当前位置: 首页 > news >正文

【Java】Apache HttpClient调用微信支付API v3报错:找不到证书序列号对应的证书

      在使用微信支付API v3版本时,需要在【API安全】中设置商户API证书、API v3秘钥,如下: 

 
      下载下来的文件夹如下,包含p12格式、pem格式的商户API证书,和pem格式的商户API私钥:

       如题,“找不到证书序列号对应的证书”,是因为在使用 wechatpay-apache-httpclient 调用微信支付时,使用的 wechatPayCertificates 参数为 微信支付平台证书,而不是商户API证书:

WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
        .withMerchant(merchantId, merchantSerialNumber, merchantPrivateKey)
        .withWechatPay(wechatPayCertificates); //微信支付平台证书

      “平台证书”需要调用 “获取平台证书接口“ 进行获取,可以使用微信官方提供的Postman脚本进行获取,如下获取到的结果:

       还需要通过其中的associated_data、nonce、ciphertext参数 和 APIv3秘钥,解密出平台证书,参考代码:

import java.io.IOException;
import java.security.GeneralSecurityException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.GCMParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class AesUtil {

    static final int KEY_LENGTH_BYTE = 32;
    static final int TAG_LENGTH_BIT = 128;
    static final byte[] aesKey = "5BAkGA1UdE3CQCMAAw3uiPA9375JXNYN".getBytes();

    public static String decryptToString(byte[] associatedData, byte[] nonce, String ciphertext)
            throws GeneralSecurityException, IOException {
        try {
            Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");

            SecretKeySpec key = new SecretKeySpec(aesKey, "AES");
            GCMParameterSpec spec = new GCMParameterSpec(TAG_LENGTH_BIT, nonce);

            cipher.init(Cipher.DECRYPT_MODE, key, spec);
            cipher.updateAAD(associatedData);

            return new String(cipher.doFinal(Base64.getDecoder().decode(ciphertext)), "utf-8");
        } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
            throw new IllegalStateException(e);
        } catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
            throw new IllegalArgumentException(e);
        }
    }
}

      将获得平台证书字符串,去掉换行符\n,写入.pem格式证书文件即可:

      另外官方建议定期去更新平台证书,见平台证书更新指引。

相关文章:

  • 数据中心如何实现跨SD-WAN融合组网?
  • 栈(C语言)
  • 【微电网优化】基于粒子群算法实现电力分配及电网建设多目标优化求解附matlab代码
  • Vue过渡与动画
  • 基于Python实现染色算法的评估
  • vue3的自定义指令
  • 公众号网课查题系统使用方法
  • 如何将多张图片合并成一张图片
  • Vue3-无限滚动的懒加载-本地数据操作版
  • uni-app国际版开发,i18n实现多语言切换
  • iABACUS:基于 Wi-Fi 的自动公交车乘客 计数系统
  • 【MySQL】字节面试:分析死锁是怎么产生的?
  • 2022 ios APP最新开发测试教程
  • zookeeper集群死亡
  • selenium自动化测试
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 2019.2.20 c++ 知识梳理
  • CAP 一致性协议及应用解析
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • FineReport中如何实现自动滚屏效果
  • yii2权限控制rbac之rule详细讲解
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • - 概述 - 《设计模式(极简c++版)》
  • 高程读书笔记 第六章 面向对象程序设计
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 前端设计模式
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • ​如何防止网络攻击?
  • #laravel 通过手动安装依赖PHPExcel#
  • (11)MSP430F5529 定时器B
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (转载)虚函数剖析
  • (轉)JSON.stringify 语法实例讲解
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .bat文件调用java类的main方法
  • .NET 指南:抽象化实现的基类
  • .NET程序员迈向卓越的必由之路
  • .NET学习教程二——.net基础定义+VS常用设置
  • .skip() 和 .only() 的使用
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • []C/C++读取串口接收到的数据程序
  • [2015][note]基于薄向列液晶层的可调谐THz fishnet超材料快速开关——
  • [acwing周赛复盘] 第 69 场周赛20220917
  • [AI]文心一言爆火的同时,ChatGPT带来了这么多的开源项目你了解吗
  • [bbk5179]第66集 第7章 - 数据库的维护 03
  • [BZOJ] 1001: [BeiJing2006]狼抓兔子
  • [BZOJ] 3262: 陌上花开
  • [C#]使用PaddleInference图片旋转四种角度检测
  • [hdu1561] The more, The Better 【树形DP】
  • [IE编程] 打开/关闭IE8的光标浏览模式(Caret Browsing)