什么是微信H5支付
H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起微信客户端进行支付。
主要用于触屏版的手机浏览器请求微信支付的场景。可以方便的从外部浏览器唤起微信支付。
微信官方也提供了一个体验链接,请在微信外浏览器打开。
微信H5支付是需要申请开通的,申请过程我就不写了
首页创建一个pay.php 的文件,代码如下
<?php
header("Content-Type: text/html; charset=UTF-8");
$subject = "微信H5充值"; //商品描述
// $additional = $data['additional']; //附加数据
$key = "Zxxxxxxxxxxxxxxxxx";//自己设置的微信商家key
$PayMoney=1;//支付金额,是以分为单位。比如1为1分钱,100才是1块钱
$nonce_str=MD5($OrderNo);//随机字符串
$appid="wxxxxxxx";//公众账号ID
$mch_id="1111111111";//商户号
$spbill_create_ip = getIPaddress(); //终端ip
$trade_type = 'MWEB';//交易类型 具体看API 里面有详细介绍
$notify_url = 'http://www.xxxx.com/notify_url.php'; //回调地址
$scene_info ='{"h5_info":{"type":"Wap","wap_url":"http://www.xxxxxxx.com/","wap_name":"测试支付"}}'; //场景信息
//对参数按照key=value的格式,并按照参数名ASCII字典序排序生成字符串
$signA = "appid=$appid&body=$subject&mch_id=$mch_id&nonce_str=$nonce_str¬ify_url=$notify_url&out_trade_no=$OrderNo&scene_info=$scene_info&spbill_create_ip=$spbill_create_ip&total_fee=$PayMoney&trade_type=$trade_type";
$strSignTmp = $signA."&key=$key"; //拼接字符串
$sign = strtoupper(MD5($strSignTmp)); // MD5 后转换成大写
$post_data = "<xml>
<appid>$appid</appid>
<body>$subject</body>
<mch_id>$mch_id</mch_id>
<nonce_str>$nonce_str</nonce_str>
<notify_url>$notify_url</notify_url>
<out_trade_no>$OrderNo</out_trade_no>
<scene_info>$scene_info</scene_info>
<spbill_create_ip>$spbill_create_ip</spbill_create_ip>
<total_fee>$PayMoney</total_fee>
<trade_type>$trade_type</trade_type>
<sign>$sign</sign>
</xml>";//拼接成XML 格式
$url = "https://api.mch.weixin.qq.com/pay/unifiedorder";//微信传参地址
$dataxml = curl_post_https($url,$post_data); //后台POST微信传参地址
$objectxml = (array)simplexml_load_string($dataxml, 'SimpleXMLElement', LIBXML_NOCDATA);
//将微信返回的XML 转换成数组
//var_dump($objectxml);
if($objectxml['return_code'] == 'SUCCESS') {
if($objectxml['result_code'] == 'SUCCESS'){//如果这两个都为此状态则返回mweb_url,详情看‘统一下单’接口文档
$url=$objectxml['mweb_url'];
echo "<script>location.href='".$url."';</script>";
}
if($objectxml['return_code'] == 'FAIL'){//如果这两个都为此状态则返回mweb_url,详情看‘统一下单’接口文档
echo $objectxml['return_msg'];
}
}
}
function curl_post_https($url,$data){ // 模拟提交数据函数
$curl = curl_init(); // 启动一个CURL会话
curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包
curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
$tmpInfo = curl_exec($curl); // 执行操作
if (curl_errno($curl)) {
echo 'Errno'.curl_error($curl);//捕抓异常
}
curl_close($curl); // 关闭CURL会话
return $tmpInfo; // 返回数据,json格式
}
function getIPaddress(){
$IPaddress='';
if (isset($_SERVER)){
if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])){
$IPaddress = $_SERVER["HTTP_X_FORWARDED_FOR"];
} else if (isset($_SERVER["HTTP_CLIENT_IP"])) {
$IPaddress = $_SERVER["HTTP_CLIENT_IP"];
} else {
$IPaddress = $_SERVER["REMOTE_ADDR"];
}
} else {
if (getenv("HTTP_X_FORWARDED_FOR")){
$IPaddress = getenv("HTTP_X_FORWARDED_FOR");
} else if (getenv("HTTP_CLIENT_IP")) {
$IPaddress = getenv("HTTP_CLIENT_IP");
} else {
$IPaddress = getenv("REMOTE_ADDR");
}
}
return $IPaddress;
}
?>这就是微信从网页拉起支付的页面。访问你项目http://www.xxxx.com/pay.php
接下来写通知页面,创建一个 notify_url.php
<?php
$input = file_get_contents("php://input") ? file_get_contents("php://input") : false;
if($input){
$xml = (array)simplexml_load_string($input, 'SimpleXMLElement', LIBXML_NOCDATA);
} else {
return;
}
$xml = (array)simplexml_load_string($input, 'SimpleXMLElement', LIBXML_NOCDATA);
//判断appid 是否一致,如果不一致可能是非法的通知,直接退出
if($xml['appid']!='wxxxxxxxxxx'){
exit();
}
//商户订单号
$out_trade_no = $xml['out_trade_no'];
//微信交易号
$trade_no = $xml['transaction_id'];
//订单金额
$total_amount=$xml['total_fee'];
if($xml['return_code'] == 'SUCCESS') {
if($xml['result_code'] == 'SUCCESS'){
//交易成功
//更新你的逻辑数据 xxxx
......
//返回 SUCCESS,告诉微信收到通知。
echo "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
}
}
if($xml['return_code'] == 'FAIL'){
}
}
?>好,到些PHP版本微信H5支付完成,如果有什么疑问,在下面留言。














