本来想手写,但是有sdk 就没必要这么麻烦。
composer地址:wechatpay/wechatpay - Packagist
微信官网sdk,给的是github,打不开。
<?php
require_once 'vendor/autoload.php';
defined('ROOT_PATH') or define('ROOT_PATH', './');
use WeChatPay\Builder;
use WeChatPay\Crypto\Rsa;
use WeChatPay\Util\PemUtil;class Test
{public function payconfig2(){$config = ['appid' => 'appid','mchid' => '商户号','key' => 'key','serial_no' => '证书序列号',];return $config;}private function getpems(){$arr = ['SSLCERT' => ROOT_PATH . "/cert/apiclient_cert.pem",'SSLKEY' => ROOT_PATH . "/cert/apiclient_key.pem",];return $arr;}public function dotest(){$pems = $this->getpems();$config = $this->payconfig2();$merchantPrivateKeyFilePath = file_get_contents($pems['SSLKEY']);$merchantPrivateKeyInstance = Rsa::from($merchantPrivateKeyFilePath, Rsa::KEY_TYPE_PRIVATE);// 「商户API证书」的「证书序列号」$merchantCertificateSerial = $config['serial_no'];$merchantId = $config['mchid'];// 从本地文件中加载「微信支付平台证书」,用来验证微信支付应答的签名$platformCertificateFilePath = file_get_contents($pems['SSLCERT']);$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;}}
$t = new Test();
$t->dotest();
证书序列号需要去商户平台看。
其次这个key有v2、v3之分。问过别人这俩版本不共用。
- 文件名是 apiclient_key.pem 的,是 「商户私钥」文件
- 文件名是 apiclient_cert.pem 的,是 「商户证书」文件
参考
微信支付:API商户证书序列号serialNo获取-YES开发框架网
TP6下微信支付wechatpay-apiv3之wechatpay-php使用,包括下单、支付、查询、关闭_哈喽吧
商户证书序列号有误。请使用签名私钥匹配的证书序列号?-CRMEB社区