Notify.php 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. <?php
  2. namespace app\controller\mini;
  3. use app\extra\basic\Base;
  4. use app\model\saas\SaasGoods;
  5. use app\model\saas\SaasOrderLife;
  6. use app\model\saas\SaasOrderLog;
  7. use app\model\saas\SaasStore;
  8. use LinFly\Annotation\Route\Controller;
  9. use LinFly\Annotation\Route\Route;
  10. use support\Request;
  11. use support\Response;
  12. #[Controller(prefix: "/notify")]
  13. class Notify extends Base
  14. {
  15. /**
  16. * 小程序webhook
  17. * @param Request $request
  18. * @return Response
  19. */
  20. #[Route(path: "hook",methods: "post")]
  21. public function webhook(Request $request): Response
  22. {
  23. try {
  24. $param = $request->post();
  25. if (empty($param['event'])) return error("参数错误");
  26. if (empty($param['content'])) return error("参数错误");
  27. switch ($param['event']) {
  28. case "verify_webhook":
  29. $return = ['challenge' => $param['content']['challenge']];
  30. break;
  31. case "life_trade_order_notify": // 支付成功
  32. $resp = json_decode($param['content'], true);
  33. if ($resp['action'] == "pay_success") {
  34. $order = (new SaasOrderLife)->where("order_id",$resp['order']['order_id'])->findOrEmpty();
  35. if ($order->isEmpty()) {
  36. $store = (new SaasStore)->where("store_id",$resp['order']['account_id'])->findOrEmpty();
  37. $order->insertGetId([
  38. "agent_id" => $store['agent_id']??'',
  39. "store_id" => $store['store_id']??'',
  40. "order_id" => $resp['order']['order_id'],
  41. "pay_amount" => $resp['order']['pay_amount'],
  42. "order_amount" => $resp['order']['original_amount'],
  43. "pay_at" => getDateFull("",$resp['order']['pay_time'])
  44. ]);
  45. (new SaasOrderLog)->insertGetId([
  46. "order_id" => $resp['order']['order_id'],
  47. "title" => "发起订单",
  48. "remark" => "下单并完成支付"
  49. ]);
  50. }
  51. }
  52. $return = [];
  53. break;
  54. case "life_trade_certificate_notify": // 退款
  55. $resp = json_decode($param['content'], true);
  56. if ($resp['action'] == "refund_success") {
  57. $order = (new SaasOrderLife)->where("order_id",$resp['order']['order_id'])->findOrEmpty();
  58. if (!$order->isEmpty()) {
  59. $order->status = 4;
  60. $order->refund_at = getDateFull();
  61. $order->save();
  62. }
  63. }
  64. $return = [];
  65. break;
  66. default:
  67. $return = [];
  68. break;
  69. }
  70. return json($return);
  71. } catch (\Throwable $e) {
  72. return error($e->getMessage());
  73. }
  74. }
  75. /**
  76. * 核销工具解决方案-spi
  77. * @param Request $request
  78. * @return Response
  79. */
  80. #[Route(path: "pay",methods: ['get','post'])]
  81. public function getPayStatue(Request $request): Response
  82. {
  83. try {
  84. if ($request->method() == "POST") {
  85. $param = $request->post();
  86. } else {
  87. $param = $request->get();
  88. }
  89. echo getDateFull()."===支付结果回调===方式{$request->method()}\n";
  90. echo getDateFull()."==支付结果回调==\n";
  91. print_r($param);
  92. return json([
  93. "err_no" => 0,
  94. "err_tips" => "success"
  95. ]);
  96. } catch (\Throwable $throwable) {
  97. return error($throwable->getMessage());
  98. }
  99. }
  100. /**
  101. * 核销工具解决方案-spi
  102. * @param Request $request
  103. * @return Response
  104. */
  105. #[Route(path: "mini",methods: ['get','post'])]
  106. public function getSpiData(Request $request): Response
  107. {
  108. try {
  109. print_r($request->rawHead());
  110. print_r($request->rawBody());
  111. if ($request->method() == "POST") {
  112. $param = $request->post();
  113. } else {
  114. $param = $request->get();
  115. }
  116. echo getDateFull()."===统一===方式{$request->method()}\n";
  117. echo getDateFull()."=={$param['type']}==\n";
  118. print_r($param);
  119. return json([
  120. "err_no" => 0,
  121. "err_tips" => "success"
  122. ]);
  123. } catch (\Throwable $throwable) {
  124. return error($throwable->getMessage());
  125. }
  126. }
  127. /**
  128. * 核销工具解决方案-扩展点-spi
  129. * @param Request $request
  130. * @return Response
  131. */
  132. #[Route(path: "expand",methods: ['get','post'])]
  133. public function getExpandData(Request $request): Response
  134. {
  135. try {
  136. print_r($request->rawHead());
  137. print_r($request->rawBody());
  138. if ($request->method() == "POST") {
  139. $param = $request->post();
  140. } else {
  141. $param = $request->get();
  142. }
  143. echo getDateFull()."===扩展点===方式{$request->method()}\n";
  144. switch ($param['type'])
  145. {
  146. case "pre_create_order": // 预下单回调
  147. $orderData = json_decode($param['msg']);
  148. $orderGoods = (new SaasGoods)->where("out_id",$orderData['goods'][0]['goods_id'])->findOrEmpty();
  149. if ($orderGoods->isEmpty()) return json([
  150. "err_no" => 0,
  151. "err_tips" => "success"
  152. ]);
  153. (new SaasOrderLife)->insertGetId([
  154. "open_id" => $orderData['open_id'],
  155. "agent_id" => $orderGoods['agent_id'],
  156. "store_id" => $orderGoods['agent_id'],
  157. "order_id" => $orderData['order_id'],
  158. "product_name" => $orderData['goods'][0]['title'],
  159. "product_img" => $orderData['goods'][0]['img_url'],
  160. "out_id" => $orderData['goods'][0]['goods_id'],
  161. "order_amount" => $orderData['goods'][0]['price'],
  162. "pay_amount" => $orderData['goods'][0]['price'],
  163. "count" => $orderData['goods'][0]['quantity'],
  164. "status" => 0
  165. ]);
  166. return json([
  167. "out_order_no" => $orderData['order_id'],
  168. "order_entry_schema" => [
  169. "path" => "page/order/detail",
  170. "params" => ['order' => $orderData['order_id']]
  171. ],
  172. "pay_notify_url" => "https://hx-mini-api.jsshuita.com.cn/notify/pay"
  173. ]);
  174. break;
  175. case "pre_create_refund": // 退款审核回调
  176. break;
  177. }
  178. echo getDateFull()."=={$param['type']}==\n";
  179. print_r($param);
  180. return json([
  181. "err_no" => 0,
  182. "err_tips" => "success"
  183. ]);
  184. } catch (\Throwable $throwable) {
  185. return error($throwable->getMessage());
  186. }
  187. }
  188. }