fix(gateway): 聚合扫码支付锁定判定补位与支付宝默认改 QR

- 支付宝 H5 聚合默认支付方式由 JSAPI 改为扫码(alipay_qr), 免 OAuth 预下单返回支付链接

- 聚合支付锁定判定对 product 空值补位(聚合传 null 由路由解析填充), 避免重复点击误判切换支付方式
This commit is contained in:
DaxPay Dev
2026-07-20 15:28:19 +08:00
parent 51a5d802cb
commit 29dafb291a
2 changed files with 10 additions and 5 deletions

View File

@@ -50,19 +50,21 @@ public enum ClientEnvEnum implements I18nSupport {
.orElseThrow(() -> new DataNotExistException("error.common.clientEnvNotExist", code));
}
/// 聚合扫码 L1 AUTO按客户端环境推导默认支付方式H5 默认 JSAPI
/// 聚合扫码 L1 AUTO按客户端环境推导默认支付方式
public String defaultMethodCode() {
return defaultMethodCode(ClientRuntimeEnum.H5);
}
/// 按运行形态推导默认支付方式: H5→JSAPI, 小程序→MINI(支付宝无独立 mini, 统一 JSAPI)
/// 按运行形态推导默认支付方式
/// H5: 微信→jsapi / 支付宝→扫码(alipay_qr, 免 OAuth) / 云闪付、抖音→jsapi
/// 小程序: 微信→mini / 支付宝、云闪付、抖音→jsapi(无独立 mini)
public String defaultMethodCode(ClientRuntimeEnum runtime) {
ClientRuntimeEnum rt = runtime == null ? ClientRuntimeEnum.H5 : runtime;
PayMethodEnum method;
if (rt == ClientRuntimeEnum.MINI) {
method = switch (this) {
case WECHAT -> PayMethodEnum.WECHAT_MINI;
// 支付宝官方 JSAPI 即小程序场景, 与 H5 同用 alipay_jsapi
// 支付宝官方 JSAPI 即小程序场景, 小程序仅走 jsapi
case ALIPAY -> PayMethodEnum.ALIPAY_JSAPI;
case UNION_PAY -> PayMethodEnum.UNION_JSAPI;
case DOUYIN -> PayMethodEnum.DOUYIN_JSAPI;
@@ -71,7 +73,8 @@ public enum ClientEnvEnum implements I18nSupport {
} else {
method = switch (this) {
case WECHAT -> PayMethodEnum.WECHAT_JSAPI;
case ALIPAY -> PayMethodEnum.ALIPAY_JSAPI;
// 支付宝 H5 默认扫码(alipay_qr): 免 OAuth, 预下单返回支付链接
case ALIPAY -> PayMethodEnum.ALIPAY_QR;
case UNION_PAY -> PayMethodEnum.UNION_JSAPI;
case DOUYIN -> PayMethodEnum.DOUYIN_JSAPI;
// browser 等非聚合扫码环境不支持

View File

@@ -106,7 +106,9 @@ public class GatewayPayHandleService {
if (Objects.equals(existing.getStatus(), PayFundStatusEnum.PROCESSING.getCode())
|| Objects.equals(existing.getStatus(), PayFundStatusEnum.INIT.getCode())) {
// 通道/方式不一致则拒绝换端(product/method 在容器上)
if (!Objects.equals(current.getProduct(), product)
// 聚合支付 product 传 null(由路由解析填充) 是合法设计, 用容器已持久化值补位避免误判切换支付方式
String effectiveProduct = StrUtil.blankToDefault(product, current.getProduct());
if (!Objects.equals(current.getProduct(), effectiveProduct)
|| !Objects.equals(current.getMethod(), method)) {
throw new BizInfoException(CommonErrorCode.VALIDATE_PARAMETERS_ERROR,
"pay.error.gateway.channelLocked");