ThinkPHP框架实现的微信支付接口开发完整示例


Posted in PHP onApril 10, 2019

本文实例讲述了ThinkPHP框架实现的微信支付接口开发。分享给大家供大家参考,具体如下:

微信支付接口开发很简单我们只需要在官方申请权限然后参考官方的文章即可实现支付开发了,下面来看一个简单的例子,具体如下。

最近有个微商城做了微信支付的接口,现在整理一下发上来。

首先是需要有已开通微信支付接口的公众号,这个相信大家都知道,开通之后微信会发一封邮件到你的邮箱,邮件的内容就是开发需要用到的一些接口信息了(包含账号密码之类的东西)。

开发步骤

一、进入公众号平台,先设置几个参数,包括绑定域名、设置回调地址等等。

1、在设置 -> 公众号设置 -> 功能设置 -> 设置JS接口安全域名

 ThinkPHP框架实现的微信支付接口开发完整示例

2、在微信支付 -> 开发配置 -> 配置你的js支付接口,回调地址等等,正式目录和测试目录都可以写上,测试目录需要把个人微信号先添加到白名单才能使用(提醒:用TP框架的小伙伴们在填写支付授权目录时可以这样填写:域名/index.php/控制器/,经测试是可以通过的,微信一样能检测到,之前看到网上有人说这样不行,可能是现在升级了吧,呵呵,还有一个就是域名一定要是已经备过案的才行,如果是在本地进行测试的小伙伴们可以使用花生壳,我不是在打广告,个人觉得还是挺好用的)

 ThinkPHP框架实现的微信支付接口开发完整示例

3、在开发者中心把“网页授权获取用户基本信息”的域名写上自己的域名,微信登陆时需要用到的;

 ThinkPHP框架实现的微信支付接口开发完整示例

二、到上面一大步设置完成后就可以开始我们的开发工作了;

1、用TP的小伙伴们可以用下面的包放到tp的扩展里,也可以自行到官网下载sdk包,具体目录:ThinkPHP\Library\Vendor\,其它就可以不用管啦;

2、打开包里的WxPayPubConfig.php文件,填写上你的微信支付的接口信息就好啦;

三、上面二大步都是配置,这一步就是写支付类了,其实也没什么的,复制粘贴就好了;

1、新建Wxpay控制器,当然你也可以自己命名,访问的名称要跟你在微信上配置的授权目录一样就好了;点击这里下载Wxpay

2、代码的地方就不多说了,下面直接上代码;

<?php
namespace Home\Controller;
use Think\Controller;
//微信支付类
class WxpayController extends Controller {
  //获取access_token过程中的跳转uri,通过跳转将code传入jsapi支付页面
  public function js_api_call() {
    $order_sn = I('get.order_sn', '');
    if (empty($order_sn)) {
      header('location:'.__ROOT__.'/');
    }
    vendor('Weixinpay.WxPayPubHelper');
    //使用jsapi接口
    $jsApi = new \JsApi_pub();
    //=========步骤1:网页授权获取用户openid============
    //通过code获得openid
    if (!isset($_GET['code'])){
      //触发微信返回code码
      $url = $jsApi->createOauthUrlForCode('域名/Wxpay/js_api_call?order_sn='.$order_sn);
      //$url = $jsApi->createOauthUrlForCode(\WxPayConf_pub::JS_API_CALL_URL);
      Header("Location: $url");
    }else{
      //获取code码,以获取openid
      $code = $_GET['code'];
      $jsApi->setCode($code);
      $openid = $jsApi->getOpenId();
    }
    $res = array(
      'order_sn' => '20150109113322',
      'order_amount' => 255
    );
    //=========步骤2:使用统一支付接口,获取prepay_id============
    //使用统一支付接口
    $unifiedOrder = new \UnifiedOrder_pub();
    //设置统一支付接口参数
    //设置必填参数
    //appid已填,商户无需重复填写
    //mch_id已填,商户无需重复填写
    //noncestr已填,商户无需重复填写
    //spbill_create_ip已填,商户无需重复填写
    //sign已填,商户无需重复填写
    $total_fee = $res['order_amount']*100;
    //$total_fee = 1;
    $body = "订单支付{$res['order_sn']}";
    $unifiedOrder->setParameter("openid", "$openid");//用户标识
    $unifiedOrder->setParameter("body", $body);//商品描述
    //自定义订单号,此处仅作举例
    $out_trade_no = $res['order_sn'];
    $unifiedOrder->setParameter("out_trade_no", $out_trade_no);//商户订单号
    $unifiedOrder->setParameter("total_fee", $total_fee);//总金额
    //$unifiedOrder->setParameter("attach", "order_sn={$res['order_sn']}");//附加数据
    $unifiedOrder->setParameter("notify_url", \WxPayConf_pub::NOTIFY_URL);//通知地址
    $unifiedOrder->setParameter("trade_type", "JSAPI");//交易类型
    //非必填参数,商户可根据实际情况选填
    //$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商户号
    //$unifiedOrder->setParameter("device_info","XXXX");//设备号
    //$unifiedOrder->setParameter("attach","XXXX");//附加数据
    //$unifiedOrder->setParameter("time_start","XXXX");//交易起始时间
    //$unifiedOrder->setParameter("time_expire","XXXX");//交易结束时间
    //$unifiedOrder->setParameter("goods_tag","XXXX");//商品标记
    //$unifiedOrder->setParameter("openid","XXXX");//用户标识
    //$unifiedOrder->setParameter("product_id","XXXX");//商品ID
    $prepay_id = $unifiedOrder->getPrepayId();
    //=========步骤3:使用jsapi调起支付============
    $jsApi->setPrepayId($prepay_id);
    $jsApiParameters = $jsApi->getParameters();
    $wxconf = json_decode($jsApiParameters, true);
    if ($wxconf['package'] == 'prepay_id=') {
      $this->error('当前订单存在异常,不能使用支付');
    }
    $this->assign('res', $res);
    $this->assign('jsApiParameters', $jsApiParameters);
    $this->display('jsapi');
  }
  //异步通知url,商户根据实际开发过程设定
  public function notify_url() {
    vendor('Weixinpay.WxPayPubHelper');
    //使用通用通知接口
    $notify = new \Notify_pub();
    //存储微信的回调
    $xml = $GLOBALS['HTTP_RAW_POST_DATA'];
    $notify->saveData($xml);
    //验证签名,并回应微信。
    //对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,
    //微信会通过一定的策略(如30分钟共8次)定期重新发起通知,
    //尽可能提高通知的成功率,但微信不保证通知最终能成功。
    if($notify->checkSign() == FALSE){
      $notify->setReturnParameter("return_code", "FAIL");//返回状态码
      $notify->setReturnParameter("return_msg", "签名失败");//返回信息
    }else{
      $notify->setReturnParameter("return_code", "SUCCESS");//设置返回码
    }
    $returnXml = $notify->returnXml();
    //==商户根据实际情况设置相应的处理流程,此处仅作举例=======
    //以log文件形式记录回调信息
    //$log_name = "notify_url.log";//log文件路径
    //$this->log_result($log_name, "【接收到的notify通知】:\n".$xml."\n");
    $parameter = $notify->xmlToArray($xml);
    //$this->log_result($log_name, "【接收到的notify通知】:\n".$parameter."\n");
    if($notify->checkSign() == TRUE){
      if ($notify->data["return_code"] == "FAIL") {
        //此处应该更新一下订单状态,商户自行增删操作
        //$this->log_result($log_name, "【通信出错】:\n".$xml."\n");
        //更新订单数据【通信出错】设为无效订单
        echo 'error';
      }
      else if($notify->data["result_code"] == "FAIL"){
        //此处应该更新一下订单状态,商户自行增删操作
        //$this->log_result($log_name, "【业务出错】:\n".$xml."\n");
        //更新订单数据【通信出错】设为无效订单
        echo 'error';
      }
      else{
        //$this->log_result($log_name, "【支付成功】:\n".$xml."\n");
        //我这里用到一个process方法,成功返回数据后处理,返回地数据具体可以参考微信的文档
        if ($this->process($parameter)) {
          //处理成功后输出success,微信就不会再下发请求了
          echo 'success';
        }else {
          //没有处理成功,微信会间隔的发送请求
          echo 'error';
        }
      }
    }
  }
  //订单处理
  private function process($parameter) {
    //此处应该更新一下订单状态,商户自行增删操作
    /*
    * 返回的数据最少有以下几个
    * $parameter = array(
      'out_trade_no' => xxx,//商户订单号
      'total_fee' => XXXX,//支付金额
      'openid' => XXxxx,//付款的用户ID
    );
    */
    return true;
  }
}
?>

四、以上就是微信支付的整个流程了,扫码支付的应该都差不多,我没去弄了,用过的朋友也可以分享下,^_^;来上几张支付的截图

 ThinkPHP框架实现的微信支付接口开发完整示例

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
解析file_get_contents模仿浏览器头(user_agent)获取数据
Jun 27 PHP
ie与session丢失(新窗口cookie丢失)实测及解决方案
Jul 15 PHP
PHP取二进制文件头快速判断文件类型的实现代码
Aug 05 PHP
php采用curl访问域名返回405 method not allowed提示的解决方法
Jun 26 PHP
PHP获取表单所有复选框的值的方法
Aug 28 PHP
PHP使用Pthread实现的多线程操作实例
Nov 14 PHP
PHP基于curl后台远程登录正方教务系统的方法
Oct 14 PHP
php使用ftp实现文件上传与下载功能
Jul 21 PHP
php把字符串指定字符分割成数组的方法
Mar 12 PHP
Centos7 Yum安装PHP7.2流程教程详解
Jul 02 PHP
浅谈thinkphp的nginx配置,以及重写隐藏index.php入口文件方法
Oct 12 PHP
php下的原生ajax请求用法实例分析
Feb 28 PHP
微信公众平台开发教程①获取用户Openid及个人信息图文详解
Apr 10 #PHP
微信公众平台开发教程⑥ 微信开发集成类的使用图文详解
Apr 10 #PHP
微信公众平台开发教程②微信端分享功能图文详解
Apr 10 #PHP
ThinkPHP框架整合微信支付之刷卡模式图文详解
Apr 10 #PHP
laravel配置Redis多个库的实现方法
Apr 10 #PHP
在Ubuntu 18.04上安装PHP 7.3 7.2和7.0的方法
Apr 09 #PHP
微信公众号实现扫码获取微信用户信息(网页授权)
Apr 09 #PHP
You might like
SONY ICF-SW7600的电路分析
2021/03/02 无线电
深入PHP数据缓存的使用说明
2013/05/10 PHP
PHP测试框架PHPUnit组织测试操作示例
2018/05/28 PHP
Add a Formatted Table to a Word Document
2007/06/15 Javascript
jQuery之网页换肤实现代码
2011/04/30 Javascript
jQuery插件bgStretcher.js实现全屏背景特效
2015/06/05 Javascript
javascript+html5实现绘制圆环的方法
2015/07/28 Javascript
js获取url传值的方法
2015/12/18 Javascript
BootStrap modal模态弹窗使用小结
2016/10/26 Javascript
jQuery EasyUI Draggable拖动组件
2017/03/01 Javascript
jQuery插件FusionCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/06 Javascript
vue 添加vux的代码讲解
2017/11/30 Javascript
JS拖拽排序插件Sortable.js用法实例分析
2019/02/20 Javascript
小程序实现分类页
2019/07/12 Javascript
vue实现路由不变的情况下,刷新页面操作示例
2020/02/02 Javascript
详解template标签用法(含vue中的用法总结)
2021/01/12 Vue.js
[01:00:14]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第二场 2月28日
2021/03/11 DOTA
python中Pycharm 输出中文或打印中文乱码现象的解决办法
2017/06/16 Python
Win8.1下安装Python3.6提示0x80240017错误的解决方法
2018/07/31 Python
对Python定时任务的启动和停止方法详解
2019/02/19 Python
Python 使用 attrs 和 cattrs 实现面向对象编程的实践
2019/06/12 Python
python检测服务器端口代码实例
2019/08/31 Python
Python中pyecharts安装及安装失败的解决方法
2020/02/18 Python
基于python SMTP实现自动发送邮件教程解析
2020/06/02 Python
html5+CSS3+JS实现七夕言情功能代码
2017/08/28 HTML / CSS
利用HTML5实现使用按钮控制背景音乐开关
2015/09/21 HTML / CSS
HTML5通过navigator.mediaDevices.getUserMedia调用手机摄像头问题
2020/04/27 HTML / CSS
销售所有的狗狗产品:Dog.com
2016/10/13 全球购物
日语系毕业生推荐信
2013/11/11 职场文书
警察先进个人事迹材料
2014/05/16 职场文书
教师学习三严三实心得体会
2014/10/13 职场文书
战马观后感
2015/06/08 职场文书
大学生干部培训心得体会
2016/01/06 职场文书
pytorch实现线性回归以及多元回归
2021/04/11 Python
CSS3 制作的书本翻页特效
2021/04/13 HTML / CSS
Python 内置函数速查表一览
2021/06/02 Python