H5App 调用微信支付 报错-100,payment微信-1 general errors
程序员文章站
2022-03-28 13:48:19
...
H5APP调用微信支付遇到的问题
这几天调用微信支付,遇到了不少问题,现在记下来,以防自己忘记,也可以供大家参考一下。
一、前端
首先,我的APP是用H5做的,配置appid是在json文件中配置。
配置的时候确认appid对不对,appid不对也会导致报错-1。
接下来就是调用微信支付了,按照H5的API文档,文档地 址:http://www.html5plus.org/doc/zh_cn/payment.html#plus.payment.PaymentChannel,要先获取支付通道,再调取支付。
注意:statement的数据时从后端获取的订单信息。
下面是我的数据格式,package的值在微信官方文档上是暂填写固定值Sign=WXPay
var varpay = {
"appid": that.payData.appId, //appid
"noncestr":that.payData.nonceStr, //随机字符串
"package": "Sign=WXPay",
"partnerid": that.payData.partnerid, //商户号
"prepayid": that.payData.prepayid, //预支付交易会话id
"timestamp":that.payData.timeStamp, //时间戳
"sign": that.payData.sign, //微信签名
}
到这里的时候,发起微信支付,一直报错{-100,payment微信-1 general errors},就开始按照其他的博客上写的去排查。
- 首先查看包名和微信开放平台的包名是否一致。
- Hbuilder的真机调试可能会影响调起微信支付,建议用自持有的证书,打包成apk安装。自持有证书的获取可以参考网站:https://ask.dcloud.net.cn/article/35985。另建议打包的时候用自定义调试基座,这样打包好的安装包也可以在线调试啦。
- 查看应用签名是否正确,应用签名的获取可参考微信开发文档:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5,如果获取的签名和微信开放平台上的不一致,可修改开放平台上的应用签名,修改好后要等几分钟再测试。
- 核对商户号是否正确
- 确认获取到了预支付订单编号(partnerid)
二、Java后端
- List item Java的后端用的是微信的demo,首先也要保住商户号、key、appId、微信支付路径等不出错。
- 还有注意开发文档的业务流程的第3步,在返回数据给前端之前,一定要再次按照签名规则重新生成签名,并且参与签名的字段只需要这几个:appid,partnerid,prepayid,noncestr,timestamp,package
生成二次签名 注意:参与签名的几个字段必须小写,而且顺序也不能错
HashMap<String, String> map = new HashMap<>();
map.put("appid", placeOrder.get("appid"));
//商户号
map.put("noncestr", placeOrder.get("nonce_str"));
map.put("package", "Sign=WXPay");
map.put("partnerid", placeOrder.get("mch_id"));
map.put("prepayid", placeOrder.get("prepay_id"));
map.put("timestamp", timeStamp);
System.out.println("------" + map);
String s = WXPayUtil.mapToXml(map);
System.out.println(s);
String sign = WXPayUtil.generateSignature(map, WXPayConstants.key, WXPayConstants.SignType.MD5);
System.out.println("------------------------" + sign);
- 如果用的是微信的官方demo,在WXPay.Java中的此处修改。
我的就是到了这一步,就能调起微信啦。
由于第一次写博客,描述的不好的还望见谅,这些就是我调用微信支付是遇到的问题,如有遗漏,还望大家补充,谢谢!