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&amp;mysql(六)
Oct 09 PHP
PHP中实现汉字转区位码应用源码实例解析
Jun 14 PHP
PHP连接MongoDB示例代码
Sep 06 PHP
PHP函数分享之curl方式取得数据、模拟登陆、POST数据
Jun 04 PHP
PHP延迟静态绑定示例分享
Jun 22 PHP
PHP查找数值数组中不重复最大和最小的10个数的方法
Apr 20 PHP
PHP扩展框架之Yaf框架的安装与使用
May 18 PHP
Linux平台PHP5.4设置FPM线程数量的方法
Nov 09 PHP
php实现替换手机号中间数字为*号及隐藏IP最后几位的方法
Nov 16 PHP
PHP的mysqli_sqlstate()函数讲解
Jan 23 PHP
PHP hebrev()函数用法讲解
Feb 21 PHP
详细分析PHP7与PHP5区别
Jun 26 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实现框架(一)
2006/10/09 PHP
解析获取优酷视频真实下载地址的PHP源代码
2013/06/26 PHP
smarty中常用方法实例总结
2015/08/07 PHP
PHP浮点数的一个常见问题
2016/03/10 PHP
浅谈php和js中json的编码和解码
2016/10/24 PHP
Thinkphp框架中D方法与M方法的区别
2016/12/23 PHP
详解Yii2高级版引入bootstrap.js的一个办法
2017/03/21 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
window.onload 加载完毕的问题及解决方案(上)
2009/07/09 Javascript
jQuery实现的向下图文信息滚动效果
2015/05/03 Javascript
js实现简洁的滑动门菜单(选项卡)效果代码
2015/09/04 Javascript
在微信小程序中使用vant的方法
2019/06/07 Javascript
微信小程序把百度地图坐标转换成腾讯地图坐标过程详解
2019/07/10 Javascript
ES6使用新特性Proxy实现的数据绑定功能实例
2020/05/11 Javascript
[58:11]守擂赛第二周擂主赛 DeMonsTer vs Leopard
2020/04/28 DOTA
Django中间件工作流程及写法实例代码
2018/02/06 Python
python3爬取各类天气信息
2018/02/24 Python
使用Anaconda3建立虚拟独立的python2.7环境方法
2018/06/11 Python
python使用PIL模块获取图片像素点的方法
2019/01/08 Python
Python实现语音识别和语音合成功能
2019/09/20 Python
Python collections中的双向队列deque简单介绍详解
2019/11/04 Python
关于Flask项目无法使用公网IP访问的解决方式
2019/11/19 Python
python怎么调用自己的函数
2020/07/01 Python
Django model重写save方法及update踩坑详解
2020/07/27 Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
2020/11/20 Python
John Varvatos官方网站:设计师男士时装
2017/02/08 全球购物
MCAKE蛋糕官方网站:一直都是巴黎的味道
2018/02/06 全球购物
师德建设实施方案
2014/03/21 职场文书
应聘销售主管的求职信
2014/04/26 职场文书
党的群众路线教育实践方案
2014/05/11 职场文书
经理任命书模板
2014/06/06 职场文书
2014年连锁店圣诞节活动方案
2014/12/09 职场文书
西柏坡导游词
2015/02/05 职场文书
Pytorch 统计模型参数量的操作 param.numel()
2021/05/13 Python
Python-OpenCV实现图像缺陷检测的实例
2021/06/11 Python
深入浅出讲解Java8函数式编程
2022/01/18 Java/Android