微信支付V3版本接入

1,546 阅读3分钟

我正在参加「掘金·启航计划」

业务背景

业务提了一个新需求,需要做一个退费系统做用户退费管理,当交易发生之后一段时间内,由于买家或者卖家的原因需要退款时,卖家可以通过退款接口将支付款退还给买家,微信支付将在收到退款请求并且验证成功之后,按照退款规则将支付款按原路退到买家账号上。

微信支付业务对于开发来说是一个很好的经验,毕竟是涉及到钱的核心业务,要做到高可用和稳定,决不允许重复扣费,或者扣费了没通知到上游发放权益等问题,不然会收到用户投诉。在做毕业设计的时候本来是想接入微信支付,但是那时候研究了一下感觉比较麻烦- -需要搞营业执照和资质啥的,就没搞了。来到这家公司接触了微信支付和支付宝支付后学到了很多。下面是业务流程图

1684222698410.png

正向的下单超时是没有重试的,支付回调必须有重试,如果没有通知到上游就会出现扣费了没有发货的问题。

微信支付V2、V3版本对比

之前微信支付是很老的项目,所以用的是V2版本,新的项目就是用V3版本。温馨提示:

新接入的商户推荐使用v3版本,V3相较于V2会更简单、一致且易用

v2已经暂停更新,目前还可以使用,具体下线时间请持续关注最新官网文档

1、V2版本参数格式是xml格式,不太好维护,V3版本已改成json格式。

2、V2版本的签名是拼在参数里面的,V3版本校验都放在配置类里面了,更加方便灵活

image.png

3、使用基于非对称密钥的SHA256-RSA的数字签名算法,不再使用MD5或HMAC-SHA256

V3版本接入

参考微信支付文档规范:pay.weixin.qq.com/wiki/doc/ap…

首先下载官方SDK,里面有源码和DEMO提供参考,详细可以看readme.md。如果想跑demo需要在idea运行项目,看配置文件是使用gradle构建,而不是maven,我一开始没选择gradle项目发现跑不起来- -然后跑quickStart需要配置四个参数:商户号、商户API私钥路径、商户证书序列号、商户APIV3密钥,这些参数需要运营在微信商户平台获取。私钥文件:apiclient_key.pem,证书文件:apiclient_cert.pem

我调用的是退款refund接口,配置了商户参数和接口参数就能调用成功了,但是后面发现一个问题,如果订单号不存在等问题,SDK会直接抛出异常

image.png

我需要返回错误信息给用户,只能通过分析字符串提取错误信息了,仔细看他居然还拼错了

image.png

因为对正则不太熟悉,后面边看边写写了挺久,卡在一个问题上面了,我想通过字符]结束,就写了这个正则

String pattern2 = "httResponseBody\[(.*)\]";
image.png

结果发现匹配到最后的]了,因为.*包含了所有的字符,后面又写了不同的两个正则

//提取response和request中间的字符
String pattern2 = "httResponseBody\[(.*)\]\tHttpRequest";
//遇到字符]就结束,但是有可能在字符串中有数组,不推荐
String pattern2 = "httResponseBody\[([^\]]*)";

image.png