有风塘主
发布于 2024-10-26 / 53 阅读
0
0

微信支付对接相关问题

微信支付对接相关问题

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

因微信沙箱环境的特殊,沙箱订单在前端唤起时,是一定会出现该错误的,并非一定代码有问题。 所以在检查并确认了以上的业务过程中相关代码无误之后,==直接忽略任何前端拉起支付的报错(仅限沙箱模式)==


评论