4.支付通知回调

B-验证签名

因为这个接口是微信进行回调的,但是如果别人知道了这个接口就给进行伪造信息进行调用这个接口

补充一点,这里这个接口最后要返回给微信success 不然会一直进行调用该接口

java接微信sdk java接微信小程序支付_微信

以下是我封装的验证签名的方法

要给的参数为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要进行解密的

java接微信sdk java接微信小程序支付_小程序_02

先把里面的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串可进行转换为实体类

java接微信sdk java接微信小程序支付_微信_03

 D--进行验证订单是否一致

从拿到的订单号里面,去自己的数据库去查询,看该订单里的数据金额是否和数据库里面的订单的数据金额是一致的

E--关单操作

在这里可以使用延迟消息进行去判断如果用户长期未进行操作进行调用微信进行支付单的关闭

关闭订单  通过我们平台的订单号进行关闭   
读取状态码--response.getStatusLine().getStatusCode()
为204即关单成功

返回的状态码是204即关闭订单成功

java接微信sdk java接微信小程序支付_小程序_04

关单路径: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签名,官方给出了专门的验证的工具

点击下载

java接微信sdk java接微信小程序支付_微信_05

解压直接进行运行即可

java接微信sdk java接微信小程序支付_java_06

java接微信sdk java接微信小程序支付_微信开放平台_07

java接微信sdk java接微信小程序支付_微信开放平台_08

输入你的明文和签名即可进行验签

 工具地址:https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay6_0.shtml

3.相关的官方测试工具类

以下是详细的官方工具类可供进行参考

工具类一

工具二

详细的开发文档

以下是小程序支付的流程图

java接微信sdk java接微信小程序支付_微信_09

 

欢迎提出意见,一名热爱学习和分享的攻城狮