收藏
回答

微信支付v3显示"商户证书序列号有误。请使用签名私钥匹配的证书序列号。"请问如何解决?

我可以确定密钥是从商户后台下载的,序列号用openssl计算出来的和商户后台获取到的是一样的,代码无论是我自己写的C++实现,PHP SDK 的示例代码,手动拼凑CURL命令都不行。只有官方那个java证书下载工具能通过。搞了两天两夜了,求高手支招。

PHP请求失败:

证书下载工具下载成功如图:

<?php
require_once('vendor/autoload.php');

use WeChatPay\Builder;
use WeChatPay\Crypto\Rsa;
use WeChatPay\Util\PemUtil;

// 设置参数

// 商户号
$merchantId = '163587****';

// 从本地文件中加载「商户API私钥」,「商户API私钥」会用来生成请求的签名
$merchantPrivateKeyFilePath = 'file:///home/ender/PhpstormProjects/untitled/cert/apiclient_key.pem';
$merchantPrivateKeyInstance = Rsa::from($merchantPrivateKeyFilePath, Rsa::KEY_TYPE_PRIVATE);

// 「商户API证书」的「证书序列号」
$merchantCertificateSerial = '1995EF71A353F9A9D722344ECD3BC396835*****';

// 从本地文件中加载「微信支付平台证书」,用来验证微信支付应答的签名
$platformCertificateFilePath = 'file:///home/ender/PhpstormProjects/untitled/cert/wechatpay_522D8E1708CE368A65C89B5E1609DEA1E1C*****.pem';
$platformPublicKeyInstance = Rsa::from($platformCertificateFilePath, Rsa::KEY_TYPE_PUBLIC);

// 从「微信支付平台证书」中获取「证书序列号」
$platformCertificateSerial = PemUtil::parseCertificateSerialNo($platformCertificateFilePath);

// 构造一个 APIv3 客户端实例
$instance = Builder::factory([
    'mchid' => $merchantId,
    'serial' => $merchantCertificateSerial,
    'privateKey' => $merchantPrivateKeyInstance,
    'certs' => [
        $platformCertificateSerial => $platformPublicKeyInstance,
    ],
]);

// 发送请求
$resp = $instance->chain('v3/certificates')->get(
    ['debug' => true] // 调试模式,https://docs.guzzlephp.org/en/stable/request-options.html#debug
);
echo $resp->getBody(), PHP_EOL;
回答关注问题邀请回答
收藏

3 个回答

  • Memory (私信不回复)
    Memory (私信不回复)
    2023-05-09

    apiclient_key.pem和商户序列号不对应导致的,去商户后台看下序列号然后和你代码里面的对比一下

    2023-05-09
    有用 2
    回复 3
    • Gerry
      Gerry
      2023-06-12
      找不到证书序列号对应的证书,序列号:5EB134AA28C84FD602FB33E527F901ACE0ADEB49,我这边也是这种错误,都是对比证书学历号,没有问题,而且还进行过二次创建新的证书,依旧报错,使用的SDK方式
      2023-06-12
      回复
    • Memory (私信不回复)
      Memory (私信不回复)
      2023-06-12回复Gerry
      哪个sdk?
      2023-06-12
      回复
    • Memory (私信不回复)
      Memory (私信不回复)
      2023-06-12回复Gerry
      postman的脚本验证能通过么?
      2023-06-12
      回复
  • 淺烣汲
    淺烣汲
    2023-08-09
    我也有这个问题,解决方案是先用官方工具把微信支付证书下下来,然后解析出这个证书的序列号,放在了申请的头文件中httpPost.addHeader("Wechatpay-Serial","微信支付证书序列号");才解决。但是这与官方推荐的通过编码动态获取证书的初衷不符合,也没找出为啥自己获取平台证书要加序列号,跑官方的demo工具不需要
    


    2023-08-09
    有用 1
    回复
  • Sam🍟
    Sam🍟
    05-10

    是不是要通过API才可以拿到啊?微信支付怎么可以做到这么垃圾的??????

    05-10
    有用
    回复
登录 后发表内容