PaySuccessAbstract.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <?php
  2. namespace App\Modules\Trade\Pay;
  3. use App\Jobs\QappTikTok\NewQappTikTokUserCharge;
  4. use App\Jobs\QappTikTok\QappTikTokUserChargeAccount;
  5. use App\Jobs\QappTikTok\QappTikTokUserChargeAccountRequest;
  6. use App\Jobs\QappTikTok\QappTikTokUserChargeRequest;
  7. use App\Jobs\QappTikTok\QappTikTokUserCharge;
  8. use App\Modules\Book\Models\BookConfig;
  9. use App\Modules\Report\Services\ReportService;
  10. use App\Modules\SendOrder\Models\QappSendOrder;
  11. use App\Modules\Subscribe\Models\Order;
  12. use App\Modules\User\Models\User;
  13. use App\Modules\User\Services\ReadRecordService;
  14. use App\Modules\UserTask\Services\BaseTask;
  15. use App\Modules\UserTask\Services\UserTaskService;
  16. use Exception;
  17. use Illuminate\Support\Facades\DB;
  18. use Illuminate\Support\Facades\Log;
  19. use Redis;
  20. use App\Jobs\CycleCallBack;
  21. /**
  22. *
  23. * @property \App\Modules\Subscribe\Models\Order $order
  24. */
  25. abstract class PaySuccessAbstract
  26. {
  27. protected $order;
  28. /**
  29. * 处理支付成功的逻辑
  30. */
  31. abstract protected function handlePayProcess();
  32. public function __construct(Order $order)
  33. {
  34. $this->order = $order;
  35. }
  36. /**
  37. * 支付成功入口
  38. */
  39. public function success()
  40. {
  41. try {
  42. DB::beginTransaction();
  43. $this->setOrderSuccess();
  44. $this->handlePayProcess();
  45. DB::commit();
  46. $this->addQueue();
  47. return true;
  48. } catch (Exception $e) {
  49. DB::rollback();
  50. Log::error('pay.success: ' . $e->getMessage() . ' ' . $e->getTraceAsString());
  51. }
  52. }
  53. /**
  54. * 设置order成功
  55. */
  56. protected function setOrderSuccess()
  57. {
  58. $this->order->pay_type = $this->getChargeTimes();
  59. $this->order->status = 'PAID';
  60. $this->order->pay_end_at = date('Y-m-d H:i:s');
  61. $this->order->save();
  62. }
  63. /**
  64. * 获取用户第几次充值
  65. * @param $uid
  66. * @return int
  67. */
  68. private function getChargeTimes()
  69. {
  70. $count = Order::where('uid', $this->order->uid)->where('status', 'PAID')->count('id');
  71. return $count + 1;
  72. }
  73. private function getReportType(int $channel_id)
  74. {
  75. return Redis::hGet('channel:setting:' . $channel_id, 'tiktok_report_type') ?? QappTikTokUserCharge::CURRENT_DAY_REGISTER;
  76. }
  77. protected function addQueue()
  78. {
  79. UserTaskService::addUserTaskQueue($this->order->uid, BaseTask::charge, UserTaskService::judge_trigger);
  80. // 取用户注册的派单id,派单信息
  81. $user = User::getUser($this->order->uid);
  82. $sendOrderId = getProp($user, 'send_order_id');
  83. $quickSendOrder = QappSendOrder::getSendOrderById($sendOrderId);
  84. $this->handleOrderQueue($quickSendOrder,$sendOrderId);
  85. // 同步数据
  86. $this->order->distribution_channel_id = getProp($quickSendOrder, 'distribution_channel_id');
  87. try {
  88. ReportService::reportRecharge($this->order);
  89. }catch (Exception $exception){
  90. Log::error('pay.success-addQueue-err: 同步数据异常' . $exception->getMessage() . ' ' . $exception->getTraceAsString());
  91. }
  92. }
  93. private function handleOrderQueue($quickSendOrder, $sendOrderId)
  94. {
  95. $bid = ReadRecordService::getSimpleFirstReadRecord($this->order->uid);
  96. $book_id = book_hash_encode($bid);
  97. $book = BookConfig::where('bid', $bid)->select('book_name')->first();
  98. $book_name = $book ? $book->book_name : '';
  99. $return_type = getProp($quickSendOrder, 'return_type'); // tiktok_account 巨量平台账户级; self:派单自身配置的回传配置成
  100. $reportType = getProp($quickSendOrder, 'report_type');
  101. $reportRate = (int)getProp($quickSendOrder, 'report_rate', 100);
  102. // 默认走派单回传配置
  103. switch ($return_type){
  104. case "tiktok_account":
  105. $tikTokChargeRequest = new QappTikTokUserChargeAccountRequest();
  106. $tikTokChargeRequest->uid = $this->order->uid;
  107. $tikTokChargeRequest->amount = $this->order->price;
  108. $tikTokChargeRequest->order_no = $this->order->trade_no;
  109. $tikTokChargeRequest->pay_time = $this->order->created_at;
  110. $tikTokChargeRequest->book_id = $book_id;
  111. $tikTokChargeRequest->book_name = $book_name;
  112. $tikTokChargeRequest->send_order_id = $sendOrderId;
  113. $tikTokChargeRequest->account = getProp($quickSendOrder,'account');
  114. $tikTokChargeRequest->account_id = DB::table('qapp_channel_accounts')->where('account',$tikTokChargeRequest->account)->value('id');
  115. myLog('qapp_user_charge')->info('addQueue', compact('tikTokChargeRequest'));
  116. $obj = new QappTikTokUserChargeAccount($tikTokChargeRequest);
  117. dispatch($obj->onConnection('redis_queue')->onQueue('{qapp_advertiser_tiktok_user_charge_queue}'));
  118. break;
  119. default:
  120. // 队列处理回传业务
  121. $tikTokChargeRequest = new QappTikTokUserChargeRequest();
  122. $tikTokChargeRequest->uid = $this->order->uid;
  123. $tikTokChargeRequest->amount = $this->order->price;
  124. $tikTokChargeRequest->order_no = $this->order->trade_no;
  125. $tikTokChargeRequest->pay_time = $this->order->created_at;
  126. $tikTokChargeRequest->book_id = $book_id;
  127. $tikTokChargeRequest->book_name = $book_name;
  128. $tikTokChargeRequest->send_order_id = $sendOrderId;
  129. // 需要跟派单设置的回传类型一致才上报
  130. myLog('qapp_user_charge')->info('addQueue', compact('tikTokChargeRequest'));
  131. $job = new NewQappTikTokUserCharge($tikTokChargeRequest);
  132. $callback_type = getProp($quickSendOrder, 'callback_type');
  133. if ($callback_type == 'cycle_report') {
  134. $cycjob = new CycleCallBack($this->order->trade_no);
  135. dispatch($cycjob->onConnection('redis_queue')->onQueue('{qapp_tiktok_cycle_user_charge_queue}'));
  136. }else{
  137. dispatch($job->onConnection('redis_queue')->onQueue('{qapp_tiktok_user_charge_queue}'));
  138. }
  139. break;
  140. }
  141. }
  142. }