• thinkphp5.0 微信扫码支付模式二


    仅供个人参考,方便大家。

    一、1)https://pay.weixin.qq.com/index.php/core/home/login  复制此地址 打开微信商户平台。

           2)下载安全操作证书(最好在IE下载);

       

      3)安装后的界面

     

    4)下载证书  (一定要用主账号登录,才会显示下载证书)

     

    此图片摘自网络,如有侵权请联系删除。

    5)设置32位秘钥(百度秘钥生成可在线生成);

    二、1)https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1  打开此链接下载SDK。

      

    2) 下载后的目录结构

    3)在thinkphp5 中把SDK放到extend 目录下 创建的wxpay文件下。

    wxpay 文件

     三、1)引入SDK下的类(注意一定要改SDK下lib文件下的类名,把点去掉)

       原来是有点 例如:WxPay.Api.php

    extend 目录下wxpay文件下。。。去掉点后把相关的类中引到的也去掉。

     2)打开WxPayConfig.php 配置好相关设置

     

     3)后台 控制器 代码

      1 <?php
      2 namespace apphomecontroller;
      3 use thinkLoader;
      4 use thinkDb;
      5 use thinkLog;
      6 /**
      7  * 微信支付控制器
      8  */
      9 
     10 class Weixinpays extends Base{
     11     
     12     /**
     13      * 初始化
     14      */
     15     private $wxpayConfig;
     16     private $wxpay;
     17     public function _initialize() {
     18          Loader::import('wxpay.lib.WxPayConfig');
     19         Loader::import('wxpay.lib.WxPayData',EXTEND_PATH);
     20         Loader::import('wxpay.lib.WxPayApi',EXTEND_PATH);
     21         Loader::import('wxpay.lib.WxPayNotify',EXTEND_PATH);
     22         Loader::import( 'wxpay.lib.WxPayNativePay',EXTEND_PATH);
     23         Loader::import( 'wxpay.example.log',EXTEND_PATH);
     24         error_reporting(E_ERROR);
     25         Loader::import('wxpay.example.phpqrcode.phpqrcode');
     26         Loader::import('wxpay.example.notify');
     27     }
     28     
     29     /**
     30      * 获取微信URL
     31      */
     32     public function getWeixinPaysURL(){
     33         $m = new M();
     34         $userId = (int)session('WST_USER.userId');
     35         $obj = array();
     36         $obj["userId"] = $userId;
     37         $obj["orderNo"] =$out_trade_no= input('orderNo');
     38         $obj["isBatch"] = 1;
     39         $data = model('Orders')->checkOrderPay($obj,3);
     40         if($data["status"]==1){
     41             $needPay = $m->getPayOrders($obj,3);
     42             //模式二
     43             /**
     44              * 流程:
     45              * 1、调用统一下单,取得code_url,生成二维码
     46              * 2、用户扫描二维码,进行支付
     47              * 3、支付完成之后,微信服务器会通知支付成功
     48              * 4、在支付成功通知中需要查单确认是否真正支付成功(见:notify.php)
     49              */
     50             import('wxpay.lib.WxPayData',EXTEND_PATH);
     51 
     52             $input = new WxPayUnifiedOrder();
     53             $input->SetBody("购物");
     54             $input->SetAttach("test1");
     55             $input->SetOut_trade_no($out_trade_no);
     56             $input->SetTotal_fee($needPay * 100);//以分为单位
     57             $input->SetTime_start(date("YmdHis"));
     58             $input->SetTime_expire(date("YmdHis", time() + 600));
     59             $input->SetGoods_tag("test");
     60             $input->SetNotify_url("http://www.shopdemo.com/home/weixinpays/notify");
     61             $input->SetTrade_type("NATIVE");
     62             $input->SetProduct_id("123456789");
     63             $notify = new NativePay();
     64             $result = $notify->GetPayUrl($input);
     66             $url2 = $result["code_url"]; 70             $this->assign('url',$url2);
     71             $this->assign('out_trade_no',$out_trade_no);
     72             return $this->fetch('testpay');
     73         }
     74         return "失效";
     75         $this->fetch('testpay');
     76     }
     77     /*生成微信支付二维码二*/
     78     public function Qrcode(){
     79         $URl1=input("data");
     80         $url = base64_decode($URl1);
     81         $QRcode = new QRcode();
     82         ob_end_clean();
     83         $QRcode->png($url);
     84 
     85     }
     86     //订单查询结果
     87     public function orderstate()
     88     {
     89         error_reporting(E_ERROR);
     90      if(isset($_REQUEST["out_trade_no"]) && $_REQUEST["out_trade_no"] != ""){
     91             $out_trade_no = $_REQUEST["out_trade_no"];
     92             $input = new WxPayOrderQuery();
     93             $input->SetOut_trade_no($out_trade_no);
     94             echo json_encode(WxPayApi::orderQuery($input));
     95             exit();
     96         }
     97     }
     98     // 回调页面
     99     public function notify()
    100     {
    101         $xml = file_get_contents('php://input');
    102         $notify = new PayNotifyCallBack();
    103         $notify->Handle(false);
    104         $result = $notify->GetValues();    //数组
    105         $WxPayResults = new WxPayResults();
    106         $dataTarr = $WxPayResults::Init($xml);//返回数据转换为数组
    107         //打印日志
    108         Log::write('-------微信支付------', 'notice');
    109         Log::write($dataTarr, 'notice');
    110         if ($result['return_code'] == 'SUCCESS') {
    111             // 订单支付完成,修改订单状态,发货。
    112             $data = array();
    113             $data["needPay"] = 0;
    114             $data["isPay"] = 1;
    115             $data["orderStatus"] = 0;
    116             $data["payFrom"] = 2;
    117             $out_trade_no = $dataTarr['out_trade_no'];
    118             $res = Db::name('orders')->where(['orderunique' => "$out_trade_no"])->update($data);
    119             if ($res) {
    120                 echo "SUCCESS";
    121             } else {
    122                 echo "FAIL";
    123             }
    124         } else {
    125             echo "FAIL";
    126         }
    127     }

    4)前端代码

     1 <html>
     2 <head>
     3     <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
     4     <meta name="viewport" content="width=device-width, initial-scale=1" />
     5     <title>微信支付样例-退款</title>
     6 </head>
     7 <body>
     8 <div style="margin-left: 10px;color:#556B2F;font-size:30px;font-weight: bolder;">扫描支付模式二</div><br/>
     9 <input type="hidden" id="out_trade_no" value="{$out_trade_no}" >
    10 <img id='img' alt="模式二扫码支付" src="{:url('Weixinpays/Qrcode','data='.base64_encode($url))}" style="150px;height:150px;"/>
    11 </body>
    12 <script src="__STYLE__/js/jquery-3.2.1.min.js?v={$v}"></script>
    13 <script type="text/javascript" src="__STATIC__/plugins/layer/layer.js?v={$v}"></script>
    14 <script type="text/javascript" src="__STATIC__/plugins/layer/skin/layer.css?v={$v}"></script>
    15 <script type="text/javascript">
    16     // 检测是否支付成功
    17     $(document).ready(function () {
    18         check();
    19       //每三秒请求一次
    20         setInterval("check()", 3000);
    21     });
    22     function check() {
    23         var url = "{:url('/home/Weixinpays/orderstate')}";
    24         var out_trade_no = $("#out_trade_no").val();
    25         var param = {'out_trade_no':out_trade_no};
    26         $.post(url,param,function(data){
    27             data=data.split("</xml>");
    28             console.log(data[1]);
    29           var  arr = JSON.parse(data[1]);
    30             console.log(arr['trade_state']);
    31             if (arr['trade_state'] == 'SUCCESS') {
    32                 // 支付成功把二维码替换成支付成功图标
    33                 $("#img").attr('src','/upload/goods/2018-06/5b1746d12bdca_thumb.jpg');
    34                 //页面跳转 到成功页面
    35                 layer.msg('支付成功!',{icon:6,skin:'#f0f0f0',shade:0.2});
    36                 window.setTimeout("window.location="+"'{:url('home/users/mallorders')}'",1000);
    37             }else{
    38 
    39             }
    40         });
    41     }
    42 </script>
    43 </html>
  • 相关阅读:
    Oracle EXTRACT()函数与to_char() 函数
    Java内部类
    SQL 之 Group By
    Android LayoutInflater布局填充器
    JS 图片转Base64
    C# 事件与委托的区别
    AngularJS的循环输出
    jquery实现button倒计时
    重新理解B/S和C/S的区别
    HashMap与HashTable
  • 原文地址:https://www.cnblogs.com/zgbcode/p/9179266.html
Copyright © 2020-2023  润新知