官方文档有些地方没说明白的坑,记录下踩过的坑!
1、准备文件
-
测试框架
Laravel8
-
官方环境要求
PHP 5.5+ / PHP 7.0+
guzzlehttp/guzzle 6.0+ -
微信支付证书,微信支付商户平台下载
2、下载官方提供SDK-wechatpay-guzzle-middleware
composer require wechatpay/wechatpay-guzzle-middleware
3、代码示例
use GuzzleHttp;
use WechatPay\GuzzleMiddleware\Util\PemUtil;
use WechatPay\GuzzleMiddleware\WechatPayMiddleware;
public function wechatPay()
{
// 商户相关配置
$merchantId = ''; // 商户ID
$merchantSerialNumber = ''; // 商户API证书序列号
$merchantPrivateKey = PemUtil::loadPrivateKey('apiclient_key.pem'); // 商户私钥的绝对路径
// 微信支付平台配置【注意:这个参数需要另外生成】
$wechatPayCertificate = PemUtil::loadCertificate('cert.pem'); // 微信支付平台证书的绝对路径
// 构造一个WechatPayMiddleware
$wechatPayMiddleware = WechatPayMiddleware::builder()
->withMerchant($merchantId, $merchantSerialNumber, $merchantPrivateKey) // 传入商户相关配置
->withWechatPay([ $wechatPayCertificate ]) // 可传入多个微信支付平台证书,参数类型为array
->build();
// 将WechatPayMiddleware添加到Guzzle的HandlerStack中
$stack = GuzzleHttp\HandlerStack::create();
$stack->push($wechatPayMiddleware, 'wechatpay');
// 创建Guzzle HTTP Client时,将HandlerStack传入
$client = new GuzzleHttp\Client(['handler' => $stack]);
// 接下来,正常使用Guzzle发起API请求,WechatPayMiddleware会自动地处理签名和验签
try {
// 以下内容根据自身需求填写,我做的是小程序支付统一下单API
$resp = $client->request('POST', 'https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi',
[
'json' => [ // JSON请求体-具体参数说明请阅读相关官方文档
'appid' => '', // 小程序APPID
'mchid' => $merchantId, // 商户号
'description' => '', // 商品描述
'out_trade_no' => '', // 商户订单号
'time_expire' => '', // 交易结束时间 DATE_RFC3339格式
'notify_url' => '', // 通知地址
'amount' => [
'total' => '', // 金额
'currency' => 'CNY' // 货币类型
],
'payer' => [
'openid' => '' // 用户标识
]
],
'headers' => [ // 请求头
'Accept' => 'application/json',
'Content-Type' => 'application/json',
'User-Agent' => request()->userAgent()
]
]);
echo $resp->getStatusCode().' '.$resp->getReasonPhrase()."\n";
echo $resp->getBody()."\n";
} catch (RequestException $e) {
// 进行错误处理
echo $e->getMessage()."\n";
if ($e->hasResponse()) {
echo $e->getResponse()->getStatusCode().' '.$e->getResponse()->getReasonPhrase()."\n";
echo $e->getResponse()->getBody();
}
return;
}
}
注意:cert.pem证书的生成
这个证书不是apiclient_cert.pem证书,官方文档没有详细说明,容易导致踩坑!
这个证书需要手动生成,生成工具就是这个SDK里的这个文件,需要运行命令生成
生成命令
php vendor/wechatpay/wechatpay-guzzle-middleware/tool/CertificateDownloader.php -f apiclient_key.pem证书的绝对路径 -k apiv3密匙 -m 填商户号 -o 生成的路径 -s 商户API证书序列号
生成证书需要5个必要参数
1 -f 商户的私钥文件,填写绝对路径
2 -k ApiV3的密钥
3 -m 商户号
4 -o 下载成功后保存证书的路径
5 -s 商户证书的序列号
报错处理
1、cURL error 60: SSL certificate problem: unable to get local issuer certificate…
- 下载cacert.pem放在php目录下的
\extras\ssl
内 - 修改php.ini(记得把参数前面的 ; 去掉),并重启服务。示例:
curl.cainfo=‘D:\phpEnv\php\php-7.4\extras\ssl\cacert.pem’
openssl.cafile=‘D:\phpEnv\php\php-7.4\extras\ssl\cacert.pem’