需求要求:用户点开链接直接进行付款,原来打算使用微信H5进行支付,但是审核太麻烦,审核和多次都没通过,并且H5支付只能通过浏览器打开链接,然后唤醒微信进行支付,如果在微信中点开链接是无法支付的。然后采用微信jsapi方案进行支付。支付前需要申请公众号,支付商户号,商户号和公众号进行绑定。支付整体逻辑,用户点开链接,静默获取用户openId(生成支付订单的时候会用到),生成预支付订单,获取到预支付订单的参数后,前端换起微信支付。
准备阶段,我就直接使用另外一名博主的截图,自己难得取图了,具体代码和这位博主有些区别,因为我是直接使用微信官方的sdk。在实际开发中也遇到一些坑,后面会描述。微信公众号-JSAPI支付(保姆级教程)_微信jsapi支付-CSDN博客
微信公众号-JSAPI支付
1、微信公众号配置
https://mp.weixin.qq.com/cgi-bin/home
① 开通网页授权域名(前置条件:需开通网页授权接口权限)
②暴露网络授权域名
③获取基本配置中的AppID、AppSecret
④微信支付关联商户号
2、微信支付配置
https://pay.weixin.qq.com/
① 配置API证书 获取证书序列号
②获取正式序列号
③设置APIV3秘钥
④ 产品中心—开通JSAPI支付
⑤添加支付域名配置
⑥暴露域名
⑦AppId账号设置-商户关联公众号
程序配置:
①配置yml文件
wx:
# 公众号appid
appId:xxxxxd5381a6
# 公众号 appSecret
appSecret: ccccccaff013ebe0eff1
# 商户号
mchId: 123456
# 商户APIV3密钥
apiV3Key: ccccccccJCcMw466spcSAyV
# 商户证书序列号
merchantSerialNumber: cccccccF237C29CC
# 微信回调地址
v3PayNotifyUrl: https://xxxx.cn/orderPay/payNotify
② 微信支付平台下载的秘钥证书放入项目resources目录下
pom文件需要引入微信sdk
<!--微信支付-->
<dependency>
<groupId>com.github.wechatpay-apiv3</groupId>
<artifactId>wechatpay-java</artifactId>
<version>0.2.12</version>
</dependency>
在生产预支付订单的解密密钥时候我遇到一个很奇怪的报错
经过各方资料查询需要引入这个版本的包确实解决了
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>1.3.50</version>
</dependency>
主要流程及代码实现
①前端通过url获取code
(url参数配置)
Appid:公众号的appid
Redirect_uri:重定向至微信支付页面,携带用户openId
Scope:snsapi_base(授权方式 无需弹窗静默授权)
https://open.weixin.qq.com/connect/oauth2/authorize?appid=xx&redirect_uri=xxx&response_type=code&scope=snsapi_base&state=STATE&connect_redirect=1#wechat_redirect
②通过前端获取的code,传入指定支付接口(Redirect_uri),获取openId
1)通过appID、appSecret、code构建请求URL,解析返回结果获取openId
可参考微信官方文档: