<?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);
|
}
|
}
|