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远程连接MYSQL数据库非常慢的解决方法
Jul 05 PHP
PHP 时间转换Unix时间戳代码
Jan 22 PHP
基于asp+ajax和数据库驱动的二级联动菜单
May 06 PHP
PHP写杨辉三角实例代码
Jul 17 PHP
如何利用php array_multisort函数 对数据库结果进行复杂排序
Jun 08 PHP
php中的常用魔术方法总结
Aug 02 PHP
PHP 使用redis简单示例分享
Mar 05 PHP
WordPress中Gravatar头像缓存到本地及相关优化的技巧
Dec 19 PHP
Zend Framework生成验证码并实现验证码验证功能(附demo源码下载)
Mar 22 PHP
php实现与python进行socket通信的方法示例
Aug 30 PHP
PHP Class SoapClient not found解决方法
Jan 20 PHP
解决Laravel blade模板转义html标签的问题
Sep 03 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中的观察者模式
2010/03/24 PHP
php cache类代码(php数据缓存类)
2010/04/15 PHP
thinkphp中连接oracle时封装方法无法用的解决办法
2013/06/17 PHP
php正则取img标记中任意属性(正则替换去掉或改变图片img标记中的任意属性)
2013/08/13 PHP
php简单实现多语言切换的方法
2016/05/09 PHP
PHPStrom 新建FTP项目以及在线操作教程
2016/10/16 PHP
ie focus bug 解决方法
2009/09/03 Javascript
window.name代替cookie的实现代码
2010/11/28 Javascript
弹出层之1:JQuery.Boxy (一) 使用介绍
2011/10/06 Javascript
js window.onload 加载多个函数和追加函数详解
2014/01/08 Javascript
javascript复制粘贴与clipboardData的使用
2014/10/16 Javascript
js实现touch移动触屏滑动事件
2015/04/17 Javascript
10个很棒的jQuery代码片段
2015/09/24 Javascript
jQuery代码实现图片墙自动+手动淡入淡出切换效果
2016/05/09 Javascript
百度多文件异步上传控件webuploader基本用法解析
2016/11/07 Javascript
JQuery EasyUI 结合ztrIee的后台页面开发实例
2017/09/01 jQuery
Vue2.0设置全局样式(less/sass和css)
2017/11/18 Javascript
微信小程序实现折叠展开效果
2018/07/19 Javascript
js中数组常用方法总结(推荐)
2019/04/09 Javascript
初学vue出现空格警告的原因及其解决方案
2019/10/31 Javascript
解决vue项目运行npm run serve报错的问题
2020/10/26 Javascript
使用python实现链表操作
2018/01/26 Python
Python cookbook(数据结构与算法)同时对数据做转换和换算处理操作示例
2018/03/23 Python
详解django中url路由配置及渲染方式
2019/02/25 Python
Django利用cookie保存用户登录信息的简单实现方法
2019/05/27 Python
keras实现多GPU或指定GPU的使用介绍
2020/06/17 Python
详解PyQt5中textBrowser显示print语句输出的简单方法
2020/08/07 Python
外国语学院毕业生自荐信
2013/10/28 职场文书
竞职演讲稿范文
2014/01/11 职场文书
韩国商务邀请函
2014/01/14 职场文书
十佳护士获奖感言
2014/02/18 职场文书
一般纳税人申请报告
2015/05/18 职场文书
企业财务管理制度范本
2015/08/04 职场文书
一文带你理解vue创建一个后台管理系统流程(Vue+Element)
2021/05/18 Vue.js
SQL注入详解及防范方法
2021/12/06 MySQL
CSS 实现磨砂玻璃(毛玻璃)效果样式
2023/05/21 HTML / CSS