PaySuccessAbstract.php 3.7 KB

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