【二十九】php之简易微信二维码支付
参考二维码支付接口文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5
index.php
1 <!DOCTYPE html> 2 <html> 3 <?php 4 // 生成随机数,长度为30位 5 function getNonceStr($length = 30) 6 { 7 $chars = "abcdefghijklmnopqrstuvwxyz0123456789"; 8 $str =""; 9 for ( $i = 0; $i < $length; $i++ ) { 10 $str .= substr($chars, mt_rand(0, strlen($chars)-1), 1); 11 } 12 return $str; 13 } 14 ?> 15 <head> 16 <title></title> 17 </head> 18 <body> 19 <form action="pay.php" method="post"> 20 订单号:<input type="" name="out_trade_no" value="<?php echo getNonceStr(); ?>"> 21 支付金额为:<input type="text" name="total_fee"><br/> 22 <input type="submit" value="付款"> 23 </form> 24 </body> 25 </html>
pay.php(生成数据向接口请求)
1 <?php 2 //必填参数 3 $appid="wx8fd788902902f0**"; 4 $mch_id="14894801**"; 5 $nonce_str=getNonceStr(); 6 $body="cmftest"; 7 $out_trade_no=$_POST['out_trade_no']; 8 $total_fee=$_POST['total_fee']; 9 // 注意:spbill_create_ip的值必须是ip。不然生成的签名是错误的 10 // $spbill_create_ip=$_SERVER['REMOTE_ADDR']; 11 $spbill_create_ip="127.0.0.1"; 12 $notify_url="http://127.0.0.1/wx_pay/res.php"; 13 $trade_type="NATIVE"; 14 $KEY = 'MIIEvAIBADANBgkqhkiG9w0BAQEF****'; 15 $device_info="WEB"; 16 // 将这些值设置为数组形式 17 $value=array( 18 'appid' => $appid, 19 'mch_id' =>$mch_id, 20 'nonce_str'=>$nonce_str, 21 'out_trade_no'=>$out_trade_no, 22 'total_fee'=>$total_fee, 23 'spbill_create_ip'=>$spbill_create_ip, 24 'notify_url'=>$notify_url, 25 'device_info'=>$device_info, 26 'body'=>$body, 27 'trade_type'=>$trade_type 28 ); 29 //生成签名 30 $sign=MakeSign($value,$KEY); 31 // 往数组中增加签名字段 32 $value["sign"]=$sign; 33 // 将数组内的数据转为xml格式 34 $res= ToXml($value); 35 echo $res; 36 //接口请求地址 37 $url="https://api.mch.weixin.qq.com/pay/unifiedorder"; 38 //向接口请求 39 $result = wx_post($url,$res); 40 var_dump($result); 41 $erweima= $result->code_url; 42 echo $erweima; 43 // 从结果xml中取出二维码的另外一种方式 44 // // 截取这个字符串第一次出现的位置(下标) 45 // $indexnum= strpos($result,"<code_url><![CDATA["); 46 // // 计算这个字符串的长度 47 // $strsumnum= strlen("<code_url><![CDATA["); 48 // $str=substr($result,$indexnum+$strsumnum); 49 // $a=strpos($str,"]"); 50 // $a=substr($str,0,$a); 51 // echo $a; 52 // 使用curl库的post方法向接口发送请求 53 function wx_post($url,$data){ 54 $ch = curl_init(); 55 curl_setopt($ch, CURLOPT_URL, $url); 56 curl_setopt($ch, CURLOPT_HEADER, FALSE); 57 curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); 58 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 59 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); 60 curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)'); 61 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 62 curl_setopt($ch, CURLOPT_AUTOREFERER, 1); 63 curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 64 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 65 $tmpInfo = curl_exec($ch); 66 if (curl_errno($ch)) { 67 return curl_error($ch); 68 } 69 // 转换形式良好的 XML 字符串为 SimpleXMLElement 对象,然后输出对象的键和元素 70 $tmpInfo=simplexml_load_string($tmpInfo); 71 return $tmpInfo; 72 } 73 //随机字符串 74 function getNonceStr($length = 30) 75 { 76 $chars = "abcdefghijklmnopqrstuvwxyz0123456789"; 77 $str =""; 78 for ( $i = 0; $i < $length; $i++ ) { 79 $str .= substr($chars, mt_rand(0, strlen($chars)-1), 1); 80 } 81 return $str; 82 } 83 //生成签名 84 function MakeSign($sign,$KEY) 85 { 86 //签名步骤一:按字典序排序参数 87 ksort($sign); 88 // var_dump($sign); 89 $string =ToUrlParams($sign); 90 // echo "<br/>$string<br/>"; 91 //签名步骤二:在string后加入KEY 92 $string = $string . "&key=".$KEY; 93 // echo "$string"; 94 //签名步骤三:MD5加密 95 $string = md5($string); 96 //签名步骤四:所有字符转为大写 97 $result = strtoupper($string); 98 return $result; 99 } 100 // 拼接key和value值 101 function ToUrlParams($sign) 102 { 103 $buff = ""; 104 foreach ($sign as $k => $v) 105 { 106 if($k != "sign" && $v != "" && !is_array($v)){ 107 $buff .= $k . "=" . $v . "&"; 108 } 109 } 110 111 $buff = trim($buff, "&"); 112 return $buff; 113 } 114 //将数组内的数据全部转为xml 115 function ToXml($sign) 116 { 117 $xml="<xml>"; 118 // $xml = "<xml>"; 119 foreach ($sign as $key=>$val) 120 { 121 if (is_numeric($val)){ 122 // $xml.="<".$key.">".$val."</".$key.">"; 123 $xml.="<".$key.">".$val."</".$key.">"; 124 125 126 }else{ 127 // $xml.="<".$key."><![CDATA[".$val."]]></".$key.">"; 128 $xml.="<".$key."><![CDATA[".$val."]]></".$key.">"; 129 } 130 } 131 $xml.="</xml>"; 132 // $xml.="</xml>"; 133 return $xml; 134 } 135 ?> 136 <!DOCTYPE html> 137 <html> 138 <head> 139 <title></title> 140 </head> 141 <body> 142 您的订单号为<?php echo $out_trade_no; ?>,您支付的金额为<?php echo $total_fee; ?> 143 <form action="pay_to.php" method="post"> 144 <input type="hidden" name="two_code" value="<?php echo $erweima;?>"> 145 <input type="submit" value="付款支付" > 146 </form> 147 148 </body> 149 </html>
pay_to.php(生成二维码)
1 <?php 2 $value=$_POST["two_code"]; 3 include 'D:\wamp64\www\wx_pay\phpqrcode\phpqrcode.php'; 4 QRcode::png("$value"); 5 ?>
界面显示: