您好,欢迎访问一九零五行业门户网

ThinkPHP实现支付宝接口功能实例

这篇文章主要介绍了thinkphp实现支付宝接口功能的方法,实例讲述了支付宝接口的下载及二次开发方法,以及对应的thinkphp开发技巧,需要的朋友可以参考下
本文实例讲述了thinkphp实现支付宝接口功能的方法。分享给大家供大家参考。具体分析如下:
最近做系统,需要实现在线支付功能,毫不犹豫,选择的是支付宝的接口支付功能,这里我用的是即时到帐的接口,具体实现的步骤如下:
一、下载支付宝接口包
下载地址:https://b.alipay.com/order/productdetail.htm?productid=2012111200373124&tabid=4#ps-tabinfo-hash
具体如何下载,我就不在罗嗦了~~
二、重新整理接口包文件,这一步应该算是比较关键的(个人认为),下载下来的接口包文件有很多语言的源码
我们选择 create_direct_pay_by_user-php-utf-8 这个名称的接口文件,里面包括如下文件:
images文件里是支付宝相关的一些标志的图片,我们暂不管他,lib文件很重要,是整个接口的核心类文件;
alipay.config.php是相关参数的配置文件
alipayapi.php 是支付宝接口入口文件
notify_url.php 是服务器异步通知页面文件;
return_url.php 是页面跳转同步通知文件;
在thinkphp的框架文件下,找到extend 进入,再进入vendor,在vendor文件夹下,新建文件夹alipay,把支付宝作为第三方类库引入,然后,复制支付宝接口文件包中lib文件里的所有文件,一共4个文件,如下:
现在对以上文件进行重命名.
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控制器代码如下
复制代码 代码如下:
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中,这样不用手动调用,即可直接使用这些函数,代码如下:
复制代码 代码如下:
其它类似信息

推荐信息