博客
关于我
PHP实现微信公众号H5支付
阅读量:793 次
发布时间:2023-03-01

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

微信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;
}

转载地址:http://cstfk.baihongyu.com/

你可能感兴趣的文章
PHP函数操作数字和汉字互转(100以内)
查看>>
PHP函数方法
查看>>
PHP创建目录mkdir无写入权限的问题解决方案
查看>>
PHP删除指定目录下的所有文件和文件夹 | 删除指定文件
查看>>
php删除文件夹下面所有文件包括(删除文件夹)不删除文件夹
查看>>
React Collapse Pane 项目教程
查看>>
php判断ip黑名单程序代码
查看>>
php判断复选框是否被选中的方法
查看>>
PHP判断指定目录下是否存在文件
查看>>
php判断数组是否为空
查看>>
PHP判断数组是否有重复值、获取重复值
查看>>
springboot基于Web的社区留守儿童管理系统源码毕设+论文
查看>>
Springboot基于Redisson实现Redis分布式可重入锁【案例到源码分析】
查看>>
PHP利用正则表达式实现手机号码中间4位用星号(*)替换显示
查看>>
PHP加密与安全的最佳实践
查看>>
PHP加速器eaccelerator导致php-fpm进程卡死原因分析
查看>>
PHP区分 企业微信浏览器 | 普通微信浏览器 | 其他浏览器
查看>>
php原生代码怎么连表查询,PHP tp5中使用原生sql查询代码实例
查看>>
PHP去掉转义符
查看>>
php去除字符串开头或末尾的字符(例如逗号)
查看>>