quanwei
2025-12-05 feda780069d64479c0c20493603717e100655da9
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
<?php
 
namespace app\common\service\order;
 
use app\common\library\alipay\AliPay;
use app\common\library\easywechat\AppOpen;
use app\common\model\app\App as AppModel;
use app\common\model\user\User as UserModel;
use app\common\model\user\BalanceLog as BalanceLogModel;
use app\common\enum\order\OrderPayTypeEnum;
use app\common\enum\user\balanceLog\BalanceLogSceneEnum;
use app\common\library\easywechat\WxPay;
use app\common\library\easywechat\AppWx;
use app\common\library\easywechat\AppMp;
use app\common\library\fbpay\FbPay; //by lyzflash
use app\common\model\app\AppWx as AppWxModel; //by lyzflash
use app\common\model\order\OrderTrade as OrderTradeModel;
use app\common\model\supplier\Balance as SupplierBalanceModel;
use app\common\model\supplier\Supplier as SupplierModel;
use app\common\model\app\AppPay as AppPayModel;
 
/**
 * 订单退款服务类
 */
class OrderRefundService
{
    /**
     * 执行订单退款
     */
    public function execute(&$order, $money = null, $out_refund_no = '')
    {
        // 退款金额,如不指定则默认为订单实付款金额
        is_null($money) && $money = $order['pay_price'];
        $pay_type = $order['pay_type']['value'];
        if ($pay_type != OrderPayTypeEnum::BALANCE && $order['balance'] > 0) {
            if ($order['refund_money'] < $order['balance']) {
                if ($order['refund_money'] + $money > $order['balance']) {
                    $balance = round($order['balance'] - $order['refund_money'], 2);//余额退款金额
                    $money = round($money - $balance, 2);
                    $this->balance($order, $balance);
                } else {
                    $pay_type = 10;
                }
            }
        }
        if ($money <= 0) {
            return true;
        }
        // 1.微信支付退款
        if ($pay_type == OrderPayTypeEnum::WECHAT) {
            //先获取商户是否单独收款
            $is_independent = SupplierModel::getIndependentOpen($order['shop_supplier_id']);
            if(!empty($is_independent)){
                //分每个商户有单独的付呗支付信息
                $AppConfig = AppPayModel::detail($order['shop_supplier_id']);; // 2024.8.7 更新
            }else{
                $AppConfig = AppModel::getAppCache($order['app_id']); // 2022.12.13 更新
            }
 
            if ($AppConfig["apitype"]) { //付呗支付
                return $this->fbpay($order, $money);
            } else {
                return $this->wxpay($order, $money);
            }
        }
        // 2.余额支付退款
        if ($pay_type == OrderPayTypeEnum::BALANCE) {
            return $this->balance($order, $money);
        }
        // 3.支付宝退款
        if ($pay_type == OrderPayTypeEnum::ALIPAY) {
            return $this->alipay($order, $money, $out_refund_no);
        }
        return false;
    }
 
    /**
     * 余额支付退款
     */
    private function balance(&$order, $money)
    {
        // 回退用户余额
 
        //判断是否商户独立收款 by yj 2024.3.14
        if(!empty($order['is_independent']) && $order['is_independent'] == 1){
            $shop_supplier_id = $order['shop_supplier_id'];
            $where =[
              "shop_supplier_id"=>  $order['shop_supplier_id'],
              "user_id"=>  $order['user_id']
            ];
            $supplier_balance = SupplierBalanceModel::detail($where);
            $supplier_balance->where('user_id', '=', $order['user_id'])->where('shop_supplier_id', '=', $order['shop_supplier_id'])->inc('balance', $money)->update();
        }else{
            $shop_supplier_id = 0;
            $user = UserModel::detail($order['user_id']);
            $user->where('user_id', '=', $order['user_id'])->inc('balance', $money)->update();
        }
 
        log_write('-------------余额退款');
        // 记录余额明细
        $money > 0 && BalanceLogModel::add(BalanceLogSceneEnum::REFUND, [
            'user_id' => $user['user_id'],
            'money' => $money,
            'shop_supplier_id' => $shop_supplier_id,
            'app_id' => $order['app_id'],
        ], ['order_no' => $order['order_no']]);
        return true;
    }
 
    /**
     * 微信支付退款
     */
    private function wxpay(&$order, $money)
    {
        $app = null;
        if ($order['pay_source'] == 'mp' || $order['pay_source'] == 'h5') {
            $app = AppMp::getWxPayApp($order['app_id']);
        }else if($order['pay_source'] == 'wx'){
            $app = AppWx::getWxPayApp($order['app_id']);
        } else if ($order['pay_source'] == 'android' || $order['pay_source'] == 'ios') {
            $app = AppOpen::getWxPayApp($order['app_id']);
        }
        $pay_price = $order['online_money'];
        if (!isset($order['main_order_no'])) {//不是定金订单
            //查询是否合并支付
            $tradeOrderInfo = OrderTradeModel::where('order_id', '=', $order['order_id'])
                ->where('pay_status', '=', 20)
                ->find();
            if ($tradeOrderInfo) {
                $pay_price = $tradeOrderInfo['online_money'];
            }
        }
        $WxPay = new WxPay($app);
        return $WxPay->refund($order['transaction_id'], $pay_price, $money);
    }
 
    /**
     * 支付宝退款
     */
    private function alipay(&$order, $money, $out_refund_no)
    {
        $AliPay = new AliPay();
        return $AliPay->refund($order['transaction_id'], $order['trade_no'], $money, $out_refund_no);
    }
 
    /**
     * 付呗退款
     */
    private function fbpay(&$order, $money)
    {
        $app = FbPay::getFbPayApp($order['app_id'], $order['shop_supplier_id']);
        $FbPay = new FbPay($app);
        return $FbPay->refund($order['transaction_id'], $order['trade_no'], $money);
    }
}