后端开发 \ PHP \ 一个PHP文件搞定微信H5支付

一个PHP文件搞定微信H5支付

总点击473
简介:什么是微信H5支付   H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起微信客户端进行支付。   主要用于触屏版的手机

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

意见反馈 常见问题 官方微信 返回顶部