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

Posted 北海北......

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 app\\home\\controller;
  3 use think\\Loader;
  4 use think\\Db;
  5 use think\\Log;
  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="width: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>

 

以上是关于thinkphp5.0 微信扫码支付模式二的主要内容,如果未能解决你的问题,请参考以下文章

php微信扫码支付

微信:微信扫码支付调用统一下单接口网站支付 + springmvc

Net MVC微信扫码支付

PHP版本,微信扫码支付native模式二,扫码支付成功,页面静止不动,怎么可以支付回调URL?

c#版在pc端发起微信扫码支付

微信扫码支付模式二无法回调解决方案(转)