Pay.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <?php
  2. namespace app\api\controller;
  3. use app\common\controller\Api;
  4. use think\Config;
  5. use think\Db;
  6. /**
  7. * 会员接口
  8. */
  9. class Pay extends Api
  10. {
  11. protected $noNeedLogin = ['notify'];
  12. protected $noNeedRight = '*';
  13. public function _initialize()
  14. {
  15. parent::_initialize();
  16. if (!Config::get('fastadmin.usercenter')) {
  17. $this->error(__('User center already closed'));
  18. }
  19. }
  20. //二合一支付
  21. public function pay() {
  22. $user_token = input('user_token', '', 'trim');
  23. if (!$user_token) {
  24. $this->error('参数缺失');
  25. }
  26. //生成支付订单记录
  27. $rechar_order['user_id'] = $this->auth->id;
  28. $rechar_order['order_no'] = date('YmdHis', time()) . $this->auth->id . rand(10000000, 99999999); //微信订单编号
  29. $rechar_order['money'] = 49;
  30. $rechar_order['purpose'] = 3; //充值用途:1=支付订单,2=充值,3=开通会员
  31. $rechar_order['pay_type'] = 'zhuowang';
  32. $rechar_order['relation_id'] = 1;
  33. $rechar_order['createtime'] = time();
  34. //开始事务
  35. $result = Db::name('rechar_order')->insertGetId($rechar_order);
  36. if (!$result) {
  37. $this->error('网络延迟,请稍后再试');
  38. }
  39. $url = 'http://' . config('pay_ip') . '/HDC/3.0/hop/svc/pay/toPay.ajax';
  40. $data = [
  41. 'transId' => $rechar_order['order_no'],
  42. 'orderNo' => $rechar_order['order_no'],
  43. 'userToken' => $user_token,
  44. 'notifyUrl' => config('img_url') . '/api/pay/notify',
  45. 'backUrl' => config('back_url'),
  46. 'deskCode' => config('desk_code'),
  47. 'products' => [
  48. [
  49. 'productCode' => config('product_code'),
  50. 'productPrice' => '29',
  51. 'productUnit' => '连续包月',
  52. 'productCount' => 1
  53. ],
  54. [
  55. 'productCode' => config('product_code'),
  56. 'productPrice' => '199',
  57. 'productUnit' => '特惠包一年',
  58. 'productCount' => 1
  59. ],
  60. [
  61. 'productCode' => config('product_code'),
  62. 'productPrice' => '269',
  63. 'productUnit' => '特惠包两年',
  64. 'productCount' => 1
  65. ],
  66. ]
  67. ];
  68. $data = json_encode($data, 320);
  69. //获取鉴权token
  70. $sign_bytes = '/3.0/hop/svc/pay/toPay.ajax' . $this->base16_encode(md5($data));
  71. $hdc_token = hash_hmac('sha256', $sign_bytes, base64_decode(config('pay_appkey')), false);
  72. $header = [
  73. 'Host:' . config('pay_ip'),
  74. 'HDC-Service:2',
  75. 'HDC-APPID:' . config('pay_appid'),
  76. 'HDC-Token:' . $hdc_token,
  77. 'Content-Type:application/json'
  78. ];
  79. $rs = httpRequest($url, 'POST', $data, $header);
  80. if (!$rs) {
  81. $this->error('您的网络开小差了~');
  82. }
  83. $rs = json_decode($rs, true);
  84. if ($rs['resultCode'] != 0) {
  85. $this->error('您的网络开小差了~');
  86. }
  87. $this->success('链接', $rs['data']);
  88. }
  89. //支付回调
  90. public function notify() {
  91. $data = file_get_contents('php://input');
  92. if (!$data) {
  93. $this->error('参数缺失');
  94. }
  95. $data = json_decode($data, true);
  96. if (!$data) {
  97. $this->error('参数缺失');
  98. }
  99. if ($data['orderstate'] != 0) {
  100. echo json_encode([
  101. 'transid' => $data['transid'],
  102. 'orderid' => $data['orderid'],
  103. 'statuscode' => -1,
  104. 'statusdesc' => '订单状态失败'
  105. ], 320);
  106. die;
  107. }
  108. $order_no = $data['orderid'];
  109. $where['order_no'] = $order_no;
  110. $order_info = Db::name('rechar_order')->where($where)->find();
  111. if (!$order_info) {
  112. echo json_encode([
  113. 'transid' => $data['transid'],
  114. 'orderid' => $data['orderid'],
  115. 'statuscode' => -1,
  116. 'statusdesc' => '业务订单不存在'
  117. ], 320);
  118. die;
  119. }
  120. if ($order_info['status'] == 1) { //已回调成功
  121. echo json_encode([
  122. 'transid' => $data['transid'],
  123. 'orderid' => $data['orderid'],
  124. 'statuscode' => 0,
  125. 'statusdesc' => ''
  126. ], 320);
  127. die;
  128. }
  129. //构建支付订单处理结果信息
  130. $_data['status'] = 1;
  131. $_data['updatetime'] = time();
  132. if ($order_info['purpose'] == 3) {
  133. //开通会员
  134. Db::startTrans();
  135. //充值
  136. $rs = Db::name('user')->where(['id' => $order_info['user_id']])->setField('is_vip', 1);
  137. if ($rs === false) {
  138. Db::rollback();
  139. $_data['pay_status'] = 3; //回调状态:1=支付订单回调失败,2=充值回调失败,3=开通会员回调失败
  140. } else {
  141. Db::commit();
  142. }
  143. }
  144. //修改订单信息
  145. Db::name('rechar_order')->where($where)->setField($_data);
  146. echo json_encode([
  147. 'transid' => $data['transid'],
  148. 'orderid' => $data['orderid'],
  149. 'statuscode' => 0,
  150. 'statusdesc' => ''
  151. ], 320);
  152. }
  153. }