Laravel8开发微信支付-对接V3接口详细流程

官方文档有些地方没说明白的坑,记录下踩过的坑!

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’


  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值