OrderRepository.php 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <?php
  2. namespace App\Repositories;
  3. use App\Models\MerchantModel;
  4. use App\Models\OrderModel;
  5. use App\Repositories\Service\CommonService;
  6. use Carbon\Carbon;
  7. use Illuminate\Support\Facades\DB;
  8. use KZ2\Laravel\Repositories\Eloquent\Repository;
  9. class OrderRepository extends Repository
  10. {
  11. public function model()
  12. {
  13. return OrderModel::class;
  14. }
  15. /**
  16. * 发送回调信息
  17. *
  18. * @param $orderData
  19. * @return void
  20. */
  21. public function sendSuccessCallback($orderSn)
  22. {
  23. $orderInfo = OrderModel::query()->where('order_sn', $orderSn)->first();
  24. if (empty($orderInfo)) {
  25. logger('订单不存在', [$orderSn]);
  26. return false;
  27. }
  28. // 获取商户信息
  29. $merchantInfo = MerchantModel::query()->where('uid', $orderInfo->merchant_uid)->first();
  30. if (empty($merchantInfo)) {
  31. logger('商户不存在', [$orderSn]);
  32. return false;
  33. }
  34. $sendData = [
  35. 'merchant_code' => $merchantInfo->merchant_code,
  36. 'status' => $orderInfo->status == 2 ? 2 : 1,
  37. 'order_id' => $orderInfo->merchant_order_sn,
  38. 'trade_no' => $orderInfo->order_sn,
  39. 'amount' => $orderInfo->order_amount,
  40. 'real_amount' => $orderInfo->real_amount,
  41. 'product_name' => $orderInfo->product_name,
  42. 'notify_url' => $orderInfo->notify_url,
  43. 'redirect_url' => $orderInfo->redirect_url,
  44. ];
  45. $sendData['signature'] = build_sign($sendData, $merchantInfo->key);
  46. $result = app(CommonService::class)->httpPost($sendData, $orderInfo['notify_url']);
  47. $upData['callback_sent_times'] = $orderInfo['callback_sent_times'] + 1;
  48. $res = false;
  49. if ($result === 'SUCCESS') {
  50. $upData['notice_status'] = 2;
  51. $upData['notice_at'] = date('Y-m-d H:i:s');
  52. $res = true;
  53. } else {
  54. logger('回调发送失败:' . $result, [$orderSn]);
  55. }
  56. // 增加回调次数
  57. OrderModel::query()->where('id', $orderInfo['id'])->update($upData);
  58. return $res;
  59. }
  60. /**
  61. * 回调订单处理
  62. *
  63. * @param array $order
  64. * @param $tradeNo
  65. * @param $payMoney
  66. * @return false
  67. */
  68. public function doBuy(array $order, $tradeNo, $payMoney)
  69. {
  70. try {
  71. DB::beginTransaction();
  72. $orderMoney = floatval($order['real_amount']);
  73. $payMoney = floatval($payMoney);
  74. $minusMoney = floatval($orderMoney - $payMoney);
  75. $minusMoney = abs(round($minusMoney, 2));
  76. if ($minusMoney > 2) {
  77. logger("只允许订单金额和付款金额相差2元内", $order);
  78. DB::rollBack();
  79. return false;
  80. }
  81. //修改订单状态
  82. $updateData = array(
  83. 'real_amount' => $payMoney,
  84. 'status' => 2,
  85. 'pay_at' => Carbon::now()->toDateTimeString(),
  86. 'trade_no' => $tradeNo,
  87. );
  88. $orderRes = OrderModel::query()->where('id', $order['id'])->update($updateData);
  89. if (!$orderRes) {
  90. logger("修改订单状态失败", $order);
  91. DB::rollBack();
  92. return false;
  93. }
  94. // 发送回调
  95. $this->sendSuccessCallback($order['order_sn']);
  96. DB::commit();
  97. return true;
  98. } catch (\Exception $e) {
  99. logger($e->getMessage(), $order);
  100. DB::rollBack();
  101. return false;
  102. }
  103. DB::rollBack();
  104. return false;
  105. }
  106. }