php 开发微信 h5 支付 APIv3 接入超详细流程

✨ 目录

    • [🎈 申请商户号](#🎈 申请商户号)
    • [🎈 申请商户证书](#🎈 申请商户证书)
    • [🎈 设置V3密钥](#🎈 设置V3密钥)
    • [🎈 开通H5支付](#🎈 开通H5支付)
    • [🎈 设置支付域名](#🎈 设置支付域名)
    • [🎈 SDK 下载](#🎈 SDK 下载)
    • [🎈 第一次下载平台证书](#🎈 第一次下载平台证书)
    • 🎈非第一次下载平台证书
    • [🎈 H5下单](#🎈 H5下单)

🎈 申请商户号

  • 申请地址:https://pay.weixin.qq.com/
  • 如果你还没有微信商户号,请点击上面的链接进行申请,如果已经有了,可以跳过这一步

🎈 申请商户证书

🎈 设置V3密钥

  • 首先点击 账户中心 ▶ API安全 ▶ 设置APIv3密钥 ▶ 设置
  • 输入任意的 32 位字符,该字符可由数字大小写字母组合,该密钥一定要记好给到开发人员


🎈 开通H5支付

  • 首先点击 产品中心 ▶ 我的产品 ▶ H5支付 ▶ 点击开通

🎈 设置支付域名

  • 首先点击 产品中心 ▶ 我的产品 ▶ 开发配置
  • 申请 H5 的师傅域名,需要准备域名 IPC 备案的截图、网站支付服务商品界面的截图(需要截取到链接地址)
  • 申请大概需要2个工作日左右,尽量材料齐全,一次审核通过,如果驳回,审核的时间会越来越长
  • 域名一定要申请正确,如果到时候你支付不是在该域名下,会报商户参数错误的,也无法正常拉起微信支付

🎈 SDK 下载

shell 复制代码
# 如果是空文件夹,先运行
composer init

# 推荐使用 PHP 包管理工具 Composer 安装 SDK
composer require wechatpay/wechatpay

🎈 第一次下载平台证书

  • 上面命令执行完之后,会有一个 vendor/bin/CertificateDownloader.php 文件
  • 平台证书跟商户证书不是同一个东西,在后期请求中,平台证书和商户证书都要带上
  • 如果你是第一次申请平台证书,需要执行命令:php CertificateDownloader.php -k ${apiV3key} -m ${mchId} -f ${mchPrivateKeyFilePath} -s ${mchSerialNo} -o ${outputFilePath}
  • apiV3key: apiv3 秘钥,上面自己设置的32位数的密钥
  • mchId: 商户号,微信商户平台可以查询
  • mchPrivateKeyFilePath: 微信商户API私钥文件目录,也就是第二步申请商户证书里面生成的 apiclient_key.pem 路径
  • mchSerialNo: 证书序列号,在 账户中心 ▶ API安全 ▶ 管理证书 中可以看见,如果有多个证书,找到自己正在使用的证书序列号
  • outputFilePath: 生成后的证书保存地址
shell 复制代码
# 命令
php CertificateDownloader.php -k ${apiV3key} -m ${mchId} -f ${mchPrivateKeyFilePath} -s ${mchSerialNo} -o ${outputFilePath}

# 我的使用
cd vendor/bin/

php CertificateDownloader.php -k 241xxxxxxxxxxxxxxxxx44 -m 1xxxxxxx1 -f ../../cert/merchant/apiclient_key.pem -s Wxxxxxxxxxxxxxxxx4 -o  ../../cert/wechatpay/

🎈非第一次下载平台证书

  • 如果你不是第一次下载平台证书,或者说你本地已经存在了平台证书,你想换一个的话
php 复制代码
<?php
require_once('../vendor/autoload.php');

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

// 商户号
$merchantId = '1xxxxxx1';

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

// 「商户API证书」的「证书序列号」
$merchantCertificateSerial = '1xxxxxxxxxxxxxxxxxxxxx91';

// 从本地文件中加载「微信支付平台证书」,用来验证微信支付应答的签名
$platformCertificateFilePath = 'file://../cert/wechatpay/wechatpay_4xxxxxxxxxxxxxxxxxxx9.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;

🎈 H5下单

  • 相信大家做微信 H5 支付,最关心的就是这个操作了
  • 主要是调用 v3/pay/transactions/h5 接口,如果上面配置都正确,就会返回一个 h5_url,然后前端拿到这个链接参数,跳转即可
  • 关于微信 H5 支付更多 API 可以查看:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_3_1.shtml
php 复制代码
<?php
require_once('../vendor/autoload.php');

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

// 商户号
$merchantId = '1xxxxxx1';

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

// 「商户API证书」的「证书序列号」
$merchantCertificateSerial = '1xxxxxxxxxxxxxxxxxxxxx91';

// 从本地文件中加载「微信支付平台证书」,用来验证微信支付应答的签名
$platformCertificateFilePath = 'file://../cert/wechatpay/wechatpay_4xxxxxxxxxxxxxxxxxxx9.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,
    ],
]);


try {
    $resp = $instance
        ->chain('v3/pay/transactions/h5')
        ->post(['json' => [
            'mchid'        => $merchantId,
            'out_trade_no' => 'tinygeeker0001',
            'appid'        => '********换成自己的**********',
            'description'  => 'Image形象店-深圳腾大-QQ公仔',
            'notify_url'   => 'https://weixin.qq.com/',
            'amount'       => [
                'total'    => 1,
                'currency' => 'CNY'
            ],
            'scene_info' => [
                'payer_client_ip' => '127.0.0.1',
                'h5_info' => [
                    'type' => 'Wap'
                ]
            ]
        ]]);

//    echo $resp->getStatusCode(), PHP_EOL;
    echo $resp->getBody(), PHP_EOL;
} catch (\Exception $e) {
    // 进行错误处理
//    echo $e->getMessage(), PHP_EOL;
    if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
        $r = $e->getResponse();
//        echo $r->getStatusCode() . ' ' . $r->getReasonPhrase(), PHP_EOL;
        echo $r->getBody(), PHP_EOL, PHP_EOL, PHP_EOL;
    }
//    echo $e->getTraceAsString(), PHP_EOL;
}
相关推荐
迅猛龙办公室14 分钟前
python实现倒序输出数字
开发语言·python
夏幻灵6 小时前
JavaScript this 面试:五种绑定规则、优先级与常见面试陷阱
开发语言·javascript·面试
程序猿编码6 小时前
榨干 RTX5090 算力!Qwen3 专用单卡推理引擎,手写C++/CUDA 算子实现 MTP 推测解码
开发语言·c++·大模型推理·qwen3·多模态推理
9624567 小时前
微信第三方平台 component_access_token 间歇性过期故障技术复盘
微信
bkspiderx8 小时前
Qt 插件机制:动态扩展应用功能的核心框架
开发语言·qt·元数据·qt 插件·qpluginloader
程序员老陆8 小时前
深入理解 C++ thread_local:线程私有存储的正确打开方式
开发语言·c++·程序设计
沐晓时光8 小时前
C语言入门,深入理解指针(3)
c语言·开发语言
码云数智-园园9 小时前
unique_ptr 还是 shared_ptr?C++ 智能指针选型与内存泄漏实战分析
java·开发语言
青绿蓝LCA低碳研究院9 小时前
FSLCI首次在印度举办会议,我们需要学习什么? · 青绿蓝
经验分享
禾小西9 小时前
07丨Redis 哨兵机制:主库故障后,如何恢复服务?
java·开发语言·redis