【二十九】php之简易微信二维码支付
参考二维码支付接口文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5
index.php
<!DOCTYPE html>
<html>
<?php
// 生成随机数,长度为30位
function getNonceStr($length = 30)
{
$chars = "abcdefghijklmnopqrstuvwxyz0123456789";
$str ="";
for ( $i = 0; $i < $length; $i++ ) {
$str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);
}
return $str;
}
?>
<head>
<title></title>
</head>
<body>
<form action="pay.php" method="post">
订单号:<input type="" name="out_trade_no" value="<?php echo getNonceStr(); ?>">
支付金额为:<input type="text" name="total_fee"><br/>
<input type="submit" value="付款">
</form>
</body>
</html>
pay.php(生成数据向接口请求)
<?php
//必填参数
$appid="wx8fd788902902f0**";
$mch_id="14894801**";
$nonce_str=getNonceStr();
$body="cmftest";
$out_trade_no=$_POST['out_trade_no'];
$total_fee=$_POST['total_fee'];
// 注意:spbill_create_ip的值必须是ip。不然生成的签名是错误的
// $spbill_create_ip=$_SERVER['REMOTE_ADDR'];
$spbill_create_ip="127.0.0.1";
$notify_url="http://127.0.0.1/wx_pay/res.php";
$trade_type="NATIVE";
$KEY = 'MIIEvAIBADANBgkqhkiG9w0BAQEF****';
$device_info="WEB";
// 将这些值设置为数组形式
$value=array(
'appid' => $appid,
'mch_id' =>$mch_id,
'nonce_str'=>$nonce_str,
'out_trade_no'=>$out_trade_no,
'total_fee'=>$total_fee,
'spbill_create_ip'=>$spbill_create_ip,
'notify_url'=>$notify_url,
'device_info'=>$device_info,
'body'=>$body,
'trade_type'=>$trade_type
);
//生成签名
$sign=MakeSign($value,$KEY);
// 往数组中增加签名字段
$value["sign"]=$sign;
// 将数组内的数据转为xml格式
$res= ToXml($value);
echo $res;
//接口请求地址
$url="https://api.mch.weixin.qq.com/pay/unifiedorder";
//向接口请求
$result = wx_post($url,$res);
var_dump($result);
$erweima= $result->code_url;
echo $erweima;
// 从结果xml中取出二维码的另外一种方式
// // 截取这个字符串第一次出现的位置(下标)
// $indexnum= strpos($result,"<code_url><![CDATA[");
// // 计算这个字符串的长度
// $strsumnum= strlen("<code_url><![CDATA[");
// $str=substr($result,$indexnum+$strsumnum);
// $a=strpos($str,"]");
// $a=substr($str,0,$a);
// echo $a;
// 使用curl库的post方法向接口发送请求
function wx_post($url,$data){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$tmpInfo = curl_exec($ch);
if (curl_errno($ch)) {
return curl_error($ch);
}
// 转换形式良好的 XML 字符串为 SimpleXMLElement 对象,然后输出对象的键和元素
$tmpInfo=simplexml_load_string($tmpInfo);
return $tmpInfo;
}
//随机字符串
function getNonceStr($length = 30)
{
$chars = "abcdefghijklmnopqrstuvwxyz0123456789";
$str ="";
for ( $i = 0; $i < $length; $i++ ) {
$str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);
}
return $str;
}
//生成签名
function MakeSign($sign,$KEY)
{
//签名步骤一:按字典序排序参数
ksort($sign);
// var_dump($sign);
$string =ToUrlParams($sign);
// echo "<br/>$string<br/>";
//签名步骤二:在string后加入KEY
$string = $string . "&key=".$KEY;
// echo "$string";
//签名步骤三:MD5加密
$string = md5($string);
//签名步骤四:所有字符转为大写
$result = strtoupper($string);
return $result;
}
// 拼接key和value值
function ToUrlParams($sign)
{
$buff = "";
foreach ($sign as $k => $v)
{
if($k != "sign" && $v != "" && !is_array($v)){
$buff .= $k . "=" . $v . "&";
}
} $buff = trim($buff, "&");
return $buff;
}
//将数组内的数据全部转为xml
function ToXml($sign)
{
$xml="<xml>";
// $xml = "<xml>";
foreach ($sign as $key=>$val)
{
if (is_numeric($val)){
// $xml.="<".$key.">".$val."</".$key.">";
$xml.="<".$key.">".$val."</".$key.">"; }else{
// $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
$xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
}
}
$xml.="</xml>";
// $xml.="</xml>";
return $xml;
}
?>
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
您的订单号为<?php echo $out_trade_no; ?>,您支付的金额为<?php echo $total_fee; ?>
<form action="pay_to.php" method="post">
<input type="hidden" name="two_code" value="<?php echo $erweima;?>">
<input type="submit" value="付款支付" >
</form> </body>
</html>
pay_to.php(生成二维码)
<?php
$value=$_POST["two_code"];
include 'D:\wamp64\www\wx_pay\phpqrcode\phpqrcode.php';
QRcode::png("$value");
?>
界面显示:
【二十九】php之简易微信二维码支付的更多相关文章
- java 面向对象(二十九):异常(二)异常的处理
1.java异常处理的抓抛模型过程一:"抛":程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象. * 并将此对象抛出. * 一旦抛出对象以后,其后的代 ...
- 机器学习实战基础(二十九):决策树(二)DecisionTreeClassifier与红酒数据集
DecisionTreeClassifier与红酒数据集 1 sklearn.tree.DecisionTreeClassifier class sklearn.tree.DecisionTreeCla ...
- 微信小程序把玩(二十九)video组件
原文:微信小程序把玩(二十九)video组件 视频播放组件与图片加载组件也没啥差别,使用起来也没啥注意的 重要属性: wxml <!--监听button点击事件--> <button ...
- 剑指Offer(二十九):最小的K个数
剑指Offer(二十九):最小的K个数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baid ...
- Bootstrap <基础二十九>面板(Panels)
Bootstrap 面板(Panels).面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 <div> 元素添加 class .panel 和 class .pa ...
- Web 开发人员和设计师必读文章推荐【系列二十九】
<Web 前端开发精华文章推荐>2014年第8期(总第29期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
- WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载]
原文:WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载] 我们有两种典型的WCF调用方式:通过SvcUtil.exe(或者添加Web引用)导入发布的服务元数据生成服务代理相关的代码 ...
- VMwarevSphere 服务器虚拟化之二十九 桌面虚拟化之安装View副本服务器
VMwarevSphere 服务器虚拟化之二十九 桌面虚拟化之安装View副本服务器 VMware View中高可用性可是一个必须要考虑的问题.在整个虚拟桌面环境中View Connection S ...
- Bootstrap入门(二十九)JS插件6:弹出框
Bootstrap入门(二十九)JS插件6:弹出框 加入小覆盖的内容,像在iPad上,用于存放非主要信息 弹出框是依赖于工具提示插件的,那它也和工具提示是一样的,是需要初始化才能够使用的 首先我们引入 ...
随机推荐
- AtCoder Regular Contest 077 C - pushpush
题目链接:http://arc077.contest.atcoder.jp/tasks/arc077_a Time limit : 2sec / Memory limit : 256MB Score ...
- Autel Maxisys MS908CV Description
The new Autel MaxiSys CV Heavy Duty Diagnostic is built on the powerful MaxiSys 908 platform and pro ...
- (2018干货系列四)最新Python学习路线整合
怎么学Python Python是一种面向对象的解释型计算机程序设计语言,纯粹的自由软件,常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起. Python初级开 ...
- Django框架----命名空间模式
命名空间模式 即使不同的APP使用相同的URL名称,URL的命名空间模式也可以让你唯一反转命名的URL. 举个例子: project中的urls.py from django.conf.urls im ...
- docker 常用操作
1,安装 .检查内核版本,必须是3.10及以上 uname ‐r .安装docker yum install docker .输入y确认安装 .启动docker [root@localhost ~]# ...
- HTML的简介
1.HTML语言是做显示用的.HTML文件由浏览器来转译执行.(全站工程师:全都会.) 2.静态网页由HTML(显示).CSS(修饰).JAVAScript(简单交互)三种元素构成.3.动态网页:数据 ...
- intelliJ IDEA之使用svn或git管理代码
intelliJ IDEA之使用svn管理代码 1.VCS—>import into Version Control—>Share Project(Subversion) 2.点击+ ...
- IOS 苹果手机fiddler抓包时出现了tunnel to 443 解决方案,亲测有效
先上一张捉取成功图[版本需4.0以上,并非所有https数据可抓取,具体原因未知] 1.先对Fiddler进行设置[打开Fiddler ——> Options .然后打开的对话框中,选择HTTP ...
- C# ms speech文字转语音例子
最近突发奇想 想玩玩 文字转语音的东东 谷歌了一下 发现微软有一个TTS 的SDK 查了查相关资料 发现 还真不错 然后就开始玩玩Microsoft Speech SDK的 DEMO了 ...
- 【题解】Luogu P4344 [SHOI2015]脑洞治疗仪
原题传送门:P4344 [SHOI2015]脑洞治疗仪 前置芝士:珂朵莉树 窝博客里对珂朵莉树的介绍 没什么好说的自己看看吧 珂朵莉树好题啊 我一开始一直Re65 后来重构代码就ac了,或许是rp问题 ...