1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
<?php
 
namespace app\api\service\order\paysuccess\type;
 
use app\api\model\user\User as UserModel;
use app\api\model\branch\ActivityUser as OrderModel;
use app\api\model\branch\Activity as ActivityModel;
use app\common\model\user\BalanceLog as BalanceLogModel;
use app\common\enum\order\OrderPayTypeEnum;
use app\common\enum\user\balanceLog\BalanceLogSceneEnum;
use app\common\service\BaseService;
 
/**
 * 订单支付成功服务类
 */
class BranchActivityPaySuccessService extends BaseService
{
    // 订单模型
    public $model;
    // 当前用户信息
    private $user;
    // 交易号
    private $orderNo;
    // 交易附带信息
    private $attach;
    /**
     * 构造函数
     */
    public function __construct($orderNo, $attach = [])
    {
        $this->orderNo = $orderNo;
        $this->attach = $attach;
        // 实例化订单模型
        $this->model = OrderModel::getPayDetail($orderNo);
        // 获取用户信息
        $this->user = UserModel::detail($this->model['user_id']);
    }
 
    /**
     * 订单支付成功业务处理
     */
    public function onPaySuccess($payType, $payData = [])
    {
        if (empty($this->model)) {
            $this->error = '未找到该订单信息';
            return false;
        }
        // 更新付款状态
        return $this->updatePayStatus($payType, $payData);
    }
 
    /**
     * 更新付款状态
     */
    private function updatePayStatus($payType, $payData = [])
    {
        // 事务处理
        $this->model->transaction(function () use ($payType, $payData) {
            // 更新订单状态
            $this->updateOrderInfo($payType, $payData);
            // 累积用户总消费金额
            $this->user->setIncPayMoney($this->model['pay_price']);
            // 记录订单支付信息
            $this->updatePayInfo();
            // 更新报名人数
            $this->updateActivityTotal();
        });
        return true;
    }
    
    /**
     * 更新订单记录
     */
    private function updateOrderInfo($payType, $payData)
    {
        // 整理订单信息
        $order = [
            'pay_type' => $payType,
            'status' => 1
        ];
        if ($this->model['online_money'] == 0) {
            if ($this->model['balance'] > 0) {
                $order['pay_type'] = OrderPayTypeEnum::BALANCE;
            } else {
                $order['pay_type'] = OrderPayTypeEnum::POINTS;
            }
        }
        if ($this->model['total_price'] > 0) {
            $order['pay_status'] = 20;
            $order['pay_time'] = time();
        } else {
            $order['pay_type'] = 0;
        }
        if (isset($payData['attach'])) {
            $attach = json_decode($payData['attach'], true);
            if(isset($attach['pay_source'])){
                $order['pay_source'] =  $attach['pay_source'];
            }
        }
 
        if ($payType == OrderPayTypeEnum::WECHAT || $payType == OrderPayTypeEnum::ALIPAY) {
            $order['transaction_id'] = $payData['transaction_id'];
        }
        // 如果是在活动范围内报名,直接签到
        if ($this->model['in_radius'] == 1) {
            $order['is_verify'] = 1;
            $order['verify_time'] = time();
        }
        // 更新订单状态
        return $this->model->save($order);
    }
 
    /**
     * 记录订单支付信息
     */
    private function updatePayInfo()
    {
        // 积分抵扣
        if ($this->model['points_num'] > 0) {
            $describe = "活动报名消费:{$this->model['order_no']}";
            $this->user->setIncPoints(-$this->model['points_num'], $describe);
        }
        // 余额支付
        if ($this->model['balance'] > 0) {
            // 更新用户余额
            $this->user->where('user_id', '=', $this->user['user_id'])
                ->dec('balance', $this->model['balance'])
                ->update();
            BalanceLogModel::add(BalanceLogSceneEnum::CONSUME, [
                'user_id' => $this->user['user_id'],
                'money' => -$this->model['balance'],
            ], ['order_no' => $this->model['order_no']]);
        }
    }
 
    /**
     * 更新报名人数
    */
    private function updateActivityTotal()
    {
        ActivityModel::incTotal($this->model['activity_id']);
    }
 
    /**
     * 返回app_id,大于0则存在订单信息
     * $pay_status 兼容支付宝支付
     */
    public function isExist($pay_status = 10)
    {
        if ($this->model) {
            return $this->model['app_id'];
        }
        return 0;
    }
 
    /**
     * 返回shop_supplier_id
     * $pay_status 兼容支付宝支付
     */
    public function isExistSupplier()
    {
        return 0;
    }
    
}