OrderPaySuccess.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <?php
  2. namespace App\Modules\Trade\Pay;
  3. use App\Modules\Book\Services\BookConfigService;
  4. use App\Modules\Subscribe\Models\Order;
  5. use DB;
  6. use App\Jobs\QappOrder;
  7. /**
  8. *
  9. */
  10. class OrderPaySuccess
  11. {
  12. /**
  13. * 支付成功回调处理订单
  14. * @param string $trade_no 订单号
  15. * @param string $transaction_id 微信商户号
  16. * @return bool
  17. */
  18. public static function handle(string $trade_no, string $transaction_id)
  19. {
  20. $order = Order::where('trade_no', $trade_no)->first();
  21. \Log::info('OrderPaySuccess_handle:trade_no:'.$trade_no.' transaction_id:'.$transaction_id);
  22. if(is_empty($order)){
  23. $order= Order::onWriteConnection()->where('trade_no', $trade_no)->first();
  24. }
  25. if ($order) {
  26. $is_change = self::orderAcrossDay($order);
  27. //订单跨天
  28. $order->transaction_id = $transaction_id;
  29. try {
  30. //添加异步任务队列
  31. $job = new QappOrder($trade_no);
  32. dispatch($job->onConnection('redis')->delay(5)->onQueue('{qapp_order_pay_success}'));
  33. } catch (Exception $e) {
  34. sendNotice($e->getMessage());
  35. }
  36. if ($order->status == 'PAID') {
  37. myLog('pay_notify')->info('has_pay:' . $trade_no);
  38. return true;
  39. }
  40. if ($order->order_type == 'YEAR') {
  41. $app = new YearOrderPaySuccess($order);
  42. } elseif ($order->order_type == 'BOOK') {
  43. $app = new BookOrderPaySuccess($order);
  44. } elseif ($order->order_type == 'QUARTER') {
  45. $app = new QuarterOrderPaySuccess($order);
  46. } elseif ($order->order_type == 'RECHARGE') {
  47. $app = new RechargeOrderPaySuccess($order);
  48. }
  49. $status = $app->success();
  50. if ($is_change) {
  51. DB::table('orders')->where('id', $order->id)->update([
  52. 'pay_end_at' => date('Y-m-d H:i:s', time() + 5),
  53. 'updated_at' => date('Y-m-d H:i:s', time() + 5),
  54. 'created_at' => date('Y-m-d H:i:s')
  55. ]);
  56. }
  57. self::freeBookStats($order->from_bid,$order->price,$order->uid);
  58. return $status;
  59. } else {
  60. return false;
  61. }
  62. }
  63. private static function freeBookStats($bid,$price,$uid){
  64. if(!$bid) return ;
  65. $free_book = BookConfigService::getByBidNoFilter($bid);
  66. if(!$free_book) return ;
  67. if(strtotime($free_book->end_time)+7*86400 < time()) return ;
  68. BookConfigService::chargeStats($free_book->id,$price,$uid);
  69. }
  70. private static function orderAcrossDay($order_info)
  71. {
  72. if (date('Y-m-d', strtotime($order_info->created_at)) == date('Y-m-d')) return false;
  73. $created_at = date('Y-m-d H:i:s', strtotime($order_info->created_at));
  74. $trade_no = $order_info->trade_no;
  75. $init_order = [
  76. 'distribution_channel_id' => $order_info->distribution_channel_id,
  77. 'uid' => $order_info->uid,
  78. 'product_id' => $order_info->product_id,
  79. 'price' => $order_info->price,
  80. 'pay_type' => $order_info->pay_type,
  81. 'trade_no' => 'cd-' . $trade_no,
  82. 'pay_merchant_source' => $order_info->pay_merchant_source,
  83. 'pay_merchant_id' => $order_info->pay_merchant_id,
  84. 'create_ip' => $order_info->create_ip,
  85. 'send_order_id' => $order_info->send_order_id,
  86. 'send_order_name' => $order_info->send_order_name,
  87. 'order_type' => $order_info->order_type,
  88. 'from_bid' => $order_info->from_bid,
  89. 'from_type' => $order_info->from_type,
  90. 'activity_id' => $order_info->activity_id,
  91. 'inner_send_order_id' => $order_info->inner_send_order_id,
  92. 'status' => 'UNPAID',
  93. 'transaction_id' => '',
  94. 'pay_end_at' => '0000-00-00 00:00:00',
  95. 'created_at' => $created_at,
  96. 'updated_at' => $created_at
  97. ];
  98. try {
  99. DB::table('orders')->insert($init_order);
  100. } catch (\Exception $e) {
  101. return false;
  102. }
  103. return true;
  104. }
  105. }