mirror of
https://gitee.com/dromara/dax-pay
synced 2026-08-08 06:05:33 +08:00
fix(gateway): 聚合扫码支付锁定判定补位与支付宝默认改 QR
- 支付宝 H5 聚合默认支付方式由 JSAPI 改为扫码(alipay_qr), 免 OAuth 预下单返回支付链接 - 聚合支付锁定判定对 product 空值补位(聚合传 null 由路由解析填充), 避免重复点击误判切换支付方式
This commit is contained in:
@@ -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 等非聚合扫码环境不支持
|
||||
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user