问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

微信支付变更安全认证方式:平台证书改用公钥

创作时间:
2025-01-21 23:17:13
作者:
@小白创作中心

微信支付变更安全认证方式:平台证书改用公钥

问题说明

微信支付对于新申请商户号以及平台证书过期的商户,已不再签发平台证书,需要更换使用微信支付平台公钥进行敏感信息加密和通知回调签名验证。因此,此类商户号在调用获取平台证书接口时,会出现"证书不存在"或者"系统繁忙"的错误提示。

解决方案

目前会存在两种情况:

  1. 新申请的商户号在商户后台没有"平台证书"管理入口
  2. 存量商户存在有效期内的平台证书或平台证书已过期未签发

对于第一种情况,可以直接在商户后台启用"微信支付公钥"。下面的教程主要以存量商户切换公钥为例进行说明。

1.1 获取商户对应的平台公钥

商户后台 -> 账户中心 -> API安全 -> 申请"微信支付公钥",在点击申请时会提示查看指引,需要点击查看才能进行公钥申请。

下载公钥:

点击"下载公钥"后会自动下载文件名为'pub_key.pem'的公钥,并在后台生成以"PUB_KEY_ID"开头的公钥ID(如果丢失,可以在后台重复下载,公钥ID不变)。

1.2 接口开发

下面的示例说明均使用官方SDK,仅供参考。

PHP示例

// 从本地文件中加载「微信支付平台证书」或者「微信支付平台公钥」,用来验证微信支付应答的签名,这里直接使用前面从后台获取的微信支付平台公钥;
$platformCertificateOrPublicKeyFilePath = 'file:///path/to/wechatpay/certificate_or_publickey.pem'; 
$platformPublicKeyInstance = Rsa::from($platformCertificateOrPublicKeyFilePath, Rsa::KEY_TYPE_PUBLIC);
// 「微信支付平台证书」的「证书序列号」或者是「微信支付平台公钥ID」
// 「平台证书序列号」及/或「平台公钥ID」可以从 商户平台 -> 账户中心 -> API安全 直接查询到,这里直接写前面从后台获取的微信支付平台公钥ID,注意要带上'PUB_KEY_ID_'
$platformCertificateSerialOrPublicKeyId = 'PUB_KEY_ID_0114232134912410000000000000';

Java示例

// 可以根据实际情况使用publicKeyFromPath或publicKey加载公钥
Config config =
    new RSAPublicKeyConfig.Builder()
        .merchantId(merchantId)
        .privateKeyFromPath(privateKeyPath)
        .publicKeyFromPath(publicKeyPath)
        .publicKeyId(publicKeyId)
        .merchantSerialNumber(merchantSerialNumber)
        .apiV3Key(apiV3Key)
        .build();

Go示例

var (
    wechatpayPublicKeyID       string = "PUB_KEY_ID_0114232134912410000000000000"          // 微信支付公钥ID
)
wechatpayPublicKey, err = utils.LoadPublicKeyWithPath("/path/to/wechatpay/pub_key.pem")
if err != nil {
    panic(fmt.Errorf("load wechatpay public key err:%s", err.Error()))
}
    
// 初始化 Client
opts := []core.ClientOption{
    option.WithWechatPayPublicKeyAuthCipher(
        mchID,
        mchCertificateSerialNumber, mchPrivateKey,
        wechatpayPublicKeyID, wechatpayPublicKey),
}
client, err := core.NewClient(ctx, opts...)
// 初始化 notify.Handler
handler := notify.NewNotifyHandler(
    mchAPIv3Key, 
    verifiers.NewSHA256WithRSAPubkeyVerifier(wechatpayPublicKeyID, *wechatPayPublicKey))

1.3 不使用SDK的情况

可以参考以下链接内的示例:点击查看

1.4 开发对接完成后

在商户后台更换验签方式。此操作需要超管进行操作并进行安全验证,更换以后回调灰度进度由平台控制在7天内完成,应答进度由商户请求参数控制。更换完成后才可以进行平台证书作废操作。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号