微信支付对接相关问题
1.微信JSAPI支付对接配置流程。
:::info 登录公众号平台
- 申请或绑定关联一个微信支付的商户号
- 进入
[开发]-[基本配置]-[公众号开发信息]
,启用并记录下 开发者ID、开发者密钥,作为后续要用到的appId、appSecret - 在
[公众号开发信息]
下,启用了开发者密钥之后,会出现服务器白名单
一项,需要将会访问微信公众号接口的服务器IP配置进去。 - 进入
[设置]-[公众号设置]-[功能设置]-[JS接口安全域名]
中添加要在公众号中运行的网页的域名,在[网页授权域名]
中添加授权跳转时网页出口和入口的域名
:::
:::info 登录微信商户平台
- 使用和公众号相关联的微信商户号进行登录。
- 进入
[账号中心]-[个人信息]
可查看到一个纯数字的登录账号,即 商户号, - 进入
[API安全]
中设置并记录下API密钥 - 进入
[产品中心]-[开发者设置]
中可配置JSAPI 支付 支付授权目录
。
:::
2. 微信支付的两次签名过程
-
第一次签名
微信支付的第一次签名即统一下单接口请求参数的签名,参考官方文档:
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
或是直接使用官方提供的SDK即可。 -
第二次签名
支付的第二次签名是指:统一下单后将获得的prepay_id
加上一些参数并签名后,构造成前端微信网页JS中用于拉起微信支付界面的参数体。参考文档:
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6
【重要】:这里需要注意的是,微信的官方文档有点乱, 梳理一下:- 直接使用内置对象
WeixinJSBridge
拉起支付。参考如上文档。需要自行用JS实现接口的对接,注意参数中的 appId和timeStamp 均是驼峰命名格式。 - 【推荐】 使用官方的JSSDK进行对接(NPM模块名:jweixin-module)。该jssdk实际上就是将
WeixinJSBridge
封装了一层。 注意chooseWXPay
中的timestamp参数是全小写。参考文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#59 - ==签名要点==: 以java版本代码为例,注意其中的参数大小写、顺序等
- 直接使用内置对象
String[] toSign = new String[]{
"appId=" + payParams.get("appId"),
"nonceStr=" + payParams.get("nonceStr"),
"package=" + payParams.get("package"),
"signType=" + payParams.get("signType"),
"timeStamp=" + payParams.get("timeStamp"),
"key=" + key
};
String toSignStr = BeamUtils.join(toSign,"&");
try {
if (order.getUseSandbox()) {
payParams.put("paySign", WXPayUtil.MD5(toSignStr));
logger.info("微信支付前端签名:{}, {}, {}", toSign, toSignStr, payParams);
} else {
payParams.put("paySign", WXPayUtil.HMACSHA256(toSignStr, config.getKey()));
}
} catch (Exception e){
logger.error("微信支付前端签名构建失败: {}", toSignStr, e);
throw new ApiException(400, "微信支付前端签名构建失败: " + e.getMessage());
}
return payParams;
3.沙箱支付时报错:调用支付jsapi缺少参数 total_fee
因微信沙箱环境的特殊,沙箱订单在前端唤起时,是一定会出现该错误的,并非一定代码有问题。 所以在检查并确认了以上的业务过程中相关代码无误之后,==直接忽略任何前端拉起支付的报错(仅限沙箱模式)==