微信小程序对接微信支付所遇问题合集

这篇具有很好参考价值的文章主要介绍了微信小程序对接微信支付所遇问题合集。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写在前面: 

1. 后端使用微信官方sdk会简单很多,可以看看在第五个大标题上。

2. 相关文档汇总:

        1、WxJava - MiniApp Java SDK 4.6.0 API

        2、wechatpay-java/README.md at main · wechatpay-apiv3/wechatpay-java · GitHub

        3、网络 | 微信开放文档

        4、开发指引 - JSAPI支付 | 微信支付商户文档中心

3. 以下所有问题均基于uniapp开发微信小程序。

4. 所使用的工具版本为:

        1、微信开发者工具:稳定版 Stable Build (1.06.2402040);

        2、uniapp工具:HBuilder X 3.99;

        3、后端程序语言:java;

5. 官方支付流程:

微信小程序对接微信支付所遇问题合集,Java,微信小程序,小程序,java,spring boot

一、请求路径不在以下 request 合法域名列表中

1. 报错详细信息:

http://localhost:30013 不在以下 request 合法域名列表中,请参考文档:https://developers.weixin.qq.com/miniprogram/dev/framework/ability/network.html

2. 解决思路:

        2.1 将域名配置在小程序中

        根据报错信息查看微信相关文档,网络 | 微信开放文档

微信小程序对接微信支付所遇问题合集,Java,微信小程序,小程序,java,spring boot

        2.2 如果只是临时修改或有其他需求可以修改微信开发工具中的配置

                启用设置中的“不校验合法域名、web-view业务域名、TLS版本以及HTTPS证书”选项

微信小程序对接微信支付所遇问题合集,Java,微信小程序,小程序,java,spring boot

二、获取用户openid出现40029响应码

1. 请求url:

https://api.weixin.qq.com/sns/jscode2session

2. 微信响应原文:

Response Body: 
    {"errcode":40029,"errmsg":"invalid code, rid: 660a3033-68f26499-0b8d2eb4"}

3. 解决思路:

        3.1 查看代码code是否被使用了两次;

        3.2 检查小程序配置的appid是否与代码中一致、appSecret是否正确

                检查小程序配置的appid:看appid是否与微信开发工具中配置的一致。

微信小程序对接微信支付所遇问题合集,Java,微信小程序,小程序,java,spring boot

三、uni.requestPayment()下单时产生参数校验错误parameter error

1. 报错具体信息:

requestPayment:fail parameter error: parameter.timeStamp should be String instead of Undefined;parameter.nonceStr should be String instead of Undefined;parameter.package should be String instead of Undefined;parameter.signType should be String instead of Undefined;parameter.paySign should be String instead of Undefined;

2. 解决思路:

可以将所有参数都打印出来查看。下面出现错误可能原因:

        2.1 请求数据字段数据类型必须为String

        后台可能返回的不是String而是int类型,需要调整为String;

        2.2 响应数据取用层级不对。

        比如后台返回的数据是{data:{data:{}}},只取到数据所在层级前几层;

        2.3 请求数据所放层级不对。

        正确的应该是paySign等参数与success平行,结果参照了其他请求示例,将这些参数放在orderInfo下面了,正确的官方请求示例为:

微信小程序对接微信支付所遇问题合集,Java,微信小程序,小程序,java,spring boot

 四、解密退款通知时产生Tag mismatch错误

官方文档相关问题链接:微信支付-QA文档

1. 报错具体信息:

javax.crypto.AEADBadTagException: Tag mismatch!

2. 相关代码:

//原始代码
JSONObject resource = jsonObject.getJSONObject("resource");
AesUtil aesUtil = new AesUtil("v3密钥".getBytes());
String s = aesUtil.decryptToString(
        resource.getString("associated_data").getBytes(),
        resource.getString("nonce").getBytes(),
        resource.getString("ciphertext")
);

3. 解决思路:

在网上查询后发现的可能原因:

        3.1 v3秘钥有问题。

        检查使用的v3秘钥是否有问题

        3.2 解密入参需要以utf-8转换。

        相关文章链接:分享微信支付回调解密提示:Tag mismatch | 微信开放社区

//更改后
JSONObject resource = jsonObject.getJSONObject("resource");
AesUtil aesUtil = new AesUtil("你的密钥".getBytes(StandardCharsets.UTF_8));
String s = aesUtil.decryptToString(
        resource.getString("associated_data").getBytes(StandardCharsets.UTF_8),
        resource.getString("nonce").getBytes(StandardCharsets.UTF_8),
        resource.getString("ciphertext")
);

        3.3 解密时接口遗漏传入附加数据(associated_data)。

        我忘了我为了美观规范写成了小驼峰的形式,导致 接收数据类的字段名 和 微信传过来的 不一致,所以associated_data没有接收到 (最好使用微信官方sdk,各种实体类和方法就不用再次创建了)

//微信原始发送的json
{"id":"xxx","create_time":"2024-04-02T11:53:30+08:00","resource_type":"encrypt-{
    "id": "xxx",
    "create_time": "2024-04-02T11:53:30+08:00",
    "resource_type": "encrypt-resource",
    "event_type": "REFUND.SUCCESS",
    "summary": "退款成功",
    "resource": {
        "original_type": "refund",
        "algorithm": "AEAD_AES_256_GCM",
        "ciphertext": "xxx",
        "associated_data": "refund",
        "nonce": "xxx"
    }
}

//错误接收的json
{
    "id": "xxx",
    "resource": {
        "algorithm": "AEAD_AES_256_GCM",
        "ciphertext": "xxx",
        "nonce": "xxx"
    },
    "summary": "退款成功"
}

五、使用代码示例:后端使用微信官方sdk示例

pom:

<!--  微信sdk依赖   -->
<dependency>
    <groupId>com.github.wechatpay-apiv3</groupId>
    <artifactId>wechatpay-java</artifactId>
    <version>0.2.12</version>
</dependency>

代码: 

/**
* refundApply 退款申请
*
* @param request
* @return Result<java.lang.Object>
*/
@PostMapping("refund-apply")
public Result<Object> refundApply(@RequestBody CreateRequest request) {
        // 获取.p12文件并获取其中的信息
        P12InfoVo vo = getP12Info(); 
        // 初始化商户配置
        Config config =
                new RSAAutoCertificateConfig.Builder()
                        .merchantId(readWechatProfile.getMchId())
                        .privateKey(vo.getPrivateKey())
                        .merchantSerialNumber(vo.getSerialNo())
                        .apiV3Key(readWechatProfile.getV3())
                        .build();

        // 初始化服务,使用微信sdk对应功能的service
        refundService = new RefundService.Builder().config(config).build();
        // 调用对应service中的接口
        Refund response = refundService.create(request);
        log.info("退款申请响应:{}", response);
        return Result.success();
}     

其中privateKey方法是可以替换成读取私钥的.pem文件地址,具体可查看类中api。另外读取p12文件api:文章来源地址https://www.toymoban.com/news/detail-857640.html

public P12InfoVo getP12Info2() {
        String p12Path = "xx/xx/xxx.p12";// p12证书路径
        char[] mchid = "xxx" .toCharArray();//商户号
        try {
            // 获取文件流
            FileInputStream fileInputStream = new FileInputStream(p12Path);

            KeyStore keyStore = KeyStore.getInstance("PKCS12");
            keyStore.load(fileInputStream, mchid);
            String keyAlias = null;
            //解析证书,必须有别名
            Enumeration<String> aliases = keyStore.aliases();
            if (aliases.hasMoreElements()) {
                keyAlias = aliases.nextElement();
            }
            //解析私钥
            PrivateKey privateKey = (PrivateKey) keyStore.getKey(keyAlias, mchid);
            Certificate cert = keyStore.getCertificate(keyAlias);
            BigInteger serialNumber = ((X509CertImpl) cert).getSerialNumber();
            //证书一般都使用16进制表示
            String certSn = serialNumber.toString(16).toUpperCase();
            //设置证书公钥、私钥、序列号
            return P12InfoVo.builder()
                    .publicKey(cert.getPublicKey())
                    .privateKey(privateKey)
                    .serialNo(certSn)
                    .build();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
}

到了这里,关于微信小程序对接微信支付所遇问题合集的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot对接微信小程序支付功能开发(一,下单功能)

    1,接入前准备: 接入模式选择直连模式; 申请小程序,得到APPID,并开通微信支付; 申请微信商户号,得到mchid,并绑定APPID; 配置商户API key,下载并配置商户证书,根据微信官方文档操作:https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_8_1.shtml 上面都配置完之后会得到:小

    2024年02月10日
    浏览(47)
  • 微信支付-超详细java开发-小程序对接

    本文适用于有一定基础的开发者,简单易通。后台用的的是java,我用的是springBoot,其它框架基本同理,前端就是一个简单的demo。微信官方提供了V2和V3两种方式,本文基于V2版支付开发(后续更新V3)。V2和V3版本区别 1.思路介绍 本次以微信小程序开发为例,如果自己想要玩一

    2024年02月09日
    浏览(38)
  • 【微信小程序】Java实现微信支付(小程序支付JSAPI-V3)java-sdk工具包(包含支付出现的多次回调的问题解析,接口幂等性)

          对于一个没有写过支付的小白,打开微信支付官方文档时彻底懵逼 ,因为 微信支付文档太过详细, 导致我无从下手,所以写此文章,帮助第一次写支付的小伙伴梳理一下。 一、流程分为三个接口:(这是前言,先看一遍,保持印象,方便理解代码) 1、第一个接口:

    2024年01月16日
    浏览(60)
  • Python对接微信小程序V3接口进行支付,并使用uwsgi+nginx+django进行https部署

    网上找了很多教程,但是很乱很杂,并且教程资源很少且说的详细。这里就记录一下分享给大家 共分为以下几个步骤: 目录 一、开始前准备信息 二、使用前端code获取用户的openid 三、对接小程序v3接口下单 四、小程序支付的回调 五、安装并启动uwsgi 六、安装并启动nginx 七、

    2024年02月12日
    浏览(33)
  • 【微信支付】java-微信小程序支付-V3接口

    最开始需要在微信支付的官网注册一个商户; 在管理页面中申请关联小程序,通过小程序的 appid 进行关联;商户号和appid之间是多对多的关系 进入微信公众平台,功能-微信支付中确认关联 具体流程请浏览官方文档:接入前准备-小程序支付 | 微信支付商户平台文档中心 流程走

    2024年02月06日
    浏览(41)
  • 微信小程序反编译出现的问题合集

    解决方法: 破解反编译wxss文件 问题描述: 在微信开发者工具中,默认canvas的层级无限大,即便你设置层级z-index=9999也无法解决,这是微信官方的一个bug,网上也出现了一堆解决方法,但是我发现一条神评论,说开发者平台出错但是真机模拟没有出错,所以,我就尝试真机模

    2024年02月09日
    浏览(74)
  • java对接微信支付:JSAPI支付(微信公众号支付)

    本文是【微信JSAPI支付】文章,主要讲解商户对接微信支付,简洁版测试 文章目录 一、JSAPI支付接入前准备 二、代码片段 1.引入Maven依赖 2.后端业务请求接口 3.前端调起支付请求方法 总结 1、JSAPI支付首先需要注册、认证一个公众号(大概300块一年) 微信公众号注册 2、申请成为

    2024年02月08日
    浏览(51)
  • java对接微信小程序(登录&获取用户信息)

    用户通过小程序登录,进入到平台系统,进行各功能操作; 解决方案: 首先通过对接小程序,用户通过小程序登录及授权获取用户信息,后端调用接口获取微信用户信息,进行保存到数据库,然后返回token给前端(实际在这里相当于用户的一个注册及登录),前端使用该to

    2024年02月15日
    浏览(34)
  • Java 微信小程序-发货信息录入接口 对接代码

    微信小程序-发货信息录入接口开发文档 POST https://api.weixin.qq.com/wxa/sec/order/upload_shipping_info?access_token=ACCESS_TOKEN 参见「查询物流公司编码列表」对接代码

    2024年02月03日
    浏览(59)
  • 【Java】微信小程序V3支付(后台)

    目录         相关官网文档         1.需要的参数         2.引入库         3.用到的工具类         4.支付下单实现         5.支付回调 接入前准备-小程序支付 | 微信支付商户平台文档中心 微信支付-JSAPI下单 获取平台证书列表-文档中心-微信支付商户平

    2024年02月12日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包