前言
正好最近项目中有需要做微信支付,跟着官方文档写下来坑还是踩了不少,于是写了这篇流程给自己长长记性,代码比较粗糙大家图一乐就好。
官方文档
官方接入指引--微信支付开发者文档
所用依赖
<dependency>
<groupId>com.github.wechatpay-apiv3</groupId>
<artifactId>wechatpay-apache-httpclient</artifactId>
<version>0.2.3</version>
</dependency>
//用来生成随机字符串的工具类
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.15</version>
</dependency>
常量解释
以下常量需要通过注册商户号获得
- APPID: 小程序ID,在微信开发平台里可以获得,格式为wx************
- API_V3_KEY:在微信商户中心的账号中心里获得,用来解密微信回调的报文
- MCH_SERIAL_NO:商户证书序列号,在微信商户中心的账号中心里获得。
- MCH_ID:商户号,开通商户后那一串数字就是商户号了。
- PRIVATE_KEY: 商户秘钥,商户在注册证书后从apiClient_key.pem文件中可以获得,商户秘钥是用来给交易签名的重要数据,请不要暴露给外部。
以下常量需要后端自行设置
- PACKAGE:签名固定字符串,小程序支付固定值为"RSA"
- NOTIFY_URL:回调地址,支付成功后微信回调报文的地址,请设置为外网可见。
流程说明
创建订单
平台用户购买平台商品,前端将动态生成的商品详情,商品价格以及订单号传入创单接口,后端接收参数,请求微信支付系统接口,获取接口返回的预支付ID。
以下是后端代码
注意,代码中WeXinPayConstant里存放的是常量值,rootNode中应填写自己项目对应的值
//创建HttpClient
PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey(
new ByteArrayInputStream(WeXinPayConstant.PRIVATE_KEY.getBytes("utf-8")));
//使用自动更新的签名验证器,不需要传入证书
AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier(
new WechatPay2Credentials(WeXinPayConstant.MCH_ID, new PrivateKeySigner(WeXinPayConstant.MCH_SERIAL_NO, merchantPrivateKey)),
WeXinPayConstant.API_V3_KEY.getBytes(StandardCharsets.UTF_8));
CloseableHttpClient httpClient = Wech