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 相关文章推荐
图形数字验证代码
Oct 09 PHP
一个比较简单的PHP 分页分组类
Dec 10 PHP
简单的php写入数据库类代码分享
Jul 26 PHP
php打造属于自己的MVC框架
Mar 07 PHP
Windows下的PHP安装文件线程安全和非线程安全的区别
Apr 23 PHP
CI框架开发新浪微博登录接口源码完整版
May 28 PHP
php使用百度ping服务代码实例
Jun 19 PHP
php中文字符串截取方法实例总结
Sep 30 PHP
yii2.0之GridView自定义按钮和链接用法
Dec 15 PHP
php获取文件名称和扩展名的方法
Feb 07 PHP
PDO::quote讲解
Jan 29 PHP
PHP+iframe模拟Ajax上传文件功能示例
Jul 02 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 array_search() 函数使用
2010/04/13 PHP
smarty缓存用法分析
2014/12/16 PHP
PHP中include/require/include_once/require_once使用心得
2016/08/28 PHP
phpmailer绑定邮箱的实现方法
2016/12/01 PHP
PHP CodeIgniter分页实例及多条件查询解决方案(推荐)
2017/05/20 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
javascript使用百度地图api和html5特性获取浏览器位置
2014/01/10 Javascript
js在指定位置增加节点函数insertBefore()用法实例
2015/01/12 Javascript
纯js实现重发验证码按钮倒数功能
2015/04/21 Javascript
jquery实现美观的导航菜单鼠标提示特效代码
2015/09/06 Javascript
jQuery Uploadify 上传插件出现Http Error 302 错误的解决办法
2015/12/12 Javascript
使用bootstrap typeahead插件实现输入框自动补全之问题及解决办法
2016/07/07 Javascript
浅谈jQuery hover(over, out)事件函数
2016/12/03 Javascript
原生js实现水平方向无缝滚动
2017/01/10 Javascript
Android中Okhttp3实现上传多张图片同时传递参数
2017/02/18 Javascript
Node.js查找当前目录下文件夹实例代码
2017/03/07 Javascript
在Vue项目中使用snapshot测试的具体使用
2019/04/16 Javascript
解决Layui 表格自适应高度的问题
2019/11/15 Javascript
[01:37]DOTA2超级联赛专访ChuaN 传奇般的电竞之路
2013/06/19 DOTA
用Python抢过年的火车票附源码
2015/12/07 Python
python利用thrift服务读取hbase数据的方法
2018/12/27 Python
python实践项目之监控当前联网状态详情
2019/05/23 Python
python使用socket 先读取长度,在读取报文内容示例
2019/09/26 Python
python爬虫看看虎牙女主播中谁最“顶”步骤详解
2020/12/01 Python
html5+css3之制作header实例与更新
2020/12/21 HTML / CSS
国际礼品店:GiftsnIdeas
2018/05/03 全球购物
《大自然的语言》教学反思
2014/04/08 职场文书
党员演讲稿
2014/09/04 职场文书
2015年元旦标语大全
2014/12/09 职场文书
英语辞职信怎么写
2015/02/28 职场文书
2015年公务员转正工作总结
2015/04/24 职场文书
小学生读书笔记
2015/07/01 职场文书
安全生产奖惩制度
2015/08/06 职场文书
2016年社区“我们的节日·中秋节”活动总结
2016/04/05 职场文书
门面租赁合同范文
2019/08/06 职场文书
mybatis调用sqlserver存储过程返回结果集的方法
2021/05/08 SQL Server