新增微信支付
This commit is contained in:
@@ -13,6 +13,10 @@ use Illuminate\Http\Client\Response;
|
||||
use Illuminate\Support\Facades\Http;
|
||||
use RuntimeException;
|
||||
|
||||
/**
|
||||
* NovaLink 支付中心客户端
|
||||
* 负责构建开放接口签名请求,并与远端支付中心完成下单和查单通信。
|
||||
*/
|
||||
class VipPaymentCenterClient
|
||||
{
|
||||
/**
|
||||
@@ -65,7 +69,8 @@ class VipPaymentCenterClient
|
||||
'subject' => $vipPaymentOrder->subject,
|
||||
'body' => '聊天室 VIP 会员购买:'.$vipPaymentOrder->vip_name,
|
||||
'amount' => number_format((float) $vipPaymentOrder->amount, 2, '.', ''),
|
||||
'channel' => 'web',
|
||||
// 支付中心要求商户显式指定 provider,不能依赖平台自动推断。
|
||||
'provider' => $vipPaymentOrder->provider,
|
||||
'business_type' => 'chatroom_vip',
|
||||
'sync_return_url' => $syncReturnUrl,
|
||||
'async_notify_url' => $asyncNotifyUrl,
|
||||
|
||||
@@ -40,11 +40,13 @@ class VipPaymentService
|
||||
*
|
||||
* @param User $user 购买用户
|
||||
* @param VipLevel $vipLevel 目标 VIP 等级
|
||||
* @param string $provider 用户选择的支付渠道
|
||||
*/
|
||||
public function createLocalOrder(User $user, VipLevel $vipLevel): VipPaymentOrder
|
||||
public function createLocalOrder(User $user, VipLevel $vipLevel, string $provider): VipPaymentOrder
|
||||
{
|
||||
$currentVip = $user->isVip() ? $user->vipLevel : null;
|
||||
$isUpgrade = $currentVip && $vipLevel->isHigherThan($currentVip);
|
||||
$provider = $this->normalizeProvider($provider);
|
||||
|
||||
// 如果已经是该等级或更高级别,且不是永久会员续费(逻辑上续费应该用原价,但此处 user 需求是升级补差价)
|
||||
// 这里我们主要处理补差价升级逻辑。
|
||||
@@ -73,7 +75,8 @@ class VipPaymentService
|
||||
'status' => 'created',
|
||||
'amount' => $price,
|
||||
'subject' => ($isUpgrade ? '【升级】' : '购买').' VIP 会员 - '.$vipLevel->name,
|
||||
'provider' => 'alipay',
|
||||
// 下单时必须固化用户选择的支付渠道,避免支付中心拒绝未指定 provider 的请求。
|
||||
'provider' => $provider,
|
||||
'vip_name' => $vipLevel->name,
|
||||
'vip_duration_days' => (int) $vipLevel->duration_days,
|
||||
'meta' => [
|
||||
@@ -250,6 +253,22 @@ class VipPaymentService
|
||||
return 'VPO'.date('YmdHis').random_int(1000, 9999);
|
||||
}
|
||||
|
||||
/**
|
||||
* 规范化并校验支付渠道
|
||||
*
|
||||
* @param string $provider 前端提交的支付渠道
|
||||
*/
|
||||
private function normalizeProvider(string $provider): string
|
||||
{
|
||||
$provider = trim(strtolower($provider));
|
||||
|
||||
if (! in_array($provider, ['alipay', 'wechat'], true)) {
|
||||
throw new RuntimeException('当前支付方式不受支持。');
|
||||
}
|
||||
|
||||
return $provider;
|
||||
}
|
||||
|
||||
/**
|
||||
* 向用户当前在线的聊天室广播 VIP 购买成功喜报与烟花特效。
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user