PHP实现微信公众号H5支付
发布日期:2025-05-04 08:50:17 浏览次数:7 分类:精选文章

本文共 3876 字,大约阅读时间需要 12 分钟。

微信H5支付开发指南

1. 开发前配置

在进行代码接入前,需在微信后台填写授权回调域名。此域名必须经过ICP备案,以确保合法性。

2. 开发主要流程

2.1 用户支付流程

  • 用户下单时选择微信支付。
  • 商户调用微信统一下单接口,交易类型为H5,参数设置为trade_type=MWEB
  • 微信返回包含支付跳转URL的参数,商户通过mweb_url调起支付中间页。
  • 中间页进行H5权限校验。
  • 支付成功后,微信向商户发送异步结果通知。

2.2 接口请求参数

  • appid:微信公众号ID。
  • mch_id:微信商户账户号。
  • nonce_str:随机字符串,不超过32位。
  • sign:签名,需通过特定方式生成。
  • body:商品描述。
  • out_trade_no:商户订单号,不超过32位。
  • total_fee:总金额,以分为单位。
  • spbill_create_ip:用户支付时的IP地址。
  • notify_url:异步通知回调地址,需为可直接访问的URL,无携带参数。
  • trade_type:交易类型,H5支付对应MWEB

3. 签名生成

  • 签名参数需非空。
  • 参数按ASCII码由小到大排序,区分大小写。
  • 参数按顺序拼接成k1=v1&k2=v2&…的字符串。
  • 将字符串拼接上秘钥,生成最终签名。
  • 签名生成方式为MD5加密,转大写。

3.1 签名生成代码示例

function genSign($params, $key) {    foreach ($params as $k => $v) {        if (!$v) {            unset($params[$k]);        }    }    ksort($params);    $paramStr = '';    foreach ($params as $k => $v) {        $paramStr .= $k . '=' . $v . '&';    }    $paramStr .= 'key=' . $key;    $sign = strtoupper(md5($paramStr));    return $sign;}

4. 发起请求

将参数转为XML数据后,通过HTTPS或HTTP协议发送请求。

4.1 参数转为XML代码示例

function array_to_xml($params) {    if (!is_array($params) || count($params) <= 0) {        return false;    }    $xml = '
'; foreach ($params as $key => $val) { if (is_numeric($val)) { $xml .= '<' . $key . '>' . $val . '
'; } else { $xml .= '<' . $key . '>
'; } } $xml .= '
'; return $xml;}

4.2 发起请求代码示例

$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_HEADER, 0);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, $params);$return = curl_exec($ch);curl_close($ch);return $return;

5. 处理返回数据

微信返回XML数据,解析后可获得支付状态和相关参数。

5.1 返回示例

SUCCESS
OK
wxdded766660f9b840
1516216351
100
2DUN2i2pGnlC6vDi
95CEA831D598299097A32D8FEEC6BDEF
SUCCESS
wx22194530678545eb3713f2f10724143329
MWEB
https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx22194530678545eb3713f2f10724143329&package=87106983

5.2 返回参数说明

  • return_codeSUCCESS表示支付成功。
  • mweb_url:支付跳转页URL,客户端可直接调用。

6. 中间页处理

通过mweb_url获取深度链接deepLink,客户端可直接调起支付。

6.1 deepLink获取代码示例

function getDeeplink($url, $ip) {    $headers = array("X-FORWARDED-FOR:$ip", "CLIENT-IP:$ip");    ob_start();    $ch = curl_init();    curl_setopt($ch, CURLOPT_URL, $url);    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);    curl_setopt($ch, CURLOPT_REFERER, "pay.o9di.cn");    curl_setopt($ch, CURLOPT_HEADER, 1);    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Linux; Android 6.0.1; OPPO R11s Build/MMB29M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/55.0.2883.91 Mobile Safari/537.36');    curl_exec($ch);    curl_close($ch);    $out = ob_get_contents();    ob_clean();    preg_match('/weixin:\/\/wap.*/', $out, $str);    if ($str) {        return substr($str[0], 0, strlen($str[0]) - 1);    } else {        return '';    }}

7. H5微信回调

notify_url回调地址接收支付结果。

7.1 回调代码示例

function notify() {    $str_Post = $GLOBALS["HTTP_RAW_POST_DATA"];    libxml_disable_entity_loader(true);    $postObj = simplexml_load_string($str_Post, 'SimpleXMLElement', LIBXML_NOCDATA);    $postObj = json_encode($postObj);    $postObj = json_decode($postObj, true);    $out_trade_no = trim($postObj["out_trade_no"]);    if ($postObj["result_code"] == 'SUCCESS' && $postObj["return_code"] == 'SUCCESS') {        // 更新订单状态等相关操作    }}

8. 获取IP

通过getClientIp函数获取用户端IP地址。

8.1 IP获取代码示例

function getClientIp() {    $cip = 'unknown';    if ($_SERVER['REMOTE_ADDR']) {        $cip = $_SERVER['REMOTE_ADDR'];    } elseif (getenv($_SERVER['REMOTE_ADDR'])) {        $cip = getenv($_SERVER['REMOTE_ADDR']);    }    return $cip;}
上一篇:PHP实现微信公众号网页授权
下一篇:php实现多关键字查找方法

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2026年06月03日 09时09分59秒