在使用 ThinkPHP 6 框架实现微信 H5 支付时,你需要按照以下步骤进行集成。微信 H5 支付主要用于在移动浏览器或 WebView 中发起支付请求。以下是实现的基本步骤:
1. 准备工作
- 注册微信商户账号:确保你已经在微信支付商户平台注册并开通了 H5 支付。
- 获取必要的凭证:包括商户号(mch_id)、商户密钥(key)、AppID(公众账号 ID)和 AppSecret。
2. 服务器端配置
安装依赖
你可能需要使用一个 HTTP 客户端库来发送请求,比如 Guzzle 或者使用 PHP 的 cURL。ThinkPHP 6 本身不强制要求特定的库,但推荐使用 Composer 安装 Guzzle:
composer require guzzlehttp/guzzle
创建支付请求
以下是一个基本的流程,使用 Guzzle 作为 HTTP 客户端:
use GuzzleHttp\Client;
use think\facade\Log;
function createWeChatH5Order($orderId, $amount, $body, $notifyUrl, $returnUrl) {
$mchId = 'your_mch_id'; // 商户号
$key = 'your_api_key'; // 商户密钥
$appId = 'your_app_id'; // 公众账号ID
$nonceStr = md5(uniqid()); // 随机字符串
// 构造请求参数
$params = [
'appid' => $appId,
'mch_id' => $mchId,
'nonce_str' => $nonceStr,
'body' => $body,
'out_trade_no' => $orderId,
'total_fee' => $amount, // 单位为分
'spbill_create_ip' => request()->ip(),
'notify_url' => $notifyUrl,
'trade_type' => 'MWEB', // H5支付类型
];
// 签名生成
$params['sign'] = makeSign($params, $key);
// 转换为XML
$xmlData = arrayToXml($params);
$client = new Client();
$response = $client->post('https://api.mch.weixin.qq.com/pay/unifiedorder', [
'body' => $xmlData,
'headers' => [
'Content-Type' => 'application/xml',
],
]);
$result = xmlToArray($response->getBody()->getContents());
if ($result['return_code'] === 'SUCCESS' && $result['result_code'] === 'SUCCESS') {
// 返回 mweb_url 给前端跳转
return $result['mweb_url'];
} else {
Log::error('WeChat H5 Pay Error: ' . json_encode($result));
return null;
}
}
function makeSign($params, $key) {
// 排序并生成签名
ksort($params);
$string = urldecode(http_build_query($params)) . "&key=" . $key;
return strtoupper(md5($string));
}
function arrayToXml($arr) {
// 数组转XML
$xml = "<xml>";
foreach ($arr as $key => $val) {
$xml .= "<$key><![CDATA[$val]]></$key>";
}
$xml .= "</xml>";
return $xml;
}
function xmlToArray($xml) {
// XML转数组
libxml_disable_entity_loader(true);
return json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
}
3. 前端处理
在前端,接收到 mweb_url
后,直接进行跳转:
// 假设通过 AJAX 获取到 mweb_url
fetch('/your-api-endpoint-to-create-order')
.then(response => response.json())
.then(data => {
if (data.mweb_url) {
window.location.href = data.mweb_url;
} else {
alert('支付创建失败');
}
});
4. 异步通知处理
配置 notify_url
接收微信支付的异步通知,处理支付结果。确保你的服务器能够处理 POST 请求并验证签名。
注意事项
- 安全性:确保所有通信都通过 HTTPS,并妥善保管商户密钥。
- 签名验证:在处理微信的通知时,务必验证签名以确保数据完整性。
- 日志记录:记录所有请求和响应,以便于调试和审计。
通过以上步骤,你可以在 ThinkPHP 6 中实现微信 H5 支付的基本功能。根据具体需求,你可能需要调整参数和错误处理逻辑。