PaySuccessAbstract.php 3.8 KB

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