PaymentRecordService.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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. ->field([
  39. 'p.id',
  40. 'p.order_sn',
  41. 'p.out_trade_no',
  42. 'p.transaction_id',
  43. 'p.amount',
  44. 'o.express_name', 'o.express_number',
  45. 'o.shipping_status',
  46. 'o.consignee',
  47. 'o.mobile',
  48. 'o.province',
  49. 'o.city',
  50. 'o.district',
  51. 'o.address',
  52. 'w.wechat_transaction_id',
  53. 'w.order_state',
  54. 'w.goods_desc',
  55. ])
  56. ->order('p.id', 'DESC')
  57. ->paginate($pageAndLimit);
  58. $paginator->each(function (ExtensionPaymentModel $item) {
  59. if ($item['order_state'] == null) {
  60. $wechatOrder = $this->createWechatOrder($item->id);
  61. $item->setAttrs([
  62. 'wechat_transaction_id' => $wechatOrder['wechat_transaction_id'],
  63. 'order_state' => $wechatOrder['order_state'],
  64. 'goods_desc' => $wechatOrder['goods_desc'],
  65. ]);
  66. }
  67. $item->setAttr('order_state_text', WechatOrderStateEnum::from($item['order_state'])->toString());
  68. });
  69. return $paginator;
  70. }
  71. public function createWechatOrder(int $paymentID): LakalaWechatPaymentModel
  72. {
  73. $payment = ExtensionPaymentModel::find($paymentID);
  74. $goods = OrderGoods::where(['order_id' => $payment['order_id']])->find();
  75. return LakalaWechatPaymentModel::create([
  76. 'payment_id' => $payment['id'],
  77. 'wechat_transaction_id' => $payment['payment_result']['acc_trade_no'],
  78. 'order_state' => WechatOrderStateEnum::PENDING_SHIPMENT,
  79. 'goods_desc' => $goods['goods_name'],
  80. ]);
  81. }
  82. /**
  83. * 更新微信发货状态
  84. */
  85. public function updateWechatOrder(int $paymentID): void
  86. {
  87. $wechatPayment = LakalaWechatPaymentModel::where(['payment_id' => $paymentID])->find();
  88. try {
  89. $result = $this->expressService->queryOrder($wechatPayment->wechat_transaction_id);
  90. } catch (LogicException $e) {
  91. return;
  92. }
  93. $orderState = WechatOrderStateEnum::from($result['order_state']);
  94. if ($orderState != $wechatPayment->order_state) {
  95. $wechatPayment->order_state = $orderState;
  96. $wechatPayment->save();
  97. }
  98. if ($orderState === WechatOrderStateEnum::PENDING_SHIPMENT) {
  99. $payment = ExtensionPaymentModel::find($paymentID);
  100. $goods = OrderGoods::where(['order_id' => $payment['order_id']])->find();
  101. $order = Order::find($payment['order_id']);
  102. if ($wechatPayment->express_company == null) {
  103. $delivery = WechatDeliveryEntity::where(['delivery_name' => $order['express_name']])->findOrEmpty();
  104. if ($delivery->isEmpty()) {
  105. Log::warning('未找到物流公司{transaction_id}', ['transaction_id' => $wechatPayment->wechat_transaction_id]);
  106. return;
  107. }
  108. $wechatPayment->express_company = $delivery['delivery_id'];
  109. $wechatPayment->express_company_name = $delivery['delivery_name'];
  110. $wechatPayment->save();
  111. }
  112. try {
  113. $this->expressService->uploadShippingInfo(
  114. transactionID: $wechatPayment->wechat_transaction_id,
  115. openid: $payment['payment_result']['acc_resp_fields']['user_id'],
  116. shippingList: [
  117. 'tracking_no' => $order['express_number'],
  118. 'express_company' => $wechatPayment->express_company,
  119. 'item_desc' => $goods['goods_name'],
  120. 'contact' => [
  121. 'receiver_contact' => substr_replace($order['mobile'], '****', -8, 4),
  122. ]
  123. ]
  124. );
  125. } catch (LogicException $e) {
  126. return;
  127. }
  128. }
  129. }
  130. }