4.支付通知回调
B-验证签名
因为这个接口是微信进行回调的,但是如果别人知道了这个接口就给进行伪造信息进行调用这个接口
补充一点,这里这个接口最后要返回给微信success 不然会一直进行调用该接口
以下是我封装的验证签名的方法
要给的参数为1-serialnumber请求头里面的序列号 2- message加密之前的报文组合 3- signature加密之后的报文的签名
public static boolean signVerify(String serialnumber, String message,String signature ){
PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey(privateKey);
//使用自动更新的签名验证器,不需要传入证书
verifier = new AutoUpdateCertificatesVerifier(
new WechatPay2Credentials(merchantId, new PrivateKeySigner(merchantSerialNumber, merchantPrivateKey)),
apiV3Key.getBytes(StandardCharsets.UTF_8));
httpClient = WechatPayHttpClientBuilder.create()
.withMerchant(merchantId, merchantSerialNumber, merchantPrivateKey)
.withValidator(new WechatPay2Validator(verifier))
.build();
return assertTrue(verifier.verify(serialNumber, message.getBytes(StandardCharsets.UTF_8), signature));
}
不通过就直接return false 给微信
C--进行解密
因为微信带来的数据resource 里的ciphertext要进行解密的
先把里面的associatedData 和nonce 和ciphertext拿出来
associatedData和nonce是微信返回的数据里面的可直接进行拿出来
在进行次方法进行解密
public String decryptToString(byte[] associatedData, byte[] nonce, String ciphertext)
throws GeneralSecurityException {
try {
SecretKeySpec key = new SecretKeySpec(aesKey, "AES");
GCMParameterSpec spec = new GCMParameterSpec(TAG_LENGTH_BIT, nonce);
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
cipher.init(Cipher.DECRYPT_MODE, key, spec);
cipher.updateAAD(associatedData);
return new String(cipher.doFinal(Base64.getDecoder().decode(ciphertext)), StandardCharsets.UTF_8);
} catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
throw new IllegalStateException(e);
} catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
throw new IllegalArgumentException(e);
}
}
解密之后的也是一个json串可进行转换为实体类
D--进行验证订单是否一致
从拿到的订单号里面,去自己的数据库去查询,看该订单里的数据金额是否和数据库里面的订单的数据金额是一致的
E--关单操作
在这里可以使用延迟消息进行去判断如果用户长期未进行操作进行调用微信进行支付单的关闭
关闭订单 通过我们平台的订单号进行关闭
读取状态码--response.getStatusLine().getStatusCode()
为204即关单成功
返回的状态码是204即关闭订单成功
关单路径:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_3.shtml
对(一)的一些补充
1.我的项目是基于maven和springboot框架下的,实现支付要导入支付包
<dependency>
<groupId>com.github.wechatpay-apiv3</groupId>
<artifactId>wechatpay-apache-httpclient</artifactId>
<version>0.4.7</version>
</dependency>
2.对于小程序调起支付的时候要携带的paySign签名,官方给出了专门的验证的工具
点击下载
解压直接进行运行即可
输入你的明文和签名即可进行验签
工具地址:https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay6_0.shtml
3.相关的官方测试工具类
以下是详细的官方工具类可供进行参考
工具类一
工具二
详细的开发文档
以下是小程序支付的流程图
欢迎提出意见,一名热爱学习和分享的攻城狮