Sandpay.php 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. <?php
  2. namespace app\api\controller;
  3. use app\common\controller\Api;
  4. use think\Db;
  5. use bsn\Bsn;
  6. use app\common\library\Sms as Smslib;
  7. /**
  8. * 支付回调
  9. */
  10. class Sandpay extends Api
  11. {
  12. protected $noNeedLogin = ['*'];
  13. protected $noNeedRight = ['*'];
  14. //protected $nofify_file = '../runtime/notify.txt';
  15. /*public function __construct(){
  16. $log_base_dir = '../paylog/';
  17. if (!is_dir($log_base_dir))
  18. {
  19. mkdir($log_base_dir, 0770, true);
  20. @chmod($log_base_dir, 0770);
  21. }
  22. $notify_file = $log_base_dir.'sandpay_notify.txt';
  23. if(!file_exists($notify_file)) {
  24. @touch($notify_file);
  25. @chmod($notify_file, 0770);
  26. }
  27. if(filesize($notify_file)>5242880)//大于5M自动切换
  28. {
  29. rename($notify_file, $log_base_dir.'sandpay_notify_'.date('Y_m_d_H_i_s').'.txt');
  30. }
  31. if(!file_exists($notify_file)) {
  32. @touch($notify_file);
  33. @chmod($notify_file, 0770);
  34. }
  35. }*/
  36. /**
  37. * 支付成功(插件)
  38. */
  39. public function notify()
  40. {
  41. //$input_post_data = json_encode($_POST);
  42. //filePut('[wallet][paySucc]充值参数 recharge money post'.$input_post_data);
  43. $postData = isset($_POST['data']) ? $_POST['data'] : [];
  44. $sign = isset($_POST['sign']) ? $_POST['sign'] : '';
  45. filePut('[wallet][paySucc]充值参数 recharge money data:'.$postData."\n".' sign:'.$sign);
  46. /*$dataArr = [
  47. "head"=>[
  48. "version"=>"1.0",
  49. "respTime"=>"20230913093602",
  50. "respCode"=>"000000",
  51. "respMsg"=>"成功",
  52. ],
  53. "body"=>[
  54. "mid"=>"6888806122762",
  55. "orderCode"=>"P23091309351693000123",
  56. "tradeNo"=>"P23091309351693000123",
  57. "clearDate"=>"20230913",
  58. "totalAmount"=>"000000000001",
  59. "orderStatus"=>"1",
  60. "payTime"=>"20230913093602",
  61. "settleAmount"=>"000000000001",
  62. "buyerPayAmount"=>"000000000001",
  63. "discAmount"=>"000000000000",
  64. "txnCompleteTime"=>"20230913093601",
  65. "payOrderCode"=>"20230913001224810000000000018593",
  66. "accLogonNo"=>"odk6K6wzq1m0sKwDD98Vv0xzYsIo",
  67. "accNo"=>"",
  68. "midFee"=>"000000000000",
  69. "extraFee"=>"000000000000",
  70. "specialFee"=>"000000000000",
  71. "plMidFee"=>"000000000000",
  72. "bankserial"=>"4200001938202309134493832643",
  73. "externalProductCode"=>"00002021",
  74. "cardNo"=>"",
  75. "creditFlag"=>"",
  76. "bid"=>"",
  77. "benefitAmount"=>"000000000000",
  78. "remittanceCode"=>"",
  79. "respTime"=>"20230912141303",
  80. "extend"=>[
  81. "type" => "gold",
  82. ]
  83. ],
  84. ];
  85. $data = ["extend"=>"",
  86. "charset"=>"UTF-8",
  87. "data"=>$dataArr,
  88. "sign"=>"hoCYCLfEmbHjoXg8KHLYU+TCwAh8HrilFUfk7x9GoXAHidKRGu+\/5CkUlC1AqY0OeD3EJKu3ckyqLFUZF4G5PbzFbV27DYNeaRNnbU8htmwCV06a9SgOumv79EJGZ78x2FmNcPL8xu8IhPoOzorLtG5uIifSbsPK4283X09ikb8wTeNFGMMEy+MioftEoOv892kFs5wbNaazJNp8IdAjRwB5wYeMJc28hfnSQfg9SsR5zpqTsMkbiQoybyVdF8msWjlXC1TD5+y33zj77If\/bOK5obSUCrdHZt7S3V5bN2HqyNtFPEK3Ipn2p\/lu3yyo9fFKC5WtgO8G20OVYCu7dQ==",
  89. "signType"=>"01",
  90. ];
  91. $plainText = json_encode($dataArr);*/
  92. //$plainText = '{"extend":"","charset":"UTF-8","data":"{\"head\":{\"version\":\"1.0\",\"respTime\":\"20230913093602\",\"respCode\":\"000000\",\"respMsg\":\"\u6210\u529f\"},\"body\":{\"mid\":\"6888806122762\",\"orderCode\":\"P23091309351693000123\",\"tradeNo\":\"P23091309351693000123\",\"clearDate\":\"20230913\",\"totalAmount\":\"000000000001\",\"orderStatus\":\"1\",\"payTime\":\"20230913093602\",\"settleAmount\":\"000000000001\",\"buyerPayAmount\":\"000000000001\",\"discAmount\":\"000000000000\",\"txnCompleteTime\":\"20230913093601\",\"payOrderCode\":\"20230913001224810000000000018593\",\"accLogonNo\":\"odk6K6wzq1m0sKwDD98Vv0xzYsIo\",\"accNo\":\"\",\"midFee\":\"000000000000\",\"extraFee\":\"000000000000\",\"specialFee\":\"000000000000\",\"plMidFee\":\"000000000000\",\"bankserial\":\"4200001938202309134493832643\",\"externalProductCode\":\"00002021\",\"cardNo\":\"\",\"creditFlag\":\"\",\"bid\":\"\",\"benefitAmount\":\"000000000000\",\"remittanceCode\":\"\",\"extend\":\"{\\\"type\\\":\\\"gold\\\"}\"}}","sign":"hoCYCLfEmbHjoXg8KHLYU+TCwAh8HrilFUfk7x9GoXAHidKRGu+\/5CkUlC1AqY0OeD3EJKu3ckyqLFUZF4G5PbzFbV27DYNeaRNnbU8htmwCV06a9SgOumv79EJGZ78x2FmNcPL8xu8IhPoOzorLtG5uIifSbsPK4283X09ikb8wTeNFGMMEy+MioftEoOv892kFs5wbNaazJNp8IdAjRwB5wYeMJc28hfnSQfg9SsR5zpqTsMkbiQoybyVdF8msWjlXC1TD5+y33zj77If\/bOK5obSUCrdHZt7S3V5bN2HqyNtFPEK3Ipn2p\/lu3yyo9fFKC5WtgO8G20OVYCu7dQ==","signType":"01"}';
  93. //echo '<pre>';var_dump($plainText);exit;
  94. //提取数据
  95. $plainText = $postData;
  96. $dataArray = json_decode($postData,true);
  97. $head = isset($dataArray['head']) ? $dataArray['head'] : [];
  98. $body = isset($dataArray['body']) ? $dataArray['body'] : [];
  99. $respCode = isset($head['respCode']) ? $head['respCode'] : '000001';
  100. $orderStatus = isset($body['orderStatus']) ? $body['orderStatus'] : '0';
  101. $orderCode = isset($body['orderCode']) ? $body['orderCode'] : '';
  102. $extend = isset($body['extend']) ? $body['extend'] : '';
  103. $extendType = '';
  104. if (!empty($extend)) {
  105. $extendArr = json_decode($extend,true);
  106. $extendType = isset($extendArr['type']) ? $extendArr['type'] : '';
  107. }
  108. //验签 1是正确
  109. $sandpay = new \app\common\library\Sandpay();
  110. /*$plainText = '{"head":{"version":"1.0","respTime":"20230913110455","respCode":"000000","respMsg":"成功"},"body":{"mid":"6888806122762","orderCode":"P23091311040769547523","tradeNo":"P23091311040769547523","clearDate":"20230913","totalAmount":"000000000001","orderStatus":"1","payTime":"20230913110455","settleAmount":"000000000001","buyerPayAmount":"000000000001","discAmount":"000000000000","txnCompleteTime":"20230913110455","payOrderCode":"20230913001241710000000000029923","accLogonNo":"odk6K6wzq1m0sKwDD98Vv0xzYsIo","accNo":"","midFee":"000000000000","extraFee":"000000000000","specialFee":"000000000000","plMidFee":"000000000000","bankserial":"4200001942202309131368220541","externalProductCode":"00002021","cardNo":"","creditFlag":"","bid":"","benefitAmount":"000000000000","remittanceCode":"","extend":"{\"type\":\"gold\"}"}}';
  111. $sign = 'Vs2JTo57FwdeT78Lxi7Sgj3XLw48+XxUZblSpVnAQkpgvPqai3m4rkobG8hfuUnYCU/yXxDbYU8hEEfc9rDryT5sFPmmTYjOISJnc6jNDBs6SpeDQhAvnpiiXgZ3/hDWp8ehsgPJbHv5nqlbzLsJM1+WhfW86sfJt70oMiffQ5v9G192zerJWXF3jL9dyLM0WmG2icr9qHz12ZPFyYYonUWRIVc+jcZ0R0qrHD7wAPx+JzbK9crXnTWu1lHjOwcVUrYtMcVDv84wSxl8NnofNUCSMSxVSYHh8ZvgPis7WtgwBcy9XfD30Jux/a/V5oIbN+7yzTlEBIL9pHZb31O4fg==';*/
  112. $encrypt_str = $sandpay->verify($plainText, $sign);
  113. if($encrypt_str != 1){
  114. filePut('[wallet][paySucc]充值入账更新余额失败 recharge money fail'.$orderCode."\n".' data:'.$postData."\n".' sign:'.$sign);
  115. echo 'Fail';exit;
  116. }
  117. //状态验证
  118. if($respCode != '000000'){
  119. filePut('[wallet][paySucc]验证回调状态失败 respCode'.$orderCode);
  120. echo 'Fail';exit;
  121. }
  122. if($orderStatus != '1'){
  123. filePut('[wallet][paySucc]验证回调订单状态 recharge money fail orderStatus'.$orderCode);
  124. echo 'Fail';exit;
  125. }
  126. //查询订单信息
  127. $PayResult = Db::name('pay_order');
  128. $where['pay_no'] = $orderCode;
  129. $order_info = $PayResult->where($where)->find();
  130. if ($order_info['status'] == 1) {
  131. filePut('[wallet][paySucc]充值入账更新余额失败 recharge money fail status已更新过'.$orderCode);
  132. echo 'respCode=000000';exit;
  133. }
  134. //构建支付订单处理结果信息
  135. //$_data['transaction_id'] = isset($data['body']['payOrderCode']) ? $data['body']['payOrderCode'] : ''; //因为文档说不一定有,所以不填了
  136. $_data['status'] = 2;
  137. $result = $PayResult->where($where)->setField($_data);
  138. if ($result || 1) {
  139. //你可以在此编写订单逻辑
  140. $payEventWhere['pay_no'] = $orderCode;
  141. $payEvent = Db::name('pay_event')->where($payEventWhere)->find();
  142. $args = isset($payEvent['args']) ? $payEvent['args'] : '';
  143. $args = json_decode($args,true);
  144. $rechargeM = new \app\common\model\Recharge();
  145. if ($extendType == 'gold') {
  146. $payRes = $rechargeM->goldpaysucc($orderCode,$args);
  147. $payTypeStr = '充值';
  148. } elseif($extendType == 'vip') {
  149. $payRes = $rechargeM->vippaysucc($orderCode,$args);
  150. $payTypeStr = 'vip';
  151. } else {
  152. $payRes = false;
  153. $payTypeStr = '未知支付类型';
  154. }
  155. if(!$payRes){
  156. filePut('[wallet][paySucc]'.$payTypeStr.'更新失败请查看问题'.$orderCode);
  157. exit;
  158. }
  159. filePut('[wallet][paySucc]回调成功'.$orderCode);
  160. echo 'respCode=000000';exit;
  161. }
  162. }
  163. }