PaySuccess.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. <?php
  2. namespace app\api\service\order;
  3. use think\Hook;
  4. use app\api\service\Basics;
  5. use app\api\model\User as UserModel;
  6. use app\api\model\Order as OrderModel;
  7. //use app\api\model\WxappPrepayId as WxappPrepayIdModel;
  8. use app\api\model\user\BalanceLog as BalanceLogModel;
  9. use app\common\service\goods\source\Factory as StockFactory;
  10. use app\common\enum\OrderType as OrderTypeEnum;
  11. use app\common\enum\order\PayType as PayTypeEnum;
  12. use app\common\enum\user\balanceLog\Scene as SceneEnum;
  13. /**
  14. * 订单支付成功服务类
  15. * Class PaySuccess
  16. * @package app\api\service\order
  17. */
  18. class PaySuccess extends Basics
  19. {
  20. // 订单模型
  21. public $model;
  22. // 当前用户信息
  23. private $user;
  24. /**
  25. * 构造函数
  26. * PaySuccess constructor.
  27. * @param $orderNo
  28. * @throws \think\exception\DbException
  29. */
  30. public function __construct($orderNo)
  31. {
  32. // 实例化订单模型
  33. $this->model = OrderModel::getPayDetail($orderNo);
  34. if (!empty($this->model)) {
  35. $this->wxappId = $this->model['wxapp_id'];
  36. }
  37. // 获取用户信息
  38. $this->user = UserModel::detail($this->model['user_id']);
  39. }
  40. /**
  41. * 获取订单详情
  42. * @return OrderModel|null
  43. */
  44. public function getOrderInfo()
  45. {
  46. return $this->model;
  47. }
  48. /**
  49. * 订单支付成功业务处理
  50. * @param $payType
  51. * @param array $payData
  52. * @return bool
  53. */
  54. public function onPaySuccess($payType, $payData = [])
  55. {
  56. if (empty($this->model)) {
  57. $this->error = '未找到该订单信息';
  58. return false;
  59. }
  60. // 更新付款状态
  61. $status = $this->updatePayStatus($payType, $payData);
  62. // 订单支付成功行为
  63. if ($status == true) {
  64. Hook::listen('order_pay_success', $this->model, OrderTypeEnum::MASTER);
  65. }
  66. return $status;
  67. }
  68. /**
  69. * 更新付款状态
  70. * @param $payType
  71. * @param array $payData
  72. * @return bool
  73. */
  74. private function updatePayStatus($payType, $payData = [])
  75. {
  76. // 验证余额支付时用户余额是否满足
  77. if ($payType == PayTypeEnum::BALANCE) {
  78. if ($this->user['balance'] < $this->model['pay_price']) {
  79. $this->error = '用户余额不足,无法使用余额支付';
  80. return false;
  81. }
  82. }
  83. // 事务处理
  84. $this->model->transaction(function () use ($payType, $payData) {
  85. // 更新订单状态
  86. $this->updateOrderInfo($payType, $payData);
  87. // 累积用户总消费金额
  88. $this->user->setIncPayMoney($this->model['pay_price']);
  89. // 记录订单支付信息
  90. $this->updatePayInfo($payType);
  91. });
  92. return true;
  93. }
  94. /**
  95. * 更新订单记录
  96. * @param $payType
  97. * @param $payData
  98. * @return false|int
  99. * @throws \Exception
  100. */
  101. private function updateOrderInfo($payType, $payData)
  102. {
  103. // 更新商品库存、销量
  104. StockFactory::getFactory($this->model['order_source'])->updateStockSales($this->model['goods']);
  105. // 整理订单信息
  106. $order = [
  107. 'pay_type' => $payType,
  108. 'pay_status' => 20,
  109. 'pay_time' => time()
  110. ];
  111. if ($payType == PayTypeEnum::WECHAT) {
  112. $order['transaction_id'] = $payData['transaction_id'];
  113. }
  114. // 更新订单状态
  115. return $this->model->save($order);
  116. }
  117. /**
  118. * 记录订单支付信息
  119. * @param $payType
  120. * @throws \think\Exception
  121. */
  122. private function updatePayInfo($payType)
  123. {
  124. // 余额支付
  125. if ($payType == PayTypeEnum::BALANCE) {
  126. // 更新用户余额
  127. $this->user->setDec('balance', $this->model['pay_price']);
  128. BalanceLogModel::add(SceneEnum::CONSUME, [
  129. 'user_id' => $this->user['user_id'],
  130. 'money' => -$this->model['pay_price'],
  131. ], ['order_no' => $this->model['order_no']]);
  132. }
  133. // 微信支付
  134. if ($payType == PayTypeEnum::WECHAT) {
  135. // 更新prepay_id记录
  136. // WxappPrepayIdModel::updatePayStatus($this->model['order_id'], OrderTypeEnum::MASTER);
  137. }
  138. }
  139. }