Sandpay.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  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. //vip用的,创建订单废弃
  37. public function sand_vip_recharge(){
  38. $rc_id = input('rc_id',0);
  39. $pay_type = input('pay_type','wechat');
  40. $uid = $this->auth->id;
  41. if(!$rc_id){
  42. $this->error('请选择会员套餐');
  43. }
  44. //赋值money
  45. $recharge_config = Db::name('payvip_config')->where('id',$rc_id)->find();
  46. $money = $recharge_config['money'];
  47. if($money<=0)
  48. {
  49. $this->error('支付金额必须大于0');
  50. }
  51. if($money > 10000){
  52. $this->error('支付金额太大');
  53. }
  54. //会员等级冲突
  55. //当前是会员,但是却要向下级续费,直接提示报错
  56. //修改等级,向上立刻改,向下不允许
  57. $wallet_info = model('wallet')->getWallet($this->auth->id);
  58. if($wallet_info['vip_endtime'] > time() && $recharge_config['vip_level'] < $wallet_info['vip_level']){
  59. $this->error('当前会员没有过期,不能续费');
  60. }
  61. //创建订单
  62. $data = [];
  63. $data['status'] = 0;
  64. $pay_no = createUniqueNo('V',$uid);
  65. $data['pay_no'] = $pay_no;
  66. $data['money'] = $money;
  67. $data['payment_class'] = $pay_type;
  68. $data['user_id'] = $uid;
  69. $data['ext_info'] = json_encode(['subject'=>'充值vip支付']);
  70. $data['memo'] = '充值会员支付';
  71. $data['createtime'] = time();
  72. //$data['payment'] = 'miniapp';
  73. $data['payment'] = 'app';
  74. $orderid = Db::name('pay_order')->insertGetId($data);
  75. //创建回调
  76. $even_data = [];
  77. $even_data['event'] = 'success';
  78. $even_data['class'] = 'app\common\model\Recharge';
  79. $even_data['method'] = 'sandvippaysucc';
  80. $even_data['args'] = json_encode(['user_id'=>$uid,'days'=>$recharge_config['days'],'vip_level'=>$recharge_config['vip_level'],'gold_num'=>$recharge_config['gold_num'],'money'=>$money]);
  81. $even_data['pay_no'] = $pay_no;
  82. Db::name('pay_event')->insertGetId($even_data);
  83. //下单
  84. $sandpay = new \app\common\library\Sandpay();
  85. $sandpayParams = [
  86. 'order_no' => $pay_no,//订单号
  87. 'goods_name' => '充值会员',//商品名称
  88. 'money' => $money,//金额
  89. 'type' => 'vip',//会员
  90. ];
  91. $res = $sandpay->wechat($sandpayParams);
  92. if ($res['status'] == 1) {
  93. $this->success('成功', $res['data']);
  94. }else {
  95. $this->error('失败', $res['data']);
  96. }
  97. }
  98. //充值金币 创建订单废弃
  99. public function sand_gold_recharge(){
  100. $rc_id = input_post('rc_id',0);
  101. $pay_type = input_post('pay_type','wechat');
  102. $freemoney = input_post('freemoney', 0, 'intval');
  103. $uid = $this->auth->id;
  104. if(!$rc_id && !$freemoney){
  105. $this->error('请选择或填写充值金额');
  106. }
  107. // if(!$rc_id){
  108. // $this->error('请选择充值金额');
  109. // }
  110. //赋值money
  111. if($rc_id){
  112. $recharge_config = Db::name('paygold_config')->where('id',$rc_id)->find();
  113. $money = $recharge_config ? $recharge_config['money']: 0;
  114. $gold = $recharge_config ? $recharge_config['gold'] : 0;
  115. $first_gold = $recharge_config ? $recharge_config['first_gold'] : 0;
  116. $first_vipdays = $recharge_config ? $recharge_config['first_vipdays'] : 0;
  117. $vip_gold = $recharge_config ? $recharge_config['vip_gold'] : 0;
  118. }
  119. //自由输入覆盖
  120. if(!empty($freemoney)){
  121. $rc_id = 0;
  122. $money = floatval($freemoney);
  123. $bili = config('site.money_to_gold') ?: 10;
  124. $gold = bcmul($money,$bili,0);
  125. $first_gold = 0;
  126. $first_vipdays = 0;
  127. $vip_gold = 0;
  128. }
  129. //
  130. if($money<=0)
  131. {
  132. $this->error('支付金额必须大于0');
  133. }
  134. if($money > 10000){
  135. $this->error('支付金额太大');
  136. }
  137. //查询是不是会员,若不是则不赠送金币
  138. $vip_endtime = Db::name('user_wallet')->where('user_id',$this->auth->id)->value('vip_endtime');
  139. if ($vip_endtime < time()) {
  140. $vip_gold = 0;
  141. }
  142. //创建订单
  143. $data = [];
  144. $data['status'] = 0;
  145. $pay_no = createUniqueNo('P',$uid);
  146. $data['pay_no'] = $pay_no;
  147. $data['money'] = $money;
  148. $data['payment_class'] = $pay_type;
  149. $data['user_id'] = $uid;
  150. $data['ext_info'] = json_encode(['subject'=>'充值金币支付']);
  151. $data['memo'] = '充值金币支付';
  152. $data['createtime'] = time();
  153. $data['payment'] = 'app';
  154. $orderid = Db::name('pay_order')->insertGetId($data);
  155. //创建回调
  156. $even_data = [];
  157. $even_data['event'] = 'success';
  158. $even_data['class'] = 'app\common\model\Recharge';
  159. $even_data['method'] = 'sandgoldpaysucc';
  160. $even_data['args'] = json_encode(['user_id'=>$uid,'gold'=>$gold,'money'=>$money,'pg_id'=>$rc_id,'first_gold'=>$first_gold,'first_vipdays'=>$first_vipdays, 'intro_uid' => $this->auth->intro_uid, 'vip_gold' => $vip_gold]);
  161. $even_data['pay_no'] = $pay_no;
  162. Db::name('pay_event')->insertGetId($even_data);
  163. //下单
  164. $sandpay = new \app\common\library\Sandpay();
  165. $sandpayParams = [
  166. 'order_no' => $pay_no,//订单号
  167. 'goods_name' => '充值金币',//商品名称
  168. 'money' => $money,//金额
  169. 'type' => 'gold',//充值
  170. ];
  171. $res = $sandpay->wechat($sandpayParams);
  172. if ($res['status'] == 1) {
  173. $this->success('成功', $res['data']);
  174. }else {
  175. $this->error('失败', $res['data']);
  176. }
  177. }
  178. /**
  179. * 支付成功(插件)
  180. */
  181. public function notify()
  182. {
  183. //$input_post_data = json_encode($_POST);
  184. //filePut('[wallet][paySucc]充值参数 recharge money post'.$input_post_data);
  185. $postData = isset($_POST['data']) ? $_POST['data'] : [];
  186. $sign = isset($_POST['sign']) ? $_POST['sign'] : '';
  187. filePut('[wallet][paySucc]充值参数 recharge money data:'.$postData."\n".' sign:'.$sign);
  188. /*$dataArr = [
  189. "head"=>[
  190. "version"=>"1.0",
  191. "respTime"=>"20230913093602",
  192. "respCode"=>"000000",
  193. "respMsg"=>"成功",
  194. ],
  195. "body"=>[
  196. "mid"=>"6888806122762",
  197. "orderCode"=>"P23091309351693000123",
  198. "tradeNo"=>"P23091309351693000123",
  199. "clearDate"=>"20230913",
  200. "totalAmount"=>"000000000001",
  201. "orderStatus"=>"1",
  202. "payTime"=>"20230913093602",
  203. "settleAmount"=>"000000000001",
  204. "buyerPayAmount"=>"000000000001",
  205. "discAmount"=>"000000000000",
  206. "txnCompleteTime"=>"20230913093601",
  207. "payOrderCode"=>"20230913001224810000000000018593",
  208. "accLogonNo"=>"odk6K6wzq1m0sKwDD98Vv0xzYsIo",
  209. "accNo"=>"",
  210. "midFee"=>"000000000000",
  211. "extraFee"=>"000000000000",
  212. "specialFee"=>"000000000000",
  213. "plMidFee"=>"000000000000",
  214. "bankserial"=>"4200001938202309134493832643",
  215. "externalProductCode"=>"00002021",
  216. "cardNo"=>"",
  217. "creditFlag"=>"",
  218. "bid"=>"",
  219. "benefitAmount"=>"000000000000",
  220. "remittanceCode"=>"",
  221. "respTime"=>"20230912141303",
  222. "extend"=>[
  223. "type" => "gold",
  224. ]
  225. ],
  226. ];
  227. $data = ["extend"=>"",
  228. "charset"=>"UTF-8",
  229. "data"=>$dataArr,
  230. "sign"=>"hoCYCLfEmbHjoXg8KHLYU+TCwAh8HrilFUfk7x9GoXAHidKRGu+\/5CkUlC1AqY0OeD3EJKu3ckyqLFUZF4G5PbzFbV27DYNeaRNnbU8htmwCV06a9SgOumv79EJGZ78x2FmNcPL8xu8IhPoOzorLtG5uIifSbsPK4283X09ikb8wTeNFGMMEy+MioftEoOv892kFs5wbNaazJNp8IdAjRwB5wYeMJc28hfnSQfg9SsR5zpqTsMkbiQoybyVdF8msWjlXC1TD5+y33zj77If\/bOK5obSUCrdHZt7S3V5bN2HqyNtFPEK3Ipn2p\/lu3yyo9fFKC5WtgO8G20OVYCu7dQ==",
  231. "signType"=>"01",
  232. ];
  233. $plainText = json_encode($dataArr);*/
  234. //$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"}';
  235. //echo '<pre>';var_dump($plainText);exit;
  236. //提取数据
  237. $plainText = $postData;
  238. $dataArray = json_decode($postData,true);
  239. $head = isset($dataArray['head']) ? $dataArray['head'] : [];
  240. $body = isset($dataArray['body']) ? $dataArray['body'] : [];
  241. $respCode = isset($head['respCode']) ? $head['respCode'] : '000001';
  242. $orderStatus = isset($body['orderStatus']) ? $body['orderStatus'] : '0';
  243. $orderCode = isset($body['orderCode']) ? $body['orderCode'] : '';
  244. $extend = isset($body['extend']) ? $body['extend'] : '';
  245. $extendType = '';
  246. if (!empty($extend)) {
  247. $extendArr = json_decode($extend,true);
  248. $extendType = isset($extendArr['type']) ? $extendArr['type'] : '';
  249. }
  250. //验签 1是正确
  251. $sandpay = new \app\common\library\Sandpay();
  252. /*$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\"}"}}';
  253. $sign = 'Vs2JTo57FwdeT78Lxi7Sgj3XLw48+XxUZblSpVnAQkpgvPqai3m4rkobG8hfuUnYCU/yXxDbYU8hEEfc9rDryT5sFPmmTYjOISJnc6jNDBs6SpeDQhAvnpiiXgZ3/hDWp8ehsgPJbHv5nqlbzLsJM1+WhfW86sfJt70oMiffQ5v9G192zerJWXF3jL9dyLM0WmG2icr9qHz12ZPFyYYonUWRIVc+jcZ0R0qrHD7wAPx+JzbK9crXnTWu1lHjOwcVUrYtMcVDv84wSxl8NnofNUCSMSxVSYHh8ZvgPis7WtgwBcy9XfD30Jux/a/V5oIbN+7yzTlEBIL9pHZb31O4fg==';*/
  254. $encrypt_str = $sandpay->verify($plainText, $sign);
  255. if($encrypt_str != 1){
  256. filePut('[wallet][paySucc]充值入账更新余额失败 recharge money fail'.$orderCode."\n".' data:'.$postData."\n".' sign:'.$sign);
  257. echo 'Fail';exit;
  258. }
  259. //状态验证
  260. if($respCode != '000000'){
  261. filePut('[wallet][paySucc]验证回调状态失败 respCode'.$orderCode);
  262. echo 'Fail';exit;
  263. }
  264. if($orderStatus != '1'){
  265. filePut('[wallet][paySucc]验证回调订单状态 recharge money fail orderStatus'.$orderCode);
  266. echo 'Fail';exit;
  267. }
  268. //查询订单信息
  269. $PayResult = Db::name('pay_order');
  270. $where['pay_no'] = $orderCode;
  271. $order_info = $PayResult->where($where)->find();
  272. if ($order_info['status'] == 1) {
  273. filePut('[wallet][paySucc]充值入账更新余额失败 recharge money fail status已更新过'.$orderCode);
  274. echo 'respCode=000000';exit;
  275. }
  276. //构建支付订单处理结果信息
  277. //$_data['transaction_id'] = isset($data['body']['payOrderCode']) ? $data['body']['payOrderCode'] : ''; //因为文档说不一定有,所以不填了
  278. $_data['status'] = 2;
  279. $result = $PayResult->where($where)->setField($_data);
  280. if ($result || 1) {
  281. //你可以在此编写订单逻辑
  282. $payEventWhere['pay_no'] = $orderCode;
  283. $payEvent = Db::name('pay_event')->where($payEventWhere)->find();
  284. $args = isset($payEvent['args']) ? $payEvent['args'] : '';
  285. $args = json_decode($args,true);
  286. $rechargeM = new \app\common\model\Recharge();
  287. if ($extendType == 'gold') {
  288. $payRes = $rechargeM->goldpaysucc($orderCode,$args);
  289. $payTypeStr = '充值';
  290. } elseif($extendType == 'vip') {
  291. $payRes = $rechargeM->vippaysucc($orderCode,$args);
  292. $payTypeStr = 'vip';
  293. } else {
  294. $payRes = false;
  295. $payTypeStr = '未知支付类型';
  296. }
  297. if(!$payRes){
  298. filePut('[wallet][paySucc]'.$payTypeStr.'更新失败请查看问题'.$orderCode);
  299. exit;
  300. }
  301. filePut('[wallet][paySucc]回调成功'.$orderCode);
  302. echo 'respCode=000000';exit;
  303. }
  304. }
  305. }