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 相关文章推荐
php下获取客户端ip地址的函数
Mar 15 PHP
php重定向的三种方法分享
Feb 22 PHP
php生成shtml类用法实例
Dec 09 PHP
php中使用base HTTP验证的方法
Apr 20 PHP
Yii中CArrayDataProvider和CActiveDataProvider区别实例分析
Mar 02 PHP
PHP中in_array函数使用的问题与解决办法
Sep 11 PHP
PHP AjaxForm提交图片上传并显示图片源码
Nov 29 PHP
php array_reverse 以相反的顺序返回数组实例代码
Apr 11 PHP
php封装db类连接sqlite3数据库的方法实例
Dec 19 PHP
PHP排序算法之冒泡排序(Bubble Sort)实现方法详解
Apr 20 PHP
phpstudy后门rce批量利用脚本的实现
Dec 12 PHP
yii2.0框架多模型操作示例【添加/修改/删除】
Apr 13 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
一个简单的PHP&amp;MYSQL留言板源码
2020/07/19 PHP
php数字游戏 计算24算法
2012/06/10 PHP
ThinkPHP的RBAC(基于角色权限控制)深入解析
2013/06/17 PHP
php set_include_path函数设置 include_path 配置选项
2016/10/30 PHP
php中html_entity_decode实现HTML实体转义
2018/06/13 PHP
jquery Firefox3.5中操作select的问题
2009/07/10 Javascript
使用dynatrace-ajax跟踪JavaScript的性能
2010/04/12 Javascript
js 为label标签和div标签赋值的方法
2013/08/08 Javascript
open 动态修改img的onclick事件示例代码
2013/11/13 Javascript
JS实现动态移动层及拖动浮层关闭的方法
2015/04/30 Javascript
jquery图片倾斜层叠切换特效代码分享
2015/08/27 Javascript
跟我学习javascript的严格模式
2015/11/16 Javascript
详解JavaScript的Date对象(制作简易钟表)
2020/04/07 Javascript
AngularJS实现动态编译添加到dom中的方法
2016/11/04 Javascript
微信小程序网络请求wx.request详解及实例
2017/05/18 Javascript
JavaScript闭包的简单应用
2017/09/01 Javascript
加载 vue 远程代码的组件实例详解
2017/11/20 Javascript
深入了解javascript 数组的sort方法
2018/06/01 Javascript
vue兄弟组件传递数据的实例
2018/09/06 Javascript
vue瀑布流组件实现上拉加载更多
2020/03/10 Javascript
[48:32]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs VG
2018/04/01 DOTA
[53:43]VP vs NewBee Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
python的else子句使用指南
2016/02/27 Python
Python实现在某个数组中查找一个值的算法示例
2018/06/27 Python
python3调用百度翻译API实现实时翻译
2018/08/16 Python
没编程基础可以学python吗
2020/06/17 Python
将时尚融入珠宝:Adornmonde
2019/10/17 全球购物
英国Radley包德国官网:Radley London德国
2019/11/18 全球购物
活动总结报告范文
2014/05/04 职场文书
学生安全责任书模板
2014/07/25 职场文书
物业工程部岗位职责
2015/02/11 职场文书
自主招生推荐信怎么写
2015/03/26 职场文书
催款函怎么写
2015/06/24 职场文书
教师学习十八届五中全会精神心得体会
2016/01/05 职场文书
MySQL中VARCHAR与CHAR格式数据的区别
2021/05/26 MySQL
Python中使用Opencv开发停车位计数器功能
2022/04/04 Python