✨ 目录
- 🎈 申请商户号
- 🎈 申请商户证书
- 🎈 设置V3密钥
- 🎈 开通H5支付
- 🎈 设置支付域名
- 🎈 SDK 下载
- 🎈 第一次下载平台证书
- 🎈非第一次下载平台证书
- 🎈 H5下单
🎈 申请商户号
- 申请地址:https://pay.weixin.qq.com/
- 如果你还没有微信商户号,请点击上面的链接进行申请,如果已经有了,可以跳过这一步
🎈 申请商户证书
- 首先点击
账户中心
▶API安全
▶申请API证书
- 申请详细步骤请点击:https://kf.qq.com/faq/161222NneAJf161222U7fARv.html
🎈 设置V3密钥
- 首先点击
账户中心
▶API安全
▶设置APIv3密钥
▶设置
- 输入任意的
32
位字符,该字符可由数字大小写字母组合,该密钥一定要记好给到开发人员
🎈 开通H5支付
- 首先点击
产品中心
▶我的产品
▶H5支付
▶点击开通
🎈 设置支付域名
- 首先点击
产品中心
▶我的产品
▶开发配置
- 申请
H5
的师傅域名,需要准备域名IPC 备案的截图
、网站支付服务商品界面的截图(需要截取到链接地址)
- 申请大概需要2个工作日左右,尽量材料齐全,一次审核通过,如果驳回,审核的时间会越来越长
- 域名一定要申请正确,如果到时候你支付不是在该域名下,会报商户参数错误的,也无法正常拉起微信支付
🎈 SDK 下载
- 微信官方提供了
JAVA
、PHP
、GO
三种语言版本的开发库,请根据自己开发语言选择 - JAVA语言: wechatpay-java ‹推荐›、wechatpay-apache-httpclient
- PHP语言: wechatpay-php ‹推荐›、wechatpay-guzzle-middleware
- GO语言: wechatpay-go ‹推荐›
- 这里我选择
php
作为讲解,使用composer
安装sdk
# 如果是空文件夹,先运行
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: 生成后的证书保存地址
# 命令
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
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
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;
}