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_code:SUCCESS表示支付成功。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;} 发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2026年06月03日 09时09分59秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
php 生成csv mac下乱码
2023-02-28
php 生成证书 签名及验签
2023-02-28
php 的rsa加密与解密
2023-02-28
PHP 的标准输入与输出
2023-02-28
php 笔记 (早前的,很乱)
2023-02-28
PHP 第一天
2023-02-28
Redis使用量暴增,快速定位有哪些大key在作怪
2023-02-28
php 结课作业答案,北语201803考试批次《PHP》(结课作业)1.pdf
2023-02-28
PHP 统计数据功能 有感
2023-02-28
SpringBoot处理JSON数据
2023-02-28
Redis使用基本套路
2023-02-28
php 解决项目中多个自动加载冲突问题
2023-02-28
PHP 设置调试工具XDebug PHPStorm IDE
2023-02-28
PHP 输入输出流合集
2023-02-28
PHP 面向对象 final类与final方法
2023-02-28
php--防止sql注入的方法
2023-02-28
php-兔子问题,斐波那契数列
2023-02-28
php-有序数组合并后仍有序
2023-02-28
Redis以及Redis的php扩展安装
2023-02-28