PayController.php 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. <?php
  2. namespace app\index\controller;
  3. use think\exception\ValidateException;
  4. use app\model\Member;
  5. use app\model\MemberCashlogs;
  6. use app\model\Order;
  7. use app\model\Tongue;
  8. use app\model\Viporder;
  9. use app\model\Test;
  10. use app\model\Config;
  11. class PayController extends Base
  12. {
  13. public function index()
  14. {
  15. $orderid = intval(input('post.orderid', '', 'serach_in'));
  16. $money = input('post.money', '', 'serach_in');
  17. $money = round($money, 2);
  18. $money = floatval($money * 100);
  19. $type = input('post.type', '', 'serach_in');
  20. if ($type == "order") {
  21. if (!empty($orderid)) {
  22. $orderdata = Order::find($orderid);
  23. if (!empty($orderdata)) {
  24. $orderdata = $orderdata->toArray();
  25. } else {
  26. return $this->json(['errno' => 1, 'msg' => '订单不存在']);
  27. }
  28. //构造支付参数
  29. $paydata = array(
  30. 'body' => '订单支付',
  31. 'out_trade_no' => $orderdata['order_num_alias'],
  32. 'total_fee' => $money,
  33. );
  34. }
  35. } elseif ($type == "vip") {
  36. $viporderdata = Viporder::find($orderid);
  37. $paydata = array(
  38. 'body' => '购买会员等级',
  39. 'out_trade_no' => 'vip-' . $viporderdata['order_num_alias'],
  40. 'total_fee' => $money,
  41. );
  42. } elseif ($type == "additional") {
  43. if (!empty($orderid)) {
  44. $orderdata = Order::find($orderid);
  45. if (!empty($orderdata)) {
  46. $orderdata = $orderdata->toArray();
  47. } else {
  48. return $this->json(['errno' => 1, 'msg' => '订单不存在']);
  49. }
  50. //构造支付参数
  51. $paydata = array(
  52. 'body' => '支付尾款',
  53. 'out_trade_no' => 'additional-' . $orderdata['order_num_alias'],
  54. 'total_fee' => $money,
  55. );
  56. }
  57. } elseif ($type == "paybill") {
  58. $paydata = array(
  59. 'body' => '优惠买单',
  60. 'out_trade_no' => 'paybill-' . time(),
  61. 'total_fee' => $money,
  62. );
  63. } elseif ($type == "recharge") {
  64. $paydata = array(
  65. 'body' => '充值',
  66. 'out_trade_no' => 'recharge-' . time(),
  67. 'total_fee' => $money,
  68. );
  69. } elseif ($type == "tongue") {
  70. $paydata = array(
  71. 'body' => 'AI舌诊',
  72. 'out_trade_no' => 'tongue-' . $orderid,
  73. 'total_fee' => $money,
  74. );
  75. }
  76. //生成支付参数,返回给小程序端
  77. $pay_params = $this->wxpay($paydata);
  78. //$pay_params['url'] = gethost() . TP_APIURL .'/index.php/index/pay/notify/state/'.input('get.state');
  79. return $this->json($pay_params);
  80. }
  81. public function wxpay($paydata)
  82. {
  83. // 支付结果通知网址,如果不设置则会使用配置里的默认地址
  84. $paydata['notify_url'] = gethost() . TP_APIURL . '/index.php/index/pay/notify/state/' . input('get.state', '', 'serach_in').'/from/' . input('get.from', '', 'serach_in');
  85. $paydata['trade_type'] = 'JSAPI';
  86. $paydata['openid'] = getFans()['openid'];
  87. $payment = \app\samos\wechat\WxPaymethod::makepay($this->userInfo['ptype']);
  88. $result = $payment->order->unify($paydata);
  89. //Test::create(['title' => '微信支付信息', 'info' => serialize($paydata)]);
  90. if ($result['return_code'] != 'SUCCESS' || $result['result_code'] != 'SUCCESS') {
  91. $msg = '支付失败';
  92. return ['errno' => 1, 'msg' => $msg, 'message' => $msg, 'data' => $result];
  93. } else {
  94. $jssdk = $payment->jssdk;
  95. $payres = $jssdk->bridgeConfig($result['prepay_id'], false);
  96. return ['data' => $payres];
  97. }
  98. }
  99. //支付回调
  100. public function notify()
  101. {
  102. //$xml = file_get_contents("php://input"); //回调回来的数据
  103. //Test::create(['title' => '微信支付回调', 'info' => serialize($xml)]);
  104. //file_put_contents('log/'.time() . "backdata.txt", $xml); //数据写入文件
  105. $response = \app\samos\wechat\WxPaymethod::makepay($this->userInfo['ptype'])->handlePaidNotify(function ($message, $fail) {
  106. //Test::create(['title' => '微信支付回调3', 'info' => $message['return_code']]);
  107. if ($message['return_code'] === 'SUCCESS') { // return_code 表示通信状态,不代表支付状态
  108. if ($message['result_code'] === 'SUCCESS') {
  109. //支付成功
  110. $tid = $message['out_trade_no'];
  111. $tidarray = explode('-', $tid);
  112. $message['total_fee'] = $message['total_fee'] / 100;
  113. if (!empty($tidarray[1])) {
  114. $tid = $tidarray[1];
  115. }
  116. if ($tidarray[0] == 'paybill') {
  117. $cashlogsdata['uid'] = UID();
  118. $cashlogsdata['weid'] = weid();
  119. $cashlogsdata['id'] = '0';
  120. $cashlogsdata['order_num_alias'] = '0';
  121. $cashlogsdata['remarks'] = '优惠买单';
  122. $cashlogsdata['prefix'] = 2;
  123. $cashlogsdata['amount'] = $message['total_fee'];
  124. MemberCashlogs::create($cashlogsdata);
  125. } elseif ($tidarray[0] == 'recharge') {
  126. Member::where('id', UID())
  127. ->inc('balance', $message['total_fee'])
  128. ->update();
  129. $cashlogsdata['uid'] = UID();
  130. $cashlogsdata['weid'] = weid();
  131. $cashlogsdata['id'] = '0';
  132. $cashlogsdata['order_num_alias'] = '0';
  133. $cashlogsdata['remarks'] = '充值';
  134. $cashlogsdata['prefix'] = 1;
  135. $cashlogsdata['amount'] = $message['total_fee'];
  136. MemberCashlogs::create($cashlogsdata);
  137. } elseif ($tidarray[0] == 'additional') {
  138. Order::itional_pay($tid);
  139. } elseif ($tidarray[0] == 'tongue') {
  140. Tongue::where('id', $tid)->update(['is_pay' => 1]);
  141. } elseif ($tidarray[0] == 'vip') {
  142. Viporder::pay_order(['order_num_alias' => $tid]);
  143. } else {
  144. $fee = $message['total_fee'];
  145. if (!empty($fee)) {
  146. $order = Order::find($tid);
  147. if (!empty($order)) {
  148. $order = $order->toArray();
  149. }
  150. }
  151. $data['order_num_alias'] = $tid;
  152. $data['user_agent'] = serialize($message);
  153. $ordermod = new Order;
  154. $ordermod->pay_order($data);
  155. }
  156. return true;
  157. } elseif ($message['result_code'] === 'FAIL') {
  158. // 用户支付失败
  159. return true;
  160. }
  161. } else {
  162. return false;
  163. }
  164. });
  165. return $response;
  166. }
  167. }