Simoquick.php 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. <?php
  2. /**
  3. * 司墨子渠道(走quick)对接
  4. *
  5. */
  6. namespace app\complex\controller;
  7. use app\common\model\PolychannelGame;
  8. use app\common\logic\PayCallback;
  9. use think\Db;
  10. class Simoquick extends Complex {
  11. protected $channel_mark = 'simoquick';
  12. /**
  13. * 初始化操作
  14. */
  15. public function _initialize() {
  16. log_message('=== '.$this->channel_mark.' --请求参数记录==='.json_encode($_POST),'log',LOG_PATH . '../complexPaylog/');
  17. }
  18. /**
  19. * 支付处理
  20. */
  21. public function pay()
  22. {
  23. /*
  24. $_POST['nt_data'] = '@116@111@175@158@160@80@168@157@168@166@157@159@164@116@90@101@99@105@87@82@154@163@155@160@156@154@166@154@112@82@134@134@126@93@111@83@84@163@166@153@164@151@149@156@165@165@157@113@87@167@164@84@116@115@116@162@173@154@155@158@166@148@156@145@165@149@170@164@149@151@151@118@114@160@153@163@169@152@159@153@115@117@158@165@148@169@157@164@172@111@105@111@98@153@164@145@172@149@170@165@114@108@149@160@151@161@162@149@162@117@104@112@100@156@157@147@163@163@157@157@118@109@155@155@148@158@159@151@164@143@172@154@152@110@149@158@106@100@150@150@156@106@156@108@101@154@153@105@150@105@109@102@154@104@157@150@99@145@106@107@153@149@111@149@105@99@114@151@94@92@112@95@153@159@153@162@163@158@161@145@170@158@156@111@116@148@160@148@161@158@150@158@151@159@169@149@153@162@112@116@101@150@156@145@164@165@157@160@148@168@167@150@154@167@118@109@159@146@165@152@146@159@163@150@157@162@117@146@168@164@147@155@158@100@106@96@111@110@108@105@105@112@105@102@109@107@116@96@159@146@165@152@146@159@163@150@157@162@117@109@163@162@150@157@168@146@162@159@116@103@104@100@103@105@103@99@101@102@104@101@105@102@107@100@100@101@106@104@108@101@103@98@109@101@101@116@101@162@166@148@155@169@151@162@164@119@113@162@150@174@151@165@161@158@157@113@101@96@99@99@101@96@104@94@100@100@82@105@107@109@103@97@112@104@109@112@100@169@150@171@148@169@161@158@157@111@116@148@160@159@166@160@172@110@104@95@100@96@110@103@151@160@163@165@164@171@118@112@168@173@150@166@170@168@118@97@116@96@171@167@148@164@166@165@118@108@156@169@168@162@147@171@149@163@149@162@151@164@171@114@113@104@154@170@169@167@153@164@151@161@153@165@148@157@164@112@116@95@164@150@167@163@147@159@155@113@112@95@167@172@161@151@160@172@153@157@148@162@157@164@171@146@159@152@113';
  25. $_POST['sign'] = '@104@98@103@151@154@104@102@105@153@105@150@100@153@152@155@100@105@113@150@106@104@154@113@147@104@105@154@108@105@146@100@100';
  26. $_POST['md5Sign'] = '978e893de47ab87410ab334c59c92e99';
  27. */
  28. if (empty($_POST)) {
  29. die('请求内容为空');
  30. }
  31. $retData = array();
  32. $retData['nt_data'] = trim($_POST['nt_data']);
  33. $retData['sign'] = trim($_POST['sign']);
  34. $retData['md5Sign'] = trim($_POST['md5Sign']);
  35. if (empty($retData['nt_data']) || empty($retData['sign']) || empty($retData['md5Sign'])) {
  36. log_message('请求数据=== '.$this->channel_mark.' --请求参数记录==='.json_encode($retData),'log',LOG_PATH . '../complexPaylog/');
  37. die('非法请求数据');
  38. }
  39. $md5KeyArrs = array('58'=>'hosucjtaxiifvynhdxthrgtkufcrvpjc','59'=>'hosucjtaxiifvynhdxthrgtkufcrvpjc');
  40. $callbackKeyArrs = array('58'=>'04008883568562817017692688783274','59'=>'04008883568562817017692688783274');
  41. $gameId = intval(input('gameid'));
  42. if(!$gameId){
  43. log_message('游戏ID未配置=== '.$this->channel_mark.' --请求参数记录==='.json_encode($retData),'log',LOG_PATH . '../complexPaylog/');
  44. die('游戏ID未配置');
  45. }
  46. try{
  47. $md5Key = $md5KeyArrs[$gameId];
  48. $callbackKey = $callbackKeyArrs[$gameId];
  49. }
  50. catch (\Exception $e) {
  51. log_message('游戏参数未配置完整=== '.$this->channel_mark.' --返回数据格式==='.json_encode($retData),'log',LOG_PATH . '../compldecodeDataxPaylog/');
  52. die('游戏参数未配置完整');
  53. }
  54. vendor('quickSdk.Quick','.class.php');
  55. $quick = new \Quick();
  56. $md5Sign = $quick->getSign($retData,$md5Key);
  57. if($md5Sign <> $retData['md5Sign']){
  58. log_message('请求数据验签不通过=== '.$this->channel_mark.' --请求参数记录==='.json_encode($retData),'log',LOG_PATH . '../complexPaylog/');
  59. die('请求数据验签不通过');
  60. }
  61. $ntXmlData = $quick->decode($retData['nt_data'],$callbackKey);
  62. if(!$ntXmlData){
  63. log_message('请求数据解密出错=== '.$this->channel_mark.' --请求参数记录==='.json_encode($retData),'log',LOG_PATH . '../complexPaylog/');
  64. die('请求数据解密出错');
  65. }
  66. $ntXmlData = mb_convert_encoding($ntXmlData, 'UTF-8', 'GBK');
  67. try{
  68. $xml = simplexml_load_string($ntXmlData);
  69. $decodeData = array();
  70. $attach = $decodeData['game_order'] = $xml->message->game_order;
  71. $orderid = $decodeData['order_no'] = $xml->message->order_no;
  72. $amount = $decodeData['amount'] = $xml->message->amount;
  73. $status = $decodeData['status'] = $xml->message->status;
  74. $paytime = $decodeData['pay_time'] = $xml->message->pay_time;
  75. $decodeData['channel_uid'] = $xml->message->channel_uid;
  76. $decodeData['is_test'] = $xml->message->is_test;
  77. $decodeData['channel'] = $xml->message->channel;
  78. $decodeData['extras_params'] = $xml->message->extras_params;
  79. } catch (\Exception $e) {
  80. log_message('返回数据格式错误=== '.$this->channel_mark.' --返回数据格式==='.$ntXmlData,'log',LOG_PATH . '../compldecodeDataxPaylog/');
  81. die('返回数据格式错误');
  82. }
  83. if($status<>0){
  84. log_message('充值状态不成功,不做处理=== '.$this->channel_mark.' --请求参数记录==='.json_encode($decodeData),'log',LOG_PATH . '../complexPaylog/');
  85. die('充值状态不成功,不做处理');
  86. }
  87. $payInfo = model('ComplexPay')->field('userid,amount,gameid,channel_id,status')->where(['orderid'=>$attach])->find();
  88. if(empty($payInfo)){
  89. log_message('游戏订单号不存在=== '.$this->channel_mark.' --游戏订单号==='.$attach,'log',LOG_PATH . '../complexPaylog/');
  90. die('游戏订单号不存在');
  91. }
  92. else if($payInfo['status']==1){
  93. log_message('该游戏订单号已发货=== '.$this->channel_mark.' --游戏订单号==='.$attach,'log',LOG_PATH . '../complexPaylog/');
  94. die('SUCCESS');
  95. }
  96. else{
  97. $ComplexChannelInfo = model('ComplexChannel')->field('id,name,mark,level')->where(['id'=>$payInfo['channel_id']])->find();
  98. if(empty($ComplexChannelInfo)){
  99. log_message('游戏订单号无归属渠道=== '.$this->channel_mark.' --游戏订单号==='.$attach,'log',LOG_PATH . '../complexPaylog/');
  100. die('游戏订单号无归属渠道');
  101. }
  102. else if($ComplexChannelInfo['mark'] <> $this->channel_mark){
  103. log_message('游戏订单号归属渠道非本渠道,不能发货=== '.$this->channel_mark.' --游戏订单号==='.$attach,'log',LOG_PATH . '../complexPaylog/');
  104. die('游戏订单号归属渠道非本渠道,不能发货');
  105. }
  106. }
  107. if(!$this->checkOrder($attach,$amount)){
  108. log_message('订单不存在或订单金额不一致,orderid='.$orderid,'error',LOG_PATH . '../complexPaylog/');
  109. die('订单不存在或订单金额不一致');
  110. }
  111. // 启动事务
  112. Db::startTrans();
  113. try{
  114. $this->updateOrder($attach,$orderid,$paytime);
  115. // 提交事务
  116. Db::commit();
  117. }
  118. catch (\Exception $e) {
  119. // 回滚事务
  120. Db::rollback();
  121. die('订单生成失败'.$e->getMessage());
  122. }
  123. // 通知CP,支付成功
  124. (new PayCallback())->callBackToCp($attach);
  125. die('SUCCESS');
  126. }
  127. /**
  128. * 二次登录验证
  129. */
  130. public function checklogin()
  131. {
  132. /*
  133. $_POST['token'] = '100073';
  134. $_POST['product_code'] = '122211';
  135. $_POST['uid'] = '123213213';
  136. $_POST['channel_code'] = '2342343';
  137. */
  138. if (empty($_POST)) {
  139. die('请求内容为空');
  140. }
  141. $token = trim($_POST['token']);
  142. $product_code = trim($_POST['product_code']);
  143. $uid = trim($_POST['uid']);
  144. $channel_code = trim($_POST['channel_code']);
  145. $requestData = array();
  146. $requestData['token'] = $token;
  147. $requestData['product_code'] = $product_code;
  148. $requestData['uid'] = $uid;
  149. if($channel_code){
  150. $requestData['channel_code'] = $channel_code;
  151. }
  152. $checkUrl = ' http://checkuser.quickapi.net/v2/checkUserInfo';
  153. $response = get_http_response($checkUrl, http_build_query(['appid'=>$appid,'username'=>$username,'gameid'=>$gameid,'logintime'=>$logintime,'sign'=>$sign]));
  154. die($response);
  155. }
  156. }