PaymentRecordService.php 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. <?php
  2. declare(strict_types=1);
  3. namespace SixShop\Lakala\Service;
  4. use app\model\Order;
  5. use app\model\OrderGoods;
  6. use SixShop\Core\Exception\LogicException;
  7. use SixShop\Lakala\Enum\WechatOrderStateEnum;
  8. use SixShop\Lakala\Model\LakalaWechatPaymentModel;
  9. use SixShop\Payment\Model\ExtensionPaymentModel;
  10. use SixShop\Wechat\Entity\WechatDeliveryEntity;
  11. use SixShop\Wechat\Service\ExpressService;
  12. use think\db\Query;
  13. use think\facade\Log;
  14. use think\Paginator;
  15. class PaymentRecordService
  16. {
  17. public function __construct(private ExpressService $expressService)
  18. {
  19. }
  20. public function getTradeOrderList(array $params, array $pageAndLimit): Paginator
  21. {
  22. $paginator = ExtensionPaymentModel::alias('p')
  23. ->leftJoin('order o', 'o.id = p.order_id')
  24. ->leftJoin('lakala_wechat_payment w', 'p.id = w.payment_id')
  25. ->where([
  26. 'p.pay_type' => 'lakala',
  27. 'p.status' => 2
  28. ])
  29. ->when($params['order_sn'], function (Query $query) use ($params) {
  30. $query->whereLike('o.order_sn', '%' . $params['order_sn'] . '%');
  31. })
  32. ->when($params['out_trade_no'], function (Query $query) use ($params) {
  33. $query->whereLike('p.out_trade_no', '%' . $params['out_trade_no'] . '%');
  34. })
  35. ->when($params['transaction_id'], function (Query $query) use ($params) {
  36. $query->whereLike('p.transaction_id', '%' . $params['transaction_id'] . '%');
  37. })
  38. ->when($params['wechat_transaction_id'], function (Query $query) use ($params) {
  39. $query->whereLike('w.wechat_transaction_id', '%' . $params['wechat_transaction_id'] . '%');
  40. })
  41. ->field([
  42. 'p.id',
  43. 'p.order_sn',
  44. 'p.out_trade_no',
  45. 'p.transaction_id',
  46. 'p.amount',
  47. 'p.payment_time',
  48. 'o.express_name',
  49. 'o.express_number',
  50. 'o.shipping_status',
  51. 'o.consignee',
  52. 'o.mobile',
  53. 'o.province',
  54. 'o.city',
  55. 'o.district',
  56. 'o.address',
  57. 'w.id as wechat_payment_id',
  58. 'w.wechat_transaction_id',
  59. 'w.order_state',
  60. 'w.goods_desc',
  61. 'w.express_company',
  62. 'w.express_company_name'
  63. ])
  64. ->order('p.id', 'DESC')
  65. ->paginate($pageAndLimit);
  66. $paginator->each(function (ExtensionPaymentModel $item) {
  67. if ($item['order_state'] == null) {
  68. $wechatOrder = $this->createWechatOrder($item->id);
  69. $item->setAttrs([
  70. 'wechat_transaction_id' => $wechatOrder['wechat_transaction_id'],
  71. 'order_state' => $wechatOrder['order_state'],
  72. 'goods_desc' => $wechatOrder['goods_desc'],
  73. ]);
  74. } else {
  75. $item->setAttr('order_state_text', WechatOrderStateEnum::from($item['order_state'])->toString());
  76. }
  77. });
  78. return $paginator;
  79. }
  80. public function createWechatOrder(int $paymentID): LakalaWechatPaymentModel
  81. {
  82. $payment = ExtensionPaymentModel::find($paymentID);
  83. $goods = OrderGoods::where(['order_id' => $payment['order_id']])->find();
  84. return LakalaWechatPaymentModel::create([
  85. 'payment_id' => $payment['id'],
  86. 'wechat_transaction_id' => $payment['payment_result']['acc_trade_no'],
  87. 'order_state' => WechatOrderStateEnum::PENDING_SHIPMENT,
  88. 'goods_desc' => $goods['goods_name'],
  89. ]);
  90. }
  91. /**
  92. * 更新微信发货状态
  93. */
  94. public function updateWechatOrder(int $paymentID): void
  95. {
  96. $wechatPayment = LakalaWechatPaymentModel::where(['payment_id' => $paymentID])->find();
  97. try {
  98. $result = $this->expressService->queryOrder($wechatPayment->wechat_transaction_id);
  99. } catch (LogicException $e) {
  100. return;
  101. }
  102. $orderState = WechatOrderStateEnum::from($result['order_state']);
  103. if ($orderState != $wechatPayment->order_state) {
  104. $wechatPayment->order_state = $orderState;
  105. $wechatPayment->save();
  106. }
  107. if ($orderState === WechatOrderStateEnum::PENDING_SHIPMENT) {
  108. $payment = ExtensionPaymentModel::find($paymentID);
  109. $goods = OrderGoods::where(['order_id' => $payment['order_id']])->find();
  110. $order = Order::find($payment['order_id']);
  111. if ($wechatPayment->express_company == null) {
  112. $delivery = WechatDeliveryEntity::where(['delivery_name' => $order['express_name']])->findOrEmpty();
  113. if ($delivery->isEmpty()) {
  114. // 未找到从历史记录查找
  115. $wechatPayment->express_company_name = $order['express_name'];
  116. $successPayment = LakalaWechatPaymentModel::where('express_company_name', $order['express_name'])
  117. ->whereNotNull('express_company')
  118. ->findOrEmpty();
  119. if (!$successPayment->isEmpty()) {
  120. $wechatPayment->express_company = $successPayment->express_company;
  121. }
  122. $wechatPayment->save();
  123. if ($successPayment->isEmpty()) {
  124. Log::warning('未找到物流公司 {transaction_id} {express_company_name}', [
  125. 'transaction_id' => $wechatPayment->wechat_transaction_id,
  126. 'express_company_name' => $order['express_name'],
  127. ]);
  128. return;
  129. }
  130. } else {
  131. $wechatPayment->express_company = $delivery['delivery_id'];
  132. $wechatPayment->express_company_name = $delivery['delivery_name'];
  133. $wechatPayment->save();
  134. }
  135. }
  136. try {
  137. $this->expressService->uploadShippingInfo(
  138. transactionID: $wechatPayment->wechat_transaction_id,
  139. openid: $payment['payment_result']['acc_resp_fields']['user_id'],
  140. shippingList: [
  141. [
  142. 'tracking_no' => $order['express_number'],
  143. 'express_company' => $wechatPayment->express_company,
  144. 'item_desc' => $goods['goods_name'],
  145. 'contact' => [
  146. 'receiver_contact' => substr_replace($order['mobile'], '****', -8, 4),
  147. ]
  148. ],
  149. ]
  150. );
  151. } catch (LogicException $e) {
  152. return;
  153. }
  154. }
  155. }
  156. }