原因:小程序和APP、公众号等支付方式夸端口调用支付,
A程序中的openid 在B程序中支付。
把请求统一支付的参数输出:得到当前的appid,微信返回后看到另一个Appid,如果两个一致,则不会出现不匹配问题。
解决方式:由于系统中的WxConfig文件实现了微信SDK的WXPayConfig,多个appid在上送请求支付时对获取APPid做了区分获取,但是没有重写getAppID()方法,导致默认使用appID作为属性的参数值是固定的,在SDK内部获取appid时,不是动态获取,而是配置好的固定值,所以重写getAppID()方法,通过tradeType来区分获取的是哪一个appid
SDK代码:
public interface WXPayConfig {
/**
* 获取 App ID
*
* @return App ID
*/
public String getAppID();
/**
* 获取 Mch ID
*
* @return Mch ID
*/
public String getMchID();
/**
* 获取 API 密钥
*
* @return API密钥
*/
public String getKey();
/**
* 获取商户证书内容
*
* @return 商户证书内容
*/
public InputStream getCertStream();
/**
* HTTP(S) 连接超时时间,单位毫秒
*
* @return
*/
public int getHttpConnectTimeoutMs();
/**
* HTTP(S) 读数据超时时间,单位毫秒
*
* @return
*/
public int getHttpReadTimeoutMs();
}
sdk内部使用的都是该接口中的getAppID()方法,所以重写之后:
@Data
@Component
@ConfigurationProperties(prefix = "wx")
public class WxConfig implements WXPayConfig {
/*微信相关字段*/
private String baseurl;
/**
* 小程序appId
*/
private String wechatAppId;
/**
* 微信小程序密钥
*/
private String wechatSecret;
private String scope;
private String appID;
private String mchID;
private String notify_url;
private String appSecret;
private String appKey;
private String keyPath;
private String spbill_create_ip;
private String unifiedorderUrl;
private String orderqueryUrl;
private String closeorderUrl;
private String refundNotifyUrl;
private String tradeType;
@Override
public String getAppID() {
if (tradeType.equals(CommonEnum.WechatPayType.JSAPI.getCode())) {
return wechatAppId;
} else if (tradeType.equals(CommonEnum.WechatPayType.APP.getCode())) {
return appID;
}
return null;
}
public String getTradeAppId(String tradeType) {
this.tradeType = tradeType;
if (tradeType.equals(CommonEnum.WechatPayType.JSAPI.getCode())) {
return wechatAppId;
} else if (tradeType.equals(CommonEnum.WechatPayType.APP.getCode())) {
return appID;
}
return null;
}
public String getTradeKey(String tradeType) {
if (tradeType.equals(CommonEnum.WechatPayType.JSAPI.getCode())) {
return wechatSecret;
} else if (tradeType.equals(CommonEnum.WechatPayType.APP.getCode())) {
return appKey;
}
return null;
}
@Override
public String getMchID() {
return mchID;
}
@Override
public String getKey() {
return appKey;
}
@Override
public InputStream getCertStream() {
return null;
}
@Override
public int getHttpConnectTimeoutMs() {
return 3000;
}
@Override
public int getHttpReadTimeoutMs() {
return 3000;
}
}
完美解决问题