微信支付:appid 与 openId 不配

原因:小程序和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;
    }
}

完美解决问题

你可能感兴趣的:(微信支付之小程序,微信,小程序)