Eepay.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. <?php
  2. namespace app\api\controller;
  3. use addons\epay\library\Service;
  4. use app\api\model\CoinRecord;
  5. use app\api\model\Delivery;
  6. use app\api\model\DeliveryTrade;
  7. use app\api\model\Order;
  8. use app\api\model\Prizerecord;
  9. use app\api\model\RechargeOrder;
  10. use app\common\controller\Frontend;
  11. use think\Db;
  12. /**
  13. * 支付宝支付接口
  14. * Class Alipay
  15. * @package app\api\controller
  16. * @version 1.0
  17. * @author fuyelk <fuyelk@fuyelk.com>
  18. */
  19. class Eepay extends Frontend
  20. {
  21. protected $noNeedLogin = ['notifyx', 'boxpaysuccess', 'rechargesuccess'];
  22. protected $noNeedRight = ['*'];
  23. /**
  24. * 盲盒订单支付
  25. * @throws \Exception
  26. * @author fuyelk <fuyelk@fuyelk.com>
  27. */
  28. public function boxpay($orderid = '')
  29. {
  30. if (empty($orderid)) {
  31. $this->error('订单ID不能为空');
  32. }
  33. $order = Order::where('id', $orderid)->where('user_id', $this->auth->id)->where('status', 'unpay')->find();
  34. if (empty($order)) {
  35. $this->error('订单有误', '');
  36. }
  37. $params = [
  38. 'amount' => $order->rmb_amount,
  39. 'orderid' => $order->out_trade_no,
  40. 'type' => "alipay",
  41. 'title' => $order->box_name,
  42. 'notifyurl' => $this->request->domain() . '/api/alipay/notifyx/orderfrom/buybox',
  43. 'returnurl' => $this->request->domain() . '/api/alipay/boxpaysuccess',
  44. 'method' => "wap",
  45. ];
  46. $query = input('get.');
  47. if (isset($query['orderid'])) {
  48. unset($query['orderid']);
  49. }
  50. $this->auth->redis->set($order->out_trade_no, $query, 60 * 30); // 将参数存入缓存,30分钟
  51. echo 222;
  52. // echo \addons\epay\library\Service::submitOrder($params);
  53. }
  54. /**
  55. * 充值订单支付
  56. * @throws \Exception
  57. * @author fuyelk <fuyelk@fuyelk.com>
  58. */
  59. public function rechargepay($orderid = '')
  60. {
  61. if (empty($orderid)) {
  62. $this->error('订单ID不能为空');
  63. }
  64. $order = RechargeOrder::where('id', $orderid)->where('user_id', $this->auth->id)->where('status', 'unpay')->find();
  65. if (empty($order)) {
  66. $this->error('订单有误', '');
  67. }
  68. $params = [
  69. 'amount' => $order->rmb_amount,
  70. 'orderid' => $order->out_trade_no,
  71. 'type' => "alipay",
  72. 'title' => '充值',
  73. 'notifyurl' => $this->request->domain() . '/api/alipay/notifyx/orderfrom/recharge',
  74. 'returnurl' => $this->request->domain() . '/api/alipay/rechargesuccess',
  75. 'method' => "wap",
  76. ];
  77. $query = input('get.');
  78. if (isset($query['orderid'])) {
  79. unset($query['orderid']);
  80. }
  81. $this->auth->redis->set($order->out_trade_no, $query, 60 * 30); // 将参数存入缓存,30分钟
  82. //print_r($params);
  83. echo \addons\eepay\Service::pay($params);
  84. // echo \addons\epay\library\Service::submitOrder($params);
  85. }
  86. /**
  87. * 发货订单支付
  88. * @throws \Exception
  89. * @author fuyelk <fuyelk@fuyelk.com>
  90. */
  91. public function deliverypay($orderid = '')
  92. {
  93. if (empty($orderid)) {
  94. $this->error('订单ID不能为空');
  95. }
  96. $order = DeliveryTrade::where('id', $orderid)->where('user_id', $this->auth->id)->where('status', 'unpay')->find();
  97. if (empty($order)) {
  98. $this->error('订单有误', '');
  99. }
  100. $params = [
  101. 'amount' => $order->rmb_amount,
  102. 'orderid' => $order->out_trade_no,
  103. 'type' => "alipay",
  104. 'title' => '快递费用',
  105. 'notifyurl' => $this->request->domain() . '/api/alipay/notifyx/orderfrom/delivery',
  106. 'returnurl' => $this->request->domain() . '/api/alipay/deliverypaysuccess',
  107. 'method' => "wap",
  108. ];
  109. $query = input('get.');
  110. if (isset($query['orderid'])) {
  111. unset($query['orderid']);
  112. }
  113. $this->auth->redis->set($order->out_trade_no, $query, 60 * 30); // 将参数存入缓存,30分钟
  114. echo \addons\epay\library\Service::submitOrder($params);
  115. }
  116. /**
  117. * 盲盒、充值支付回调
  118. */
  119. public function notifyx($orderfrom = '')
  120. {
  121. // 回调只能来自于购买盲盒和充值
  122. if (!in_array($orderfrom, ['buybox', 'recharge', 'delivery'])) {
  123. dta(input(), '支付宝回调有误');
  124. echo '请求有误';
  125. return;
  126. }
  127. $pay = Service::checkNotify('alipay');
  128. if (!$pay) {
  129. dta('支付宝签名错误', __METHOD__ . ' ' . __LINE__);
  130. echo '签名错误';
  131. return;
  132. }
  133. Db::startTrans();
  134. try {
  135. $data = $pay->verify()->toArray();
  136. $usefulTemplate = array(
  137. 'invoice_amount' => '12.34',
  138. 'trade_status' => 'TRADE_SUCCESS',
  139. 'receipt_amount' => '12.34',
  140. 'buyer_pay_amount' => '12.34',
  141. 'notify_time' => '2021-07-16 14:40:39',
  142. 'out_trade_no' => '20210716144024',
  143. 'total_amount' => '12.34',
  144. 'trade_no' => '2021071622001413960501380461',
  145. );
  146. if ('TRADE_SUCCESS' != strtoupper($data['trade_status'])) {
  147. dta(array_intersect_key($data, $usefulTemplate), '支付宝支付失败');
  148. echo '支付失败';
  149. return;
  150. }
  151. // 购买盲盒订单,更新盲盒订单
  152. if ('buybox' == $orderfrom) {
  153. $order = Order::where('out_trade_no', $data['out_trade_no'])->where('status', 'unpay')->find();
  154. if (empty($order)) {
  155. dta(array_intersect_key($data, $usefulTemplate), '订单有误,支付失败');
  156. echo '支付失败';
  157. return;
  158. }
  159. $order->save([
  160. 'pay_method' => 'alipay',
  161. 'pay_rmb' => $data['total_amount'],
  162. 'alipay_trade_no' => $data['trade_no'],
  163. 'pay_time' => time(),
  164. 'status' => 'unused',
  165. 'backend_read' => 0,
  166. ]);
  167. }
  168. // 充值订单
  169. if ('recharge' == $orderfrom) {
  170. $order = RechargeOrder::where('out_trade_no', $data['out_trade_no'])->where('status', 'unpay')->find();
  171. if (empty($order)) {
  172. dta(array_intersect_key($data, $usefulTemplate), '订单有误,支付失败');
  173. echo '支付失败';
  174. return;
  175. }
  176. $order->save([
  177. 'pay_method' => 'alipay',
  178. 'pay_rmb' => $data['total_amount'],
  179. 'alipay_trade_no' => $data['trade_no'],
  180. 'pay_time' => time(),
  181. 'status' => 'paid',
  182. 'backend_read' => 0,
  183. ]);
  184. $user = \app\common\model\User::where('id', $order->user_id)->find();
  185. // 给账户充值前
  186. $coin_before = $user->coin;
  187. // 增加金币余额
  188. $user->setInc('coin', $order->coin_amount);
  189. // 创建金币记录
  190. CoinRecord::create([
  191. 'user_id' => $user->id,
  192. 'before' => $coin_before,
  193. 'after' => $user->coin,
  194. 'coin' => $order->coin_amount,
  195. 'order_id' => $order->id,
  196. 'type' => 'recharge', // 变更类型:pay_box=支付盲盒,recharge=充值,fromwallet=余额转入,refund=退款
  197. ]);
  198. }
  199. // 发货订单
  200. if ('delivery' == $orderfrom) {
  201. $trade = DeliveryTrade::where('out_trade_no', $data['out_trade_no'])->where('status', 'unpay')->find();
  202. if (empty($trade)) {
  203. dta(array_intersect_key($data, $usefulTemplate), '订单有误,支付失败');
  204. echo '支付失败';
  205. return;
  206. }
  207. // 变更发货交易订单状态
  208. $trade->save([
  209. 'pay_method' => 'alipay',
  210. 'pay_rmb' => $data['total_amount'],
  211. 'alipay_trade_no' => $data['trade_no'],
  212. 'pay_time' => time(),
  213. 'status' => 'paid'
  214. ]);
  215. // 变更发货订单状态
  216. $deliveryOrder = Delivery::where('delivery_trade_id', $trade->id)->select();
  217. $prizeIds = [];
  218. foreach ($deliveryOrder as $order) {
  219. $order->save(['status' => 'undelivered']);
  220. $prizeIds[] = $order->prize_id;
  221. }
  222. // 变更奖品状态
  223. Prizerecord::whereIn('id', $prizeIds)->update(['status' => 'delivery', 'delivery_time' => time()]);
  224. }
  225. } catch (\Exception $e) {
  226. Db::rollback();
  227. dta($e->getMessage(), '支付宝回调执行出错');
  228. echo '错误';
  229. return;
  230. }
  231. Db::commit();
  232. echo $pay->success();
  233. }
  234. /**
  235. * 盲盒支付成功后用户会被重定向到这里
  236. * @author fuyelk <fuyelk@fuyelk.com>
  237. */
  238. public function boxpaysuccess()
  239. {
  240. $out_trade_no = $this->request->param('out_trade_no');
  241. $pay = Service::checkReturn('alipay');
  242. // 读取缓存里的参数
  243. $query = $this->auth->redis->get($out_trade_no);
  244. if (!$query || !is_array($query)) {
  245. $query = [];
  246. }
  247. $query['status'] = 1;
  248. if (!$pay) {
  249. $query['status'] = 0;
  250. }
  251. $query['out_trade_no'] = $out_trade_no;
  252. $params = http_build_query($query);
  253. // 将用户重定向到前端页面
  254. $this->redirect($this->request->domain() . "/h5/#/pagesA/pages/camera?" . $params);
  255. }
  256. /**
  257. * 充值支付成功后用户会被重定向到这里
  258. * @author fuyelk <fuyelk@fuyelk.com>
  259. */
  260. public function rechargesuccess()
  261. {
  262. $out_trade_no = $this->request->param('out_trade_no');
  263. $pay = Service::checkReturn('alipay');
  264. // 读取缓存里的参数
  265. $query = $this->auth->redis->get($out_trade_no);
  266. if (!$query || !is_array($query)) {
  267. $query = [];
  268. }
  269. $query['status'] = 1;
  270. if (!$pay) {
  271. $query['status'] = 0;
  272. }
  273. $params = http_build_query($query);
  274. // 将用户重定向到前端页面
  275. $this->redirect($this->request->domain() . "/h5/#/pages/me/wallet?" . $params);
  276. }
  277. /**
  278. * 发货订单支付成功后用户会被重定向到这里
  279. * @author fuyelk <fuyelk@fuyelk.com>
  280. */
  281. public function deliverypaysuccess()
  282. {
  283. $out_trade_no = $this->request->param('out_trade_no');
  284. $pay = Service::checkReturn('alipay');
  285. // 读取缓存里的参数
  286. $query = $this->auth->redis->get($out_trade_no);
  287. if (!$query || !is_array($query)) {
  288. $query = [];
  289. }
  290. $query['status'] = 1;
  291. if (!$pay) {
  292. $query['status'] = 0;
  293. }
  294. $params = http_build_query($query);
  295. // 将用户重定向到前端页面
  296. $this->redirect($this->request->domain() . "/h5/#/pages/me/order?type=0?" . $params);
  297. }
  298. }