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类
Nov 27 PHP
php后台程序与Javascript的两种交互方式
Oct 25 PHP
Search File Contents PHP 搜索目录文本内容的代码
Feb 21 PHP
PHP学习 变量使用总结
Mar 24 PHP
使用php实现下载生成某链接快捷方式的解决方法
May 07 PHP
在windows平台上构建自己的PHP实现方法(仅适用于php5.2)
Jul 05 PHP
yii框架配置默认controller和action示例
Apr 30 PHP
php中使用PHPExcel读写excel(xls)文件的方法
Sep 15 PHP
PHP数据库操作Helper类完整实例
May 11 PHP
php将html转为图片的实现方法
May 19 PHP
如何在PHP中使用数组
Jun 09 PHP
详解PHP用mb_string处理windows中文字符
May 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
支付宝接口开发集成支付环境小结
2015/03/17 PHP
PHP实现微信网页授权开发教程
2016/01/19 PHP
DOM 基本方法
2009/07/18 Javascript
Javascript 网页黑白效果实现代码(兼容IE/FF等)
2010/04/23 Javascript
javascript动态加载三
2012/08/22 Javascript
JQuery中使用.each()遍历元素学习笔记
2014/11/08 Javascript
AngularJS基础知识笔记之表格
2015/05/10 Javascript
JS操作COOKIE实现备忘记录的方法
2016/04/01 Javascript
详解微信小程序设置底部导航栏目方法
2017/06/29 Javascript
移动前端图片压缩上传的实例
2017/12/06 Javascript
vue的token刷新处理的方法
2018/07/17 Javascript
Bootstrap Table实现定时刷新数据的方法
2018/08/13 Javascript
浅谈JavaScript中等号、双等号、 三等号的区别
2020/08/06 Javascript
原生js 实现表单验证功能
2021/02/08 Javascript
python基于urllib实现按照百度音乐分类下载mp3的方法
2015/05/25 Python
pygame加载中文名mp3文件出现error
2017/03/31 Python
Python实现针对中文排序的方法
2017/05/09 Python
解决nohup重定向python输出到文件不成功的问题
2018/05/11 Python
Python爬虫的两套解析方法和四种爬虫实现过程
2018/07/20 Python
Python中函数参数调用方式分析
2018/08/09 Python
在Python函数中输入任意数量参数的实例
2019/07/16 Python
python按行读取文件并找出其中指定字符串
2019/08/08 Python
如何基于Python创建目录文件夹
2019/12/31 Python
pytorch1.0中torch.nn.Conv2d用法详解
2020/01/10 Python
Python图像处理库PIL中图像格式转换的实现
2020/02/26 Python
关于python中的xpath解析定位
2020/03/06 Python
Python调用飞书发送消息的示例
2020/11/10 Python
HTML5新标签兼容——&gt; 的两种方法
2018/09/12 HTML / CSS
国际知名设计师时装商店:Coggles
2016/09/05 全球购物
Tech21美国/加拿大:英国NO.1防摔保护壳品牌
2018/01/20 全球购物
俄罗斯便宜的在线服装商店:GroupPrice
2020/04/10 全球购物
物理教师自荐信范文
2013/12/28 职场文书
业务员薪酬管理制度
2014/01/15 职场文书
超市后勤自我鉴定
2014/01/17 职场文书
2015年数学教研工作总结
2015/07/22 职场文书
webpack的移动端适配方案小结
2021/07/25 Javascript