ThinkPHP6微信H5支付功能实现-全流程解析

2025-04-21 18

在使用 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 支付的基本功能。根据具体需求,你可能需要调整参数和错误处理逻辑。

Image

1. 本站所有资源来源于用户上传和网络,因此不包含技术服务请大家谅解!如有侵权请邮件联系客服!cheeksyu@vip.qq.com
2. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理!
3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!
4. 如果您也有好的资源或教程,您可以投稿发布,成功分享后有积分奖励和额外收入!
5.严禁将资源用于任何违法犯罪行为,不得违反国家法律,否则责任自负,一切法律责任与本站无关