最近工作原因需要使用支付宝支付,所以总结了下支付宝支付接口如何在thinkphp当中使用。

从官方下载下来的接口文件中有现成的demo,我们要使用的是create_direct_pay_by_user-PHP-UTF-8这个。

其中lib文件目录很重要,是整个支付宝接口的核心类,我们不去更改它,先从外面几个文件开始看起:

alipay.config.php是相关参数的配置文件
alipayapi.php 是支付宝接口入口文件
notify_url.php 是服务器异步通知页面文件;
return_url.php 是页面跳转同步通知文件;

上面的index.php文件为这个demo的入口文件,可以忽略。

好了,文件目录接口就是这个样子,在实际放置在thinkphp框架之内使用之前,我先介绍下这个即时到账接口的整个工作流程,因为只有知道了整个即时到账接口的整个流程然后在防置在thinkphp框架当中也就变得容易很多:

首先呢,当用户访问该demo中的index.php文件时,就等于在调用支付宝接口的开始,实际页面的效果就是跳转到支付宝支付的页面当中,当支付完成之后支付宝会返回支付成功的状态和相应的数据。而返回状态的方式分为两种,跳转返回和异步返回,这两个说白了就是前者通过get传值后者通过post传值,之所以用这两个返回是因为防止用户再支付时发生的一些意外导致支付不能正常进行,最后造成用户损失这样肯定也就是不行的了。当跳转返回失败时候 还可以有异步返回的方式,保证支付状态传递的稳定。当进行返回值传递之后支付宝会按照用户设置的网址来跳转回商户的网址,这里要特别的说一下,这上面说的条转回网址一定要绝对路径形式,因为说白了咱们要实现的跳转是从支付宝跳到咱们自己的网站之中。好了,到此支付宝接口的基本调用流程已经全部说完,下面要做的就是和thinkphp整合:

其次再真正弄之前我先说一下整合到thinkphp的具体思路:首先呢thinkphp是面向对象的,然而支付宝给出的接口却是面向过程的,所以我们要做的就是把面向过程的方法转成面向对象就可以了。ok基本思路已经搞定,下面咱们就开搞:(我这里使用的是thinkphp3.0 其中并没有最新的命名空间用法,所以有使用thinkphp最新框架的朋友记得别忘记命名空间这个东东)

这几个文件的名字要更改一下,至于更改什么名字就是随你们了,因为这些文件要放在Vendor文件夹下,在Vendor文件夹中新建文件夹Alipay,把支付宝作为第三方类库引入。然后,复制支付宝接口文件包中lib文件里的所有文件。一共4个文件,如下:

然后,打开Submit.php文件,把以下代码去掉;

  1. require_once("alipay_core.function.php");
  2. require_once("alipay_md5.function.php");

同样,打开Notify.php文件,把以下两段代码去掉

  1. require_once("alipay_core.function.php");
  2. require_once("alipay_md5.function.php");

这里我解释下为什么要去掉这两句话,因为咱们实现的最终的目的是放在thinkphp框架之中使用,所以当使用支付宝的接口时候使用 vendor来进行引入即可,所以并不需要在进行引入。

下面打开thinkphp的config.php文件 将以下代码复制到里面即可

  1. //支付宝配置参数
  2. 'alipay_config'=>array(
  3. 'partner' =>'PID',   //这里是你在成功申请支付宝接口后获取到的PID;
  4. 'key'=>'Key',//这里是你在成功申请支付宝接口后获取到的Key
  5. 'sign_type'=>strtoupper('MD5'),
  6. 'input_charset'=> strtolower('utf-8'),
  7. 'cacert'=> getcwd().'\\cacert.pem',
  8. 'transport'=> 'http',
  9. ),
  10. //以上配置项,是从接口包中alipay.config.php 文件中复制过来,进行配置;
  11. 'alipay'   =>array(
  12. //这里是卖家的支付宝账号,也就是你申请接口时注册的支付宝账号
  13. 'seller_email'=>'支付宝账号',
  14. //这里是异步通知页面url,提交到项目的支付控制器的notifyurl方法;(记住这里要是外链)
  15. 'notify_url'=>'http://www.xxx.com/支付控制器名/notifyurl',
  16. //这里是页面跳转通知url,提交到项目的支付控制器的returnurl方法;(这里同样是外链)
  17. 'return_url'=>'http://www.xxx.com/支付控制器名/returnurl',
  18. //支付成功跳转到的页面,这里是支持传值
  19. 'successpage'=>'控制器/方法?传值=值',
  20. //支付失败跳转到的页面,
  21. 'errorpage'=>'控制器/方法?传值=值',
  22. ),

新建一个支付控制器我这里就是新建一个PayAction(最新版本的注意不是Action)代码如下:

  1. <?php
  2. class PayAction extends Action{
  3. //在类初始化方法中,引入相关类库
  4. public function _initialize() {
  5. vendor('Alipay.Corefunction');
  6. vendor('Alipay.Md5function');
  7. vendor('Alipay.Notify');
  8. vendor('Alipay.Submit');
  9. }
  10. //doalipay方法
  11. /*该方法其实就是将接口文件包下alipayapi.php的内容复制过来
  12. 然后进行相关处理
  13. */
  14. public function doalipay(){
  15. /*********************************************************
  16. 把alipayapi.php中复制过来的如下两段代码去掉,
  17. 第一段是引入配置项,
  18. 第二段是引入submit.class.php这个类。
  19. 为什么要去掉??
  20. 第一,配置项的内容已经在项目的Config.php文件中进行了配置,我们只需用C函数进行调用即可;
  21. 第二,这里调用的submit.class.php类库我们已经在PayAction的_initialize()中已经引入;所以这里不再需要;
  22. *****************************************************/
  23. // require_once("alipay.config.php");
  24. // require_once("lib/alipay_submit.class.php");
  25. //这里我们通过TP的C函数把配置项参数读出,赋给$alipay_config;
  26. $alipay_config=C('alipay_config');
  27. /**************************请求参数**************************/
  28. $payment_type = "1"; //支付类型 //必填,不能修改
  29. $notify_url = C('alipay.notify_url'); //服务器异步通知页面路径
  30. $return_url = C('alipay.return_url'); //页面跳转同步通知页面路径
  31. $seller_email = C('alipay.seller_email');//卖家支付宝帐户必填
  32. $out_trade_no = $_POST['trade_no'];//商户订单号 通过支付页面的表单进行传递,注意要唯一!
  33. $subject = $_POST['ordsubject'];  //订单名称 //必填 通过支付页面的表单进行传递
  34. $total_fee = $_POST['ordtotal_fee'];   //付款金额  //必填 通过支付页面的表单进行传递
  35. $body = $_POST['ordbody'];  //订单描述 通过支付页面的表单进行传递
  36. $show_url = $_POST['ordshow_url'];  //商品展示地址 通过支付页面的表单进行传递
  37. $anti_phishing_key = "";//防钓鱼时间戳 //若要使用请调用类文件submit中的query_timestamp函数
  38. $exter_invoke_ip = get_client_ip(); //客户端的IP地址
  39. /************************************************************/
  40. //构造要请求的参数数组,无需改动
  41. $parameter = array(
  42. "service" => "create_direct_pay_by_user",
  43. "partner" => trim($alipay_config['partner']),
  44. "payment_type"    => $payment_type,
  45. "notify_url"    => $notify_url,
  46. "return_url"    => $return_url,
  47. "seller_email"    => $seller_email,
  48. "out_trade_no"    => $out_trade_no,
  49. "subject"    => $subject,
  50. "total_fee"    => $total_fee,
  51. "body"            => $body,
  52. "show_url"    => $show_url,
  53. "anti_phishing_key"    => $anti_phishing_key,
  54. "exter_invoke_ip"    => $exter_invoke_ip,
  55. "_input_charset"    => trim(strtolower($alipay_config['input_charset']))
  56. );
  57. //建立请求
  58. $alipaySubmit = new AlipaySubmit($alipay_config);
  59. $html_text = $alipaySubmit->buildRequestForm($parameter,"post", "确认");
  60. echo $html_text;
  61. }
  62. /******************************
  63. 服务器异步通知页面方法
  64. 其实这里就是将notify_url.php文件中的代码复制过来进行处理
  65. *******************************/
  66. function notifyurl(){
  67. //这里还是通过C函数来读取配置项,赋值给$alipay_config
  68. $alipay_config=C('alipay_config');
  69. unset($_POST['_URL_']);   //这里是因为咱们使用的是payinfo模式访问 和官方给定的跳转链接有变化,所以要将跳转链接恢复回去,这里要在实例化之前
  70. //计算得出通知验证结果
  71. $alipayNotify = new AlipayNotify($alipay_config);
  72. $verify_result = $alipayNotify->verifyNotify();
  73. if($verify_result) {
  74. //验证成功
  75. //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
  76. $out_trade_no   = $_POST['out_trade_no'];      //商户订单号
  77. $trade_no       = $_POST['trade_no'];          //支付宝交易号
  78. $trade_status   = $_POST['trade_status'];      //交易状态
  79. $total_fee      = $_POST['total_fee'];         //交易金额
  80. $notify_id      = $_POST['notify_id'];         //通知校验ID。
  81. $notify_time    = $_POST['notify_time'];       //通知的发送时间。格式为yyyy-MM-dd HH:mm:ss。
  82. $buyer_email    = $_POST['buyer_email'];       //买家支付宝帐号;
  83. $parameter = array(
  84. "out_trade_no"     => $out_trade_no, //商户订单编号;
  85. "trade_no"     => $trade_no,     //支付宝交易号;
  86. "total_fee"     => $total_fee,    //交易金额;
  87. "trade_status"     => $trade_status, //交易状态
  88. "notify_id"     => $notify_id,    //通知校验ID。
  89. "notify_time"   => $notify_time,  //通知的发送时间。
  90. "buyer_email"   => $buyer_email,  //买家支付宝帐号;
  91. );
  92. if($_POST['trade_status'] == 'TRADE_FINISHED') {
  93. //
  94. }else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {                           if(!checkorderstatus($out_trade_no)){
  95. orderhandle($parameter);
  96. //进行订单处理,并传送从支付宝返回的参数;
  97. }
  98. }
  99. echo "success";        //请不要修改或删除
  100. }else {
  101. //验证失败
  102. echo "fail";
  103. }
  104. }
  105. /*
  106. 页面跳转处理方法;
  107. 这里其实就是将return_url.php这个文件中的代码复制过来,进行处理;
  108. */
  109. function returnurl(){
  110. //头部的处理跟上面两个方法一样,这里不罗嗦了!
  111. $alipay_config=C('alipay_config');
  112. unset($_GET['_URL_']);   //这里是因为咱们使用的是payinfo模式访问 和官方给定的跳转链接有变化,所以要将跳转链接恢复回去,这里要在实例化之前
  113. $alipayNotify = new AlipayNotify($alipay_config);//计算得出通知验证结果
  114. $verify_result = $alipayNotify->verifyReturn();
  115. if($verify_result) {
  116. //验证成功
  117. //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表
  118. $out_trade_no   = $_GET['out_trade_no'];      //商户订单号
  119. $trade_no       = $_GET['trade_no'];          //支付宝交易号
  120. $trade_status   = $_GET['trade_status'];      //交易状态
  121. $total_fee      = $_GET['total_fee'];         //交易金额
  122. $notify_id      = $_GET['notify_id'];         //通知校验ID。
  123. $notify_time    = $_GET['notify_time'];       //通知的发送时间。
  124. $buyer_email    = $_GET['buyer_email'];       //买家支付宝帐号;
  125. $parameter = array(
  126. "out_trade_no"     => $out_trade_no,      //商户订单编号;
  127. "trade_no"     => $trade_no,          //支付宝交易号;
  128. "total_fee"      => $total_fee,         //交易金额;
  129. "trade_status"     => $trade_status,      //交易状态
  130. "notify_id"      => $notify_id,         //通知校验ID。
  131. "notify_time"    => $notify_time,       //通知的发送时间。
  132. "buyer_email"    => $buyer_email,       //买家支付宝帐号
  133. );
  134. if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
  135. if(!checkorderstatus($out_trade_no)){
  136. orderhandle($parameter);  //进行订单处理,并传送从支付宝返回的参数;
  137. }
  138. $this->redirect(C('alipay.successpage'));//跳转到配置项中配置的支付成功页面;
  139. }else {
  140. echo "trade_status=".$_GET['trade_status'];
  141. $this->redirect(C('alipay.errorpage'));//跳转到配置项中配置的支付失败页面;
  142. }
  143. }else {
  144. //验证失败
  145. //如要调试,请看alipay_notify.php页面的verifyReturn函数
  146. echo "支付失败!";
  147. }
  148. }
  149. }
  150. ?>

我在上面使用了两个处理函数

  1. //函数功能:根据支付接口传回的数据判断该订单是否已经支付成功;
  2. //返回值:如果订单已经成功支付,返回true,否则返回false;
  3. function checkorderstatus($ordid){
  4. //你的业务逻辑
  5. if($ordstatus==1){
  6. return true;
  7. }else{
  8. return false;
  9. }
  10. }
  1. //处理订单函数
  2. //更新订单状态,写入订单支付后返回的数据
  3. function orderhandle($parameter){
  4. //你的业务逻辑
  5. }

thinkphp框架使用支付宝相关推荐

  1. ping php支付,thinkphp框架中引出ping++支付server SDK

    thinkphp框架中引入ping++支付server SDK ping++支付平台整合了支付宝,微信支付,百度钱包,银联支付等主流支付方式.而且其开发文档,也很容易理解和上手,所以想写篇博客,记录下 ...

  2. php接入微信支付,扫码支付和H5支付(非微信浏览器),基于thinkPHP框架 WeChatDeveloper支付类包 踩坑指南

    此文章入选<PHP领域内容榜>第4名 文章介绍 本文主要介绍通过thinkPHP5和第三方支付类包(WeChatDeveloper)实现快速接入微信扫码支付和微信H5手机网站支付(非微信浏 ...

  3. php接入微信JSAPI支付,微信内拉起支付,基于thinkPHP框架 WeChatDeveloper支付类包

    文章:php接入微信支付,扫码支付和H5支付(非微信浏览器),基于thinkPHP框架 WeChatDeveloper支付类包 踩坑指南 文章:php快速接入支付宝即时支付,PC网站支付和手机网站支付 ...

  4. CT多商户个人免签即时到账支付系统源码-thinkphp框架

    介绍: thinkPHP框架第四方多商户个人免签即时到账支付系统源码,免费.开源,无后门风险. 支持监控店员收款信息,使用支付宝微信小号/模拟器挂机免root,避xp框架,不修改支付宝/微信客户端,防 ...

  5. 使用xdebug分析thinkphp框架函数调用图

    开发中需要性能调优,使用xdebug分析thinkphp框架函数调用图. 关于xdebug的安装参考这2篇 NetBeans配置Xdebug 远程调试PHP php扩展xdebug安装以及用kcach ...

  6. 从ThinkPHP框架核心讨论C、E、G、L、T、I、N...等函数

    如果只是从了解怎么用这几函数的角度看,直接看官方发布的文档即可!但是要了解这些函数是怎么被ThinkPHP框架定义调用的,那需要另外一番讨 论了.还好,ThinkPHP官方在源码力做了很好的注释,通过 ...

  7. thinkphp 框架自动加载原理_ThinkPHP5分析Part 1 基本框架流程

    ThinkPHP是一个免费开源的,快速.简单的面向对象的轻量级PHP开发框架,是为了敏捷WEB应用开发和简化企业应用开发而诞生的.ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能 ...

  8. php阿里大于验证码开发,阿里大于验证码发送 (ThinkPhp框架)

    1.登录平台 阿里大于 2.登陆之后我们可以看到资费,使用场景等,在进入正题之前我们需要一些准备工作,首先我们先了解下短信的请求参数,在这里我们需要注意的是sms_param这个参数,在接下来我们申请 ...

  9. ThinkPHP框架搭建网站

    ThinkPHP框架搭建网站 第一步:找网页模板(不会美工,PS,见谅..) 前端页面我找的是一个大学的实验室,这里就不贴了,很普通的那种.后台直接下载的模板,感觉蛮漂亮的,运行后如下图: 第二步:初 ...

最新文章

  1. 给定二叉树先序、中序遍历序列,求后序遍历
  2. 【hdu5285】wyh2000 and pupil
  3. kvm虚拟机命令梳理
  4. java ssl证书_Java安全教程–创建SSL连接和证书的分步指南
  5. 多线程知识梳理(2) - 并发编程的艺术笔记
  6. framebuffer驱动详解3——framebuffer驱动分析(driver和device的配套查找)
  7. 矩阵键盘简易计算机设计报告,矩阵键盘显设计报告..doc
  8. Bootstrap网页模板
  9. 王思聪5亿投资神话破灭?旗下普思资本股权遭冻结,冻结期3年
  10. 快速利用第三方平台SDK,实现点对点语音通话
  11. 市面常见存储卡的读写速度对比测试
  12. 算法导论—分治策略(C语言)
  13. uniapp全局修改字体
  14. 2022学术道德与学术规范教育【研究生】SPOC课程答案
  15. vue实践学习——keep-alive属性及生命周期
  16. Ubuntu卸载firefox浏览器安装google浏览器
  17. android 隐私文件夹,秘密文件夹 – 隐私保护,隐藏文件夹和文件
  18. TM1650代码记录(基于51单片机)
  19. PV + MPPT +均匀辐射
  20. Microsoft 365 E5开发者账号25T存储空间免费领取教程

热门文章

  1. 支付宝生活号获取uid踩坑实践
  2. 工作金钥匙——统筹方法
  3. 什么是接口?什么是接口测试?什么是接口自动化测试?
  4. 分类型变量预测连续型变量_SPSS中的Variable数据变量类型介绍,一次性弄清无序分类变量、有序分类变量、 离散型数值变量、连续型数值变量的区别!...
  5. 数据库8-数据库查询
  6. 重温SQL行转列,性能又双叒提升了
  7. Vue3项目 —— Vite / Webpack 批量注册组件
  8. 软件设计师考试笔记-(7)
  9. 基层员工和领导者的区别,悟到这一层,你也会腾飞!
  10. Kali Linux渗透测试实战 1.3 渗透测试的一般化流程_商洛学院司徒荆_新浪博客