|
|
@@ -45,12 +45,11 @@ class PaymentOrderService extends BaseService
|
|
|
const PAY_TIMEOUT_MINUTES = 30;
|
|
|
const PAY_OPEN_STATUSES = [self::STATUS_PROCESS, self::STATUS_TIMEOUT]; // 在线充值可接收回调/查询入账的状态
|
|
|
|
|
|
- const PAYOUT_FIXED_FEE = 2; // 三方代付每笔固定手续费
|
|
|
-
|
|
|
public static string $MODEL = PaymentOrder::class;
|
|
|
|
|
|
/**
|
|
|
- * 三方手续费快照:fee 是三方向平台收的成本(= 金额 × 费率 + 固定费),不扣客户。费率为小数(0.02 = 2%)。
|
|
|
+ * 三方手续费快照:fee 是三方向平台收的成本(= 金额 × 费率 + 每笔固定费),不扣客户。费率为小数(0.02 = 2%)。
|
|
|
+ * 费率和每笔固定费来自通道配置(recharge_channel.rate / fee_fixed),可以只配其中一项或两项组合。
|
|
|
* @return array{fee_rate: string, fee_fixed: string, fee: string}
|
|
|
*/
|
|
|
public static function feeFields($amount, $rate, $fixed = 0): array
|
|
|
@@ -264,6 +263,7 @@ class PaymentOrderService extends BaseService
|
|
|
$max = (float)($channelConfig->max ?? 0);
|
|
|
$min = (float)($channelConfig->min ?? 0);
|
|
|
$rate = (float)($channelConfig->rate ?? 0);
|
|
|
+ $feeFixed = $channelConfig->fee_fixed ?? 0;
|
|
|
$selectedProduct = null;
|
|
|
|
|
|
$geText = '';
|
|
|
@@ -281,6 +281,7 @@ class PaymentOrderService extends BaseService
|
|
|
if ($amount >= $v['min'] && $amount <= $v['max']) {
|
|
|
$channel = $k;
|
|
|
$rate = $v['rate'];
|
|
|
+ $feeFixed = $v['fee_fixed'] ?? 0;
|
|
|
|
|
|
}
|
|
|
if ($min == 0) {
|
|
|
@@ -332,12 +333,12 @@ class PaymentOrderService extends BaseService
|
|
|
$data['member_id'] = $memberId;
|
|
|
$data['amount'] = ZimuPayService::amount($amount);
|
|
|
$data['channel'] = $channel;
|
|
|
- $data += self::feeFields($amount, $rate);
|
|
|
+ $data += self::feeFields($amount, $rate, $feeFixed);
|
|
|
$data['bank_name'] = $bankName;
|
|
|
$order_no = self::createOrderNo($orderPrefix . 'zm' . $data['type'] . '_', $memberId);
|
|
|
$data['order_no'] = $order_no;
|
|
|
$data['callback_url'] = ZimuPayService::getPayNotifyUrl();
|
|
|
- $data['remark'] = '充值费率:' . $rate;
|
|
|
+ $data['remark'] = '充值手续费:' . RechargeChannel::feeDisplay($rate, $feeFixed)['fee_text'];
|
|
|
$data['status'] = self::STATUS_STAY;
|
|
|
|
|
|
$ret = ZimuPayService::pay($amount, $order_no, (string)$memberId);
|
|
|
@@ -381,12 +382,12 @@ class PaymentOrderService extends BaseService
|
|
|
$data['member_id'] = $memberId;
|
|
|
$data['amount'] = NoPayService::amount($amount);
|
|
|
$data['channel'] = $channel;
|
|
|
- $data += self::feeFields($amount, $rate);
|
|
|
+ $data += self::feeFields($amount, $rate, $feeFixed);
|
|
|
$data['bank_name'] = $bankName;
|
|
|
$order_no = self::createOrderNo($orderPrefix . 'no' . $data['type'] . '_', $memberId);
|
|
|
$data['order_no'] = $order_no;
|
|
|
$data['callback_url'] = NoPayService::getDepositNotifyUrl();
|
|
|
- $data['remark'] = '充值费率:' . $rate;
|
|
|
+ $data['remark'] = '充值手续费:' . RechargeChannel::feeDisplay($rate, $feeFixed)['fee_text'];
|
|
|
$data['status'] = self::STATUS_STAY;
|
|
|
|
|
|
$ret = NoPayService::pay($amount, $order_no, (string)$memberId, $channel);
|
|
|
@@ -429,12 +430,12 @@ class PaymentOrderService extends BaseService
|
|
|
$data['member_id'] = $memberId;
|
|
|
$data['amount'] = JdPayService::amount($amount);
|
|
|
$data['channel'] = $channel;
|
|
|
- $data += self::feeFields($amount, $rate);
|
|
|
+ $data += self::feeFields($amount, $rate, $feeFixed);
|
|
|
$data['bank_name'] = $bankName;
|
|
|
$order_no = self::createOrderNo($orderPrefix . 'jd' . $data['type'] . '_', $memberId);
|
|
|
$data['order_no'] = $order_no;
|
|
|
$data['callback_url'] = JdPayService::getNotifyUrl();
|
|
|
- $data['remark'] = '充值费率:' . $rate;
|
|
|
+ $data['remark'] = '充值手续费:' . RechargeChannel::feeDisplay($rate, $feeFixed)['fee_text'];
|
|
|
$data['status'] = self::STATUS_STAY;
|
|
|
|
|
|
$ret = JdPayService::pay($amount, $order_no);
|
|
|
@@ -472,12 +473,12 @@ class PaymentOrderService extends BaseService
|
|
|
$data['member_id'] = $memberId;
|
|
|
$data['amount'] = $amount;
|
|
|
$data['channel'] = $channel;
|
|
|
- $data += self::feeFields($amount, $rate);
|
|
|
+ $data += self::feeFields($amount, $rate, $feeFixed);
|
|
|
$data['bank_name'] = SanJinService::getChannel($paymentType) ?? '';
|
|
|
$order_no = self::createOrderNo($orderPrefix . 'sj' . $data['type'] . '_', $memberId);
|
|
|
$data['order_no'] = $order_no;
|
|
|
$data['callback_url'] = SanJinService::getNotifyUrl();
|
|
|
- $data['remark'] = '充值费率:' . $rate;
|
|
|
+ $data['remark'] = '充值手续费:' . RechargeChannel::feeDisplay($rate, $feeFixed)['fee_text'];
|
|
|
$data['status'] = self::STATUS_STAY;
|
|
|
$ret = SanJinService::pay(($amount * 100), $order_no, $channel);
|
|
|
Log::error('三斤支付发起:', $ret);
|
|
|
@@ -955,6 +956,8 @@ class PaymentOrderService extends BaseService
|
|
|
return $result;
|
|
|
}
|
|
|
$channelRate = (float)($channelConfig->rate ?? 0);
|
|
|
+ $channelFixed = $channelConfig->fee_fixed ?? 0;
|
|
|
+ $feeText = RechargeChannel::feeDisplay($channelRate, $channelFixed)['fee_text'];
|
|
|
|
|
|
// 在调用三方支付前开始事务
|
|
|
DB::beginTransaction();
|
|
|
@@ -967,7 +970,7 @@ class PaymentOrderService extends BaseService
|
|
|
$order_no = self::createOrderNo('sj' . $data['type'] . '_', $memberId);
|
|
|
$data['order_no'] = $order_no;
|
|
|
$data['member_id'] = $memberId;
|
|
|
- $data += self::feeFields($amount, $channelRate, self::PAYOUT_FIXED_FEE);
|
|
|
+ $data += self::feeFields($amount, $channelRate, $channelFixed);
|
|
|
$amount = number_format($amount, 2, '.', '');
|
|
|
$data['amount'] = $amount;
|
|
|
$data['channel'] = $channel;
|
|
|
@@ -987,10 +990,10 @@ class PaymentOrderService extends BaseService
|
|
|
$data['callback_url'] = QianBaoService::getNotifyUrl();
|
|
|
}
|
|
|
$data['status'] = self::STATUS_STAY;
|
|
|
- $data['remark'] = '提现费率:' . ($channelRate * 100) . '%+2';
|
|
|
+ $data['remark'] = '三方提现手续费:' . $feeText;
|
|
|
|
|
|
// 校验打码量 → 冻结资金 → 创建待处理的提现记录 → 重置打码周期
|
|
|
- [$info, $wallet] = WithdrawFundsService::hold((string)$memberId, $default_amount, '三方提现', '钱宝提现费率:' . ($channelRate * 100) . '%+2',
|
|
|
+ [$info, $wallet] = WithdrawFundsService::hold((string)$memberId, $default_amount, '三方提现', '三方提现手续费:' . $feeText,
|
|
|
WithdrawFundsService::PAYMENT_ORDERS, fn () => static::$MODEL::create($data));
|
|
|
$id = $info->id;
|
|
|
$available_balance = $wallet->available_balance;
|