payment.php 116 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339
  1. <?php
  2. defined('IN_WEB') or die('Include Error!');
  3. /**
  4. * 支付相关
  5. */
  6. class ModelPayment
  7. {
  8. const GGAMEID = 1; //创建订单时使用到的ggameid
  9. private $_status = 1;//订单下单成功状态码
  10. /**
  11. * 获取支付平台信息
  12. * @param array $param
  13. * @return int (0:其他平台,1:vivo,...)
  14. */
  15. private function getPlat($param) {
  16. if(empty($param['plat'])){
  17. return 0;
  18. }
  19. $plat = 0;
  20. switch($param['plat']) {
  21. case 'vivo':
  22. $plat = 1;
  23. break;
  24. }
  25. return $plat;
  26. }
  27. /**
  28. * 下单
  29. */
  30. public function createOrder($param){
  31. $data = array('code' => -1, 'orderId' => 0);
  32. if( !is_array($param) ){
  33. oo::logs()->debug3(["err"=>'param is not array',"param"=>$param],'paymant_err.log');
  34. return $data;
  35. }
  36. $plat = $this->getPlat($param);
  37. $uid = oo::functions()->uint($param['uid']);
  38. $sid = oo::getDefinedSid($param['uid']);
  39. $gid = oo::functions()->uint($param['gid']);
  40. $ggameid = self::GGAMEID;
  41. $orderTime = time();
  42. $orderId = empty($param['orderId']) ? $this->createOrderId($uid, $ggameid) : $param['orderId'];//vivo平台客户端自己上传orderId
  43. $gprice = $this->getGoodsPrice($gid,$uid);
  44. $flag = oo::functions()->uint($param['flag']) ?? 0;
  45. $version = oo::commonOprModel('user')->getUserVersion($uid);
  46. $levelId = oo::commonOprModel('member')->getUserLevel($uid)['levelId'];
  47. $table = otable::payment($uid);
  48. $serialNo = isset($param['serialNo']) ? $param['serialNo'] : '';
  49. $sql = "INSERT INTO {$table}(pid, siteuid, uid, sid, order_id, gid, order_time, pay_time, status, pusd, flag, version,plat,platform_serial_num) VALUES( NULL, {$ggameid}, {$uid}, {$sid}, '{$orderId}', {$gid}, {$orderTime}, 0, 1, {$gprice}, {$flag}, '{$version}','{$plat}', '{$serialNo}') ";
  50. oo::commonOprDb('payment')->query($sql);
  51. $insertID = oo::commonOprDb('payment')->insertID();
  52. if( !$insertID ){
  53. oo::logs()->debug3(["err"=>'insert is table payment err',"param"=>$param],'paymant_err.log');
  54. $data['code'] = -3;
  55. oo::logs()->debug3(["ts"=>time(),"uid"=>$param['uid'],"error"=>"create or insert db table payment err","sql"=>$sql],'payment_err.log');
  56. return $data;
  57. }
  58. //插入到订单汇总表
  59. $summaryTable = otable::summarylist();
  60. $summarySql = " INSERT INTO {$summaryTable} (sl_orderid, sl_gid, sl_uid, sl_pay_time, sl_order_time, sl_pusd, sl_status, sl_sid, sl_levelId,sl_platform_serial_num) VALUES('{$orderId}', {$gid}, {$uid}, 0, {$orderTime}, {$gprice}, 1, {$sid},{$levelId},'{$serialNo}') ";
  61. oo::commonOprDb('payment')->query($summarySql);
  62. $insertIDsummary = oo::commonOprDb('payment')->insertID();
  63. if(!$insertIDsummary){
  64. oo::logs()->debug3(array("ts"=>time(),"uid"=>$param['uid'],"error"=>"create or insert db table summarylist err", 'sql' => $summarySql), 'payment_err.log');
  65. }
  66. $data['code'] = 1;
  67. $data['orderId'] = $orderId;
  68. $data['gid'] = $gid;
  69. return $data;
  70. }
  71. /**
  72. * 客户端上报发货验单异常的订单
  73. * @param array $param
  74. */
  75. public function createFailOrder($param){
  76. $uid = oo::functions()->uint($param['uid']);
  77. $sid = !empty($param['sid']) ? (int)$param['sid'] : oo::getDefinedSid($uid);
  78. $deviceid = oo::getDefinedDeviceId($uid, $sid);
  79. $serialNo = '0';
  80. switch ($deviceid) {
  81. case 2://IOS
  82. $serialNo = isset($param['transactionId']) ? $param['transactionId'] : '0';
  83. $extraData = isset($param['extraData']) ? (array)json_decode(base64_decode(oo::functions()->escape($param['extraData'])),true) : [];
  84. $gid = isset($extraData['gid']) ? $extraData['gid'] : 0;
  85. break;
  86. default://ANDROID
  87. $signedData = empty($param['signedData']) ? '[]' : base64_decode($param['signedData']);
  88. $signedData = (array)json_decode($signedData, true);
  89. $serialNo = empty($signedData['orderId']) ? '0' : $signedData['orderId'];
  90. $orderInfo = empty($signedData['developerPayload']) ? [] : json_decode(base64_decode($signedData['developerPayload']),true);
  91. $gid = empty($orderInfo['gid']) ? 0 : $orderInfo['gid'];
  92. if(empty($gid) && isset($param['extraData'])){
  93. $extraData = (array)json_decode(base64_decode(oo::functions()->escape($param['extraData'])),true);
  94. $gid = isset($extraData['gid']) ? $extraData['gid'] : 0;
  95. }
  96. break;
  97. }
  98. //uid为0或gid为0的上报记录写文件
  99. if(empty($uid) || empty($gid)){
  100. oo::logs()->debug3([
  101. "err"=>'gid or uid empty', 'uid' => $uid, 'gid' => $gid, 'param'=>$param
  102. ],'paymentfail_err.log');
  103. }
  104. $data = array('code' => -1, 'orderId' => 0);
  105. if( !is_array($param) ){
  106. oo::logs()->debug3(["err"=>'param is not array',"param"=>$param],'paymentfail_err.log');
  107. return $data;
  108. }
  109. $plat = $this->getPlat($param);
  110. $ggameid = self::GGAMEID;
  111. $orderTime = time();
  112. //vivo平台客户端自己上传orderId
  113. $orderId = empty($param['orderId']) ? $this->createOrderId($uid, $ggameid) : $param['orderId'];
  114. $gprice = $this->getGoodsPrice($gid,$uid);
  115. $flag = oo::functions()->uint($param['flag']) ?? 0;
  116. $version = oo::commonOprModel('user')->getUserVersion($uid);
  117. $sku = empty($param['sku']) ? '' : $param['sku'];
  118. //解析到了订单信息
  119. if(strpos($serialNo, 'GPA') !== false){
  120. $table = otable::summarylist();
  121. $sql = "INSERT INTO {$table}(id,sl_uid, sl_sid, sl_orderid, sl_gid, sl_order_time, sl_platform_serial_num, sl_status, sl_pusd) VALUES( NULL, {$uid}, {$sid}, '{$orderId}', {$gid}, {$orderTime}, '{$serialNo}', 1, {$gprice}) ";
  122. oo::logs()->debug3(["msg"=>'save unexpected order',"sql"=>$sql],'paymentfail_err');
  123. }else{
  124. $table = otable::paymentFail($uid);
  125. $sql = "INSERT INTO {$table}(pid, siteuid, uid, sid, order_id, gid, order_time, platform_serial_num, status, pusd, flag, version,plat, sku) VALUES( NULL, {$ggameid}, {$uid}, {$sid}, '{$orderId}', {$gid}, {$orderTime}, '{$serialNo}', 1, {$gprice}, {$flag}, '{$version}','{$plat}', '{$sku}') ";
  126. }
  127. oo::commonOprDb('payment')->query($sql);
  128. $insertID = oo::commonOprDb('payment')->insertID();
  129. if( !$insertID ){
  130. oo::logs()->debug3(["err"=>'insert is table payment_fail err',"param"=>$param],'paymentfail_err');
  131. $data['code'] = -3;
  132. oo::logs()->debug3(["uid"=>$param['uid'],"error"=>"create or insert db table payment_fail err","sql"=>$sql],'paymentfail_err');
  133. return $data;
  134. }
  135. $data['code'] = 1;
  136. $data['orderId'] = $orderId;
  137. $data['gid'] = $gid;
  138. return $data;
  139. }
  140. /**
  141. * 生成唯一订单号
  142. */
  143. protected function createOrderId($uid = 0, $ggameid = 0)
  144. {
  145. return date('YmdHis').$uid.$ggameid.substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
  146. }
  147. /**
  148. * 获取商品的美元值
  149. */
  150. public function getGoodsPrice($gid = 0,$uid=0)
  151. {
  152. if(in_array($gid,[710,711,712])){//连环礼包
  153. if(oo::commonOprRedis('activity')->get(okeys::bindChainGift($uid))){
  154. $aid = oo::commonOprRedis('activity')->get(okeys::bindChainGift($uid));
  155. $reward = oo::commonOprModel('activitynew')->getChainGiftConf($uid,$aid,$gid);
  156. return (float)$reward['priceNum'];
  157. }
  158. }
  159. if($gid>720&&$gid<=750){//超级连环礼包
  160. $version = oo::commonOprModel('user')->getUserVersion($uid);
  161. if(oo::compareVersion($version,'1.7.4')&&oo::commonOprRedis('activity')->get(okeys::bindSuperSerialPack($uid))){
  162. $aid = oo::commonOprRedis('activity')->get(okeys::bindSuperSerialPack($uid));
  163. $reward = oo::commonOprModel('activitynew')->getCGRewardByGid($uid,$aid,$gid);
  164. return (float)$reward['priceNum'];
  165. }
  166. }
  167. if($gid>750&&$gid<=760){//四选一活动礼包
  168. $reward = oo::commonOprModel('activitynew')->getEasterGiftBag($uid,$gid);
  169. return (float)$reward['priceNum'];
  170. }
  171. if($gid>760&&$gid<=790){//超级连环礼包2
  172. $version = oo::commonOprModel('user')->getUserVersion($uid);
  173. if(oo::compareVersion($version,'1.10.1')&&oo::commonOprRedis('activity')->get(okeys::bindSuperSerialPack2($uid))){
  174. $aid = oo::commonOprRedis('activity')->get(okeys::bindSuperSerialPack2($uid));
  175. $reward = oo::commonOprModel('activitynew')->getCGRewardByGid($uid,$aid,$gid);
  176. return (float)$reward['priceNum'];
  177. }
  178. }
  179. //体力不足价格按积分变化
  180. if(in_array($gid, [1502])){
  181. if(oo::compareVersion(oo::commonOprModel('user')->getUserVersion($uid),'1.7.7')){
  182. $goodInfoTemp = oo::commonOprRedis('common')->get(okeys::shopNotEnoughLog($uid,$gid));
  183. $goodInfoTemp = json_decode($goodInfoTemp, true);
  184. if(!empty($goodInfoTemp)){
  185. return (float)$goodInfoTemp['gprice'];
  186. }
  187. }
  188. }
  189. //
  190. if(in_array($gid, [1501,1511])){
  191. //金币、钻石不足价格按积分变化
  192. $userInfo = oo::commonOprModel('member')->getUserInfo($uid);
  193. $vipPoint = $userInfo['vipPoint'];//用户积分
  194. if($vipPoint < 1000){ //1000积分一下走旧逻辑
  195. $goodInfoTemp = oo::commonOprRedis('common')->get(okeys::shopNotEnoughLog($uid,$gid));
  196. $goodInfoTemp = json_decode($goodInfoTemp, true);
  197. if(!empty($goodInfoTemp)){
  198. return (float)$goodInfoTemp['gprice'];
  199. }
  200. }
  201. }
  202. if(in_array($gid, [1810,1811])){
  203. //二选一
  204. $reward = oo::commonOprModel('activitynew')->getChooseOneGoods($uid);
  205. if($reward){
  206. foreach($reward as $row){
  207. if($row['gid'] == $gid){
  208. return (float)$row['priceNum'];
  209. }
  210. }
  211. }
  212. }
  213. if(in_array($gid, [1837,1838])){
  214. //1+1
  215. $reward = oo::commonOprModel('activitynew')->getActivityGoods($uid,"one_plus_gift");
  216. if($reward){
  217. foreach($reward as $row){
  218. if($row['gid'] == $gid){
  219. return (float)$row['priceNum'];
  220. }
  221. }
  222. }
  223. }
  224. if(in_array($gid, [1839,1840])){
  225. //惊喜礼包
  226. $reward = oo::commonOprModel('activitynew')->getActivityGoods($uid,"safe_surprise");
  227. if($reward){
  228. foreach($reward as $row){
  229. if($row['gid'] == $gid){
  230. return (float)$row['priceNum'];
  231. }
  232. }
  233. }
  234. }
  235. $table = otable::goodsCrazy();
  236. $sql = "SELECT gprice FROM {$table} WHERE gid = $gid LIMIT 1";
  237. $ret = oo::commonOprDb('payment')->getOne($sql, MYSQLI_ASSOC);
  238. $gprice = empty($ret) ? 0 : $ret['gprice'];
  239. return $gprice;
  240. }
  241. /**
  242. * 发货
  243. */
  244. public function success($param)
  245. {
  246. $data = array('code' => -1);
  247. $uid = oo::functions()->uint($param['uid']);
  248. $channel = oo::functions()->uint($param['channel']);
  249. $sid = !empty($param['sid']) ? (int)$param['sid'] : oo::getDefinedSid($uid);
  250. $deviceid = oo::getDefinedDeviceId($uid, $sid);
  251. //判断设备类型
  252. switch ($deviceid) {
  253. case 2://IOS
  254. $data = oo::commonOprModel('paymentapple')->deliveryApplePay($param);
  255. break;
  256. default://ANDROID
  257. $data = oo::commonOprModel('paymentgoogle')->deliveryGooglePay($param);
  258. break;
  259. }
  260. return $data;
  261. }
  262. /**
  263. * 为多种支付方式提供公共入口
  264. */
  265. public function pubDelivery($uid = 0, $orderId = 0, $serialNo = 0)
  266. {
  267. return self::delivery($uid, $orderId, $serialNo);
  268. }
  269. /**
  270. * 多种支付方式的发货入库接口
  271. */
  272. protected function delivery($uid = 0, $orderId = 0, $serialNo = 0){
  273. if( empty($uid) || empty($orderId) ){
  274. return -1;
  275. }
  276. //查询订单状态,如果为已发货或退单则返回失败
  277. $tablePayment = otable::payment($uid);
  278. $sql = " SELECT gid, status, flag, uid, version, sid FROM {$tablePayment} WHERE order_id = '{$orderId}' LIMIT 1 ";
  279. $paymentInfo = oo::commonOprDb('payment')->getOne($sql, MYSQLI_ASSOC);
  280. if( empty($paymentInfo) || !is_array($paymentInfo) ){
  281. oo::logs()->nodatedebug(array('code'=>-2,'uid' => $uid, 'orderId' => $orderId, 'paymentInfo' => $paymentInfo,'serialNo'=>$serialNo), 'payment_deliveryFail.log');
  282. return -2;
  283. }
  284. if(!isset($paymentInfo['uid']) || $uid != $paymentInfo['uid']){//如果该订单UID和发货的UID不一致
  285. return -5;
  286. }
  287. $flag = $paymentInfo['flag'] ?? 0;
  288. $version = $paymentInfo['version'] ?? '';
  289. $sid = $paymentInfo['sid'] ?? 0;
  290. //订单状态不正确
  291. $status = $paymentInfo['status'];
  292. if( $status != $this->_status ){
  293. oo::logs()->nodatedebug(array('uid' => $uid, 'orderId' => $orderId, 'status' => $status, 'line' => __LINE__ ,'serialNo'=>$serialNo), 'payment_deliveryFail.log');
  294. return -3;
  295. }
  296. //更新订单状态
  297. $payTime = time();
  298. $sqlUpdate = "UPDATE {$tablePayment} SET status = 2, pay_time = {$payTime}, platform_serial_num = '{$serialNo}' WHERE uid = {$uid} AND order_id = '{$orderId}' LIMIT 1";
  299. $retQuery = oo::commonOprDb('payment')->query($sqlUpdate);
  300. //正式发奖
  301. $gid = $paymentInfo['gid'];//商品ID
  302. $retReward = $this->reward($uid, $gid, $flag, $version, $sid);
  303. if( !$retReward ){
  304. oo::logs()->debug3(array('uid' => $uid, 'orderId' => $orderId, 'gid' => $gid, 'line' => __LINE__,'serialNo'=>$serialNo ), 'payment_retRewardFail.log');
  305. return -4;
  306. }
  307. //更新订单汇总表
  308. $table = otable::summarylist();
  309. $sqlUpdateSummary = " UPDATE {$table} SET sl_status = 2, sl_pay_time = {$payTime} WHERE sl_uid = {$uid} AND sl_orderid = '{$orderId}' LIMIT 1";
  310. oo::commonOprDb('payment')->query($sqlUpdateSummary);
  311. return true;
  312. }
  313. /**
  314. * 是否有购买记录
  315. * @param int $uid
  316. * @return bool
  317. * Created by: Owen
  318. * Created on: 2020/8/17 14:22
  319. */
  320. public function checkBought($uid = 0)
  321. {
  322. $uid = oo::functions()->uint($uid);
  323. $key = okeys::bought($uid);
  324. $cacheBought = intval(oo::commonOprRedis('common')->get($key));
  325. if( $cacheBought === 1 ){
  326. return true;
  327. }
  328. $table = otable::payment($uid);
  329. $sql = "SELECT pid FROM {$table} WHERE uid = {$uid} AND status = 2 LIMIT 1 ";
  330. $ret = oo::commonOprDb('payment')->getOne($sql, MYSQLI_ASSOC);
  331. $bought = false;
  332. if( !empty($ret) ){
  333. $bought = true;
  334. $saveCache = 1;
  335. oo::commonOprRedis('common')->setex($key, $saveCache,86400*7);
  336. }
  337. return $bought;
  338. }
  339. /**
  340. * 支付
  341. * @param $param
  342. * @param $newVersion
  343. * @return false|string
  344. * Created by: Owen
  345. * Created on: 2019/11/14 18:19
  346. */
  347. public function payment($param,$newVersion = false){
  348. $uid = oo::functions()->uint($param['uid']);
  349. $orderId = oo::functions()->escape($param['orderId']);
  350. $paymenttb = otable::payment($uid);
  351. $sid = !empty($param['sid']) ? (int)$param['sid'] : oo::getDefinedSid($uid);
  352. $deviceid = oo::getDefinedDeviceId($uid, $sid);
  353. if($param['signature'] != 'fakesignature'){
  354. switch ($deviceid) {
  355. case 2://IOS
  356. $orderInfo = oo::commonOprModel('paymentapple')->crazyGodDeliveryApplePay($param);
  357. if($orderInfo['status'] == 2){
  358. return json_encode(['code'=>1,'msg'=>'order reward was given','err'=>1]);
  359. }
  360. $serialNo = $orderInfo['transaction_id'];
  361. break;
  362. default://ANDROID
  363. $sql = "SELECT * FROM {$paymenttb} WHERE uid={$uid} AND order_id='{$orderId}' LIMIT 1";
  364. $orderInfo = oo::commonOprDb('payment')->getOne($sql,1);
  365. if(empty($orderInfo)){
  366. return json_encode(['code'=>-2,'msg'=>'order error','err'=>2]);
  367. }
  368. if($orderInfo['status'] == 2){
  369. return json_encode(['code'=>1,'msg'=>'order reward was given','err'=>3]);
  370. }
  371. /**plat > 0表示andor外的三方支付(vivo,已在外层验证过) **/
  372. if(empty($orderInfo['plat'])){
  373. $ret = oo::commonOprModel('paymentgoogle')->validateGooglePay($param);//验证失败
  374. }else{
  375. $ret = $this->checkPlatOrder($param);
  376. }
  377. if( !$ret ){
  378. return json_encode(['code'=>-3,'msg'=>'Google sign error','err'=>4]);
  379. }
  380. $signedData = base64_decode($param['signedData']);
  381. $signedData = json_decode($signedData, true);
  382. if( !is_array($signedData) ){
  383. return json_encode(['code'=>-4,'msg'=>'signedData error','err'=>5]);
  384. }
  385. if(!$newVersion){
  386. $orderId = $signedData['extraData'];//订单ID
  387. }
  388. $productId = $signedData['productId'];//商品ID
  389. $serialNo = $signedData['orderId'] ?? 0;//谷歌支付的流水号
  390. break;
  391. }
  392. }else{
  393. $sql = "SELECT * FROM {$paymenttb} WHERE uid={$uid} AND order_id='{$orderId}' LIMIT 1";
  394. $orderInfo = oo::commonOprDb('payment')->getOne($sql,1);
  395. if(empty($orderInfo)){
  396. return json_encode(['code'=>-2,'msg'=>'order error','err'=>6]);
  397. }
  398. if($orderInfo['status'] == 2){
  399. return json_encode(['code'=>1,'msg'=>'order reward was given','err'=>7]);
  400. }
  401. //更新订单为测试订单
  402. $table = otable::summarylist();
  403. $sqlUpdateSummary = " UPDATE {$table} SET sl_sid = -1 WHERE sl_uid = {$uid} AND sl_orderid = '{$orderId}' LIMIT 1";
  404. oo::commonOprDb('payment')->query($sqlUpdateSummary);
  405. }
  406. $order_scene_father = "其它";
  407. $order_scene_son = "其它";
  408. $gid = intval($orderInfo['gid']);
  409. $tb = otable::goodsCrazy();
  410. $sql = "SELECT * FROM {$tb} WHERE gid={$gid}";
  411. $goodInfo = oo::commonOprDb('payment')->getOne($sql,MYSQLI_ASSOC);
  412. $time = time();
  413. $free = false;
  414. $version = oo::commonOprModel('user')->getUserVersion($uid);
  415. $isPush = false;
  416. $AssetsInfo = oo::commonOprModel('member')->getUserAssetsInfo($uid);
  417. $propsArr= [];
  418. if($gid>=710&&$gid<=760){//特殊商品不固定价格则更改价格(连环礼包,超级连环礼包,四选一活动礼包)
  419. $gprice = $this->getGoodsPrice($gid,$uid);
  420. $newPusd = $goodInfo['gprice'] = $gprice;
  421. }
  422. if(in_array($gid, [1501,1502,1511])){
  423. $gprice = $this->getGoodsPrice($gid,$uid);
  424. $goodInfo['gprice'] = $gprice;
  425. }
  426. if(in_array($gid, [1810,1811,1837,1838,1839,1840])){
  427. $gprice = $this->getGoodsPrice($gid,$uid);
  428. $newPusd = $goodInfo['gprice'] = $gprice;
  429. }
  430. if($goodInfo['gtype'] ==1){
  431. $gbaseReward = intval($goodInfo['gbaseReward']);
  432. //商城默认走体力优惠券逻辑
  433. ////////////////////////////////
  434. $param['shopDiscount'] = 1;
  435. if(empty($param['shopDiscount'])){
  436. if(oo::commonOprModel('newvip')->checkNewVip($uid)){
  437. $config = oo::commonOprModel('newvip')->getUserVipLv($uid,true,false,155);
  438. $gbaseReward = ceil($gbaseReward + $gbaseReward*$config['shopAppend']);
  439. }
  440. $tips = "";
  441. if(oo::commonOprRedis("common")->ttl(okeys::PropsExpire($uid,"37-spins")) > 0){
  442. $gbaseReward = 2 * $gbaseReward;
  443. $tips = "【首冲限时优惠券】";
  444. oo::commonOprRedis("common")->delete(okeys::PropsExpire($uid,"37-spins"));
  445. }
  446. oo::commonOprModel('member')->optProperty($uid,['spins'=>$gbaseReward],'+',310,'商城购买获取体力:'.$orderId.$tips);
  447. }else{
  448. //商城促销活动
  449. $tips = "【商城限时优惠券】";
  450. $activityConfig = oo::commonOprModel('activitynew')->activityLock($uid, 'shop_promotion', true);
  451. $vipAddBet = 0;
  452. if(oo::commonOprModel('newvip')->checkNewVip($uid)){
  453. $config = oo::commonOprModel('newvip')->getUserVipLv($uid,true,false,155);
  454. $vipAddBet = empty($config['shopAppend']) ? 0 : $config['shopAppend'];
  455. }
  456. if($activityConfig){
  457. $point = oo::commonOprModel('newvip')->getUserCurPoint($uid);
  458. if(!empty($activityConfig['activityData']['config']['init']) && is_array($activityConfig['activityData']['config']['init'])){
  459. $bet = 0;
  460. foreach($activityConfig['activityData']['config']['init'] as $row){
  461. if($point < $row['point']){
  462. $bet = $row['bet'];
  463. break;
  464. }
  465. }
  466. $gbaseReward = (1 + $bet + $vipAddBet) * $gbaseReward;
  467. oo::logs()->debug5(['uid'=>$uid,'商城促销'=>'加倍'.$bet,'time'=>time()],date('Ymd').'.log','shopPromotion/');
  468. }
  469. oo::commonOprModel('statistics')->shopDiscountSta($uid,$goodInfo['gprice']);//商城促销统计
  470. oo::commonOprRedis('common')->hIncrBy(okeys::ShopPromotionBuyNumber(),$uid,1);
  471. }else{
  472. $gbaseReward = ceil($gbaseReward + $gbaseReward*$vipAddBet);
  473. if(oo::commonOprRedis("common")->ttl(okeys::PropsExpire($uid,"37-spins")) > 0){
  474. $gbaseReward = 2 * $gbaseReward;
  475. $tips = "【首冲限时优惠券】";
  476. oo::commonOprRedis("common")->delete(okeys::PropsExpire($uid,"37-spins"));
  477. }
  478. }
  479. oo::commonOprModel('member')->optProperty($uid,['spins'=>$gbaseReward],'+',310,'商城购买获取体力:'.$orderId.$tips);
  480. }
  481. // oo::commonOprModel('activitynew')->addCommonScore($uid,'spins_master',intval($gbaseReward));
  482. $data['data']=['spins'=>$gbaseReward,'gtype'=>1];
  483. $isPush && oo::commonOprModel('Workerman')->push($uid,ocmd::$SVR_UPDATE_SPINS,['num'=>$gbaseReward]);
  484. $sql = " UPDATE {$paymenttb} SET status = 2,pay_time={$time},use_time={$time},platform_serial_num = '{$serialNo}' WHERE uid = {$uid} AND order_id = '{$orderId}' AND status = 1 LIMIT 1";
  485. $propsArr[] = ["propsId"=>15,"num"=>$gbaseReward];
  486. $order_scene_father = "商城";
  487. $order_scene_son = "商城:体力";
  488. }
  489. else if($goodInfo['gtype'] ==2){
  490. $property = oo::commonOprModel('member')->getUserAssetsInfo($uid);
  491. $level = intval($property['levelId']);
  492. $tb = otable::goodsCoin();
  493. $sql = "SELECT * FROM {$tb} WHERE gsku='{$goodInfo['gsku']}' AND levelId={$level}";
  494. $coinInfo = oo::commonOprDb('payment')->getOne($sql,1);
  495. $gbaseReward = intval($coinInfo['num']);
  496. //商城促销活动
  497. if(!empty($param['shopDiscount'])){
  498. $tips = "【商城限时优惠券】";
  499. $activityConfig = oo::commonOprModel('activitynew')->activityLock($uid, 'shop_promotion', true);
  500. if($activityConfig){
  501. $point = oo::commonOprModel('newvip')->getUserCurPoint($uid);
  502. if(!empty($activityConfig['activityData']['config']['init']) && is_array($activityConfig['activityData']['config']['init'])){
  503. $bet = 0;
  504. foreach($activityConfig['activityData']['config']['init'] as $row){
  505. if($point < $row['point']){
  506. $bet = $row['bet'];
  507. break;
  508. }
  509. }
  510. $gbaseReward = (1 + $bet) * $gbaseReward;
  511. oo::logs()->debug5(['uid'=>$uid,'商城促销'=>'加倍'.$bet,'time'=>time()],date('Ymd').'.log','shopPromotion/');
  512. }
  513. }
  514. oo::commonOprModel('member')->optProperty($uid,['money'=>$gbaseReward],'+',310,'商城购买获取金币:'.$orderId.$tips);
  515. oo::commonOprModel('statistics')->shopDiscountSta($uid,$goodInfo['gprice']);//商城促销统计
  516. oo::commonOprRedis('common')->hIncrBy(okeys::ShopPromotionBuyNumber(),$uid,1);
  517. }else{
  518. $tips = "";
  519. if(oo::commonOprRedis("common")->ttl(okeys::PropsExpire($uid,"37-coins")) > 0){
  520. $gbaseReward = 2 * $gbaseReward;
  521. $tips = "【首冲限时优惠券】";
  522. oo::commonOprRedis("common")->delete(okeys::PropsExpire($uid,"37-coins"));
  523. }
  524. oo::commonOprModel('member')->optProperty($uid,['money'=>$gbaseReward],'+',310,'商城购买获取金币:'.$orderId.$tips);
  525. }
  526. $data['data']=['money'=>$gbaseReward,'coins'=>$gbaseReward];
  527. $isPush && oo::commonOprModel('Workerman')->push($uid,ocmd::$SVR_UPDATE_COINS,['num'=>$gbaseReward]);
  528. $sql = " UPDATE {$paymenttb} SET status = 2,pay_time={$time},use_time={$time},platform_serial_num = '{$serialNo}' WHERE uid = {$uid} AND order_id = '{$orderId}' AND status = 1 LIMIT 1";
  529. $propsArr[] = ["propsId"=>14,"num"=>$gbaseReward];
  530. $order_scene_father = "商城";
  531. $order_scene_son = "商城:金币";
  532. }
  533. else if($goodInfo['gtype'] == 3 ){
  534. $sql = " UPDATE {$paymenttb} SET status = 2,pay_time={$time},use_time={$time},platform_serial_num = '{$serialNo}' WHERE uid = {$uid} AND order_id = '{$orderId}' AND status = 1 LIMIT 1";
  535. if($goodInfo['gid'] == 306) { //每日礼包
  536. //每日宝箱
  537. $result = oo::commonOprModel('activitynew')->setDailyChestBuy($uid);
  538. $data['data'] = $result;
  539. $propsArr[] = ["propsId"=>19,"num"=>1,"value"=>$result['treasureChest']];
  540. $order_scene_father = "商城";
  541. $order_scene_son = "商城:每日小丑宝箱";
  542. }else{
  543. oo::commonOprModel('props')->addUserProps($uid,$goodInfo['gimg'],1,0,310);
  544. $propsArr[] = $data['data']['props'][] = [
  545. 'propsId' => $goodInfo['gimg'],
  546. 'num' => 1,
  547. 'value' => 1,
  548. ];
  549. }
  550. }
  551. else if($goodInfo['gtype'] == 5 ){
  552. $sql = " UPDATE {$paymenttb} SET status = 2,pay_time={$time},platform_serial_num = '{$serialNo}' WHERE uid = {$uid} AND order_id = '{$orderId}' AND status = 1 LIMIT 1";
  553. oo::commonOprRedis('common')->setex(okeys::TpFeeTimes($uid),intval(oo::commonOprRedis('common')->get(okeys::TpFeeTimes($uid))) + 1, oo::todayDeadline());
  554. oo::commonOprRedis('common')->hSet(okeys::bigwheelPay($uid),$time,$orderId);
  555. $data['data']=['wheel'=>4];
  556. $order_scene_father = "转盘";
  557. $order_scene_son = "转盘:黄金转盘";
  558. }
  559. else if($goodInfo['gtype'] == 6 ){
  560. $sql = " UPDATE {$paymenttb} SET status = 2,pay_time={$time},use_time={$time},platform_serial_num = '{$serialNo}' WHERE uid = {$uid} AND order_id = '{$orderId}' AND status = 1 LIMIT 1";
  561. if($gid == 601){
  562. $coins = oo::commonOprModel('goods')->getGoodCoins($uid,'coins03');
  563. $coins = $coins * 0.5;
  564. $spins = intval($goodInfo['gbaseReward']);
  565. $diamond = 0;
  566. if(oo::compareVersion($version,'1.7.3')) {
  567. if(!empty($goodInfo['goriginReward'])) {
  568. $reward = json_decode($goodInfo['goriginReward'], true);
  569. foreach ($reward as $p) {
  570. $p['propsId'] == 22 && $diamond = $p['num'];
  571. $p['propsId'] == 14 && $coins = $p['num'];
  572. }
  573. }
  574. }
  575. oo::commonOprModel('member')->optProperty($uid,['money'=>$coins,'spins'=>$spins,'diamond'=>$diamond],'+',304,'首充获取金币体力钻石');
  576. }else if($gid == 602){
  577. $spins = 0;
  578. $coins = 0;
  579. $diamond = 0;
  580. $reward = json_decode($goodInfo['gbaseReward'],true);
  581. foreach ($reward as $p){
  582. $p['propsId'] == 14 && $coins = $p['num'];
  583. $p['propsId'] == 15 && $spins = $p['num'];
  584. $p['propsId'] == 22 && $diamond = $p['num'];
  585. }
  586. oo::commonOprModel('member')->optProperty($uid,['money'=>$coins,'spins'=>$spins,'diamond'=>$diamond],'+',304,'(新)首充获取金币体力钻石');
  587. }
  588. $data['data']=['spins'=>$spins, 'money'=>$coins, 'coins'=>$coins, 'diamond'=>$diamond];
  589. $isPush && oo::commonOprModel('Workerman')->push($uid,ocmd::$SVR_UPDATE_SPINS,['num'=>$spins]);
  590. $isPush && oo::commonOprModel('Workerman')->push($uid,ocmd::$SVR_UPDATE_COINS,['num'=>$coins]);
  591. $isPush && oo::commonOprModel('Workerman')->push($uid,ocmd::$SVR_UPDATE_DIAMONDS,['num'=>$diamond]);
  592. oo::commonOprRedis('User')->setex(okeys::firstPay($uid,$gid),1,3*24*60*60);
  593. //首充优惠
  594. if(oo::compareVersion($version,"1.8.0")){
  595. $couponVer = oo::commonOprRedis('common')->get(okeys::firstPayCouponVersion());
  596. $couponVer = empty($couponVer) ? '1.9.1' : $couponVer; //1.9.1版本临时隐藏首冲优惠券商品
  597. if(!oo::compareVersion($version, $couponVer)){
  598. $data['data']['coupon'] = oo::commonOprModel('props')->setFirstPayPromotion($uid);
  599. }
  600. }
  601. $propsArr[] = ["propsId"=>14,"num"=>$coins];
  602. $propsArr[] = ["propsId"=>15,"num"=>$spins];
  603. $order_scene_father = "礼包";
  604. $order_scene_son = "礼包:首充";
  605. }
  606. else if($goodInfo['gtype'] == 7){
  607. if(in_array($goodInfo['gid'],[710,711,712])){
  608. if(oo::commonOprRedis('activity')->get(okeys::bindChainGift($uid))){
  609. $aid = oo::commonOprRedis('activity')->get(okeys::bindChainGift($uid));
  610. $reward = $this->sendGift($uid,$aid,$goodInfo['gid']);
  611. if(is_array($reward)){
  612. $data['data']['treasureChest'] = $reward['treasureChest'];
  613. }else{
  614. $reward = [];
  615. }
  616. }else{
  617. $reward = json_decode($goodInfo['gbaseReward'],true);
  618. $coin = oo::commonOprModel('goods')->getGoodCoins($uid,$reward['coins']['coins']) * $reward['coins']['bet'];
  619. oo::commonOprModel('member')->optProperty($uid,['money'=>$coin,'spins'=>$reward['spins']],'+',311,$goodInfo['gdesc']);
  620. foreach ($reward['props'] as $row){
  621. oo::commonOprModel('props')->addUserProps($uid,$row['propsId'],$row['num'],0,311);
  622. }
  623. $cacheKey = okeys::SerialPackTimer($uid,$gid);
  624. oo::commonOprRedis('common')->hIncrBy(okeys::SerialPackTimer(),$cacheKey,1);
  625. }
  626. $data['data']['props'] = $reward['props'];
  627. array_push($reward['props'],["propsId"=>14,"num"=>$reward['coin']],["propsId"=>15,"num"=>$reward['spin']]);
  628. $propsArr = $reward['props'];
  629. $order_scene_father = "礼包";
  630. $order_scene_son = "礼包:连环礼包";
  631. }else{
  632. $giftArr = oo::commonOprModel('goods')->getGiftConfig();
  633. $reward = $giftArr[$gid];
  634. $money = intval(oo::commonOprModel('goods')->getGoodCoins($uid,$reward['coins']) * $reward['coinsBet']);
  635. $diamond = 0;
  636. if(oo::compareVersion($version,'1.7.3')) {
  637. if(!empty($goodInfo['goriginReward'])) {
  638. $goriginReward = json_decode($goodInfo['goriginReward'], true);
  639. foreach ($goriginReward as $p) {
  640. $p['propsId'] == 22 && $diamond = $p['num'];
  641. }
  642. }
  643. }
  644. $gbaseReward = intval($goodInfo['gbaseReward']);
  645. $data['data']=[
  646. 'spins'=>$gbaseReward,
  647. 'money'=>$money,
  648. 'coins'=>$money,
  649. 'diamond'=>$diamond,
  650. ];
  651. oo::commonOprModel('member')->optProperty($uid,$data['data'],'+',300,$goodInfo['gdesc']);
  652. $isPush && oo::commonOprModel('Workerman')->push($uid,ocmd::$SVR_UPDATE_SPINS,['num'=>$gbaseReward]);
  653. $isPush && oo::commonOprModel('Workerman')->push($uid,ocmd::$SVR_UPDATE_COINS,['num'=>$money]);
  654. $isPush && oo::commonOprModel('Workerman')->push($uid,ocmd::$SVR_UPDATE_DIAMONDS,['num'=>$diamond]);
  655. if(in_array($gid,[701,702,703])){
  656. oo::commonOprRedis('common')->incr(okeys::promotion($uid,$gid>701?$gid:""));
  657. oo::commonOprRedis('common')->expire(okeys::promotion($uid,$gid>701?$gid:""),oo::todayDeadline());
  658. }
  659. $propsArr[] = ["propsId"=>14,"num"=>$money];
  660. $propsArr[] = ["propsId"=>15,"num"=>$gbaseReward];
  661. $order_scene_father = "礼包";
  662. $order_scene_son = "礼包:充值+限时+常规";
  663. }
  664. $sql = "UPDATE {$paymenttb} SET status = 2,pay_time={$time},use_time={$time},platform_serial_num = '{$serialNo}' WHERE uid = {$uid} AND order_id = '{$orderId}' AND status = 1 LIMIT 1";
  665. }
  666. else if($goodInfo['gtype'] == 8){
  667. $sql = "UPDATE {$paymenttb} SET status = 2,pay_time={$time},use_time={$time},platform_serial_num = '{$serialNo}' WHERE uid = {$uid} AND order_id = '{$orderId}' AND status = 1 LIMIT 1";
  668. switch ($deviceid){
  669. case 2:
  670. $serialNo = $orderInfo['original_transaction_id'];
  671. $expire = ceil($orderInfo['expires_date_ms']/1000);
  672. oo::commonOprModel('newvip')->setVip($uid,$expire,$orderInfo['original_transaction_id']);
  673. break;
  674. default:
  675. $packageName = $signedData['packageName'];//订单ID
  676. $purchaseToken = $signedData['purchaseToken'] ?? 0;//谷歌支付的流水号
  677. $purchaseInfo = oo::commonOprModel('Paymentgoogle')->getUserSubscribeStatus($packageName,$productId,$purchaseToken);
  678. $expire = ceil($purchaseInfo['expiryTimeMillis']/1000);
  679. oo::commonOprModel('newvip')->setVip($uid,$expire,$purchaseToken);
  680. break;
  681. }
  682. oo::logs()->debug3(["ts"=>time(),"uid"=>$uid,"param"=>$param,"sid"=>$deviceid,"orderInfo"=>$orderInfo],'payment_add_vip.log');
  683. $userInfo = oo::commonOprModel('member')->getUserInfo($uid);
  684. if($gid == 801 && $userInfo['vip_expire'] == 0){
  685. $free = true;
  686. $sql = "UPDATE {$paymenttb} SET pusd = 0,status = 2,pay_time={$time},use_time={$time},platform_serial_num = '{$serialNo}' WHERE uid = {$uid} AND order_id = '{$orderId}' AND status = 1 LIMIT 1";
  687. }
  688. oo::commonOprRedis('common')->delete(okeys::VipExperience($uid));
  689. oo::commonOprModel('Workerman')->push($uid,ocmd::$send['Vip_Rec'],['vipInfo'=>oo::commonOprModel('newvip')->getVipInfo($uid)]);
  690. //购买vip取消跑马灯
  691. //oo::async()->add('oo::commonOprModel("notice")->sendNoticeMsg',[$uid,"buyVip"]);//异步跑马灯消息
  692. $order_scene_father = "会员";
  693. $order_scene_son = "会员:开通订阅";
  694. oo::commonOprModel('ta')->setEventData($uid,'user_set',["is_member"=>1,"member_time"=>$expire]);
  695. }
  696. else if($goodInfo['gtype'] == 9){
  697. $sql = "UPDATE {$paymenttb} SET status = 2,pay_time={$time},use_time={$time},platform_serial_num = '{$serialNo}' WHERE uid={$uid} AND order_id='{$orderId}' AND status=1 LIMIT 1";
  698. $reward = json_decode($goodInfo['gbaseReward'],true);
  699. foreach ($reward as $row){
  700. if($row['type'] == 1){
  701. oo::commonOprModel('member')->optProperty($uid,['money'=>$row['num']],'+',305,'节日礼包');
  702. $data['data']['coins'] = $data['data']['money'] = $row['num'];
  703. $propsArr[] = ["propsId"=>14,"num"=>$row['num']];
  704. }else if($row['type'] == 2){
  705. oo::commonOprModel('member')->optProperty($uid,['spins'=>$row['num']],'+',305,'节日礼包');
  706. $data['data']['spins'] = $row['num'];
  707. $propsArr[] = ["propsId"=>15,"num"=>$row['num']];
  708. }else if($row['type'] == 3){
  709. oo::commonOprModel('props')->addUserProps($uid,$row['id'],$row['num'],0,305);
  710. $propsArr[] = ["propsId"=>$row['id'],"num"=>$row['num']];
  711. $data['data']['card'] = [];
  712. }else if($row['type'] == 4){
  713. $data['data']['festival'] = oo::commonOprModel('activity')->updateHolidayCollect($uid,$row['num']);
  714. }
  715. }
  716. oo::commonOprRedis('User')->hIncrBy(okeys::GoodBuyNum(),$uid.'_'.$gid,1);
  717. $order_scene_father = "弃用";
  718. $order_scene_son = "弃用:节日礼包";
  719. }
  720. else if($goodInfo['gtype'] == 10){
  721. $endUseTime = time();
  722. $sql = "SELECT * FROM {$paymenttb} WHERE uid={$uid} AND gid={$gid} AND status=2 AND buff>{$endUseTime} ORDER BY buff DESC LIMIT 1";
  723. $ret = oo::commonOprDb('payment')->getOne($sql,MYSQLI_ASSOC);
  724. if(!empty($ret)){
  725. $buff = $ret['buff'] + 30*24*60*60;
  726. }else{
  727. if(oo::commonOprRedis('User')->get(okeys::SignInToday($uid))){
  728. $buff = strtotime("23:59:59") + 30*24*60*60;
  729. }else{
  730. $buff = strtotime("23:59:59") + 29*24*60*60;
  731. }
  732. }
  733. $sql = " UPDATE {$paymenttb} SET status = 2,pay_time={$time},use_time={$time},platform_serial_num = '{$serialNo}',buff='{$buff}' WHERE uid={$uid} AND order_id='{$orderId}' AND status=1 LIMIT 1";
  734. $reward = json_decode($goodInfo['gbaseReward'],true);
  735. if($reward['base']['type'] == 1){
  736. $type = 'money';
  737. $data['data']['coins'] = $reward['base']['num'];
  738. }else if($reward['base']['type'] == 2){
  739. $type = 'spins';
  740. }
  741. oo::commonOprModel('member')->optProperty($uid,[$type=>$reward['base']['num']],'+',330,'体力月卡');
  742. oo::commonOprRedis('usercache')->delete(okeys::SpinMonthly($uid,$gid));
  743. $data['data'][$type] = $reward['base']['num'];
  744. $data['data']['expire'] = $buff;
  745. $type == 'money' && $propsArr[] = ["propsId"=>14,"num"=>$reward['base']['num']];
  746. $type == 'spins' && $propsArr[] = ["propsId"=>15,"num"=>$reward['base']['num']];
  747. $order_scene_father = "弃用";
  748. $order_scene_son = "弃用:体力月卡";
  749. }
  750. else if($goodInfo['gtype'] == 11){
  751. $sql = " UPDATE {$paymenttb} SET status = 2,pay_time={$time},platform_serial_num = '{$serialNo}' WHERE uid = {$uid} AND order_id='{$orderId}' AND status = 1 LIMIT 1";
  752. oo::commonOprRedis('usercache')->delete(okeys::CardBless($uid,$gid));
  753. $order_scene_father = "弃用";
  754. $order_scene_son = "弃用:卡片祝福";
  755. }
  756. else if($goodInfo['gtype'] == 12){
  757. $sql = "UPDATE {$paymenttb} SET status = 2,pay_time={$time},use_time={$time},platform_serial_num = '{$serialNo}' WHERE uid={$uid} AND order_id='{$orderId}' AND status=1 LIMIT 1";
  758. $reward = json_decode($goodInfo['gbaseReward'],true);
  759. oo::commonOprModel('props')->addUserProps($uid,$reward['props'],$reward['num'],0,313);
  760. $propsArr[] = $data['data']['props'][] = [
  761. 'propsId' => $reward['props'],
  762. 'num' => $reward['num'],
  763. 'value' => $reward['num'],
  764. ];
  765. $order_scene_father = "弃用";
  766. $order_scene_son = "弃用:夺宝券";
  767. }
  768. else if($goodInfo['gtype'] == 13){
  769. $sql = "UPDATE {$paymenttb} SET status = 2,pay_time={$time},use_time={$time},platform_serial_num = '{$serialNo}' WHERE uid={$uid} AND order_id='{$orderId}' AND status=1 LIMIT 1";
  770. oo::commonOprModel('props')->addUserProps($uid,9,$goodInfo['gbaseReward'],0,313);
  771. $data['data']['props'][] = [
  772. 'propsId' => 9,
  773. 'num' => $goodInfo['gbaseReward'],
  774. 'value' => $goodInfo['gbaseReward'],
  775. ];
  776. $data['data']['petFeed'] = $goodInfo['gbaseReward'];
  777. oo::commonOprModel('props')->addUserProps($uid,8,$goodInfo['goriginReward'],0,313);
  778. $data['data']['petExp'] = $goodInfo['goriginReward'];
  779. $data['data']['props'][] = [
  780. 'propsId' => 8,
  781. 'num' => $goodInfo['goriginReward'],
  782. 'value' => $goodInfo['goriginReward'],
  783. ];
  784. $propsArr = $data['data']['props'];
  785. $order_scene_father = "商城";
  786. $order_scene_son = "商城:宠物经验+粮食";
  787. }
  788. else if($goodInfo['gtype'] == 14){
  789. $sql = "UPDATE {$paymenttb} SET status = 2,pay_time={$time},use_time={$time},platform_serial_num = '{$serialNo}' WHERE uid={$uid} AND order_id='{$orderId}' AND status=1 LIMIT 1";
  790. oo::commonOprModel('props')->addUserProps($uid,8,$goodInfo['gbaseReward'],0,313);
  791. $propsAr[] = $data['data']['props'][] = [
  792. 'propsId' => 8,
  793. 'num' => $goodInfo['gbaseReward'],
  794. 'value' => $goodInfo['gbaseReward'],
  795. ];
  796. $order_scene_father = "商城";
  797. $order_scene_son = "商城:宠物经验";
  798. }
  799. else if($goodInfo['gtype'] == 15){
  800. $userInfo = oo::commonOprModel('member')->getUserInfo($uid);
  801. $vipPoint = $userInfo['vipPoint'];//用户积分
  802. $goodInfoTemp = oo::commonOprRedis('common')->get(okeys::shopNotEnoughLog($uid,$gid));
  803. if(($gid == 1502 || ($vipPoint < 1000 && in_array($gid, [1501, 1511]))) && !empty($goodInfoTemp)){
  804. $goodInfoTemp = json_decode($goodInfoTemp,1);
  805. $goodInfo['gbaseReward'] = $goodInfoTemp['gbaseReward'];
  806. $newPusd = $goodInfoTemp['gprice'];
  807. $goodInfo['gprice'] = $goodInfoTemp['gprice'];
  808. $sql = "UPDATE {$paymenttb} SET status = 2,pay_time={$time},use_time={$time},platform_serial_num = '{$serialNo}',pusd={$newPusd} WHERE uid={$uid} AND order_id='{$orderId}' AND status=1 LIMIT 1";
  809. }else{
  810. $sql = "UPDATE {$paymenttb} SET status = 2,pay_time={$time},use_time={$time},platform_serial_num = '{$serialNo}' WHERE uid={$uid} AND order_id='{$orderId}' AND status=1 LIMIT 1";
  811. }
  812. $order_scene_father = "不足";
  813. if(in_array($gid, [1501, 1503, 1504, 1505, 1506, 1507])){
  814. $property = oo::commonOprModel('member')->getUserAssetsInfo($uid);
  815. $level = intval($property['levelId']);
  816. $temp = json_decode($goodInfo['gbaseReward'],true);
  817. $coins= oo::commonOprModel('goods')->getGoodCoinsByLevelId($level + 1,$temp['coins']['coins']);
  818. $coins= $coins * $temp['coins']['bet'];
  819. oo::commonOprModel('member')->optProperty($uid,["money"=>$coins],'+',310,'商城购买获取金币');
  820. $data['data']=[ 'money'=>$coins, 'coins'=>$coins, ];
  821. $propsArr[] = ["propsId"=>14,"num"=>$coins];
  822. $order_scene_son = "不足:金币不足";
  823. }else if($gid == 1502){
  824. oo::commonOprModel('member')->optProperty($uid,["spins"=>$goodInfo['gbaseReward']],'+',310,'商城购买获取体力');
  825. $data['data']=['spins'=>$goodInfo['gbaseReward']];
  826. $propsArr[] = ["propsId"=>15,"num"=>$goodInfo['gbaseReward']];
  827. $order_scene_son = "不足:体力不足";
  828. }else if(in_array($gid, [1511, 1512, 1513, 1514, 1515, 1516])){
  829. oo::commonOprModel('member')->optProperty($uid,["diamond"=>$goodInfo['gbaseReward']],'+',312,'钻石不足购买');
  830. $data['data']=[ 'diamond'=>$goodInfo['gbaseReward'], ];
  831. $order_scene_son = "不足:钻石不足";
  832. }
  833. }
  834. else if(in_array($goodInfo['gtype'],[16, 18, 19, 27])){//27为回归礼包
  835. $rid =$goodInfo['gtype']==27?454:311;
  836. if(in_array($gid, [1833,1834,1835,1836])){
  837. $rid = '314'; //超值礼包
  838. }
  839. $sql = "UPDATE {$paymenttb} SET status = 2,pay_time={$time},use_time={$time},platform_serial_num = '{$serialNo}' WHERE uid={$uid} AND order_id='{$orderId}' AND status=1 LIMIT 1";
  840. $reward = json_decode($goodInfo['gbaseReward'],true);
  841. $coin = oo::commonOprModel('goods')->getGoodCoins($uid,$reward['coins']['coins']) * $reward['coins']['bet'];
  842. $diamond = 0;
  843. $crazyPassExp = 0;
  844. $data['data']['coins'] = $coin;
  845. $data['data']['money'] = $coin;
  846. $data['data']['spins'] = $reward['spins'];
  847. foreach ($reward['props'] as $key=>$row){
  848. if(in_array($row['propsId'],[19,20,21,29,30])){
  849. $skin = isset($row['skin']) ? (int)$row['skin'] : 0;
  850. $data['data']['treasureChest'] = oo::commonOprModel('props')->rewardChest($uid,$row['propsId'],'',$rid, $skin);
  851. }else if($row['propsId'] == 22){
  852. $diamond = $row['num'];
  853. }else if($row['propsId'] == 38){
  854. $crazyPassExp = $row['num'];
  855. }else{
  856. $valueTemp = [];
  857. if($row['propsId']==41 && !empty($row['skin'])){
  858. $valueTemp["skin"] = $row['skin'];
  859. }
  860. oo::commonOprModel('member')->sendReward($uid,$row['propsId'],$row['num'], $rid, "礼包:{$gid}",$valueTemp);
  861. }
  862. if(in_array($row['propsId'],[19,20,21,29,30])){
  863. $propsArr[] = ["propsId"=>$row['propsId'],"num"=>1,"value"=>$data['data']['treasureChest']];
  864. }else{
  865. $propsArr[] = ["propsId"=>$row['propsId'],"num"=>$row['num']];
  866. }
  867. }
  868. $data['data']['diamond'] = $diamond;
  869. $data['data']['crazyPassExp'] = $crazyPassExp;
  870. oo::commonOprModel('member')->optProperty($uid,['money'=>$coin,'spins'=>$reward['spins'],'diamond'=>$diamond],'+',$rid,$goodInfo['gdesc']);
  871. $data['data']['props'] = $reward['props'];
  872. $order_scene_father ="礼包";
  873. if ($goodInfo['gtype']==27){
  874. $order_scene_son = "礼包:召回礼包";
  875. }else if ($goodInfo['gtype']==16){
  876. $order_scene_son = "礼包:规则礼包";
  877. }else if($goodInfo['gtype']==18){
  878. $order_scene_son = "礼包:升级礼包";
  879. }else if($goodInfo['gtype']==19){
  880. $order_scene_son = "礼包:金币老虎机礼包";
  881. }
  882. }
  883. else if($goodInfo['gtype'] == 17){
  884. if(self::payBet($uid,$orderId,false)){
  885. $sql = " UPDATE {$paymenttb} SET status = 2,pay_time={$time},use_time={$time},platform_serial_num = '{$serialNo}' WHERE uid = {$uid} AND order_id = '{$orderId}' AND status = 1 LIMIT 1";
  886. }
  887. $order_scene_father ="支付加倍";
  888. $order_scene_son ="支付加倍:加倍";
  889. }
  890. else if($goodInfo['gtype'] == 20){
  891. $actInfo = oo::commonOprModel('activitynew')->activityLock($uid,"traffic_permit",true);
  892. if(!empty($actInfo)){
  893. $aid = $actInfo['activityData']['aid'];
  894. $end = $actInfo['activityData']['end'];
  895. oo::commonOprRedis('activity')->setex(okeys::BuyTrafficPermitStatus($aid,$uid),1, max($end - time(),0));
  896. oo::async()->add('oo::commonOprModel("activitynew")->BuyTrafficPermitNotice',[$uid]);
  897. }else{
  898. $aid = 0;
  899. }
  900. if($gid == 1814){
  901. $expData = oo::commonOprModel('activitynew')->buyTrafficPermitLevelByPay($uid,15);
  902. $data['data']['props'][] = ['propsId'=>38,'num'=>$expData['actionNum'],'value'=>$expData['curNum']];
  903. }
  904. $sql = " UPDATE {$paymenttb} SET status = 2,pay_time={$time},use_time={$time},platform_serial_num = '{$serialNo}',buff='{$aid}' WHERE uid = {$uid} AND order_id = '{$orderId}' AND status = 1 LIMIT 1";
  905. oo::commonOprModel('activitynew')->buyTrafficPermitSta($uid);
  906. $order_scene_father = "通行证";
  907. $order_scene_son = "通行证:开通";
  908. }
  909. else if($goodInfo['gtype'] == 21){ //钻石商品
  910. $reward = (int)$goodInfo['gbaseReward'];
  911. $data['data']['diamond'] = $reward;
  912. oo::commonOprModel('member')->optProperty($uid,['diamond'=>$reward],'+',310,'商城购买获得钻石:'.$reward);
  913. $sql = "UPDATE {$paymenttb} SET status = 2,pay_time={$time},use_time={$time},platform_serial_num = '{$serialNo}' WHERE uid = {$uid} AND order_id = '{$orderId}' AND status = 1 LIMIT 1";
  914. $order_scene_father = "商城";
  915. $order_scene_son = "商城:钻石";
  916. }
  917. else if(in_array($goodInfo['gtype'],[22,28,29])){//超级连环礼包,彩蛋复活礼包,超级连环礼包2
  918. if($goodInfo['gtype']==22){
  919. $aid = oo::commonOprRedis('activity')->get(okeys::bindSuperSerialPack($uid));//超级连环礼包
  920. }else if($goodInfo['gtype']==28){
  921. $aid = oo::commonOprModel('activitynew')->getBindActivity($uid,'easter_egg');//四选一活动
  922. }else if($goodInfo['gtype']==29){
  923. $aid = oo::commonOprRedis('activity')->get(okeys::bindSuperSerialPack2($uid));//超级连环礼包2
  924. }
  925. if($aid){
  926. $reward = $this->sendReward($uid,$goodInfo['gid'],$aid);
  927. $data['data']['treasureChest'] = is_int($reward)||empty($reward)?[]:$reward['treasureChest'];
  928. $propsArr = $reward['props'];
  929. $goodInfo['gprice'] = (empty((float)$goodInfo['gprice'])) ? $this->getGoodsPrice($goodInfo['gid'], $uid) : $goodInfo['gprice'];
  930. }else{
  931. $reward['props'] =[];
  932. }
  933. $goodInfo['gsku'] = $reward['sku'];
  934. $data['data']['props'] = $reward['props'];
  935. $sql = "UPDATE {$paymenttb} SET status = 2,pay_time={$time},use_time={$time},platform_serial_num = '{$serialNo}' WHERE uid = {$uid} AND order_id = '{$orderId}' AND status = 1 LIMIT 1";
  936. $order_scene_father = "礼包";
  937. $order_scene_son = $goodInfo['gtype']==22 ? "礼包:超级连环礼包" : ($goodInfo['gtype']==28?"礼包:彩蛋复活礼包":"礼包:超级连环礼包2");
  938. }
  939. else if($goodInfo['gtype'] == 23){
  940. //体力存钱罐
  941. $safeGoodsInfo = oo::commonOprModel('activitynew')->getActivityShopCache(okeys::activityShopCache($uid, 'spin_safe-'.$gid));
  942. if(empty($safeGoodsInfo)){
  943. $safeGoodsInfo = oo::commonOprModel('activitynew')->getSpinSafeGoodsByGid($uid, $gid);
  944. }
  945. if(!empty($safeGoodsInfo['price'])){
  946. $newPusd = $safeGoodsInfo['price'];
  947. }
  948. $gidTransForm = [1807=>2,1808=>3];
  949. $progressId = $gidTransForm[$gid];
  950. $propsArr = $props = oo::commonOprModel('activitynew')->rewardSteelSafe($uid,$progressId,true);
  951. $data['data']['props'] = $props;
  952. $sql = "UPDATE {$paymenttb} SET status = 2,pay_time={$time},use_time={$time},platform_serial_num = '{$serialNo}' WHERE uid = {$uid} AND order_id = '{$orderId}' AND status = 1 LIMIT 1";
  953. $order_scene_father = "体力存钱罐";
  954. $order_scene_son = "体力存钱罐:进度".$progressId;
  955. }
  956. else if($goodInfo['gtype'] == 24){
  957. $sql = "UPDATE {$paymenttb} SET status = 2,pay_time={$time},use_time={$time},platform_serial_num = '{$serialNo}' WHERE uid = {$uid} AND order_id = '{$orderId}' AND status = 1 LIMIT 1";
  958. $expData = oo::commonOprModel('activitynew')->buyTrafficPermitLevelByPay($uid,[1809=>1,1815=>6,1816=>21][$gid]);
  959. $data['data']['props'][] = ['propsId'=>38,'num'=>$expData['actionNum'],'value'=>$expData['curNum']];
  960. $order_scene_father = "通行证";
  961. $order_scene_son = "通行证:升级";
  962. }
  963. else if($goodInfo['gtype'] == 25 || $goodInfo['gtype'] == 30 || $goodInfo['gtype'] == 31){
  964. if($goodInfo['gtype'] == 30){
  965. $config = oo::commonOprModel('activitynew')->getActivityGoods($uid,"one_plus_gift");
  966. $logExplain = "购买1+1活动商品:";
  967. $reasonRid = 455;
  968. }else if($goodInfo['gtype'] == 31){
  969. $config = oo::commonOprModel('activitynew')->getActivityGoods($uid,"safe_surprise");
  970. $logExplain = "购买惊喜活动商品:";
  971. $reasonRid = 457;
  972. }else{
  973. $config = oo::commonOprModel('activitynew')->getChooseOneGoods($uid);
  974. $logExplain = "购买二选一活动商品:";
  975. $reasonRid = 120;
  976. }
  977. $data['data']['coins'] = 0;
  978. $data['data']['spins'] = 0;
  979. $data['data']['diamond'] = 0;
  980. $data['data']['crazyPassExp'] = 0;
  981. $data['data']['treasureChest']= [];
  982. $data['data']['goldCard']= [];
  983. if(!empty($config)){
  984. $gidPrices = array_column($config, 'priceNum', 'gid');
  985. $config = array_column($config,"props",'gid');
  986. $props = $config[$gid];
  987. $newPusd = $gidPrices[$gid];
  988. foreach ($props as $key=>&$row){
  989. $valueTemp = [];
  990. if($row['propsId'] == 41 && !empty($row['value'])){
  991. $valueTemp = $row['value'];
  992. }
  993. $info = oo::commonOprModel('member')->sendReward($uid, $row['propsId'], $row['num'],$reasonRid,$logExplain.$gid,$valueTemp,$row);
  994. if(in_array($row['propsId'],[19,20,21,29,30])){
  995. $data['data']['treasureChest'] = $info;
  996. }else if($row['propsId'] == 22){
  997. $data['data']['diamond'] = $row['num'];
  998. }else if($row['propsId'] == 38){
  999. $data['data']['crazyPassExp'] = $row['num'];
  1000. }else if($row['propsId'] == 14){
  1001. $data['data']['coins'] = $row['num'];
  1002. }else if($row['propsId'] == 15){
  1003. $data['data']['spins'] = $row['num'];
  1004. }else if($row['propsId'] == 13){
  1005. $data['data']['goldCard'] = is_array($info) ? $info : [$info];
  1006. }
  1007. }
  1008. $propsArr = $data['data']['props'] = $props;
  1009. }
  1010. if($goodInfo['gtype'] == 30){
  1011. $aid = oo::commonOprModel('activitynew')->activityLock($uid,"one_plus_gift");
  1012. if($aid){
  1013. oo::commonOprRedis('Activity')->hSet(okeys::onePlusGiftBuyStatus($aid),$uid,1) ;//免费礼包
  1014. oo::commonOprRedis('activity')->hIncrBy(okeys::onePlusGiftBuyNum($aid),$uid,1);//累计
  1015. $goodInfo['gprice'] = (empty((float)$goodInfo['gprice'])) ? $this->getGoodsPrice($goodInfo['gid'], $uid) : $goodInfo['gprice'];
  1016. }
  1017. $order_scene_father = "礼包";
  1018. $order_scene_son = "礼包:1+1";
  1019. }else if($goodInfo['gtype'] == 31){
  1020. $aid = oo::commonOprModel('activitynew')->activityLock($uid,"safe_surprise");
  1021. if($aid){
  1022. oo::commonOprRedis('Activity')->hSet(okeys::safeSurpriseBuyStatus($aid),$uid,1) ;//免费礼包
  1023. $goodInfo['gprice'] = (empty((float)$goodInfo['gprice'])) ? $this->getGoodsPrice($goodInfo['gid'], $uid) : $goodInfo['gprice'];
  1024. }
  1025. $order_scene_father = "礼包";
  1026. $order_scene_son = "礼包:安全惊喜礼包";
  1027. }else{
  1028. $aid = oo::commonOprModel('activitynew')->activityLock($uid,"choose_one");
  1029. if($aid){
  1030. oo::commonOprRedis('Activity')->hSet(okeys::ChooseOneStatus($aid),$uid,1);
  1031. $goodInfo['gprice'] = (empty((float)$goodInfo['gprice'])) ? $this->getGoodsPrice($goodInfo['gid'], $uid) : $goodInfo['gprice'];
  1032. }
  1033. $order_scene_father = "礼包";
  1034. $order_scene_son = "礼包:二选一";
  1035. }
  1036. $sql = "UPDATE {$paymenttb} SET status = 2,pay_time={$time},use_time={$time},platform_serial_num = '{$serialNo}',buff='{$aid}' WHERE uid = {$uid} AND order_id = '{$orderId}' AND status = 1 LIMIT 1";
  1037. }
  1038. else if($goodInfo['gtype'] == 26){
  1039. $order_scene_father = "基金";
  1040. if($gid==1812){ //首购
  1041. $aid = oo::commonOprModel('activitynew')->activityLock($uid,"fund");
  1042. if($aid){
  1043. oo::commonOprRedis("Activity")->setex(okeys::FundAid($uid),$aid,7 * 24 * 60 * 60);
  1044. oo::commonOprRedis("Activity")->hSet(okeys::FundAidUid($aid),$uid,time());
  1045. $data['data']['expire'] = time() + 7 * 24 * 60 * 60;
  1046. }
  1047. $order_scene_son = "基金:首购";
  1048. }else if($gid==1813){ //续购
  1049. $aid = oo::commonOprRedis("Activity")->get(okeys::FundAid($uid));
  1050. if($aid){
  1051. $ttl = oo::commonOprRedis("Activity")->ttl(okeys::FundAid($uid));
  1052. $ttl > 0 && oo::commonOprRedis("Activity")->expire(okeys::FundAid($uid),$ttl + 7 * 24 * 60 * 60);
  1053. $data['data']['expire'] = $ttl + 7 * 24 * 60 * 60 + time();
  1054. }
  1055. $order_scene_son = "基金:续购";
  1056. }else if($gid==1832){ //补签
  1057. $aid = oo::commonOprRedis("Activity")->get(okeys::FundAid($uid));
  1058. if($aid){
  1059. $actExtraData = json_decode($param['actExtraData'],true)??[];
  1060. !empty($actExtraData["fundBoomRepair"]) && oo::commonOprModel('activitynew')->setFundReissue($aid,$uid,$actExtraData["fundBoomRepair"]);
  1061. $data['data']['reissueList'] = oo::commonOprModel('activitynew')->getFundReissue($aid,$uid);
  1062. }
  1063. $order_scene_son = "基金:补签";
  1064. }
  1065. $actGoodsTmp = oo::commonOprModel('activitynew')->getActivityShopCache(okeys::activityShopCache($uid, 'fund'));
  1066. if($actGoodsTmp){
  1067. $actGoods = array_column($actGoodsTmp, 'priceNum', 'gid');
  1068. if(isset($actGoods[$gid])){
  1069. $newPusd = $actGoods[$gid];
  1070. }
  1071. }
  1072. $sql = "UPDATE {$paymenttb} SET status = 2,pay_time={$time},use_time={$time},platform_serial_num = '{$serialNo}',buff='{$aid}' WHERE uid = {$uid} AND order_id = '{$orderId}' AND status = 1 LIMIT 1";
  1073. oo::commonOprRedis('activity')->delete(okeys::BuyFundStatus($aid,$uid));
  1074. }
  1075. else{
  1076. return json_encode(['code'=>-6,'err'=>8]);
  1077. }
  1078. oo::commonOprRedis('common')->setex(okeys::TodayBuyGoods($uid,$goodInfo['gtype']),1,oo::todayDeadline());
  1079. oo::commonOprRedis('common')->setex(okeys::TodayBuyGoods($uid),1,oo::todayDeadline());
  1080. oo::commonOprDb('payment')->query($sql);
  1081. //更新订单汇总表
  1082. $table = otable::summarylist();
  1083. $sl_content = json_encode($data['data']);
  1084. if($free){
  1085. $sqlUpdateSummary = " UPDATE {$table} SET sl_pusd = 0 , sl_status = 2, sl_pay_time = {$time}, `sl_platform_serial_num`='{$serialNo}', sl_content = '{$sl_content}' WHERE sl_uid = {$uid} AND sl_orderid = '{$orderId}' LIMIT 1";
  1086. }else{
  1087. if(empty($newPusd)){
  1088. $sqlUpdateSummary = " UPDATE {$table} SET sl_status = 2, sl_pay_time = {$time}, `sl_platform_serial_num`='{$serialNo}', sl_content = '{$sl_content}' WHERE sl_uid = {$uid} AND sl_orderid = '{$orderId}' LIMIT 1";
  1089. }else{
  1090. $sqlUpdateSummary = " UPDATE {$table} SET sl_status = 2, sl_pay_time = {$time}, `sl_platform_serial_num`='{$serialNo}',sl_pusd = {$newPusd}, sl_content = '{$sl_content}' WHERE sl_uid = {$uid} AND sl_orderid = '{$orderId}' LIMIT 1";
  1091. }
  1092. }
  1093. oo::commonOprDb('payment')->query($sqlUpdateSummary);
  1094. $data['code'] = 1;
  1095. $sgsid = oo::getDefinedSid($uid);
  1096. $data['data']['sku'] = ($sgsid==1)?$goodInfo['gsku']:str_replace('gworld.cc','astak.crazyspin',$goodInfo['gsku']);
  1097. $data['data']['gid'] = $gid;
  1098. $data['data']['price'] = floatval($goodInfo['gprice']);
  1099. $data = self::goodDataTurnToFormat($data);
  1100. $protectedTime = 300;
  1101. oo::commonOprModel('member')->setUserStealProtect($uid,$protectedTime);
  1102. oo::commonOprModel('Workerman')->push($uid,ocmd::$send['stealProtected'],[ 'expireTime' => time() + $protectedTime]);
  1103. self::updateUserPayCache($uid,$gid,$goodInfo['gprice']);
  1104. self::changeVipStatus($uid,$gid,$goodInfo['gprice'],$param['signature'] == 'fakesignature');
  1105. //仅限: 商场体力(1)
  1106. if(in_array($goodInfo['gtype'],[1]) && !empty($data['data']['spins'])){
  1107. $data = self::payTurnTabBet($uid,$gid,$goodInfo['gprice'],$data);
  1108. }
  1109. /**
  1110. * 排行榜活动期间支付记录 & 活动进度支付统计
  1111. */
  1112. $aid = oo::commonOprModel('activitynew')->activityLock($uid, 'rank');
  1113. $aid && oo::commonOprRedis('activity')->hSetNx(okeys::ActivityBuyGoods($aid), $uid, 1);
  1114. //锦标赛 + 超级收集活动 统计 & 活动进度支付统计
  1115. oo::commonOprModel('statistics')->rankCollectSta($uid,$goodInfo['gprice'],$AssetsInfo['spins']);
  1116. /**
  1117. * 宝藏探索礼包 每次活动只能购买一次
  1118. */
  1119. if(in_array($gid,[1763,1764,1765,1766])){
  1120. if(oo::compareVersion($version,'1.7.2')){
  1121. $aid = oo::commonOprModel('activitynew')->activityLock($uid,"treasure");
  1122. }else{
  1123. $aid = 0;
  1124. }
  1125. // oo::commonOprRedis('activity')->hSet(okeys::treasureQuestGiftLog($aid), $uid, 1);
  1126. oo::commonOprModel('activitynew')->setUserTreasureCacheLog($aid,$uid,"GiftPackBuyStatus",1);
  1127. }
  1128. if(oo::compareVersion($version,'1.7.0')){
  1129. //累计充值活动
  1130. oo::commonOprModel('activitynew')->addSumPayNum($uid,$goodInfo['gprice']);
  1131. //邀请累计充值
  1132. if(oo::compareVersion($version,'1.7.5')){
  1133. oo::commonOprModel('invite')->addSumPayNum($uid,$goodInfo['gprice']);
  1134. }
  1135. }
  1136. $isFirst = 1-intval(oo::commonOprModel('payment')->getUserPayTimes($uid)) == 0 ? true : false;
  1137. $info = oo::commonOprModel('ta')->getPropsSSEventData($propsArr);
  1138. oo::commonOprModel('ta')->setEventData($uid,"order_finish",[
  1139. "order_id"=>$orderId,
  1140. "order_scene_father"=>$order_scene_father,
  1141. "order_scene_son"=>$order_scene_son,
  1142. "shopid"=>$gid,
  1143. "pay_method"=>$sgsid==1 ? "GOOGLE":"IOS",
  1144. //"pay_amount"=>$data['data']['price'],
  1145. "pay_amount"=>!empty($newPusd)?$newPusd:$data['data']['price'],
  1146. "pay_reward_spin"=>$info['reward_spin'],
  1147. "pay_reward_coin"=>$info['reward_coin'],
  1148. "pay_reward_petfood"=>$info['reward_petfood'],
  1149. "pay_reward_petexp"=>$info['reward_petexp'],
  1150. "pay_reward_chest_list"=>empty($info['reward_chest_list'])?[]:$info['reward_chest_list'],
  1151. "pay_reward_activity"=>$info['reward_activity'],
  1152. "pay_reward_activity_time"=>$info['reward_activity_time'],
  1153. "pay_reward_card_list"=>empty($info['reward_card_list'])?[]:$info['reward_card_list'],
  1154. "pay_reward_card_joker"=>$info['reward_card_joker'],
  1155. "is_first_pay"=> $isFirst,
  1156. ]);
  1157. // $props2 = $this->mergeOtherProps($data);
  1158. // if($props2){
  1159. // $data['data']['props2'] = $props2;
  1160. // }
  1161. // if(empty($data['data']['props'])){
  1162. // unset($data['data']['props']);
  1163. // }
  1164. if($isFirst){
  1165. $this->getUserFirstPayTS($uid,true);//更新首次支付时间
  1166. oo::commonOprModel('ta')->setEventData($uid,'user_setOnce',["first_pay_time"=>time()]);
  1167. }
  1168. return json_encode($data);
  1169. }
  1170. public function mergeOtherProps($data) {
  1171. if(empty($data['data'])){
  1172. return [];
  1173. }
  1174. $props2 = empty($data['data']['props']) ? [] : $data['data']['props'];
  1175. $propIds = array_column($props2, 'num','propsId');
  1176. if(!empty($data['data']['coins']) && !isset($propIds[14])){
  1177. $props2[] = ['propsId' =>14, 'num' => $data['data']['coins']];
  1178. }
  1179. if(!empty($data['data']['spins']) && !isset($propIds[15])){
  1180. $props2[] = ['propsId' =>15, 'num' => $data['data']['spins']];
  1181. }
  1182. if(!empty($data['data']['crazyPassExp']) && !isset($propIds[38])){
  1183. $props2[] = ['propsId' =>38, 'num' => $data['data']['crazyPassExp']];
  1184. }
  1185. if(!empty($data['data']['petFeed']) && !isset($propIds[9])){
  1186. $props2[] = ['propsId' =>9, 'num' => $data['data']['petFeed']];
  1187. }
  1188. if(!empty($data['data']['petExp']) && !isset($propIds[8])){
  1189. $props2[] = ['propsId' =>8, 'num' => $data['data']['petExp']];
  1190. }
  1191. if(!empty($data['data']['goldCard']) && !isset($propIds[13])){
  1192. $props2[] = ['propsId' =>13, 'num' => $data['data']['goldCard']];
  1193. }
  1194. return $props2;
  1195. }
  1196. /**
  1197. * 支付加倍转盘 发货
  1198. * @param $param
  1199. * @return false|string
  1200. * Created by: Hss
  1201. * Created on: 2020/7/21 17:54
  1202. */
  1203. public function payBet($uid,$orderId,$returnJson = true){
  1204. //支付加倍逻辑
  1205. $TurnPaybetLog = oo::commonOprRedis('common')->hGet(okeys::TurnPaybetLog(),$uid);
  1206. if(!empty($TurnPaybetLog)){
  1207. oo::commonOprRedis('common')->hDel(okeys::TurnPaybetLog(),$uid);//删除数据
  1208. $TurnPaybetLog = json_decode($TurnPaybetLog,1);
  1209. if($orderId == '免费' && $TurnPaybetLog['gid'] != 0){
  1210. return ($returnJson?oo::response(-2,[],'支付加倍免费转盘 发货失败'):false);
  1211. }
  1212. if(!empty($TurnPaybetLog['reward']['spins'])){
  1213. $gbaseReward = $TurnPaybetLog['reward']['spins'] * ( $TurnPaybetLog['bet'] - 1 );
  1214. oo::commonOprModel('member')->optProperty($uid,['spins'=>$gbaseReward],'+',500,'支付加倍获得体力:'.$orderId.",bet:".$TurnPaybetLog['bet']);
  1215. $data['data']=['spins'=>$gbaseReward];
  1216. if(isset($TurnPaybetLog['reward']['gtype'])&&$TurnPaybetLog['reward']['gtype']==1){//充值体力时,判断是否有体力大师活动加进度
  1217. // oo::commonOprModel('activitynew')->addCommonScore($uid,'spins_master',intval($gbaseReward));
  1218. }
  1219. return ($returnJson?oo::response(1):true);
  1220. }else{
  1221. oo::logs()->debug5(['uid'=>$uid,'支付加倍'=>'奖励没有体力','time'=>time()],date('Ymd').'.log','payBet/');
  1222. }
  1223. }else{
  1224. oo::logs()->debug5(['uid'=>$uid,'支付加倍'=>'redis key 丢失','time'=>time()],date('Ymd').'.log','payBet/');
  1225. }
  1226. return ($returnJson?oo::response(-2,[],'支付加倍转盘 发货失败'):false);
  1227. }
  1228. /**
  1229. * 新版发货
  1230. * @param $param
  1231. * @return false|string
  1232. * Created by: Owen
  1233. * Created on: 2020/4/26 16:59
  1234. */
  1235. public function payment2($param){
  1236. $uid = oo::functions()->uint($param['uid']);
  1237. $sid = !empty($param['sid']) ? (int)$param['sid'] : oo::getDefinedSid($uid);
  1238. $deviceid = oo::getDefinedDeviceId($uid, $sid);
  1239. switch ($deviceid){
  1240. case 2:
  1241. $extraData = json_decode(base64_decode(oo::functions()->escape($param['extraData'])),true);
  1242. if(empty($extraData)){
  1243. $iosInApp = oo::commonOprModel('paymentapple')->validateApplePay($param);
  1244. $sku = str_replace('newsky.cc','sa.crazygod',$iosInApp['product_id']);
  1245. $tb = otable::goodsCrazy();
  1246. $goodInfo = oo::commonOprDb('payment')->getOne("SELECT * FROM {$tb} WHERE gsku='{$sku}' LIMIT 1",MYSQLI_ASSOC);
  1247. $extraData = [
  1248. 'uid' => $uid,
  1249. 'gid' => $goodInfo['gid'],
  1250. 'ggameid' => $goodInfo['ggameid'],
  1251. ];
  1252. }
  1253. $orderStatus= self::createOrder($extraData);
  1254. if($orderStatus['code'] == 1){
  1255. $param['orderId'] = $orderStatus['orderId'];
  1256. $param['version'] = $orderStatus['version'];
  1257. return self::payment($param,true);
  1258. }
  1259. break;
  1260. default:
  1261. $signedData = base64_decode($param['signedData']);
  1262. $signedData = json_decode($signedData, true);
  1263. if( !is_array($signedData) ){
  1264. return json_encode(['code'=>-4,'msg'=>'signedData error']);
  1265. }
  1266. if($param['signature'] != 'fakesignature'){
  1267. $ret = oo::commonOprModel('paymentgoogle')->validateGooglePay($param);//验证失败
  1268. if(!$ret){
  1269. return json_encode(['code'=>-3,'msg'=>'Google sign error']);
  1270. }
  1271. $googleOrderId = $signedData['orderId'];
  1272. $purchaseTime = intval($signedData['purchaseTime']/1000);
  1273. $tb = otable::summarylist();
  1274. $sql= "SELECT * FROM {$tb} WHERE sl_platform_serial_num='{$googleOrderId}' AND sl_pay_time>={$purchaseTime} LIMIT 1";
  1275. $ret= oo::commonOprDb('common')->getOne($sql,MYSQLI_ASSOC);
  1276. if(!empty($ret)){
  1277. return json_encode(['code'=>1,'google orderId was used']);
  1278. }
  1279. }
  1280. $orderInfo = json_decode(base64_decode($signedData['developerPayload']),true);
  1281. $orderStatus= self::createOrder($orderInfo);
  1282. if($orderStatus['code'] == 1){
  1283. $param['orderId'] = $orderStatus['orderId'];
  1284. $param['version'] = $orderStatus['version'];
  1285. return self::payment($param,true);
  1286. }
  1287. }
  1288. return oo::response(-2,[],'订单创建失败');
  1289. }
  1290. //三方支付订单验证
  1291. private function checkPlatOrder(array $param) {
  1292. if(empty($param['plat']) || empty($param['orderId'])){
  1293. return false;
  1294. }
  1295. $uid = oo::functions()->uint($param['uid']);
  1296. $orderId = $param['orderId'];
  1297. switch($param['plat']){
  1298. case 'vivo':
  1299. $region = empty($param['region']) ? '' : $param['region'];
  1300. if(!oo::commonOprModel('paymentvivo')->qryOrder($orderId, $uid, $region)){
  1301. oo::logs()->debug3(array('uid' => $uid, 'data' => $param), 'vivoOrder.log');
  1302. return false;
  1303. }
  1304. return true;
  1305. default:
  1306. }
  1307. return false;
  1308. }
  1309. /**
  1310. * 谷歌、vivo、测试等类型签名验证
  1311. * @param array $signedData
  1312. * @param int array $orderInfo
  1313. * @return mixed
  1314. */
  1315. public function verifySignature(array $signedData = [], array $orderInfo = [], $param = []) {
  1316. $orderId = $orderInfo['orderId'];
  1317. if(!funs::concurrentLock($orderId,'PlatformSerialNum',6)){
  1318. return ['code'=>-500,'msg'=>'order be locked','err'=>9];
  1319. }
  1320. if($param['signature'] == 'fakesignature'){
  1321. return true;
  1322. }
  1323. //vivo pay
  1324. if(!empty($param['plat'])){
  1325. if(IS_DEBUF){
  1326. return true;
  1327. }else{
  1328. return $this->checkPlatOrder($param);
  1329. }
  1330. }
  1331. //google pay
  1332. $purchaseTime = intval($signedData['purchaseTime']/1000);
  1333. $googleOrderId = $signedData['orderId'];
  1334. $tb = otable::summarylist();
  1335. $sql= "SELECT * FROM {$tb} WHERE sl_platform_serial_num='{$googleOrderId}' AND sl_pay_time>={$purchaseTime} LIMIT 1";
  1336. $ret= oo::commonOprDb('common')->getOne($sql,MYSQLI_ASSOC);
  1337. if(!empty($ret)){
  1338. return ['code'=>1,'google orderId was used','err'=>10];
  1339. }
  1340. if(!oo::commonOprModel('paymentgoogle')->validateGooglePayOauth($signedData,$param)){//验证失败
  1341. return ['code'=>-3,'msg'=>'Google sign error','err'=>11];
  1342. }
  1343. return true;
  1344. }
  1345. /**
  1346. * 支付auth 2.0
  1347. * @param $param
  1348. * @return false|string
  1349. * Created by: Owen
  1350. * Created on: 2020/8/6 16:27
  1351. */
  1352. public function payment3($param){
  1353. $uid = oo::functions()->uint($param['uid']);
  1354. $sid = !empty($param['sid']) ? (int)$param['sid'] : oo::getDefinedSid($uid);
  1355. $deviceid = oo::getDefinedDeviceId($uid, $sid);
  1356. $tss['ts1'] = oo::getMsectime();
  1357. switch ($deviceid){
  1358. case 2:
  1359. $extraData = json_decode(base64_decode(oo::functions()->escape($param['extraData'])),true);
  1360. $serialNo = isset($param['transactionId']) ? $param['transactionId'] : '0';
  1361. if(empty($extraData)){
  1362. $iosInApp = oo::commonOprModel('paymentapple')->validateApplePay($param);
  1363. $sku = str_replace('astak.crazyspin','gworld.cc',$iosInApp['product_id']);
  1364. $tb = otable::goodsCrazy();
  1365. $goodInfo = oo::commonOprDb('payment')->getOne("SELECT * FROM {$tb} WHERE gsku='{$sku}' LIMIT 1",MYSQLI_ASSOC);
  1366. $extraData = [
  1367. 'uid' => $uid,
  1368. 'gid' => $goodInfo['gid'],
  1369. 'ggameid' => $goodInfo['ggameid'],
  1370. ];
  1371. }
  1372. if(empty($param['gid']) && !empty($extraData['gid'])){
  1373. $param['gid'] = $extraData['gid'];
  1374. }
  1375. $oldOrder = [];
  1376. if((string)$serialNo && $serialNo !== '0'){
  1377. $extraData['serialNo'] = $serialNo;
  1378. $tb = otable::payment($uid);
  1379. $sql = "SELECT * FROM {$tb} WHERE uid={$uid} AND platform_serial_num='{$serialNo}' LIMIT 1";
  1380. $oldOrder = oo::commonOprDb('payment')->getOne($sql,MYSQLI_ASSOC);
  1381. }
  1382. if(!empty($oldOrder)){
  1383. $gid = oo::functions()->uint($param['gid']);
  1384. $orderStatus = ['code' => 1, 'orderId' => $oldOrder['order_id'], 'gid' => $gid];
  1385. }else{
  1386. $orderStatus = self::createOrder($extraData);
  1387. }
  1388. $tss['ts5'] = oo::getMsectime();
  1389. if($orderStatus['code'] == 1){
  1390. $param['orderId'] = $orderStatus['orderId'];
  1391. $param['version'] = $orderStatus['version'];
  1392. $ret = self::payment($param,true);
  1393. //日志记录
  1394. $tss['ts6'] = oo::getMsectime();
  1395. $passTs = $tss['ts6']-$tss['ts1'];
  1396. if($passTs>2000){
  1397. oo::logs()->debug3(['ts'=>$tss,'gid'=>$extraData['gid'],"uid"=>$param['uid']],'paymentTime.log');
  1398. }
  1399. $retArr = json_decode($ret,true);
  1400. if($retArr['err']&&!in_array(intval($extraData['gid']),[801,803])){
  1401. oo::logs()->debug3(["ts"=>time(),"uid"=>$param['uid'],"param"=>$param,"err"=>$retArr],'payment_err.log');
  1402. }
  1403. return $ret;
  1404. }
  1405. break;
  1406. default:
  1407. $signedData = base64_decode($param['signedData']);
  1408. $signedData = json_decode($signedData, true);
  1409. if( !is_array($signedData) ){
  1410. $ret = json_encode(['code'=>-4,'msg'=>'signedData error','err'=>12]);
  1411. oo::logs()->debug3(["ts"=>time(),"uid"=>$param['uid'],"param"=>$param,"err"=>$ret],'payment_err.log');
  1412. return $ret;
  1413. }
  1414. $orderInfo=empty($param['extraData'])?[]:(array)json_decode(base64_decode($param['extraData']),true);
  1415. $uid = oo::functions()->uint($param['uid']);
  1416. if(empty($uid)){
  1417. $ret = json_encode(['code'=>-500,'msg'=>'order info error','err'=>13]);
  1418. oo::logs()->debug3(["ts"=>time(),"uid"=>$param['uid'],"param"=>$param,"err"=>$ret],'payment_err.log');
  1419. return $ret;
  1420. }
  1421. //预处理订单号
  1422. if(!empty($param['plat'])){
  1423. if(empty($param['orderId']) || strlen($param['orderId']) != 32){
  1424. //vivo或其他支付平台需传递orderid
  1425. $ret = json_encode(['code'=>-500,'msg'=>'3rd plat order id error','err'=>14]);
  1426. oo::logs()->debug3(["ts"=>time(),"uid"=>$param['uid'],"param"=>$param,"err"=>$ret],'payment_err.log');
  1427. return $ret;
  1428. }
  1429. $orderInfo['orderId'] = $param['orderId'];
  1430. $orderInfo['plat'] = $param['plat'];
  1431. }else{
  1432. $orderInfo['orderId'] = $this->createOrderId($uid, self::GGAMEID);
  1433. }
  1434. $orderInfo['uid'] = $uid;
  1435. if(empty($orderInfo['gid']) && !empty($orderInfo['serialNo'])){
  1436. $matchNum = preg_match('/^GPA.*\.\.\d$/', $orderInfo['serialNo'], $matchRes);
  1437. $matchNum && $orderInfo['gid'] = 801; //gid为0的订单,尾部带了2个点的自动转化为801订阅商品
  1438. }
  1439. $ret = $this->verifySignature($signedData, $orderInfo, $param);
  1440. if(is_array($ret) || !$ret){
  1441. if(!(in_array(intval($orderInfo['gid']),[801,803])&&isset($ret['err'])&&intval($ret['err'])==10)){
  1442. oo::logs()->debug3(["ts"=>time(),"uid"=>$param['uid'],"param"=>$param,"err"=>$ret],'payment_err.log');
  1443. }
  1444. return json_encode((array)$ret);
  1445. }
  1446. $orderStatus= self::createOrder($orderInfo);
  1447. $tss['ts5'] = oo::getMsectime();
  1448. if($orderStatus['code'] == 1){
  1449. $param['orderId'] = $orderStatus['orderId'];
  1450. $param['version'] = $orderStatus['version'];
  1451. $ret = self::payment($param,true);
  1452. //日志记录
  1453. $tss['ts6'] = oo::getMsectime();
  1454. $passTs = $tss['ts6']-$tss['ts1'];
  1455. if($passTs>2000){
  1456. oo::logs()->debug3(['ts'=>$tss,'gid'=>$orderInfo['gid'],"uid"=>$orderInfo['uid']],'paymentTime.log');
  1457. }
  1458. $retArr = json_decode($ret,true);
  1459. if($retArr['err']&&!in_array(intval($orderInfo['gid']),[801,803])){
  1460. oo::logs()->debug3(["ts"=>time(),"uid"=>$param['uid'],"param"=>$param,"err"=>$ret],'payment_err.log');
  1461. }
  1462. return $ret;
  1463. }
  1464. }
  1465. return oo::response(-2,[],'订单创建失败');
  1466. }
  1467. /**
  1468. * 获取体力月卡的状态
  1469. * @param $uid
  1470. * @param $gid
  1471. * @return mixed
  1472. * Created by: Owen
  1473. * Created on: 2019/12/25 15:00
  1474. */
  1475. public function getSpinMonthly($uid,$gid){
  1476. $status = oo::commonOprRedis('usercache')->get(okeys::SpinMonthly($uid,$gid));
  1477. if($status === 0){
  1478. return false;
  1479. }
  1480. if($status === false){
  1481. $tb = otable::payment($uid);
  1482. $time = time();
  1483. $sql = "SELECT * FROM {$tb} WHERE status=2 AND uid={$uid} AND gid={$gid} AND buff>'{$time}' ORDER BY buff DESC LIMIT 1";
  1484. $ret = oo::commonOprDb('payment')->getOne($sql,MYSQLI_ASSOC);
  1485. if(!empty($ret)){
  1486. $tb = otable::goodsCrazy();
  1487. $sql = "SELECT * FROM {$tb} WHERE gid={$gid}";
  1488. $goods = oo::commonOprDb('payment')->getOne($sql,MYSQLI_ASSOC);
  1489. $reward = json_decode($goods['gbaseReward'],true);
  1490. $record = [
  1491. 'endTime'=>$ret['buff'],
  1492. 'num' =>$reward['daily'],
  1493. ];
  1494. $endTime = strtotime("23:59:59") + 29*24*60*60;
  1495. if($ret['buff'] > $endTime){
  1496. $expire = $endTime - time();
  1497. }else{
  1498. $expire = $ret['buff'] - time();
  1499. }
  1500. oo::commonOprRedis('usercache')->setex(okeys::SpinMonthly($uid,$gid),json_encode($record,JSON_NUMERIC_CHECK),$expire);
  1501. return $record;
  1502. }else{
  1503. oo::commonOprRedis('usercache')->setex(okeys::SpinMonthly($uid,$gid),0,7*24*60*60);
  1504. }
  1505. }else{
  1506. return json_decode($status,true);
  1507. }
  1508. }
  1509. /**
  1510. * 获得用户充值总值
  1511. * @param $uid
  1512. * @param $day
  1513. * @return mixed
  1514. * Created by: owen
  1515. * Created on: 2020/2/6 16:56
  1516. */
  1517. public function getUserTotalPayNum($uid,$day = 0){
  1518. $cacheKey = okeys::UserTotalPayNum($uid);
  1519. $cache = oo::commonOprRedis('User')->hGet($cacheKey,$day);
  1520. if($cache !== false){
  1521. return $cache;
  1522. }
  1523. $tb = otable::payment($uid);
  1524. if($day > 0){
  1525. $time= time() - $day * 24*60*60;
  1526. $sql = "SELECT COALESCE(SUM(pusd),0) AS sum FROM {$tb} WHERE uid={$uid} AND status=2 AND pay_time>{$time}";
  1527. }else{
  1528. $sql = "SELECT COALESCE(SUM(pusd),0) AS sum FROM {$tb} WHERE uid={$uid} AND status=2";
  1529. }
  1530. $ret = oo::commonOprDb('payment')->getOne($sql,MYSQLI_ASSOC);
  1531. $sum = round($ret['sum'],2);
  1532. oo::commonOprRedis('User')->hSet($cacheKey,$day,$sum);
  1533. oo::commonOprRedis('User')->expire($cacheKey,oo::redisRandomExpire(7*24*60*60));
  1534. return $sum;
  1535. }
  1536. /**
  1537. * 获得用户充值总次数
  1538. * @param $uid
  1539. * @return false|int
  1540. * Created by: Owen
  1541. * Created on: 2020/12/1 15:06
  1542. */
  1543. public function getUserPayTimes($uid,$day = 0){
  1544. $cacheKey = okeys::UserPayTimes($uid);
  1545. $cache = oo::commonOprRedis('User')->hGet($cacheKey,$day);
  1546. if($cache !== false){
  1547. return intval($cache);
  1548. }
  1549. $tb = otable::payment($uid);
  1550. if($day){
  1551. $time= time() - $day * 24*60*60;
  1552. $ret = oo::commonOprDb('payment')->getOne("SELECT COUNT(*) AS count FROM {$tb} WHERE uid={$uid} AND status=2 AND pay_time>{$time}",MYSQLI_ASSOC);
  1553. }else{
  1554. $ret = oo::commonOprDb('payment')->getOne("SELECT COUNT(*) AS count FROM {$tb} WHERE uid={$uid} AND status=2",MYSQLI_ASSOC);
  1555. }
  1556. oo::commonOprRedis('User')->hSet($cacheKey,$day,intval($ret['count']));
  1557. oo::commonOprRedis('User')->expire($cacheKey,oo::redisRandomExpire(7*24*60*60));
  1558. return intval($ret['count']);
  1559. }
  1560. /**
  1561. * Notes:获取首次支付时间
  1562. * User: wsc
  1563. * Time: 2021/6/8 10:19
  1564. * @param $uid
  1565. * @param bool $db
  1566. * @return false|string
  1567. */
  1568. public function getUserFirstPayTS($uid,$db=false){
  1569. $key = okeys::UserFirstPayTS($uid);
  1570. $cache = oo::commonOprRedis('User')->get($key);
  1571. if(!$cache||$db){
  1572. oo::commonOprRedis('User')->delete($key);
  1573. $tb = otable::payment($uid);
  1574. $sql = "SELECT pay_time FROM {$tb} WHERE uid={$uid} and status=2 ORDER BY pay_time ASC LIMIT 1";
  1575. $info = oo::commonOprDb('payment')->getOne($sql,1);
  1576. if($info){
  1577. $cache = $info['pay_time'];
  1578. }else{
  1579. $cache = 1;
  1580. }
  1581. oo::commonOprRedis('User')->setex($key,$cache,7*86400);
  1582. }
  1583. // else{
  1584. // oo::commonOprRedis('User')->expire($key,7*86400);
  1585. // }
  1586. if($cache>1){
  1587. $ts = $cache;
  1588. }else{
  1589. $ts = 0;
  1590. }
  1591. return $ts;
  1592. }
  1593. /**
  1594. * 当天充值金额
  1595. * @param $uid
  1596. * @return mixed
  1597. * Created by: Owen
  1598. * Created on: 2020/4/23 11:36
  1599. */
  1600. public function getUserDayPayNum($uid){
  1601. $cache = oo::commonOprRedis('User')->get(okeys::UserDayPayNum($uid));
  1602. if(!empty($cache)){
  1603. return $cache;
  1604. }
  1605. $tb = otable::payment($uid);
  1606. $startTime = strtotime("00:00:00");
  1607. $endTime = strtotime("23:59:59");
  1608. $sql = "SELECT COALESCE(SUM(pusd),0) AS sum FROM {$tb} WHERE uid={$uid} AND status=2 AND pay_time>{$startTime} AND pay_time<{$endTime}";
  1609. $ret = oo::commonOprDb('payment')->getOne($sql,MYSQLI_ASSOC);
  1610. $sum = round($ret['sum'],2);
  1611. oo::commonOprRedis('User')->setex(okeys::UserDayPayNum($uid),$sum,24*60*60);
  1612. return $sum;
  1613. }
  1614. /**
  1615. * 购买矿工小游戏次数
  1616. * @param $uid
  1617. * @return string
  1618. * Created by: Owen
  1619. * Created on: 2020/5/12 12:20
  1620. */
  1621. public function buyMiningGameCount($uid){
  1622. $coins = oo::commonOprModel('goods')->getGoodCoins($uid,'coins01');
  1623. $coins = intval($coins * 0.25);
  1624. $userInfo = oo::commonOprModel('member')->getUserAssetsInfo($uid);
  1625. if($userInfo['money'] < $coins){
  1626. return oo::response(-2,[],'金币不足');
  1627. }
  1628. $ret = oo::commonOprModel('member')->optProperty($uid,array('money'=>$coins),'-',22,"矿工小游戏");
  1629. if($ret){
  1630. $ttl = max(0,oo::commonOprRedis('common')->ttl(okeys::MiningGame($uid)));
  1631. $count = intval(oo::commonOprRedis('common')->get(okeys::MiningGame($uid)));
  1632. oo::commonOprRedis('common')->setex(okeys::MiningGame($uid),max(0,$count-1),$ttl);
  1633. oo::commonOprRedis('common')->hIncrBy(okeys::MiningGame(),$uid,-1);
  1634. return oo::response(1,oo::commonOprModel('mining')->getGameInfo($uid,2),'',true);
  1635. }
  1636. return oo::response(-2,[],'金币不足');
  1637. }
  1638. /**
  1639. * 购买矿工小游戏次数
  1640. * @param $uid
  1641. * @return string
  1642. * Created by: Owen
  1643. * Created on: 2020/5/12 12:20
  1644. */
  1645. public function buyMiningGameCountByDiamond($uid){
  1646. $userInfo = oo::commonOprModel('member')->getUserAssetsInfo($uid);
  1647. $refreshTimeDiamondNum = oo::commonOprModel('mining')->getRefreshTimeDiamond();
  1648. if($userInfo['diamond'] < $refreshTimeDiamondNum){
  1649. return oo::response(errorCode::DIAMOND_NOT_ENOUGH,[],'钻石不足');
  1650. }
  1651. $ret = oo::commonOprModel('member')->optProperty($uid,array('diamond'=>$refreshTimeDiamondNum),'-',22,"矿工小游戏");
  1652. if($ret){
  1653. $ttl = max(0,oo::commonOprRedis('common')->ttl(okeys::MiningGame($uid)));
  1654. $count = intval(oo::commonOprRedis('common')->get(okeys::MiningGame($uid)));
  1655. oo::commonOprRedis('common')->setex(okeys::MiningGame($uid),max(0,$count-1),$ttl);
  1656. oo::commonOprRedis('common')->hIncrBy(okeys::MiningGame(),$uid,-1);
  1657. return oo::response(1,oo::commonOprModel('mining')->getGameInfo($uid,2),'',true);
  1658. }
  1659. return oo::response(errorCode::DIAMOND_NOT_ENOUGH,[],'钻石不足');
  1660. }
  1661. /**
  1662. * ios vip 监听定时器
  1663. * Created by: Owen
  1664. * Created on: 2020/5/12 20:36
  1665. */
  1666. public function vipMonitor(){
  1667. $_urlBuy = "https://buy.itunes.apple.com/verifyReceipt";
  1668. $_urlSanbox = "https://sandbox.itunes.apple.com/verifyReceipt";
  1669. $tb = otable::subscription(2);
  1670. $summarylist = otable::summarylist();
  1671. $ret = oo::commonOprRedis('common')->zRangeByScore(okeys::VipMonitor(),0,time() - 24*60*60,['withscores'=>true]);
  1672. foreach ($ret as $transaction_id => $time){
  1673. $ret = oo::commonOprDb('common')->getOne("SELECT * FROM {$tb} WHERE transaction_id='{$transaction_id}' LIMIT 1",1);
  1674. if(!empty($ret)){
  1675. $receipt = $ret['latest_receipt'];
  1676. $postDataArr = array("receipt-data" => $receipt , "password" => "b8dd1ad711de4bbdb7b08a4fa2706b04");
  1677. $postData = json_encode($postDataArr);
  1678. $iosData = oo::functions()->curl($_urlBuy, $postData);
  1679. if($iosData['status'] === 0){
  1680. $expires_date = ceil($iosData['latest_receipt_info']['expires_date']/1000);
  1681. if(time() < $expires_date){
  1682. $transaction_uid = oo::commonOprDb('common')->getOne("SELECT * FROM {$summarylist} WHERE sl_platform_serial_num='{$transaction_id}' LIMIT 1",MYSQLI_ASSOC);
  1683. oo::commonOprModel('member')->getUserInfo($transaction_uid['sl_uid'], NULL, TRUE,[
  1684. 'svip' => 1,
  1685. 'svip_expire' => $expires_date,
  1686. ]);
  1687. oo::commonOprRedis('common')->zAdd(okeys::VipMonitor(),$expires_date,$transaction_id);
  1688. }else{
  1689. oo::commonOprRedis('common')->zDelete(okeys::VipMonitor(),$transaction_id);
  1690. }
  1691. }elseif($iosData['status'] == 21007){//沙盒测试
  1692. $iosData = oo::functions()->curl($_urlSanbox, $postData);
  1693. if($iosData['status'] === 0){
  1694. $expires_date = ceil($iosData['latest_receipt_info']['expires_date']/1000);
  1695. if(time() < $expires_date){
  1696. $transaction_uid = oo::commonOprDb('common')->getOne("SELECT * FROM {$summarylist} WHERE sl_platform_serial_num='{$transaction_id}' LIMIT 1",MYSQLI_ASSOC);
  1697. oo::commonOprModel('member')->getUserInfo($transaction_uid['sl_uid'], NULL, TRUE,[
  1698. 'svip' => 1,
  1699. 'svip_expire' => $expires_date,
  1700. ]);
  1701. oo::commonOprRedis('common')->zAdd(okeys::VipMonitor(),$expires_date,$transaction_id);
  1702. }else{
  1703. oo::commonOprRedis('common')->zDelete(okeys::VipMonitor(),$transaction_id);
  1704. }
  1705. }
  1706. }
  1707. }
  1708. }
  1709. }
  1710. /**
  1711. * 购买星星兑换次数
  1712. * @param $uid
  1713. * @param $propsId
  1714. * @return string
  1715. * Created by: Owen
  1716. * Created on: 2020/6/10 20:46
  1717. */
  1718. public function starExchange($uid,$propsId){
  1719. $config = oo::commonOprModel('config')->getStarExchange($propsId);
  1720. $cacheKey = okeys::StarExchangeBuyTimer($uid,$propsId);
  1721. $timer = intval(oo::commonOprRedis('User')->get($cacheKey));
  1722. if($timer >= count($config['chestPrice'])){
  1723. return oo::response(-2,"","达到购买上限");
  1724. }
  1725. $bet = $config['chestPrice'][$timer];
  1726. if(empty($bet)){
  1727. return oo::response(-2,"","达到购买上限");
  1728. }
  1729. $refreshTime = intval(oo::commonOprRedis('User')->ttl(okeys::StarExchange($uid,$propsId)));
  1730. if($refreshTime <= 0){
  1731. return oo::response(-2,"","购买异常");
  1732. }
  1733. $userInfo = oo::commonOprModel('member')->getUserAssetsInfo($uid);
  1734. $coins = oo::commonOprModel('config')->getActivityCoins(max($userInfo['levelId'],1),"starExchange");
  1735. $coins = $coins * $bet;
  1736. if($userInfo['money'] < $coins){
  1737. return oo::response(-2,"","金币不足");
  1738. }
  1739. $ret = oo::commonOprModel('member')->optProperty($uid,['money'=>$coins],'-',33,"购买星星兑换次数");
  1740. if($ret > 0){
  1741. oo::commonOprRedis('User')->setex($cacheKey,$timer+1,$refreshTime);
  1742. oo::commonOprRedis('User')->delete(okeys::StarExchange($uid,$propsId));
  1743. return oo::response(1);
  1744. }else{
  1745. return oo::response(-2,"","金币不足");
  1746. }
  1747. }
  1748. /**
  1749. * 连环礼包
  1750. * @param $uid
  1751. * @param $gid
  1752. * @return string
  1753. * Created by: Owen
  1754. * Created on: 2020/6/12 14:29
  1755. */
  1756. public function buyGift($uid,$gid){
  1757. if(in_array($gid,[710,711,712])){
  1758. $cacheKey = okeys::SerialPackTimer($uid,$gid);
  1759. $timer = oo::commonOprRedis('common')->hGet(okeys::SerialPackTimer(),$cacheKey);
  1760. $goodInfo = oo::commonOprModel('goods')->getGoodsInfoByGid($gid);
  1761. if($timer >= $goodInfo['gMax']){
  1762. return oo::response(-2,[],"次数达到上限");
  1763. }
  1764. if(strpos($goodInfo['gsku'],'com.sa') !== false||strpos($goodInfo['gsku'],'com.gworld') !== false||strpos($goodInfo['gsku'],'gworld.cc') !== false||strpos($goodInfo['gsku'],'astak.crazyspin') !== false){
  1765. return oo::response(-2,[],"商品异常");
  1766. }
  1767. $price = json_decode($goodInfo['gsku'],true);
  1768. $price = oo::commonOprModel('goods')->getGoodCoins($uid,$price['coins']) * $price['bet'];
  1769. $money = oo::commonOprModel('member')->getUserAssetsInfo($uid)['money'];
  1770. if(intval($price)>0&&$money<intval($price)){
  1771. return oo::response(-2,[],"金币不足");
  1772. }
  1773. oo::commonOprModel('member')->optProperty($uid,['money'=>$price],'-',450,$goodInfo['gdesc']);
  1774. $reward = json_decode($goodInfo['gbaseReward'],true);
  1775. $coin = oo::commonOprModel('goods')->getGoodCoins($uid,$reward['coins']['coins']) * $reward['coins']['bet'];
  1776. oo::commonOprModel('member')->optProperty($uid,['money'=>$coin,'spins'=>$reward['spins']],'+',450,$goodInfo['gdesc']);
  1777. $data = [];
  1778. foreach ($reward['props'] as $row){
  1779. if(in_array($row['propsId'],[19,20,21,29,30])){
  1780. $skin = isset($row['skin']) ? (int)$row['skin'] : 0;
  1781. $data['treasureChest'] = oo::commonOprModel('props')->rewardChest($uid,$row['propsId'],'',450, $skin);
  1782. }else{
  1783. oo::commonOprModel('member')->sendReward($uid,$row['propsId'],$row['num'],450,$goodInfo['gdesc']);
  1784. }
  1785. }
  1786. oo::commonOprRedis('common')->hIncrBy(okeys::SerialPackTimer(),$cacheKey,1);
  1787. return oo::response(1,$data,"",true);
  1788. }
  1789. return oo::response(-2,[],"商品异常");
  1790. }
  1791. /**
  1792. * Notes:连环礼包领奖
  1793. * User: wsc
  1794. * Time: 2020/8/21 17:17
  1795. * @param $uid
  1796. * @param $aid
  1797. * @param $gid
  1798. * @return string
  1799. */
  1800. public function buyGiftNew($uid,$aid,$gid){
  1801. if(in_array($gid,[710,711,712])){
  1802. $res =$this->sendGift($uid,$aid,$gid,1);
  1803. if($res==-1){
  1804. return oo::response(-2,[],"次数达到上限");
  1805. }
  1806. if($res==-2){
  1807. return oo::response(-2,[],"金币不足");
  1808. }
  1809. if($res==-3){
  1810. return oo::response(-2,[],"该商品需付费");
  1811. }
  1812. return oo::response(1,$res);
  1813. }
  1814. return oo::response(-2,[],"商品异常");
  1815. }
  1816. /**
  1817. * Notes:连环礼包奖励发放
  1818. * User: wsc
  1819. * Time: 2020/8/21 18:02
  1820. * @param $uid
  1821. * @param $aid
  1822. * @param $gid
  1823. * @return array
  1824. */
  1825. public function sendGift($uid,$aid,$gid,$d=0){
  1826. $cacheKey = $uid.'_'.$gid;
  1827. $timer = oo::commonOprRedis('activity')->hGet(okeys::buyChainGiftLimit($aid),$cacheKey);
  1828. $goodInfo = oo::commonOprModel('activitynew')->getChainGiftConf($uid,$aid,$gid);
  1829. if($timer >= $goodInfo['gMax']){
  1830. return -1;
  1831. }
  1832. if($d==1&&$goodInfo['sku']){
  1833. return -3;
  1834. }
  1835. if(intval($goodInfo['price'])>0&&!$goodInfo['sku']){
  1836. $money = oo::commonOprModel('member')->getUserAssetsInfo($uid)['money'];
  1837. if($money<intval($goodInfo['price'])){
  1838. return -2;
  1839. }
  1840. oo::commonOprModel('member')->optProperty($uid,['money'=>$goodInfo['price']],'-',450,$goodInfo['gdesc']."--gid:{$gid}--aid:{$aid}");
  1841. }
  1842. $reward['reward'] = $goodInfo['gbaseReward'];
  1843. oo::commonOprModel('member')->optProperty($uid,['money'=>$goodInfo['coin'],'spins'=>$goodInfo['spin']],'+',450,$goodInfo['gdesc']."--gid:{$gid}--aid:{$aid}");
  1844. foreach ($goodInfo['props'] as $k=>$row){
  1845. if(in_array($row['propsId'],[19,20,21,29,30])){
  1846. $skin = isset($row['skin']) ? (int)$row['skin'] : 0;
  1847. $reward['treasureChest'] = oo::commonOprModel('props')->rewardChest($uid,$row['propsId'],'',450, $skin);
  1848. $goodInfo['props'][$k]['value'] = $reward['treasureChest'];
  1849. }else{
  1850. $res = oo::commonOprModel('member')->sendReward($uid,$row['propsId'],$row['num'],450,$goodInfo['gdesc']."--gid:{$gid}--aid:{$aid}",$aid);
  1851. if(in_array($row['propsId'],[13,18,19,20,21,29,30])){
  1852. $goodInfo['props'][$k]['value'] =$res;
  1853. }
  1854. }
  1855. }
  1856. oo::commonOprRedis('activity')->hIncrBy(okeys::buyChainGiftLimit($aid),$cacheKey,1);
  1857. $reward['props'] = $goodInfo['props'];
  1858. return $reward;
  1859. }
  1860. /**
  1861. * Notes:购买超级连环礼包
  1862. * User: wsc
  1863. * Time: 2020/11/25 19:54
  1864. * @param $uid
  1865. * @param $aid
  1866. * @param $gid
  1867. * @return string
  1868. */
  1869. public function buySuperSerialPack($uid,$aid,$gid){
  1870. if(!$aid){
  1871. return oo::response(errorCode::NOT_FOUND_ACTIVITY,[],"活动未绑定");
  1872. }
  1873. if(($gid>720&&$gid<=750)||($gid>760&&$gid<=790)){
  1874. $res =$this->sendReward($uid,$gid,$aid,1);
  1875. if($res==-1){
  1876. return oo::response(errorCode::NOT_FOUND_GOODINFO,[],"商品信息不存在");
  1877. }
  1878. if($res==-2){
  1879. return oo::response(errorCode::LIMIT_NOT_RNOUGH,[],"次数达到上限");
  1880. }
  1881. if($res==-3){
  1882. return oo::response(errorCode::MONEY_NOT_RNOUGH,[],"金币不足");
  1883. }
  1884. if($res==-4){
  1885. return oo::response(errorCode::CONDITION_NOT_RNOUGH,[],"该商品需付费");
  1886. }
  1887. return oo::response(1,$res);
  1888. }
  1889. return oo::response(-2,[],"商品异常");
  1890. }
  1891. /**
  1892. * Notes:发奖
  1893. * User: wsc
  1894. * Time: 2020/11/25 15:51
  1895. * @param $uid
  1896. * @param $gid
  1897. * @param int $aid
  1898. * @param int $d 0内部发货,1外部购买
  1899. * @return array
  1900. */
  1901. public function sendReward($uid,$gid,$aid=0,$d=0){
  1902. $reward =[];
  1903. if((($gid>720&&$gid<=750)||($gid>760&&$gid<=790))&&$aid){//超级连环礼包\
  1904. $tip = $gid>720&&$gid<=750?"超级连环":"超级连环2";
  1905. $cacheKey = $uid.'_'.$gid;
  1906. $timer = oo::commonOprModel('activitynew')->getBuySuperSerialPackLimit($aid,$uid,$gid);
  1907. // $timer = oo::commonOprRedis('activity')->hGet(okeys::buySuperSerialPackLimit($aid),$cacheKey);
  1908. $goodInfo = oo::commonOprModel('activitynew')->getCGRewardByGid($uid,$aid,$gid);
  1909. if(empty($goodInfo)){
  1910. return -1;
  1911. }
  1912. if($timer >= $goodInfo['gMax']){
  1913. return -2;
  1914. }
  1915. if($d==1&&$goodInfo['sku']){//外部购买
  1916. return -4;
  1917. }
  1918. if($goodInfo['mtype']==1){//金币购买
  1919. $money = oo::commonOprModel('member')->getUserAssetsInfo($uid)['money'];
  1920. if($money<intval($goodInfo['price'])){
  1921. return -3;
  1922. }
  1923. oo::commonOprModel('member')->optProperty($uid,['money'=>$goodInfo['price']],'-',451,$goodInfo['name']."{$tip}--gid:{$gid}--aid:{$aid}");
  1924. }
  1925. $reward['sku'] = $goodInfo['sku'];
  1926. foreach ($goodInfo['props'] as $k=>$row){
  1927. $ret = oo::commonOprModel('member')->sendReward($uid,$row['propsId'],$row['num'],451,$goodInfo['name']."{$tip}--gid:{$gid}--aid:{$aid}",$row['value'],$row);
  1928. if(in_array($row['propsId'],[19,20,21,29,30])){
  1929. $reward['treasureChest'] = $ret;
  1930. }
  1931. if(in_array($row['propsId'],[13,18,19,20,21,29,30])){
  1932. $goodInfo['props'][$k]['value'] = $ret;
  1933. }
  1934. }
  1935. $reward['props'] = $goodInfo['props'];
  1936. oo::commonOprModel('activitynew')->addBuySuperSerialPackLimit($aid,$uid,$gid);
  1937. // oo::commonOprRedis('activity')->hIncrBy(okeys::buySuperSerialPackLimit($aid),$cacheKey,1);
  1938. }
  1939. else if($gid>750&&$gid<=760){
  1940. $goodInfo = oo::commonOprModel('activitynew')->getEasterGiftBag($uid,$gid);
  1941. $reward['sku'] = $goodInfo['sku'];
  1942. foreach ($goodInfo['props'] as $row){
  1943. $ret = oo::commonOprModel('member')->sendReward($uid,$row['propsId'],$row['num'],453,$goodInfo['name']."复活礼包--gid:{$gid}--aid:{$aid}",$row['value'],$row);
  1944. }
  1945. $reward['props'] = $goodInfo['props'];
  1946. }
  1947. return $reward;
  1948. }
  1949. /**
  1950. * 购买礼包的次数
  1951. * @param $uid
  1952. * @param $day
  1953. * @return mixed
  1954. * Created by: Owen
  1955. * Created on: 2020/6/28 14:43
  1956. */
  1957. public function getBuyGiftNum($uid,$day){
  1958. $cacheKey = okeys::UserBuyGiftNum($uid);
  1959. $cache = oo::commonOprRedis('User')->hGet($cacheKey,$day);
  1960. if($cache){
  1961. return $cache;
  1962. }
  1963. $day2= time() - $day * 24*60*60;
  1964. $tb = otable::payment($uid);
  1965. $sql= "SELECT COUNT(*) as count FROM {$tb} WHERE uid={$uid} AND status=2 AND pay_time>{$day2} AND ((gid>700 AND gid<800) OR (gid>1600 AND gid<1700))";
  1966. $ret= oo::commonOprDb('common')->getOne($sql,MYSQLI_ASSOC);
  1967. oo::commonOprRedis('User')->delete($cacheKey);
  1968. oo::commonOprRedis('User')->hSet($cacheKey,$day,$ret['count']);
  1969. oo::commonOprRedis('User')->expire($cacheKey,oo::redisRandomExpire(7*24*60*60));
  1970. return $ret['count'];
  1971. }
  1972. /**
  1973. * 更新支付统计数据缓存
  1974. * @param $uid
  1975. * @param $gid
  1976. * @param $num
  1977. * Created by: Owen
  1978. * Created on: 2020/6/28 15:32
  1979. */
  1980. public function updateUserPayCache($uid,$gid,$num){
  1981. if(($gid>700 && $gid<800) || ($gid>1600 && $gid<1700)){
  1982. $cacheKey = okeys::UserBuyGiftNum($uid);
  1983. $cache = oo::commonOprRedis('User')->hGetAll($cacheKey);
  1984. foreach ($cache as $key=>$row){
  1985. oo::commonOprRedis('User')->hIncrBy($cacheKey,$key,1);
  1986. }
  1987. }
  1988. $cacheKey = okeys::UserTotalPayNum($uid);
  1989. $cache = oo::commonOprRedis('User')->hGetAll($cacheKey);
  1990. foreach ($cache as $key=>$row){
  1991. oo::commonOprRedis('User')->hIncrBy($cacheKey,$key,$num);
  1992. }
  1993. oo::commonOprRedis('User')->expire($cacheKey,oo::redisRandomExpire(7*24*60*60));
  1994. oo::commonOprRedis('User')->incrBy(okeys::UserDayPayNum($uid),$num);
  1995. oo::commonOprRedis('User')->expire(okeys::UserDayPayNum($uid),oo::redisRandomExpire(3*24*60*60));
  1996. oo::commonOprRedis('User')->setex(okeys::UserLastPayTime($uid),time(),oo::redisRandomExpire(3*24*60*60));
  1997. oo::commonOprRedis('User')->delete([okeys::UserPayTimes($uid),okeys::CMSUserPayData($uid)]);
  1998. }
  1999. /**
  2000. * 用戶最後購買時間
  2001. * @param $uid
  2002. * @return mixed
  2003. * Created by: Owen
  2004. * Created on: 2020/6/30 14:40
  2005. */
  2006. public function getUserLastPayTime($uid){
  2007. $cacheKey = okeys::UserLastPayTime($uid);
  2008. $cache = oo::commonOprRedis('User')->get($cacheKey);
  2009. if($cache !== false){
  2010. return intval($cache);
  2011. }
  2012. $tb = otable::payment($uid);
  2013. $sql= "SELECT * FROM {$tb} WHERE uid={$uid} AND status=2 ORDER BY pid DESC LIMIT 1";
  2014. $ret= oo::commonOprDb('common')->getOne($sql,MYSQLI_ASSOC);
  2015. $lastTime = max(intval($ret['pay_time']),0);
  2016. oo::commonOprRedis('User')->setex($cacheKey,$lastTime,7*24*60*60);
  2017. return $lastTime;
  2018. }
  2019. /**
  2020. * 支付转盘加倍
  2021. * @param $uid
  2022. * @param $gid
  2023. * @param $gprice
  2024. * @param $data
  2025. * @return mixed
  2026. * Created by: Owen
  2027. * Created on: 2020/7/21 18:02
  2028. */
  2029. public function payTurnTabBet($uid,$gid,$gprice,$data){
  2030. //支付转盘加倍
  2031. //获取转盘出现配置
  2032. $config = oo::commonOprModel('config')->getTurnPaybetConfig('price');
  2033. $userInfo = oo::commonOprModel('member')->getUserInfo($uid);
  2034. $showPriceArr = $vipPointRet = $maxNum = [];
  2035. $vipPoint = $userInfo['vipPoint'];//用户积分
  2036. foreach ($config as $k => $v){
  2037. if($v['price'] === '0' || $v['price'] == '-1' || $v['price'] >= $gprice){
  2038. foreach($v['list'] as $listRow){
  2039. if($listRow['mixPoint'] <= $vipPoint){
  2040. $showPriceArr[$v['price']] = $listRow['probability'];
  2041. $vipPointRet[$v['price']] = $listRow['mixPoint'];
  2042. $maxNum[$v['price']] = $listRow['maxNum'];
  2043. }
  2044. }
  2045. }
  2046. }
  2047. $temp = oo::commonOprModel('slot')->get_rand($showPriceArr);
  2048. if($temp != '-1'){
  2049. if(intval(oo::commonOprRedis('common')->hGet(okeys::TurnPaybetNum($temp,$vipPointRet[$temp]),$uid)) >= $maxNum[$temp]){
  2050. //该积分+价格 出现次数已超过等于最大次数
  2051. return $data;
  2052. }
  2053. $configBet = oo::commonOprModel('config')->getTurnPaybetConfig('bet');
  2054. $betRet = [];
  2055. foreach($configBet as $k => $v){
  2056. if($v['price'] == $temp){
  2057. $rate = [];
  2058. $list = [];
  2059. foreach($v['list'] as $listKey => $listVal){
  2060. $rate[] = $listVal[1];
  2061. $list[] = $listVal[0];
  2062. }
  2063. $betRet[$v['price']]['rate'] = $rate;
  2064. $betRet[$v['price']]['list'] = $list;
  2065. }
  2066. }
  2067. if(!empty($betRet[$temp])){
  2068. $betId = oo::commonOprModel('slot')->get_rand($betRet[$temp]['rate']);
  2069. $data['data']['multiPay']['reward'] = $data['data'];
  2070. $data['data']['multiPay']['bet'] = intval($betRet[$temp]['list'][$betId]);
  2071. $data['data']['multiPay']['gid'] = 0;
  2072. $data['data']['multiPay']['betGid'] = intval($gid);
  2073. $data['data']['multiPay']['gprice'] = $temp;
  2074. foreach($betRet[$temp]['list'] as $key => $betTemp){
  2075. $betRet[$temp]['list'][$key] = intval($betTemp);
  2076. }
  2077. $data['data']['multiPay']['betConfig'] = $betRet[$temp]['list'];
  2078. if($temp != 0){
  2079. $tb = otable::goodsCrazy();
  2080. $sql = "SELECT * FROM {$tb} WHERE gprice={$temp} AND gtype = 17";
  2081. $payBetGoodInfo = oo::commonOprDb('payment')->getOne($sql,1);
  2082. $data['data']['multiPay']['gid'] = intval($payBetGoodInfo['gid']);
  2083. }
  2084. oo::commonOprRedis('common')->hSet(okeys::TurnPaybetLog(),$uid,json_encode($data['data']['multiPay']));//记录获得的bet
  2085. oo::commonOprRedis('common')->hIncrBy(okeys::TurnPaybetNum($temp,$vipPointRet[$temp]),$uid,1);//添加次数
  2086. }
  2087. }
  2088. return $data;
  2089. }
  2090. /**
  2091. * 设定vip
  2092. * @param $uid
  2093. * @param $gid
  2094. * @param $price
  2095. * @param bool $isDebug
  2096. * Created by: Owen
  2097. * Created on: 2020/7/21 18:17
  2098. */
  2099. public function changeVipStatus($uid,$gid,$price,$isDebug = false){
  2100. $num = intval($price*100);
  2101. if($gid == 601){
  2102. $num += 50;
  2103. }
  2104. if($isDebug){
  2105. if($gid == 801){
  2106. oo::commonOprModel('newvip')->setFreeVip($uid,7*24*60*60);
  2107. }else if($gid == 803){
  2108. oo::commonOprModel('newvip')->setFreeVip($uid,30*24*60*60);
  2109. }
  2110. // oo::async()->add('oo::commonOprModel("notice")->sendNoticeMsg',[$uid,"buyVip"]);//异步跑马灯消息
  2111. }
  2112. oo::commonOprModel('newvip')->updateUserCurPoint($uid,$num);
  2113. oo::commonOprModel('newvip')->updateVipLv($uid);
  2114. oo::commonOprModel('Workerman')->push($uid,ocmd::$send['Vip_Rec'],['vipInfo'=>oo::commonOprModel('newvip')->getVipInfo($uid)]);
  2115. /**
  2116. * ta 公共属性
  2117. */
  2118. $curVipLevel = oo::commonOprModel('newvip')->getUserVipLv($uid, false,false,155);
  2119. $curVipScore = oo::commonOprModel('newvip')->getUserCurPoint($uid);
  2120. $total = $this->getUserTotalPayNum($uid);
  2121. oo::commonOprModel('ta')->setCommonEventProperty($uid,'common',['current_vip_level'=>$curVipLevel,'total_pay'=> $total]);
  2122. oo::commonOprModel('ta')->setEventData($uid,'user_set',["total_pay"=>$total,"current_vip_level"=>$curVipLevel,"current_vip_score"=>$curVipScore,"last_pay_time"=>time()]);
  2123. }
  2124. /**
  2125. * 商品数据后端转换前端格式
  2126. * @param $data
  2127. * @return mixed
  2128. * Created by: Owen
  2129. * Created on: 2020/7/21 18:37
  2130. */
  2131. public function goodDataTurnToFormat($data){
  2132. if(isset($data['data']['money']) && !isset($data['data']['coins'])){
  2133. $data['data']['coins'] = $data['data']['money'];
  2134. }
  2135. if(isset($data['data']['props'])){
  2136. foreach ($data['data']['props'] as $row){
  2137. if($row['propsId'] == 8 && !isset($data['data']['petExp'])){
  2138. $data['data']['petExp'] = $row['num'];
  2139. }
  2140. if($row['propsId'] == 9 && !isset($data['data']['petFeed'])){
  2141. $data['data']['petFeed'] = $row['num'];
  2142. }
  2143. if($row['propsId'] <= 4){
  2144. $data['data']['chest'][] = [
  2145. 'chestId' => $row['propsId'],
  2146. 'num' => $row['num'],
  2147. ];
  2148. }
  2149. }
  2150. }
  2151. return $data;
  2152. }
  2153. /**
  2154. * IOS 账号转移,转移订阅状态
  2155. * @param $uid
  2156. * @param $transactionId
  2157. * @param $receipt
  2158. * @return string
  2159. * Created by: Owen
  2160. * Created on: 2020/12/3 17:57
  2161. */
  2162. public function syncIosSubscribe($uid,$transactionId,$receipt){
  2163. $tb = otable::summarylist();
  2164. $ret = oo::commonOprDb('payment')->getOne("SELECT * FROM {$tb} WHERE `sl_platform_serial_num`='{$transactionId}' LIMIT 1",MYSQLI_ASSOC);
  2165. if(empty($ret)){
  2166. return oo::response(errorCode::SYNCIOSSUBSCRIBE_TRANSACTIONID_ERROR);
  2167. }
  2168. $applePayInfo = oo::commonOprModel('paymentapple')->validateApplePay(['uid'=>$uid,'receipt'=>$receipt,'transactionId'=>$transactionId],'original_transaction_id');
  2169. if(!$applePayInfo){
  2170. return oo::response(errorCode::SYNCIOSSUBSCRIBE_ORDER_ERROR);
  2171. }
  2172. $id = $ret['id'];
  2173. $origUid= $ret['sl_uid'];
  2174. $expire = ceil($applePayInfo['expires_date_ms']/1000);
  2175. if($origUid == $uid){
  2176. oo::commonOprModel('member')->getUserInfo($uid, NULL, TRUE,[
  2177. 'svip' => 1,
  2178. 'svip_expire' => $expire,
  2179. ]);
  2180. return oo::response(errorCode::SYNCIOSSUBSCRIBE_UID_ERROR,['vipInfo'=>oo::commonOprModel('newvip')->getVipInfo($uid),"expires_date_ms"=>$expire]);
  2181. }
  2182. oo::commonOprModel('member')->getUserInfo($origUid, NULL, TRUE,['svip'=>0]);
  2183. oo::commonOprDb('payment')->query("UPDATE {$tb} SET `sl_uid` = '{$uid}' WHERE id={$id} AND `sl_platform_serial_num`='{$transactionId}' LIMIT 1",false);
  2184. oo::commonOprModel('member')->getUserInfo($uid, NULL, TRUE,['svip'=>1,'svip_expire'=>$expire]);
  2185. $tb = otable::SubscribeTransferLog();
  2186. $subscribeInfo = json_encode([
  2187. 'localOrderInfo' => $ret,
  2188. 'appleOrderInfo' => $applePayInfo,
  2189. ],JSON_NUMERIC_CHECK);
  2190. $subscribeInfo = addslashes($subscribeInfo);
  2191. oo::commonOprDb('common')->query("INSERT INTO {$tb} (id, origUid, newUid, subscribeInfo) VALUES(NULL,{$origUid},{$uid},'{$subscribeInfo}')",false);
  2192. return oo::response(errorCode::SUCCESS,['vipInfo'=>oo::commonOprModel('newvip')->getVipInfo($uid)]);
  2193. }
  2194. public function syncAndroidSubscribe($uid,$googleOrderId,$token){
  2195. $sumTb = otable::summarylist();
  2196. $localOrderInfo = oo::commonOprDb('payment')->getOne("SELECT * FROM {$sumTb} WHERE `sl_platform_serial_num`='{$googleOrderId}' LIMIT 1",MYSQLI_ASSOC);
  2197. if(empty($localOrderInfo)){
  2198. return oo::response(errorCode::SYNCIOSSUBSCRIBE_TRANSACTIONID_ERROR);
  2199. }
  2200. $origUid = $localOrderInfo['sl_uid'];
  2201. $gid = $localOrderInfo['sl_gid'];
  2202. $tb = otable::goodsCrazy();
  2203. $goodInfo= oo::commonOprDb('common')->getOne("SELECT * FROM {$tb} WHERE gid={$gid} LIMIT 1",MYSQLI_ASSOC);
  2204. $sku = $goodInfo['gsku'];
  2205. oo::commonOprRedis('common')->delete($token);
  2206. $purchaseInfo= oo::commonOprModel('Paymentgoogle')->getUserSubscribeStatus("com.gworld.crazyspin",$sku,$token);
  2207. $expire = ceil($purchaseInfo['expiryTimeMillis']/1000);
  2208. if(isset($purchaseInfo['error'])){
  2209. return oo::response(errorCode::SYNCIOSSUBSCRIBE_UID_ERROR,['vipInfo'=>oo::commonOprModel('newvip')->getVipInfo($uid)]);
  2210. }
  2211. if($origUid == $uid){
  2212. oo::commonOprModel('member')->getUserInfo($uid, NULL, TRUE,[
  2213. 'svip' => 1,
  2214. 'svip_expire' => $expire,
  2215. ]);
  2216. oo::commonOprModel('ta')->setEventData($uid,'user_set',["is_member"=>1,"member_time"=>$expire]);
  2217. return oo::response(errorCode::SYNCIOSSUBSCRIBE_UID_ERROR,['vipInfo'=>oo::commonOprModel('newvip')->getVipInfo($uid)]);
  2218. }
  2219. $id = $localOrderInfo['id'];
  2220. oo::commonOprDb('payment')->query("UPDATE {$sumTb} SET `sl_uid` = '{$uid}' WHERE id={$id} AND `sl_platform_serial_num`='{$googleOrderId}' LIMIT 1",false);
  2221. $subTb = otable::subscription();
  2222. oo::commonOprDb('payment')->query("UPDATE {$subTb} SET `uid`={$uid} WHERE `purchaseToken`='{$token}'",false);
  2223. /**
  2224. * 取消原本的用户的vip
  2225. */
  2226. oo::commonOprModel('member')->getUserInfo($origUid, NULL, true,[
  2227. 'svip' => 0,
  2228. 'svip_expire' => time(),
  2229. ]);
  2230. /**
  2231. * 设置新用户原本的用户的vip
  2232. */
  2233. oo::commonOprModel('member')->getUserInfo($uid, NULL, true,[
  2234. 'svip' => 1,
  2235. 'svip_expire' => $expire,
  2236. ]);
  2237. /**
  2238. * 同步奖励领取限制
  2239. */
  2240. if(oo::commonOprRedis('common')->get(okeys::UserVipWeekReward($origUid))){
  2241. oo::commonOprRedis('common')->setex(okeys::UserVipWeekReward($uid),1,oo::todayDeadline());
  2242. }
  2243. $tb = otable::SubscribeTransferLog();
  2244. $subscribeInfo = json_encode([
  2245. 'localOrderInfo' => $localOrderInfo,
  2246. 'appleOrderInfo' => $purchaseInfo,
  2247. ],JSON_NUMERIC_CHECK);
  2248. $subscribeInfo = addslashes($subscribeInfo);
  2249. oo::commonOprDb('common')->query("INSERT INTO {$tb} (id, origUid, newUid, subscribeInfo) VALUES(NULL,{$origUid},{$uid},'{$subscribeInfo}')",false);
  2250. oo::commonOprModel('ta')->setEventData($uid,'user_set',["is_member"=>1,"member_time"=>$expire]);
  2251. return oo::response(errorCode::SUCCESS,['vipInfo'=>oo::commonOprModel('newvip')->getVipInfo($uid)]);
  2252. }
  2253. }