ThinkPHP框架整合微信支付之Native 扫码支付模式二图文详解


Posted in PHP onApril 09, 2019

本文实例讲述了ThinkPHP框架整合微信支付之Native 扫码支付模式二。分享给大家供大家参考,具体如下:

大家好,这篇文章是继微信支付之Native 扫码支付 模式一之后的微信支付系列教程第三篇:扫码支付之模式二

介绍下扫码支付目前有两种模式,模式一比模式二稍微复杂点,至于模式一与模式二的具体内容,流程,微信开发文档都有详细介绍,这里就不多说废话,接下来赶紧上教程!

首先我们还是一样,导入微信支付的类库:

ThinkPHP框架整合微信支付之Native 扫码支付模式二图文详解 

接下来是Public下的文件:

ThinkPHP框架整合微信支付之Native 扫码支付模式二图文详解

以上跟Native扫码模式一一样,不明白请看 //3water.com/article/159356.htm

jsAPI支付请看://3water.com/article/159351.htm

接下来直接看控制器部分的代码:

step1:同样,先初始化引入WxPayPubHelper类库

/**
     * 初始化
     */
    public function _initialize()
    {
        //引入WxPayPubHelper
        vendor('WxPayPubHelper.WxPayPubHelper');
    }

step2:这里就跟扫码支付模式一有区别了:根据订单生产二维码,使用统一支付接口,请看代码:

public function createQrcode()
    {
        //使用统一支付接口
        $unifiedOrder = new \UnifiedOrder_pub();
        
        //设置统一支付接口参数
        //设置必填参数
        //appid已填,商户无需重复填写
        //mch_id已填,商户无需重复填写
        //noncestr已填,商户无需重复填写
        //spbill_create_ip已填,商户无需重复填写
        //sign已填,商户无需重复填写
        $unifiedOrder->setParameter("body","贡献一分钱");//商品描述
        //自定义订单号,此处仅作举例
        $timeStamp = time();
        $out_trade_no = C('WxPayConf_pub.APPID')."$timeStamp";
        $unifiedOrder->setParameter("out_trade_no","$out_trade_no");//商户订单号 
        $unifiedOrder->setParameter("total_fee","1");//总金额
        $unifiedOrder->setParameter("notify_url", C('WxPayConf_pub.NOTIFY_URL'));//通知地址 
        $unifiedOrder->setParameter("trade_type","NATIVE");//交易类型
        //非必填参数,商户可根据实际情况选填
        //$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商户号  
        //$unifiedOrder->setParameter("device_info","XXXX");//设备号 
        //$unifiedOrder->setParameter("attach","XXXX");//附加数据 
        //$unifiedOrder->setParameter("time_start","XXXX");//交易起始时间
        //$unifiedOrder->setParameter("time_expire","XXXX");//交易结束时间 
        //$unifiedOrder->setParameter("goods_tag","XXXX");//商品标记 
        //$unifiedOrder->setParameter("openid","XXXX");//用户标识
        //$unifiedOrder->setParameter("product_id","XXXX");//商品ID
        
        //获取统一支付接口结果
        $unifiedOrderResult = $unifiedOrder->getResult();
        
        //商户根据实际情况设置相应的处理流程
        if ($unifiedOrderResult["return_code"] == "FAIL") 
        {
            //商户自行增加处理流程
            echo "通信出错:".$unifiedOrderResult['return_msg']."<br>";
        }
        elseif($unifiedOrderResult["result_code"] == "FAIL")
        {
            //商户自行增加处理流程
            echo "错误代码:".$unifiedOrderResult['err_code']."<br>";
            echo "错误代码描述:".$unifiedOrderResult['err_code_des']."<br>";
        }
        elseif($unifiedOrderResult["code_url"] != NULL)
        {
            //从统一支付接口获取到code_url
            $code_url = $unifiedOrderResult["code_url"];
            //商户自行增加处理流程
            //......
        }
        $this->assign('out_trade_no',$out_trade_no);
        $this->assign('code_url',$code_url);
        $this->assign('unifiedOrderResult',$unifiedOrderResult);
        
        $this->display('qrcode');
    }

对应qrcode.html页面:

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF-8">
    <title>微信安全支付</title>
</head>
<body>
    <div align="center" id="qrcode">
    </div>
    <div align="center">
        <p>订单号:<?php echo $out_trade_no; ?></p>
    </div>
    <div align="center">
        <form  action="./order_query.php" method="post">
            <input name="out_trade_no" type='hidden' value="<?php echo $out_trade_no; ?>">
            <button type="submit" >查询订单状态</button>
        </form>
    </div>
    <br>
    <div align="center">
        <form  action="./refund.php" method="post">
            <input name="out_trade_no" type='hidden' value="<?php echo $out_trade_no; ?>">
            <input name="refund_fee" type='hidden' value="1">
            <button type="submit" >申请退款</button>
        </form>
    </div>
    <br>
    <div align="center">
        <a href="../index.php" rel="external nofollow" >返回首页</a>
    </div>
</body>
    <script src="__PUBLIC__/js/qrcode.js"></script>
    <script>
        if(<?php echo $unifiedOrderResult["code_url"] != NULL; ?>)
        {
            var url = "<?php echo $code_url;?>";
            //参数1表示图像大小,取值范围1-10;参数2表示质量,取值范围'L','M','Q','H'
            var qr = qrcode(10, 'M');
            qr.addData(url);
            qr.make();
            var wording=document.createElement('p');
            wording.innerHTML = "扫我,扫我";
            var code=document.createElement('DIV');
            code.innerHTML = qr.createImgTag();
            var element=document.getElementById("qrcode");
            element.appendChild(wording);
            element.appendChild(code);
        }
    </script>
</html>

模式二不需要配置公众平台了,所以简单就简单在这里

step3:异步通知,这里都一样:

public function notify()
    {
        //使用通用通知接口
        $notify = new \Notify_pub();
         
        //存储微信的回调
        $xml = $GLOBALS['HTTP_RAW_POST_DATA'];
        $notify->saveData($xml);
         
        //验证签名,并回应微信。
        //对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,
        //微信会通过一定的策略(如30分钟共8次)定期重新发起通知,
        //尽可能提高通知的成功率,但微信不保证通知最终能成功。
        if($notify->checkSign() == FALSE){
            $notify->setReturnParameter("return_code","FAIL");//返回状态码
            $notify->setReturnParameter("return_msg","签名失败");//返回信息
        }else{
            $notify->setReturnParameter("return_code","SUCCESS");//设置返回码
        }
        $returnXml = $notify->returnXml();
        echo $returnXml;
         
        //==商户根据实际情况设置相应的处理流程,此处仅作举例=======
         
        //以log文件形式记录回调信息
        //         $log_ = new Log_();
        $log_name= __ROOT__."/Public/notify_url.log";//log文件路径
         
        $this->log_result($log_name,"【接收到的notify通知】:\n".$xml."\n");
         
        if($notify->checkSign() == TRUE)
        {
            if ($notify->data["return_code"] == "FAIL") {
                //此处应该更新一下订单状态,商户自行增删操作
                log_result($log_name,"【通信出错】:\n".$xml."\n");
            }
            elseif($notify->data["result_code"] == "FAIL"){
                //此处应该更新一下订单状态,商户自行增删操作
                log_result($log_name,"【业务出错】:\n".$xml."\n");
            }
            else{
                //此处应该更新一下订单状态,商户自行增删操作
                log_result($log_name,"【支付成功】:\n".$xml."\n");
            }
             
            //商户自行增加处理流程,
            //例如:更新订单状态
            //例如:数据库操作
            //例如:推送支付完成信息
        }
    }

这样模式二的扫码支付就OK了 是不是相对来说简单很多?

下面是测试截图:

扫码截图:

ThinkPHP框架整合微信支付之Native 扫码支付模式二图文详解

 扫码结果:

ThinkPHP框架整合微信支付之Native 扫码支付模式二图文详解 

有问题请留言,下面还会介绍微信支付刷卡支付的详细教程

微信支付教程jsapi篇:
//3water.com/article/159351.htm

微信支付教程扫码模式一:
//3water.com/article/159356.htm

微信支付教程刷卡支付:
//3water.com/article/159401.htm

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
动态生成gif格式的图像要注意?
Oct 09 PHP
php URL跳转代码 减少外链
Jun 25 PHP
基于xcache的配置与使用详解
Jun 18 PHP
一个完整的PHP类包含的七种语法说明
Jun 04 PHP
6个超实用的PHP代码片段
Aug 10 PHP
ThinkPHP模板Volist标签嵌套循环输出多维数组的方法
Mar 23 PHP
PHP实现动态执行代码的方法
Mar 25 PHP
php array_merge_recursive 数组合并
Oct 26 PHP
ThinkPHP5实现作业管理系统中处理学生未交作业与已交作业信息的方法
Nov 12 PHP
php微信开发之百度天气预报
Nov 18 PHP
php中文语义分析实现方法示例
Sep 28 PHP
Laravel框架下载,安装及路由操作图文详解
Dec 04 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式一图文详解
Apr 09 #PHP
ThinkPHP框架整合微信支付之JSAPI模式图文详解
Apr 09 #PHP
PHP7引入的&quot;??&quot;和&quot;?:&quot;的区别讲解
Apr 08 #PHP
PHP开发实现快递查询功能详解
Apr 08 #PHP
PHP中number_format()函数的用法讲解
Apr 08 #PHP
微信JSSDK分享功能图文实例详解
Apr 08 #PHP
ThinkPHP框架实现FTP图片上传功能示例
Apr 08 #PHP
You might like
Search File Contents PHP 搜索目录文本内容的代码
2010/02/21 PHP
php学习之流程控制实现代码
2011/06/09 PHP
PHP二维索引数组的遍历实例分析【2种方式】
2019/06/24 PHP
javascript实现划词标记+划词搜索功能
2007/03/06 Javascript
Jquery实现列表(隔行换色,全选,鼠标滑过当前行)效果实例
2013/06/09 Javascript
js中Math之random,round,ceil,floor的用法总结
2013/12/26 Javascript
js实现获取焦点后光标在字符串后
2014/09/17 Javascript
jquery实现初次打开有动画效果的网页TAB切换代码
2015/09/06 Javascript
js获取客户端操作系统类型的方法【测试可用】
2016/05/27 Javascript
jquery mobile 实现自定义confirm确认框效果的简单实例
2016/06/17 Javascript
JavaScript读二进制文件并用ajax传输二进制流的方法
2016/07/18 Javascript
nodejs利用ajax实现网页无刷新上传图片实例代码
2017/06/06 NodeJs
Vue props用法详解(小结)
2018/07/03 Javascript
解决vue select当前value没有更新到vue对象属性的问题
2018/08/30 Javascript
Vue移动端右滑屏幕返回上一页附源码下载
2019/06/26 Javascript
Python实现的飞速中文网小说下载脚本
2015/04/23 Python
windows下python连接oracle数据库
2017/06/07 Python
Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
2019/01/04 Python
python自定义函数实现最大值的输出方法
2019/07/09 Python
Django如何实现网站注册用户邮箱验证功能
2019/08/14 Python
Python学习之路之pycharm的第一个项目搭建过程
2020/06/18 Python
Matlab中plot基本用法的具体使用
2020/07/17 Python
用HTML5实现手机摇一摇的功能的教程
2012/10/30 HTML / CSS
html5 canvas fillRect坐标和大小的问题解决方法
2014/03/26 HTML / CSS
中邮全球便购:中国邮政速递物流
2017/03/04 全球购物
美国饼干礼物和美食甜点购买网站:Cheryl’s
2020/05/28 全球购物
情侣吵架检讨书
2014/02/05 职场文书
妈妈活动方案
2014/08/15 职场文书
考试作弊检讨书范文
2015/01/27 职场文书
用python开发一款操作MySQL的小工具
2021/05/12 Python
Java SSM配置文件案例详解
2021/08/30 Java/Android
Appium中scroll和drag_and_drop根据元素位置滑动
2022/02/15 Python
Apache Linkis 中间件架构及快速安装步骤
2022/03/16 Servers
排查并解决MySQL生产库内存使用率高的报警
2022/04/11 MySQL
Python序列化模块JSON与Pickle
2022/06/05 Python
Linux中各个目录的作用与内容
2022/06/28 Servers