thinkphp3.2支付宝接口类教程

thinkphp3.2.3 成功对接支付宝接口,thinkphp小巧开源的一款框架 博主还是比较看好了 今天需要做个项目 看了下 官方的一些文档 对3.2的支付宝的教程 有点少 本人装个13写一个。
首先登陆支付宝集成接口的地址 下载你需要的文档 

 

https://doc.open.alipay.com/doc2/detail?treeId=62&articleId=103566&docType=1

 

thinkphp3.2支付宝接口类教程_第1张图片

ok下载下来文档 压缩包内 2个文件夹
分别是
MD5签名版本和 RSA签名版本 
本人愚见 web开发用 md5 app 选择RSA签名 所以我们选择 md5签名版本

thinkphp3.2支付宝接口类教程_第2张图片

我是用的create_direct_pay_by_user-PHP-UTF-8 文件夹下的 
ok 下一步 找到你的项目的 ThinkPHP\Library\Vendor\ 下 打开 
新创建文件夹 Alipay 注意大小写 
然后 [code]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");

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'=>'[email protected]',
 //这里是异步通知页面url,提交到项目的Pay控制器的notifyurl方法;
 'notify_url'=>'http://www.liuyuyao.com/Pay/notifyurl', 
 //这里是页面跳转通知url,提交到项目的Pay控制器的returnurl方法;
 'return_url'=>'http://www.liuyuyao.com/Pay/returnurl',
 //支付成功跳转到的页面,我这里跳转到项目的User控制器,myorder方法,并传参payed(已支付列表)
 'successpage'=>'User/myorder?ordtype=payed',   
 //支付失败跳转到的页面,我这里跳转到项目的User控制器,myorder方法,并传参unpay(未支付列表)
 'errorpage'=>'User/myorder?ordtype=unpay', 
 ),

2、新建一个PayController代码如下:位置是你的项目的Controller 下 不懂的自己去看手册 

代码如下

namespace Home\Controller;
use Think\Controller;


class PayController extends Controller {
      //在类初始化方法中,引入相关类库    
       public function _initialize() {
        vendor('Alipay.Corefunction');
        vendor('Alipay.Md5function');
        vendor('Alipay.Notify');
        vendor('Alipay.Submit');
     
    }
    
    //doalipay方法
        /*该方法其实就是将接口文件包下alipayapi.php的内容复制过来
          然后进行相关处理
        */
    public function doalipay(){
        
       /*********************************************************
            把alipayapi.php中复制过来的如下两段代码去掉,
            第一段是引入配置项,
            第二段是引入submit.class.php这个类。
           为什么要去掉??
            第一,配置项的内容已经在项目的Config.php文件中进行了配置,我们只需用C函数进行调用即可;
            第二,这里调用的submit.class.php类库我们已经在PayAction的_initialize()中已经引入;所以这里不再需要;
            *****************************************************/
       // 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;
    }
    
        /******************************
        服务器异步通知页面方法
        其实这里就是将notify_url.php文件中的代码复制过来进行处理
        
        *******************************/
    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";
        }    
    }
    
    /*
        页面跳转处理方法;
        这里其实就是将return_url.php这个文件中的代码复制过来,进行处理; 
        */
    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 "支付失败!";
    }
 }
 }
 ?>
    }

这儿说下 有很多朋友Class 'Home\Controller\AlipaySubmit' not found 发生过以下的错误
执行new方法实例化的时候就报错
Class 'Home\Controller\Alipay' not found
其实这样的 需要在你的 $alipaySubmit = new AlipaySubmit($alipay_config); 等等 new 后面加一个 / 
3、这里有几个支付处理过程中需要用到的函数,我把这些函数写到了项目的Common/common.php中没有的自己创建 当然你也开业写到其他位置



//在线交易订单支付处理函数
 //函数功能:根据支付接口传回的数据判断该订单是否已经支付成功;
 //返回值:如果订单已经成功支付,返回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);
 } 
 /*-----------------------------------
2013.8.13更正
下面这个函数,其实不需要,大家可以把他删掉,
具体看我下面的修正补充部分的说明
------------------------------------*/
 //获取一个随机且唯一的订单号;
 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;
    }
 }

访问 Pay下的doalipay 弹出支付错误 这样基本没有问题了 
因为你的 config里面的签约的一些信息没有正确配置 需要自己申请配置以后 
CREATE TABLE `liuyuao_orderlist` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userid` int(11) DEFAULT NULL,
  `username` varchar(255) DEFAULT NULL,
  `ordid` varchar(255) DEFAULT NULL,
  `ordtime` int(11) DEFAULT NULL,
  `productid` int(11) DEFAULT NULL,
  `ordtitle` varchar(255) DEFAULT NULL,
  `ordbuynum` int(11) DEFAULT '0',
  `ordprice` float(10,2) DEFAULT '0.00',
  `ordfee` float(10,2) DEFAULT '0.00',
  `ordstatus` int(11) DEFAULT '0',
  `payment_type` varchar(255) DEFAULT NULL,
  `payment_trade_no` varchar(255) DEFAULT NULL,
  `payment_trade_status` varchar(255) DEFAULT NULL,
  `payment_notify_id` varchar(255) DEFAULT NULL,
  `payment_notify_time` varchar(255) DEFAULT NULL,
  `payment_buyer_email` varchar(255) DEFAULT NULL,
  `ordcode` varchar(255) DEFAULT NULL,        
  `isused` int(11) DEFAULT '0',
  `usetime` int(11) DEFAULT NULL,
  `checkuser` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)

还差一个订单记录的数据库 
打开你的mysql 运行 sql 记得修改数据库前缀

CREATE TABLE `liuyuao_orderlist` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userid` int(11) DEFAULT NULL,
  `username` varchar(255) DEFAULT NULL,
  `ordid` varchar(255) DEFAULT NULL,
  `ordtime` int(11) DEFAULT NULL,
  `productid` int(11) DEFAULT NULL,
  `ordtitle` varchar(255) DEFAULT NULL,
  `ordbuynum` int(11) DEFAULT '0',
  `ordprice` float(10,2) DEFAULT '0.00',
  `ordfee` float(10,2) DEFAULT '0.00',
  `ordstatus` int(11) DEFAULT '0',
  `payment_type` varchar(255) DEFAULT NULL,
  `payment_trade_no` varchar(255) DEFAULT NULL,
  `payment_trade_status` varchar(255) DEFAULT NULL,
  `payment_notify_id` varchar(255) DEFAULT NULL,
  `payment_notify_time` varchar(255) DEFAULT NULL,
  `payment_buyer_email` varchar(255) DEFAULT NULL,
  `ordcode` varchar(255) DEFAULT NULL,        
  `isused` int(11) DEFAULT '0',
  `usetime` int(11) DEFAULT NULL,
  `checkuser` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)

通过表单 提交处理 搞定 ....后面的就不说了 然后 下载的地址如下
http://www.liuyuyao.com/xd/jzjy/2016-06-04/120.html

你可能感兴趣的:(PHP)