【二十九】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上,用于存放非主要信息 弹出框是依赖于工具提示插件的,那它也和工具提示是一样的,是需要初始化才能够使用的 首先我们引入 ...
随机推荐
- 1分钟完美安装最新CentOS+Nginx+PHP-FPM+MySQL
PHP 5.3.1 MySQL 5.0.89 Nginx 0.8.33 或 0.7.65 (可选) 现在,我们可以快速全自动搞定 CentOS + Nginx + PHP-FPM + MySQL 的安 ...
- 一个Java系统测试
实验感受: 本次实验最大的感受,就是不要改代码,自己写,代码改起来真的没完没了,不知道会出现什么问题.还有就是一定要清楚自己要怎么去写,流程很重要,一个个功能去实现. 主界面 数据库 主页面代码 &l ...
- 了解Redis过期策略及实现原理
我们在使用redis时,一般会设置一个过期时间,当然也有不设置过期时间的,也就是永久不过期. 当我们设置了过期时间,redis是如何判断是否过期,以及根据什么策略来进行删除的. redis设置过期时间 ...
- 学习Linux shell脚本中连接字符串的方法
这篇文章主要介绍了Linux shell脚本中连接字符串的方法,如果想要在变量后面添加一个字符,可以用一下方法: 代码如下: $value1=home $value2=${value1}"= ...
- POJ 1308 Is It A Tree?和HDU 1272 小希的迷宫
POJ题目网址:http://poj.org/problem?id=1308 HDU题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1272 并查集的运用 ...
- bzoj4566 / P3181 [HAOI2016]找相同字符
P3181 [HAOI2016]找相同字符 后缀自动机 (正解应是广义后缀自动机) 并不会广义后缀自动机. 然鹅可以用普通的后缀自动机. 我们先引入一个问题:算出从一个串内取任意两个不重合子串完全 ...
- RequestBody使用
@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的); GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是 ...
- golang Format string by key.
example: $ go get github.com/hoisie/mustache package main import ( "github.com/hoisie/mustache& ...
- mysql读写分离[高可用]
顾名思义, 在mysql负载均衡中有多种方式, 本人愚钝,只了解驱动中间件和mysql_proxy两种方式, 对于驱动,利用的是ReplicationDriver,具体请看远哥的这篇文章: MySQL ...
- vector.resize 与 vector.reserve的区别(转载)
转载:https://blog.csdn.net/shuilan0066/article/details/3588478 reserve是容器预留空间,但并不真正创建元素对象,在创建对象之前,不能引用 ...