PaySuccessAbstract.php 4.5 KB

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