【二十九】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上,用于存放非主要信息 弹出框是依赖于工具提示插件的,那它也和工具提示是一样的,是需要初始化才能够使用的 首先我们引入 ...
随机推荐
- iframe有那些缺点
1.页面样式调试麻烦,出现多个滚动条: 2.浏览器的后退按钮失效: 3.过多会增加服务器的HTTP请求: 4.小型的移动设备无法完全显示框架: 5.产生多个页面,不易管理: 6.不容易打印: 7.代码 ...
- MyEclipse如何配置Struts2源码的框架压缩包
1.MyEclipse如何配置Struts2源码的框架压缩包 如本机的Struts2框架压缩包路径为:D:\MyEclipseUserLibraries\struts\struts-2.3.15.3- ...
- Prometheus监控学习笔记之PromQL 内置函数
概述 Prometheus 提供了其它大量的内置函数,可以对时序数据进行丰富的处理.某些函数有默认的参数,例如:year(v=vector(time()) instant-vector).其中参数 v ...
- php 腾讯云 对象存储V5版本 获取返回的上传文件的链接方法
腾讯云 对象存储V5版本 文档地址:https://github.com/tencentyun/cos-php-sdk-v5 调用简单文件上传方法: 返回数据如下 Array ( [data:prot ...
- setfacl 设置文件访问控制列表
setfacl 设置文件访问控制列表 用法: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ... 参数: -m, --modify=acl 更改文件的访问控 ...
- oracle RAC如何正确地删除ASM磁盘组
1.登录到命令行 切换到grid用户 [grid@swnode1 ~]$ sqlplus / as sysasm SQL*Plus: Release Production on Wed May :: ...
- python3 logging模块
很多程序都有记录日志的需求,并且日志包含的信息有正常的程序访问日志还可能有错误,警告等信息输出,python的logging模块提供了标准的日志接口,可以通过它存储各种格式的日志,日志级别等级:cri ...
- [c/c++] programming之路(9)、运算优先级
一.运算优先级 二.条件运算符(表达式1?表达式2:表达式3) 当式1正确时,取式2的值:否则,取式3的值 三.格式字符 #include<stdio.h> #include<std ...
- Python3基础 list for+continue 输出1-50之间的偶数
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- git克隆源码时提示fatal: HTTP request failed怎么办?
答: 升级git版本即可 centos下升级git的方法在此