ThinkPHP实现支付宝接口功能

ThinkPHP实现支付宝接口效率

近年做系统,要求贯彻在线支付功用,不假思索,选择的是支付宝的接口开拓功用。这里作者用的是即时到帐的接口,具体落到实处的步骤如下:

 一、下载支付宝接口包

 下载地址:
 

 具体怎么下载,小编就不在罗嗦了~~
 
 二、重新整理接口包文件,这一步应该算是相比较关键的(个人感到)
 下载下来的接口包文件有比相当多语言的源码,
 图片 1
 我们挑选 create_direct_pay_by_user-PHP-UTF-8 这些名号的接口文件。里面包蕴如下文件:
 图片 2
 images文件里是支付宝相关的一些标注的图纸,我们暂不管她,lib文件十分重大,是任何接口的主旨类公事;
 alipay.config.php是有关参数的陈设文件
 alipayapi.php 是支付宝接口入口文件
 notify_url.php 是服务器异步布告页面文件;
 return_url.php 是页面跳转同步文告文件;
 
 在ThinkPHP的框架文件下,找到Extend步入,再踏向Vendor,在Vendor文件夹下,新建文件夹Alipay,把支付宝作为第三方类库引进。然后,复制支付宝接口文件包中lib文件里的全部文件。一共4个文件,如下:

 图片 3
 以往对以上文件实行重命名,
 alipay_core.function.php重命名称为:Corefunction.php;
 alipay_md5.function.php重命名称为:Md5function.php;
 alipay_notify.class.php重命名称叫:Notify.php;
 alipay_submit.class.php重命名称叫:Submit.php;
 
 然后,展开Submit.php文件,把以下代码去掉;require_once("alipay_core.function.php");  require_once("alipay_md5.function.php");同样,张开Notify.php文件,把以下两段代码去掉require_once("alipay_core.function.php");  require_once("alipay_md5.function.php");为何要去掉以上四个文本中的这两段代码,因为在品种中调用接口文件的时候,作者把具备4个基本文件都通过vendor来进行引进。所以,那不再要求导入。
 
 到此,支付宝接口包相关宗旨类库的整理基本到位。未来开端在项目中调用;
 
 三、在类型中调用支付宝接口
 调用分两步:
 1、在配备文件中Conf/Config.php文件中对支付宝相关参数实行陈设://支付宝配置参数  'alipay_config'=>array(         'partner' =>'20********50',   //这里是你在成功申请支付宝接口后获取到的PID;      'key'=>'9t***********ie',//这里是你在成功申请支付宝接口后获取到的Key      'sign_type'=>strtoupper('MD5'),      'input_charset'=> strtolower('utf-8'),      'cacert'=> getcwd().'\cacert.pem',      'transport'=> 'http',        ),       //以上配置项,是从接口包中alipay.config.php 文件中复制过来,进行配置;        'alipay'   =>array(   //这里是卖家的支付宝账号,也就是你申请接口时注册的支付宝账号  'seller_email'=>'pay@xxx.com',    //这里是异步通知页面url,提交到项目的Pay控制器的notifyurl方法;  'notify_url'=>'http://www.xxx.com/Pay/notifyurl',     //这里是页面跳转通知url,提交到项目的Pay控制器的returnurl方法;  'return_url'=>'http://www.xxx.com/Pay/returnurl',    //支付成功跳转到的页面,我这里跳转到项目的User控制器,myorder方法,并传参payed(已支付列表)  'successpage'=>'User/myorder?ordtype=payed',       //支付失败跳转到的页面,我这里跳转到项目的User控制器,myorder方法,并传参unpay(未支付列表)  'errorpage'=>'User/myorder?ordtype=unpay',   ),2、新建一个PayAction调整器代码如下:<?php  class PayAction extends Action{         //在类初始化方法中,引入相关类库             public function _initialize() {          vendor('Alipay.Corefunction');          vendor('Alipay.Md5function');          vendor('Alipay.Notify');          vendor('Alipay.Submit');          }            //doalipay方法                public function doalipay(){                       // require_once("alipay.config.php");         // require_once("lib/alipay_submit.class.php");                  //这里我们通过TP的C函数把配置项参数读出,赋给$alipay_config;         $alipay_config=C('alipay_config');                           $payment_type = "1"; //支付类型 //必填,不能修改          $notify_url = C('alipay.notify_url'); //服务器异步通知页面路径          $return_url = C('alipay.return_url'); //页面跳转同步通知页面路径          $seller_email = C('alipay.seller_email');//卖家支付宝帐户必填          $out_trade_no = $_POST['trade_no'];//商户订单号 通过支付页面的表单进行传递,注意要唯一!          $subject = $_POST['ordsubject'];  //订单名称 //必填 通过支付页面的表单进行传递          $total_fee = $_POST['ordtotal_fee'];   //付款金额  //必填 通过支付页面的表单进行传递          $body = $_POST['ordbody'];  //订单描述 通过支付页面的表单进行传递          $show_url = $_POST['ordshow_url'];  //商品展示地址 通过支付页面的表单进行传递          $anti_phishing_key = "";//防钓鱼时间戳 //若要使用请调用类文件submit中的query_timestamp函数          $exter_invoke_ip = get_client_ip(); //客户端的IP地址                           //构造要请求的参数数组,无需改动      $parameter = array(          "service" => "create_direct_pay_by_user",          "partner" => trim($alipay_config['partner']),          "payment_type"    => $payment_type,          "notify_url"    => $notify_url,          "return_url"    => $return_url,          "seller_email"    => $seller_email,          "out_trade_no"    => $out_trade_no,          "subject"    => $subject,          "total_fee"    => $total_fee,          "body"            => $body,          "show_url"    => $show_url,          "anti_phishing_key"    => $anti_phishing_key,          "exter_invoke_ip"    => $exter_invoke_ip,          "_input_charset"    => trim(strtolower($alipay_config['input_charset']))          );          //建立请求          $alipaySubmit = new AlipaySubmit($alipay_config);          $html_text = $alipaySubmit->buildRequestForm($parameter,"post", "确认");          echo $html_text;      }                        function notifyurl(){                                     //require_once("alipay.config.php");                  //require_once("lib/alipay_notify.class.php");                                    //这里还是通过C函数来读取配置项,赋值给$alipay_config          $alipay_config=C('alipay_config');            //计算得出通知验证结果          $alipayNotify = new AlipayNotify($alipay_config);          $verify_result = $alipayNotify->verifyNotify();            if($verify_result) {                 //验证成功                     //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表             $out_trade_no   = $_POST['out_trade_no'];      //商户订单号             $trade_no       = $_POST['trade_no'];          //支付宝交易号             $trade_status   = $_POST['trade_status'];      //交易状态             $total_fee      = $_POST['total_fee'];         //交易金额             $notify_id      = $_POST['notify_id'];         //通知校验ID。             $notify_time    = $_POST['notify_time'];       //通知的发送时间。格式为yyyy-MM-dd HH:mm:ss。             $buyer_email    = $_POST['buyer_email'];       //买家支付宝帐号;                     $parameter = array(               "out_trade_no"     => $out_trade_no, //商户订单编号;               "trade_no"     => $trade_no,     //支付宝交易号;               "total_fee"     => $total_fee,    //交易金额;               "trade_status"     => $trade_status, //交易状态               "notify_id"     => $notify_id,    //通知校验ID。               "notify_time"   => $notify_time,  //通知的发送时间。               "buyer_email"   => $buyer_email,  //买家支付宝帐号;             );             if($_POST['trade_status'] == 'TRADE_FINISHED') {                         //             }else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {                           if(!checkorderstatus($out_trade_no)){                 orderhandle($parameter);                              //进行订单处理,并传送从支付宝返回的参数;                 }              }                  echo "success";        //请不要修改或删除           }else {                  //验证失败                  echo "fail";          }          }                  function returnurl(){                  //头部的处理跟上面两个方法一样,这里不罗嗦了!          $alipay_config=C('alipay_config');          $alipayNotify = new AlipayNotify($alipay_config);//计算得出通知验证结果          $verify_result = $alipayNotify->verifyReturn();          if($verify_result) {              //验证成功              //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表          $out_trade_no   = $_GET['out_trade_no'];      //商户订单号          $trade_no       = $_GET['trade_no'];          //支付宝交易号          $trade_status   = $_GET['trade_status'];      //交易状态          $total_fee      = $_GET['total_fee'];         //交易金额          $notify_id      = $_GET['notify_id'];         //通知校验ID。          $notify_time    = $_GET['notify_time'];       //通知的发送时间。          $buyer_email    = $_GET['buyer_email'];       //买家支付宝帐号;                        $parameter = array(              "out_trade_no"     => $out_trade_no,      //商户订单编号;              "trade_no"     => $trade_no,          //支付宝交易号;              "total_fee"      => $total_fee,         //交易金额;              "trade_status"     => $trade_status,      //交易状态              "notify_id"      => $notify_id,         //通知校验ID。              "notify_time"    => $notify_time,       //通知的发送时间。              "buyer_email"    => $buyer_email,       //买家支付宝帐号          );            if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {          if(!checkorderstatus($out_trade_no)){               orderhandle($parameter);  //进行订单处理,并传送从支付宝返回的参数;      }          $this->redirect(C('alipay.successpage'));//跳转到配置项中配置的支付成功页面;      }else {          echo "trade_status=".$_GET['trade_status'];          $this->redirect(C('alipay.errorpage'));//跳转到配置项中配置的支付失败页面;      }  }else {      //验证失败      //如要调试,请看alipay_notify.php页面的verifyReturn函数      echo "支付失败!";      }  }  }  ?>3、这里有多少个开采管理进程中供给利用的函数,作者把这个函数写到了项指标Common/common.php中,那样不用手动调用,就可以直接运用这一个函数,代码如下://////////////////////////////////////////////////////  //Orderlist数据表,用于保存用户的购买订单记录;    //在线交易订单支付处理函数  //函数功能:根据支付接口传回的数据判断该订单是否已经支付成功;  //返回值:如果订单已经成功支付,返回true,否则返回false;  function checkorderstatus($ordid){      $Ord=M('Orderlist');      $ordstatus=$Ord->where('ordid='.$ordid)->getField('ordstatus');      if($ordstatus==1){          return true;      }else{          return false;          }  }    //处理订单函数  //更新订单状态,写入订单支付后返回的数据  function orderhandle($parameter){      $ordid=$parameter['out_trade_no'];      $data['payment_trade_no']      =$parameter['trade_no'];      $data['payment_trade_status']  =$parameter['trade_status'];      $data['payment_notify_id']     =$parameter['notify_id'];      $data['payment_notify_time']   =$parameter['notify_time'];      $data['payment_buyer_email']   =$parameter['buyer_email'];      $data['ordstatus']             =1;      $Ord=M('Orderlist');      $Ord->where('ordid='.$ordid)->save($data);  }       //获取一个随机且唯一的订单号;  function getordcode(){      $Ord=M('Orderlist');      $numbers = range (10,99);      shuffle ($numbers);       $code=array_slice($numbers,0,4);       $ordcode=$code[0].$code[1].$code[2].$code[3];      $oldcode=$Ord->where("ordcode='".$ordcode."'")->getField('ordcode');      if($oldcode){          getordcode();      }else{          return $ordcode;      }  }四、总结几点
 1、接口包中lib文件中的文件复制到Vendor后,重命名叫TP规范的命名法则,为的是调用方便,当然你要改成任何名目也足以;
 2、把施行支付操作(doalipay),管理异步再次回到结果(notifyurl),管理跳转再次来到结果(returnurl)多少个开辟接口的宗旨页面写到三个PayAction调整器中。
 3、提交支付的页面中,可以在提交在此之前先把某个参数要传送的剧情先经过遮掩域的方式结合好,举例金额先总括好,订单名称,订单描述等先用字符串组合好。然后提交表单,那样,在doalipay方法中只要间接组织传递参数,间接开始展览付出就行过了。
 4、支付重返后的管理因为要在异步和跳转五个点子中都要进行相应的判别和管理,所以,把那几个判定和管理写到多个自定义函数中,那样只要调用函数就可以,使得代码特别清晰明了。
 5、notify_url和return_url三种方式的归来url必须运用
 
 以上代码在ThinkPHP3.0中平常使用  


本文由金沙澳门官网-www.js333com-金沙js333com发布于金沙澳门官网计算机,转载请注明出处:ThinkPHP实现支付宝接口功能

您可能还会对下面的文章感兴趣: