PaySuccessAbstract.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. <?php
  2. namespace App\Modules\Trade\Pay;
  3. use App\Jobs\QappTikTok\NewQappTikTokUserCharge;
  4. use App\Jobs\QappTikTok\QappTikTokUserChargeRequest;
  5. use App\Jobs\QappTikTok\QappTikTokUserCharge;
  6. use App\Modules\Book\Models\BookConfig;
  7. use App\Modules\Report\Services\ReportService;
  8. use App\Modules\SendOrder\Models\QappSendOrder;
  9. use App\Modules\Subscribe\Models\Order;
  10. use App\Modules\User\Models\User;
  11. use App\Modules\User\Services\ReadRecordService;
  12. use App\Modules\UserTask\Services\BaseTask;
  13. use App\Modules\UserTask\Services\UserTaskService;
  14. use Exception;
  15. use Illuminate\Support\Facades\DB;
  16. use Illuminate\Support\Facades\Log;
  17. use Redis;
  18. /**
  19. *
  20. * @property \App\Modules\Subscribe\Models\Order $order
  21. */
  22. abstract class PaySuccessAbstract
  23. {
  24. protected $order;
  25. /**
  26. * 处理支付成功的逻辑
  27. */
  28. abstract protected function handlePayProcess();
  29. public function __construct(Order $order)
  30. {
  31. $this->order = $order;
  32. }
  33. /**
  34. * 支付成功入口
  35. */
  36. public function success()
  37. {
  38. try {
  39. DB::beginTransaction();
  40. $this->setOrderSuccess();
  41. $this->handlePayProcess();
  42. DB::commit();
  43. $this->addQueue();
  44. return true;
  45. } catch (Exception $e) {
  46. DB::rollback();
  47. Log::error('pay.success: ' . $e->getMessage() . ' ' . $e->getTraceAsString());
  48. }
  49. }
  50. /**
  51. * 设置order成功
  52. */
  53. protected function setOrderSuccess()
  54. {
  55. $this->order->pay_type = $this->getChargeTimes();
  56. $this->order->status = 'PAID';
  57. $this->order->pay_end_at = date('Y-m-d H:i:s');
  58. $this->order->save();
  59. }
  60. /**
  61. * 获取用户第几次充值
  62. * @param $uid
  63. * @return int
  64. */
  65. private function getChargeTimes()
  66. {
  67. $count = Order::where('uid', $this->order->uid)->where('status', 'PAID')->count('id');
  68. return $count + 1;
  69. }
  70. private function getReportType(int $channel_id)
  71. {
  72. return Redis::hGet('channel:setting:' . $channel_id, 'tiktok_report_type') ?? QappTikTokUserCharge::CURRENT_DAY_REGISTER;
  73. }
  74. protected function addQueue()
  75. {
  76. UserTaskService::addUserTaskQueue($this->order->uid, BaseTask::charge, UserTaskService::judge_trigger);
  77. $bid = ReadRecordService::getSimpleFirstReadRecord($this->order->uid);
  78. $book_id = book_hash_encode($bid);
  79. $book = BookConfig::where('bid', $bid)->select('book_name')->first();
  80. $book_name = $book ? $book->book_name : '';
  81. // 取用户注册的派单id,派单信息
  82. $user = User::getUser($this->order->uid);
  83. $sendOrderId = getProp($user, 'send_order_id');
  84. $quickSendOrder = QappSendOrder::getSendOrderById($sendOrderId);
  85. $reportType = getProp($quickSendOrder, 'report_type');
  86. $reportRate = (int)getProp($quickSendOrder, 'report_rate', 100);
  87. // 队列处理回传业务
  88. $tikTokChargeRequest = new QappTikTokUserChargeRequest();
  89. $tikTokChargeRequest->uid = $this->order->uid;
  90. $tikTokChargeRequest->amount = $this->order->price;
  91. $tikTokChargeRequest->order_no = $this->order->trade_no;
  92. $tikTokChargeRequest->pay_time = $this->order->created_at;
  93. $tikTokChargeRequest->book_id = $book_id;
  94. $tikTokChargeRequest->book_name = $book_name;
  95. $tikTokChargeRequest->send_order_id = $sendOrderId;
  96. // 需要跟派单设置的回传类型一致才上报
  97. myLog('qapp_user_charge')->info('addQueue', compact('tikTokChargeRequest'));
  98. $job = new NewQappTikTokUserCharge($tikTokChargeRequest);
  99. dispatch($job->onConnection('rabbitmq')->onQueue('qapp_tiktok_user_charge_queue'));
  100. // 同步数据
  101. $this->order->distribution_channel_id = getProp($quickSendOrder, 'distribution_channel_id');
  102. ReportService::reportRecharge($this->order);
  103. }
  104. }