栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java超详细小程序对接微信支付(二),看完不会你打我

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java超详细小程序对接微信支付(二),看完不会你打我

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框架下的,实现支付要导入支付包

            com.github.wechatpay-apiv3
            wechatpay-apache-httpclient
            0.4.7
        
2.对于小程序调起支付的时候要携带的paySign签名,官方给出了专门的验证的工具

点击下载

解压直接进行运行即可

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

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

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

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

工具类一

工具二

详细的开发文档

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

 

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1020270.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号