什么是微信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支付完成,如果有什么疑问,在下面留言。