当前位置:首页 > CMS教程 > Thinkphp > 列表

thinkphp5实现微信扫码支付

发布:smiling 来源: PHP粉丝网  添加日期:2022-02-01 20:21:01 浏览: 评论:0 

这篇文章主要为大家详细介绍了thinkphp5实现微信扫码支付,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

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

配置WxPay.Config.php

控制器

  1. //微信支付 
  2. //参数 订单 价格 
  3.  public function wxPay($order_number,$money
  4.  { 
  5.   header("Content-type:text/html;charset=utf-8"); 
  6.    //require_once VENDOR_PATH.'/alipaymobile/config.php'; 
  7.   require_once VENDOR_PATH.'/wxpay/WxPay.Api.php';//引入微信支付 
  8.   require_once VENDOR_PATH.'/wxpay/WxPay.Notify.php'
  9.   require_once VENDOR_PATH.'/wxpay/phpqrcode/phpqrcode.php'
  10.  
  11.   $input = new \WxPayUnifiedOrder();//统一下单 
  12.   $config = new \WxPayConfig();//配置参数 
  13.   $notify = new \QRcode(); 
  14.   //$paymoney = input('post.paymoney'); //支付金额 
  15.   $paymoney = $money//测试写死 
  16.   //$paymoney = 0.01; //测试写死 
  17.   //$str = date('Ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);//生成订单号  
  18.   $out_trade_no = $order_number//商户订单号(自定义) 
  19.   $goods_name = '扫码支付'.$paymoney.'元'//商品名称(自定义) 
  20.   $input->SetBody($goods_name); 
  21.   $input->SetAttach($goods_name); 
  22.   $input->SetOut_trade_no($out_trade_no); 
  23.   $input->SetTotal_fee($paymoney*100);//金额乘以100 
  24.   $input->SetTime_start(date("YmdHis")); 
  25.   $input->SetTime_expire(date("YmdHis", time() + 600)); 
  26.   $input->SetGoods_tag("test"); 
  27.   //回调地址 注意能访问 
  28.   $input->SetNotify_url("http://www.域名.com/index.php/index/index/wxpaynotifyurl"); //回调地址 
  29.   $input->SetTrade_type("NATIVE"); 
  30.   $input->SetProduct_id('123456789');//商品id 
  31.   $result = \WxPayApi::unifiedOrder($config$input); 
  32.   if($result['result_code']=='SUCCESS' && $result['return_code']=='SUCCESS') { 
  33.    $url = $result["code_url"]; 
  34.    $this->assign('money',$paymoney); 
  35.    $this->assign('url',$url); 
  36.    $this->assign('num',$out_trade_no); 
  37.    //映射视图 微信二维码需要自己生成  
  38.    return view("../../../template/wxpay"); 
  39.   }else
  40.    $this->error('参数错误');  
  41.   } 
  42.   // return view(); 
  43.  
  44.  } 

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

  1. <!doctype html> 
  2. <html> 
  3. <head> 
  4. <meta charset="utf-8"
  5. <title>微信支付页面</title> 
  6. <style> 
  7. .wxsm{ width:1200px; margin:0 auto; overflow:hidden;} 
  8. .wxsmt{ width:100%; height:40px; border-bottom:1px solid #ccc;} 
  9. .wxsmt h2{ font-size:14px; line-height:40px; color:#232323; font-weight:400; text-align:center;} 
  10. .wxsmc{ width:100%; overflow:hidden;} 
  11. .smcr{ overflow:hidden; margin:0 auto; } 
  12. .smcr h2{ font-size:14px; font-weight:400; line-height:40px; text-align:center;} 
  13. .smcr h2 span{ font-size:20px; color:#f23535;} 
  14. .smcrb{ width:100%; overflow:hidden;;} 
  15. .smm{ width:218px; height:284px; border:1px solid #3cb035; background:#3cb035; margin:0 auto} 
  16. .smm img{ width:218px; height:218px; background:#fff;} 
  17. .smm span{ display:block; color:#fff; line-height:66px; text-align:center;} 
  18.  
  19. </style> 
  20. <script src="__TEMP__/js/jquery-1.10.1.min.js"></script> 
  21.  
  22. </head> 
  23.  
  24. <body> 
  25.  
  26. <div class="wxsm"
  27.  <div class="wxsmt"
  28.   <h2>订单提交成功,请尽快付款</h2> 
  29.  </div> 
  30.  <div class="wxsmc"
  31.   <div class="smcr"
  32.    <h2>应付金额:<span>{$money}</span>元</h2> 
  33.    <div class="smcrb"
  34.     <div class="smm"
  35.      <img src="/vendor/wxpay/qrcode.php?data=<?php echo urlencode($url);?>"/> 
  36.      <span>打开微信,扫描二维码支付</span> 
  37.     </div> 
  38.    </div> 
  39.   </div> 
  40.  </div> 
  41. </div> 
  42.  
  43. <script>  
  44.  //设置每隔1000毫秒执行一次load() 方法  
  45.  var myIntval=setInterval(function(){loads()},1000);  
  46.  function loads(){  
  47.     
  48.   var xmlhttp;  
  49.     // 轮询的浏览器设置  
  50.     if (window.XMLHttpRequest){  
  51.      // code for IE7+, Firefox, Chrome, Opera, Safari  
  52.      xmlhttp=new XMLHttpRequest();  
  53.     }else{  
  54.      // code for IE6, IE5  
  55.      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");  
  56.     }  
  57.     xmlhttp.onreadystatechange=function(){  
  58.      if (xmlhttp.readyState==4 && xmlhttp.status==200){  
  59.       trade_state=JSON.parse(xmlhttp.responseText);  
  60.       console.log(trade_state);//打印查看轮询的状态,也可以关闭。 
  61.       //判断订单支付状态 并用document.getElementById方法赋值到myDiv中; 
  62.       if(trade_state.code=='SUCCESS'){  
  63.          
  64.        //延迟3000毫秒执行tz() 方法 
  65.        clearInterval(myIntval); 
  66.        //进行跳转。 
  67.         var url = "{:url('index/center')}"
  68.         var http = window.location.protocol; 
  69.         var zhu = window.location.host; 
  70.         setTimeout("location.href='"+http+"//"+zhu+""+url+"'",1500);  
  71.       }else if(trade_state.code=='REFUND'){  
  72.          
  73.        clearInterval(myIntval);  
  74.       }else if(trade_state.code=='NOTPAY'){  
  75.            
  76.       }else if(trade_state.code=='CLOSED'){  
  77.          
  78.        clearInterval(myIntval); 
  79.       }else if(trade_state.code=='REVOKED'){  
  80.          
  81.        clearInterval(myIntval); 
  82.       }else if(trade_state.code=='USERPAYING'){  
  83.          
  84.       }else if(trade_state.code=='PAYERROR'){  
  85.          
  86.        clearInterval(myIntval);  
  87.       }  
  88.          
  89.      }  
  90.     }  
  91.   //orderquery.php 文件返回订单状态,通过订单状态确定支付状态  
  92.   xmlhttp.open("POST","/vendor/wxpay/orderquery.php",false);  
  93.   //下面这句话必须有  
  94.   //把标签/值对添加到要发送的头文件。  
  95.   xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");  
  96.   xmlhttp.send("out_trade_no=<?php echo $num;?>");  
  97.      
  98.  }  
  99. </script> 
  100.  
  101. </body> 
  102. </html> 

支付回调

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

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

Tags: thinkphp5微信扫码支付

分享到: