thinkphp5实现微信扫码支付


Posted in PHP onDecember 23, 2019

本文实例为大家分享了thinkphp5微信扫码支付的具体代码,供大家参考,具体内容如下

配置WxPay.Config.php

thinkphp5实现微信扫码支付

控制器

//微信支付
//参数 订单 价格
 public function wxPay($order_number,$money)
 {
  header("Content-type:text/html;charset=utf-8");
   //require_once VENDOR_PATH.'/alipaymobile/config.php';
  require_once VENDOR_PATH.'/wxpay/WxPay.Api.php';//引入微信支付
  require_once VENDOR_PATH.'/wxpay/WxPay.Notify.php';
  require_once VENDOR_PATH.'/wxpay/phpqrcode/phpqrcode.php';

  $input = new \WxPayUnifiedOrder();//统一下单
  $config = new \WxPayConfig();//配置参数
  $notify = new \QRcode();
  //$paymoney = input('post.paymoney'); //支付金额
  $paymoney = $money; //测试写死
  //$paymoney = 0.01; //测试写死
  //$str = date('Ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);//生成订单号 
  $out_trade_no = $order_number; //商户订单号(自定义)
  $goods_name = '扫码支付'.$paymoney.'元'; //商品名称(自定义)
  $input->SetBody($goods_name);
  $input->SetAttach($goods_name);
  $input->SetOut_trade_no($out_trade_no);
  $input->SetTotal_fee($paymoney*100);//金额乘以100
  $input->SetTime_start(date("YmdHis"));
  $input->SetTime_expire(date("YmdHis", time() + 600));
  $input->SetGoods_tag("test");
  //回调地址 注意能访问
  $input->SetNotify_url("http://www.域名.com/index.php/index/index/wxpaynotifyurl"); //回调地址
  $input->SetTrade_type("NATIVE");
  $input->SetProduct_id('123456789');//商品id
  $result = \WxPayApi::unifiedOrder($config, $input);
  if($result['result_code']=='SUCCESS' && $result['return_code']=='SUCCESS') {
   $url = $result["code_url"];
   $this->assign('money',$paymoney);
   $this->assign('url',$url);
   $this->assign('num',$out_trade_no);
   //映射视图 微信二维码需要自己生成 
   return view("../../../template/wxpay");
  }else{
   $this->error('参数错误'); 
  }
  // return view();

 }

视图 生成二维码 进行扫描付款

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>微信支付页面</title>
<style>
.wxsm{ width:1200px; margin:0 auto; overflow:hidden;}
.wxsmt{ width:100%; height:40px; border-bottom:1px solid #ccc;}
.wxsmt h2{ font-size:14px; line-height:40px; color:#232323; font-weight:400; text-align:center;}
.wxsmc{ width:100%; overflow:hidden;}
.smcr{ overflow:hidden; margin:0 auto; }
.smcr h2{ font-size:14px; font-weight:400; line-height:40px; text-align:center;}
.smcr h2 span{ font-size:20px; color:#f23535;}
.smcrb{ width:100%; overflow:hidden;;}
.smm{ width:218px; height:284px; border:1px solid #3cb035; background:#3cb035; margin:0 auto}
.smm img{ width:218px; height:218px; background:#fff;}
.smm span{ display:block; color:#fff; line-height:66px; text-align:center;}

</style>
<script src="__TEMP__/js/jquery-1.10.1.min.js"></script>

</head>

<body>

<div class="wxsm">
 <div class="wxsmt">
  <h2>订单提交成功,请尽快付款</h2>
 </div>
 <div class="wxsmc">
  <div class="smcr">
   <h2>应付金额:<span>{$money}</span>元</h2>
   <div class="smcrb">
    <div class="smm">
     <img src="/vendor/wxpay/qrcode.php?data=<?php echo urlencode($url);?>"/>
     <span>打开微信,扫描二维码支付</span>
    </div>
   </div>
  </div>
 </div>
</div>

<script> 
 //设置每隔1000毫秒执行一次load() 方法 
 var myIntval=setInterval(function(){loads()},1000); 
 function loads(){ 
  
  var xmlhttp; 
    // 轮询的浏览器设置 
    if (window.XMLHttpRequest){ 
     // code for IE7+, Firefox, Chrome, Opera, Safari 
     xmlhttp=new XMLHttpRequest(); 
    }else{ 
     // code for IE6, IE5 
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    xmlhttp.onreadystatechange=function(){ 
     if (xmlhttp.readyState==4 && xmlhttp.status==200){ 
      trade_state=JSON.parse(xmlhttp.responseText); 
      console.log(trade_state);//打印查看轮询的状态,也可以关闭。
      //判断订单支付状态 并用document.getElementById方法赋值到myDiv中;
      if(trade_state.code=='SUCCESS'){ 
       
       //延迟3000毫秒执行tz() 方法
       clearInterval(myIntval);
       //进行跳转。
        var url = "{:url('index/center')}";
        var http = window.location.protocol;
        var zhu = window.location.host;
        setTimeout("location.href='"+http+"//"+zhu+""+url+"'",1500); 
      }else if(trade_state.code=='REFUND'){ 
       
       clearInterval(myIntval); 
      }else if(trade_state.code=='NOTPAY'){ 
         
      }else if(trade_state.code=='CLOSED'){ 
       
       clearInterval(myIntval);
      }else if(trade_state.code=='REVOKED'){ 
       
       clearInterval(myIntval);
      }else if(trade_state.code=='USERPAYING'){ 
       
      }else if(trade_state.code=='PAYERROR'){ 
       
       clearInterval(myIntval); 
      } 
       
     } 
    } 
  //orderquery.php 文件返回订单状态,通过订单状态确定支付状态 
  xmlhttp.open("POST","/vendor/wxpay/orderquery.php",false); 
  //下面这句话必须有 
  //把标签/值对添加到要发送的头文件。 
  xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); 
  xmlhttp.send("out_trade_no=<?php echo $num;?>"); 
   
 } 
</script>

</body>
</html>

支付回调

public function wxpaynotifyurl()
 {
  //$xml = $GLOBALS['HTTP_RAW_POST_DATA']; //返回的xml
 $xml = file_get_contents("php://input");
 //$results = db('fund') -> where('id',1) -> update(['a'=>$xml]);exit();
  $xmlArr = $this->Init($xml);
  file_put_contents(dirname(__FILE__).'/xml.txt',$xml); //记录日志 支付成功后查看xml.txt文件是否有内容 如果有xml格式文件说明回调成功
  
  $out_trade_no=$xmlArr['out_trade_no']; //订单号
  $total_fee=$xmlArr['total_fee']/100; //回调回来的xml文件中金额是以分为单位的
  $result_code=$xmlArr['result_code']; //状态
  //$result = db('order') -> where(['order' => $out_trade_no]) -> find();
  //if($result['price'] == $total_fee){
   if($result_code=='SUCCESS'){ //数据库操作
    //处理数据库操作 例如修改订单状态 给账户充值等等 
 
    echo 'SUCCESS'; //返回成功给微信端 一定要带上不然微信会一直回调8次
    exit; 
   }else{ //失败
    return false;
    exit;
   }
  
  
 }
 public function Init($xml)
 {
  $array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
  return $array_data;
 }

简单的写了一下 能实现简单的thinkphp5+微信扫码支付的大体流程 若有有问题的地方 还请各位大神指点

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP写的加密函数,支持私人密钥(详细介绍)
Jun 09 PHP
PHP取整函数:ceil,floor,round,intval的区别详细解析
Aug 31 PHP
PHP empty函数报错解决办法
Mar 06 PHP
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
Oct 29 PHP
ThinkPHP采用原生query实现关联查询left join实例
Dec 02 PHP
php从数据库查询结果生成树形列表的方法
Apr 17 PHP
PHP文件上传问题汇总(文件大小检测、大文件上传处理)
Dec 24 PHP
php制作的简单验证码识别代码
Jan 26 PHP
YII CLinkPager分页类扩展增加显示共多少页
Jan 29 PHP
Zend Framework动作助手Json用法实例分析
Mar 05 PHP
PHP封装的MSSql操作类完整实例
May 26 PHP
PHP 验证身份证是否合法的函数
Feb 09 PHP
PHP实现笛卡尔积算法的实例讲解
Dec 22 #PHP
PHP架构及原理知识点详解
Dec 22 #PHP
Laravel 验证码认证学习记录小结
Dec 20 #PHP
php文件上传原理与实现方法详解
Dec 20 #PHP
PHP使用PDO实现mysql防注入功能详解
Dec 20 #PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
Dec 20 #PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
Dec 20 #PHP
You might like
php 短链接算法收集与分析
2011/12/30 PHP
PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等)
2014/04/21 PHP
PHP两种快速排序算法实例
2015/02/15 PHP
PHP正则匹配反斜杠'\'和美元'$'的方法
2017/02/08 PHP
不错的JS中变量相关的细节分析
2007/08/13 Javascript
自己实现string的substring方法 人民币小写转大写,数字反转,正则优化
2012/09/02 Javascript
jQuery事件 delegate()使用方法介绍
2012/10/30 Javascript
JQuery中对Select的option项的添加、删除、取值
2013/08/25 Javascript
JS中类或对象的定义说明
2014/03/10 Javascript
js绘制圆形和矩形的方法
2015/08/05 Javascript
jQuery实现带有动画效果的回到顶部和底部代码
2015/11/04 Javascript
jQuery+Cookie实现切换皮肤功能【附源码下载】
2018/03/25 jQuery
移动端自适应flexible.js的使用方法(不用三大框架,仅写一个单html页面使用)推荐
2019/04/02 Javascript
微信小程序实现页面监听自定义组件的触发事件
2020/11/01 Javascript
python对象及面向对象技术详解
2016/07/19 Python
解决出现Incorrect integer value: '' for column 'id' at row 1的问题
2017/10/29 Python
django的登录注册系统的示例代码
2018/05/14 Python
Python3爬虫教程之利用Python实现发送天气预报邮件
2018/12/16 Python
python如何爬取网站数据并进行数据可视化
2019/07/08 Python
浅谈Python3识别判断图片主要颜色并和颜色库进行对比的方法
2019/10/25 Python
Python 实现将数组/矩阵转换成Image类
2020/01/09 Python
为什么python比较流行
2020/06/19 Python
Prometheus开发中间件Exporter过程详解
2020/11/30 Python
HTML5新特性 多线程(Worker SharedWorker)
2017/04/24 HTML / CSS
Sneaker Studio乌克兰:购买运动鞋
2018/03/26 全球购物
夏洛特和乔治婴儿和儿童时装精品店:Charlotte and George
2018/06/06 全球购物
NFL欧洲商店(德国):NFL Europe Shop DE
2018/11/03 全球购物
iHerb俄罗斯:维生素、补品和天然产品
2020/07/09 全球购物
利达恒信公司.NET笔试题面试题
2016/03/05 面试题
Java中的类包括什么内容?设计时要注意哪些方面
2012/05/23 面试题
2013的个人自我评价
2013/12/26 职场文书
新郎父亲婚宴答谢词
2014/01/11 职场文书
2014学校领导四风对照检查材料思想汇报
2014/09/23 职场文书
幼儿园保育员随笔
2015/08/14 职场文书
工作转正自我鉴定范文
2019/06/21 职场文书
如何用JavaScript实现一个数组惰性求值库
2021/05/05 Javascript