环境
- wechatpay-java开发的接口
现状
- native,h5,小程序支付都已完成。
疑问
- 在参考jsapi支付时,对于传参和调用那个服务类感觉很模糊,和小程序很类似,但又不同。
部分代码片段如下
自动更新平台证书
public RSAAutoCertificateConfig rsaAutoCertificateConfig() { return new RSAAutoCertificateConfig.Builder() .merchantId(merchantId) .privateKeyFromPath(privateKeyPath) .merchantSerialNumber(serialNumber) .apiV3Key(apiV3Key) .build(); }
native请求
public NativePayService nativePayService() {
return new NativePayService.Builder()
.config(rsaAutoCertificateConfig()).build();
}
其中native和h5,小程序都是类似的。
但是使用公众号支付,公众号自身存在mchid和appid。
如果按照之前的调用方式
com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest prepayRequest = new com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest();
com.wechat.pay.java.service.payments.jsapi.model.Amount amount = new com.wechat.pay.java.service.payments.jsapi.model.Amount();
amount.setTotal(1);
prepayRequest.setAmount(amount);
会提示[{"code":"PARAM_ERROR","message":"http header中的mchid与post payload中的mchid不匹配"}]
如果传入新的mchid,会提示 httpResponseBody[{"code":"SIGN_ERROR","message":"商户证书序列号有误。请使用签名私钥匹配的证书序列号"}]
到这里就很糊涂了。不清楚jsapi的整个流程是还需要做什么。
请问各位大佬,这个情况下,怎么排查问题,怎么解决?
谢谢。
问题已完结。
结论:在jsapi支付中,除了openId和小程序不同外,小程序的appId需要提供自身的。jsapi的请求和其他的native、h5一致。
jsapi是作为native/h5支付与小程序之间的支付方式。PrepayRequest构建与native一致,但同时有需要获取openid。小程序既需要提供openid有需要,提供不同的appid。
”http header中的mchid与post payload中的mchid不匹配”这个报错是你用了请求头用的A的商户号,在post的body中的商户号和你请求头的不一致,这两个是必须要一致的,不能串号;
“商户证书序列号有误。请使用签名私钥匹配的证书序列号”这个问题是你请求头的商户证书序列号和你计算签名用的证书不匹配,可以通过openssl命令来读取;
总结来说,你两个报错都是串号导致
我将请求的mchid和appid、证书的序列号都换成一致的情况下。这样native等方式的下单支付。
但是jsapi支付,下单请求提示另一个错误(代码块中)。
公众号也同时存在的appid是否需要设置到下单请求中,我不确定。
回到openid获取上。我这里的openid获取是通过公众号授权获取到code(https://open.weixin.qq.com/connect/oauth2/authorizecode),之后通过访问https://api.weixin.qq.com/sns/oauth2/access_token,获取到openid。唯一和小程序的区别就是,公众号的openid和小程序openid获取不同。但是小程序支付下单支付正常。我是否在jsapi请求下单过程中,缺少了什么步骤?或者传参出现逻辑问题?
对于整个jsapi的支付流程,我已经有所了解。但细节上,缺少关键信息。
{"code":"PARAM_ERROR","message":"appid和openid不匹配"}
最后,误操作仅按照小程序方式调用,但又使用native构建PrepayRequest的方式,就可以通过jsapiserviceExtension获得正确回应。
谢谢回复。