Order.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. <?php
  2. namespace app\controller\api;
  3. use app\extra\basic\Base;
  4. use app\extra\dyLife\Crypt;
  5. use app\extra\dyMini\Pay;
  6. use app\middleware\AuthMiddleware;
  7. use app\model\saas\SaasOrder;
  8. use app\service\saas\OrderService;
  9. use DI\Attribute\Inject;
  10. use LinFly\Annotation\Attributes\Route\Controller;
  11. use LinFly\Annotation\Attributes\Route\GetMapping;
  12. use LinFly\Annotation\Attributes\Route\Middleware;
  13. use LinFly\Annotation\Attributes\Route\PostMapping;
  14. use support\Request;
  15. use support\Response;
  16. #[Controller("/dy/order"),Middleware(AuthMiddleware::class)]
  17. class Order extends Base
  18. {
  19. #[Inject]
  20. protected SaasOrder $model;
  21. #[Inject]
  22. protected OrderService $service;
  23. #[GetMapping('list')]
  24. public function getDataList(Request $request): Response
  25. {
  26. try {
  27. $param = $request->all();
  28. if (!empty($param['size'])) {
  29. $param['pageSize'] = $param['size'];
  30. }
  31. $param['openid'] = $request->user['openid'];
  32. $data = $this->service->setModel()->getList($param);
  33. return successTrans("success.data",pageFormat($data));
  34. } catch (\Throwable $th) {
  35. return error($th->getMessage());
  36. }
  37. }
  38. #[PostMapping("refund")]
  39. public function orderRefund(Request $request): Response
  40. {
  41. try {
  42. $param = $this->_valid([
  43. "order.require" => trans("empty.require"),
  44. "refund.require" => trans("empty.require"),
  45. ],$request->method());
  46. if (!is_array($param)) return error($param);
  47. $order = $this->model->where("order_sn",$param['order'])->with(['product','poi'])->findOrEmpty();
  48. if ($order->isEmpty()) return errorTrans("empty.data");
  49. if ($order['openid'] <> $request->user['openid']) return errorTrans("empty.data");
  50. if ($order['status'] <> 1) return error("当前订单不支持退款");
  51. $order->status = 4;
  52. $order->refund_apply = getDateFull();
  53. $state = $order->save();
  54. if (!$state) return errorTrans("error.data");
  55. return successTrans("提交申请成功");
  56. } catch (\Throwable $throwable) {
  57. return error($throwable->getMessage());
  58. }
  59. }
  60. #[GetMapping('detail')]
  61. public function getDataDetail(Request $request): Response
  62. {
  63. try {
  64. $param = $this->_valid([
  65. "order.require" => trans("empty.require")
  66. ],$request->method());
  67. if (!is_array($param)) return error($param);
  68. $order = $this->model->where("order_sn",$param['order'])->with(['product','poi'])->findOrEmpty();
  69. if ($order->isEmpty()) return errorTrans("empty.data");
  70. return $this->encode("ok",$order->toArray());
  71. } catch (\Throwable $th) {
  72. return error($th->getMessage());
  73. }
  74. }
  75. #[GetMapping("confirm")]
  76. public function confirmOrder(Request $request): Response
  77. {
  78. try {
  79. $param = $this->_valid([
  80. "order.require" => trans("empty.require")
  81. ],$request->method());
  82. if (!is_array($param)) return error($param);
  83. $order = $this->model->where("order_sn",$param['order'])->with(['product','poi'])->findOrEmpty();
  84. if ($order->isEmpty()) return errorTrans("empty.data");
  85. if ($order['status'] <> 0) return errorTrans("empty.data");
  86. return $this->encode("ok",$order->toArray());
  87. } catch (\Throwable $throwable) {
  88. return error($throwable->getMessage());
  89. }
  90. }
  91. /**
  92. * 发起支付
  93. * @param Request $request
  94. * @return Response
  95. */
  96. #[PostMapping("toPay")]
  97. public function orderPay(Request $request): Response
  98. {
  99. try {
  100. $param = $this->_valid([
  101. "order.require" => trans("empty.require"),
  102. "mobile.default" => ""
  103. ],$request->method());
  104. if (!is_array($param)) return error($param);
  105. $order = $this->model->where("order_sn",$param['order'])->with(['product','poi'])->findOrEmpty();
  106. $payParam = [
  107. "order_sn" => $order['order_sn'],
  108. "total" => $order['price'],
  109. "name" => $order['product']['product_name'],
  110. "notify_url" => "https://tran.jsshuita.cn/notify/douyin"
  111. ];
  112. $byteAuthorization = (new Pay)->config([
  113. "appid" => sConf("wechat.mini_appid"),
  114. "secret" => sConf("wechat.mini_secret"),
  115. "salt" => sConf("wechat.mch_salt"),
  116. ])->createOrder($payParam);
  117. if (!empty($param['mobile'])) {
  118. $order->mobile = $param['mobile'];
  119. $order->save();
  120. }
  121. return success("ok",['pay' => $byteAuthorization]);
  122. } catch (\Throwable $throwable) {
  123. return error($throwable->getMessage());
  124. }
  125. }
  126. #[PostMapping("mobile")]
  127. public function getOrderMobile(Request $request)
  128. {
  129. try {
  130. $param = $request->post();
  131. $mobile = [];
  132. if (!empty($param['code'])) {
  133. $mobileStr = (new Crypt)->config($this->getDyConfig())->token()->getMobile($param['code']);
  134. if (!empty($mobileStr)) {
  135. $mobile = $this->decrypt2code(sConf('wechat.min_private_key'), $mobileStr);
  136. }
  137. }
  138. $mobileStr = "";
  139. if (!empty($mobile['purePhoneNumber'])) {
  140. $mobileStr = $mobile['purePhoneNumber'];
  141. }
  142. return success("ok",['mobile' => $mobileStr]);
  143. } catch (\Throwable $throwable) {
  144. return error($throwable->getMessage());
  145. }
  146. }
  147. protected function decrypt2code($private_key, $ciphertext_str) {
  148. // 解码 base64 密文
  149. $ciphertext = base64_decode($ciphertext_str);
  150. // 使用私钥解密
  151. openssl_private_decrypt($ciphertext, $plaintext, $private_key, OPENSSL_PKCS1_PADDING);
  152. if ($plaintext === false) {
  153. return [];
  154. }
  155. return json_decode($plaintext,true);
  156. }
  157. protected function decrypt($encrypted_data, $session_key, $iv) {
  158. $data = base64_decode($encrypted_data);
  159. $key = base64_decode($session_key);
  160. $iv_decoded = base64_decode($iv);
  161. // 使用 AES-256-CBC 模式解密
  162. $decrypted = openssl_decrypt($data, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv_decoded);
  163. return $decrypted;
  164. }
  165. }