PaySuccess.php 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2017~2021 https://www.yiovo.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
  8. // +----------------------------------------------------------------------
  9. // | Author: 萤火科技 <admin@yiovo.com>
  10. // +----------------------------------------------------------------------
  11. declare (strict_types=1);
  12. namespace app\api\service\order;
  13. use app\common\service\BaseService;
  14. use app\api\model\User as UserModel;
  15. use app\api\model\Order as OrderModel;
  16. use app\api\model\user\BalanceLog as BalanceLogModel;
  17. use app\common\service\goods\source\Factory as StockFactory;
  18. use app\common\enum\OrderType as OrderTypeEnum;
  19. use app\common\enum\order\PayType as OrderPayTypeEnum;
  20. use app\common\enum\user\balanceLog\Scene as SceneEnum;
  21. use think\facade\Event;
  22. /**
  23. * 订单支付成功服务类
  24. * Class PaySuccess
  25. * @package app\api\service\order
  26. */
  27. class PaySuccess extends BaseService
  28. {
  29. // 订单模型
  30. public $model;
  31. // 当前用户信息
  32. private $user;
  33. /**
  34. * 构造函数
  35. * PaySuccess constructor.
  36. * @param $orderNo
  37. */
  38. public function __construct($orderNo)
  39. {
  40. parent::__construct();
  41. // 实例化订单模型
  42. $this->model = OrderModel::getPayDetail($orderNo);
  43. // 获取用户信息
  44. $this->user = UserModel::detail($this->model['user_id']);
  45. }
  46. /**
  47. * 获取订单详情
  48. * @return OrderModel|null
  49. */
  50. public function getOrderInfo()
  51. {
  52. return $this->model;
  53. }
  54. /**
  55. * 订单支付成功业务处理
  56. * @param $payType
  57. * @param array $payData
  58. * @return bool
  59. */
  60. public function onPaySuccess($payType, $payData = [])
  61. {
  62. if (empty($this->model)) {
  63. $this->error = '未找到该订单信息';
  64. return false;
  65. }
  66. // 更新付款状态
  67. $status = $this->updatePayStatus($payType, $payData);
  68. // 订单支付成功事件
  69. if ($status == true) {
  70. Event::trigger('OrderPaySuccess', ['order' => $this->model, 'orderType' => OrderTypeEnum::ORDER]);
  71. }
  72. return $status;
  73. }
  74. /**
  75. * 更新付款状态
  76. * @param $payType
  77. * @param array $payData
  78. * @return bool
  79. */
  80. private function updatePayStatus($payType, $payData = [])
  81. {
  82. // 验证余额支付时用户余额是否满足
  83. if ($payType == OrderPayTypeEnum::BALANCE) {
  84. if ($this->user['balance'] < $this->model['pay_price']) {
  85. $this->error = '用户余额不足,无法使用余额支付';
  86. return false;
  87. }
  88. }
  89. // 事务处理
  90. $this->model->transaction(function () use ($payType, $payData) {
  91. // 更新订单状态
  92. $this->updateOrderInfo($payType, $payData);
  93. // 累积用户总消费金额
  94. UserModel::setIncPayMoney($this->user['user_id'], (float)$this->model['pay_price']);
  95. // 记录订单支付信息
  96. $this->updatePayInfo($payType);
  97. });
  98. return true;
  99. }
  100. /**
  101. * 更新订单记录
  102. * @param int $payType
  103. * @param array $payData
  104. * @return false|int
  105. * @throws \Exception
  106. */
  107. private function updateOrderInfo(int $payType, array $payData)
  108. {
  109. // 更新商品库存、销量
  110. StockFactory::getFactory($this->model['order_source'])->updateStockSales($this->model['goods']);
  111. // 整理订单信息
  112. $order = [
  113. 'pay_type' => $payType,
  114. 'pay_status' => 20,
  115. 'pay_time' => time()
  116. ];
  117. if ($payType == OrderPayTypeEnum::WECHAT) {
  118. $order['transaction_id'] = $payData['transaction_id'];
  119. }
  120. // 更新订单状态
  121. return $this->model->save($order);
  122. }
  123. /**
  124. * 记录订单支付信息
  125. * @param int $payType
  126. */
  127. private function updatePayInfo(int $payType)
  128. {
  129. // 余额支付
  130. if ($payType == OrderPayTypeEnum::BALANCE) {
  131. // 更新用户余额
  132. UserModel::setDecBalance((int)$this->user['user_id'], (float)$this->model['pay_price']);
  133. // 新增余额变动记录
  134. BalanceLogModel::add(SceneEnum::CONSUME, [
  135. 'user_id' => (int)$this->user['user_id'],
  136. 'money' => -$this->model['pay_price'],
  137. ], ['order_no' => $this->model['order_no']]);
  138. }
  139. // 微信支付
  140. if ($payType == OrderPayTypeEnum::WECHAT) {
  141. }
  142. }
  143. }