上一篇基于个人收款码 + 作者邮箱确认收费的方式实现了付费阅读,适用于无法开通微信/支付宝支付的小伙伴(需要企业商户);如果有企业商户,就可以开通微信支付,就可以实现全自动的付费解锁阅读。
上一篇中的作者邮箱确认收费,其实就是变相增加了一种企业商户的能力,因为个人收款码是无法发起自动回调收款通知的,等于说用作者邮箱主动确认这个手动操作去实现回调能力。
技术派目前已经实现了微信支付的集成,想体验相关功能的小伙伴可以访问 从0到1封装一个通用的耗时统计工具类 来试试。
下面给大家带来全流程的微信支付集成方案。
微信支付相关材料准备
1.1 微信支付前置材料准备
根据官方文档进行配置:参数申请 - 通用规则 | 微信支付商户文档中心
A. 绑定AppId
在下图对应的路径中,进行APPID绑定
- 支持微信公众号(服务号,非个人订阅号)
- 小程序
- 企业微信(技术派是通过二哥的企业微信来完成的)
B. 申请开通支付方式
①、申请开通h5支付(针对手机浏览器访问站点进行支付的场景)。对于h5支付,需要提前准备一些材料:
- 备案过的域名,如 paicoding.com
- 一个用于支付的在线页面 https://paicoding.com/user/pay
②、申请开通native支付(pc站点,实现扫码支付的场景),开通之后需要配置回调的地址
注意在产品大全这里找。
1.2 证书配置
配置API Key
下载并配置商户证书
申请后,需要下面几个关键信息:
①、证书压缩包: xxxx_cert.zip
②、APIv2 密钥: -- (这个在代码中没有实际使用)
- 密钥(字符串):xdfaljf
- 有效期:如 2029/12/01
③、APIv3密钥:
- 密钥(字符串):jq4123jk4
在 API 安全这里进行调整。
用于代码配置的关键参数:
wx:
appId: wxb6721----1b5c5
#商户号
merchantId: 1641---78
#商户API私钥
privateKey: cert/apiclient_key.pem
#商户证书序列号
# openssl x509 -in apiclient_cert.pem -noout -serial
merchantSerialNumber: 2E4806A3BF-----9AC49897FE46BC9
#商户APIv3密钥
apiV3Key: jQjhtFlpmaBD----Ay
#支付通知地址
payNotifyUrl: https://paicoding.com/wx/payNotify
#退款通知地址
refundNotifyUrl: https://paicoding.com/wx/refundNotify
说明:
- 商户号在微信支付的后台,账号信息获取
- appId 即前面在微信支付后台绑定的appId
- 商户证书序列号:根据上面的证书中的
apiclient_cert.pem
文件生成
- Linux 环境,执行
openssl x509 -in apiclient_cert.pem -noout -serial
命令,输出的就是我们要的
- apiV3Key: 证书生成时,设置的密钥
上面生成的密钥,一般是五年的有效期,到期之后需要重新再生成
:::
技术派集成微信支付
前面准备完毕之后,接下来进入编码环节,将在项目中集成微信支付的全套流程;对于PC站点的技术派而言,我们采取微信native支付的方式进行,对应的交互流程如下图
API 文档:产品介绍 - Native支付 | 微信支付商户文档中心
2.1 关键设计
在具体编码之前,我们先梳理一下,集成微信支付,我们需要做什么(没有阅读 ✅技术派付费阅读方案设计(👍强烈推荐) 这篇文章的,强烈建议先看完再继续下面的内容)
任务1: 给用户展示付款二维码,用于用户实现扫码支付
- 后台服务向微信下单,用于获取唤起支付的交易链接
- 拿到微信返回的code_url,生成二维码展示给用户,用于扫码支付
任务2:接收微信的支付结果回调,判断支付成功与否
- 定义一个接口,用于接收微信支付回调,更新支付状态
- 定时任务补漏,校验微信支付的结果,避免回调处理异常、导致支付状态一直未更新(非必须)
2.2 技术实现
基于微信的交互流程图,梳理的两个实现事项之后,接下来就可以进入真正的编码环节了。要实现微信支付流程,我们最少需要做下面两件事情:
- 调用微信下单接口,根据微信的返回值,给用户展示付款二维码
- 提供一个微信回调接口,判断支付成功/失败
2.2.1 微信SDK配置
直接引入微信官方的sdk进行微信后台的交互,再pom.xml
中添加依赖
<!-- 微信支付 -->
<dependency>
<groupId>com.github.wechatpay-apiv3</groupId>
<artifactId>wechatpay-java</artifactId>
<version>0.2.14</version>
</dependency>
基于微信支付的关键配置参数,定义专用的配置类进行 WxPayConfig
配置的绑定
@Data
@Component
@ConditionalOnProperty(value = "wx.pay.enable")
@ConfigurationProperties(prefix = "wx.pay")
public class WxPayConfig {
//APPID
private String appId;
//mchid
private String merchantId;
//商户API私钥
private String privateKey;
//商户证书序列号
private String merchantSerialNumber;
//商户APIv3密钥
private String apiV3Key;
//支付通知地址
private String payNotifyUrl;
//退款通知地址
private String refundNotifyUrl;
}
对应的配置统一放在 application-pay.yml
文件
# fixme 替换成目标小程序信息
wx:
pay:
# tru
回复