最新消息: 新版网站上线了!!!

Thinkphp 与支付宝接口

今天应项目需求,在开发过程中要开发支付宝接口,如下是thinkphp的与支付宝接口代码:

首先到支付宝官网下载支付宝接口代码:根据自己的需求选择支付宝接口,下面的为即时到账收款接口

下载地址:http://club.alipay.com/read-htm-tid-9976972.html

下 载完成解压以后。把create_direct_pay_by_user-PHP-UTF-8此文件夹中的lib目录下的四个文件复制到 Thinkphp/Vendor/下。然后创建一个目录Alipay然后粘贴到些文件夹下,也可以根据自己的情况改变文件名在action类中引入就可以

        vendor('Alipay.alipay_core');
        vendor('Alipay.alipay_md5');
        vendor('Alipay.alipay_notify');
        vendor('Alipay.alipay_submit');

1、写支付宝配置文件conf/alipay.config.php/

//支付宝配置参数

        'alipay_config'=>array(

            'partner' =>'XXX',//这里是你在成功申请支付宝接口后获取到的PID;

            'key'=>'XXXX',//这里是你在成功申请支付宝接口后获取到的Key

            'sign_type'=>strtoupper('MD5'),

            'input_charset'=> strtolower('utf-8'),

            'cacert'=> getcwd().'\\cacert.pem',

            'transport'=> 'http',

        ),

        //以上配置项,是从接口包中alipay.config.php 文件中复制过来,进行配置;

        'alipay'   =>array(

            //这里是卖家的支付宝账号,也就是你申请接口时注册的支付宝账号

            'seller_email'=>'你的支付宝帐号',

            //这里是异步通知页面url,提交到项目的Pay控制器的notifyurl方法;

            'notify_url'=>'http://XXX.com/notifyurl',

            //这里是页面跳转通知url,提交到项目的Pay控制器的returnurl方法;

            'return_url'=>'http://XXX.com/returnurl',

            //支付成功跳转到的页面,我这里跳转到项目的User控制器,myorder方法,并传参payed(已支付列表)

            'successpage'=>'/Myaccount/topup/?ordtype=payed',

            //支付失败跳转到的页面,我这里跳转到项目的User控制器,myorder方法,并传参unpay(未支付列表)

            'errorpage'=>'XXx.com/XX/Xx?ordtype=unpay',

        )

配置成功以后。下一步写一个下单html页面,然后点击跳转到

在此Action中的顶部或在入口文件中一定要写字符集;否则会出现签名不正确:

header("Content-type:text/html;charset=utf-8");我在此纠结了好长时间

    public function doalipay(){

     

        /*********************************************************

        第一段是引入配置项,

        第二段是引入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');

        $AlipaySubmit = new AlipaySubmit();

     

        //生成订单号

        $pay_id = $alipay_config['partner'];

        //生成订单号

        $trade_no = '生成一个唯一订单号';

        /**************************请求参数**************************/

        $payment_type ="1"; //支付类型 //必填,不能修改

        $notify_url   =C('alipay.notify_url'); //服务器异步通知页面路径

        $return_url   =C('alipay.return_url'); //页面跳转同步通知页面路径

        $seller_email =C('alipay.seller_email');//卖家支付宝帐户必填

        $out_trade_no =$trade_no;//商户订单号 通过支付页面的表单进行传递,注意要唯一!

        $total_fee    =$this->_post('ordtotal_fee','intval');   //付款金额  //必填 通过支付页面的表单进行传递

        $subject      ='订单名称’;  //订单名称 //必填 通过支付页面的表单进行传递

        $body         ='订单描述';//订单描述 通过支付页面的表单进行传递

        $anti_phishing_key ="";//防钓鱼时间戳 //若要使用请调用类文件submit中的query_timestamp函数

        $exter_invoke_ip=get_client_ip(); //客户端的IP地址

        /************************************************************/

        //将订单添加到数据库

        $data = array(

                    //此处为你要插入数据库的值

                )

        $insert_state = $this->addOrderData($data);

                //这个是插入数据库的方法(自己根据网站的需求写一个入库的方法就可以)

        if ( !$insert_state ){

            $this->error('添加订单失败');

        }

        //构造要请求的参数数组,无需改动

        $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,

            "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(){

        //这里还是通过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(!$this->checkorderstatus($out_trade_no)){

                    !$this->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(!$this->checkorderstatus($out_trade_no)){

                    $this->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 "支付失败!";

        }

    }

/**

     * 获取订单状态

     * @param unknown_type $ordid

     */

    private function checkorderstatus($ordid){

        $order_M = D('Order');

        $ordstatus=$order_M->getFieldVal( array('ordid'=>$ordid),'ordstatus' );

        if($ordstatus==1){

            return true;

        }else{

            return false;

        }

    }

     

    //处理订单函数

    //更新订单状态,写入订单支付后返回的数据

    private 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;

        $order_M = D('Order');

        $update_ord = $order_M->updateData( array('ordid'=>$ordid),$data );

         

    }

 

转载请注明:谷谷点程序 » Thinkphp 与支付宝接口