文档章节

Thinkphp 与支付宝接口

webphp
 webphp
发布于 2017/07/26 11:28
字数 1679
阅读 13
收藏 1

今天应项目需求,在开发过程中要开发支付宝接口,如下是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 );

         

    }

© 著作权归作者所有

共有 人打赏支持
webphp
粉丝 1
博文 92
码字总数 92070
作品 0
海淀
程序员
新手指导Thinkphp开发指南

小编于昨日参加朋友婚礼,浑身喜气洋洋。今天给用户带来的是关于thinkphp开发指南的纯技术性的文档,本文档目的很简单: 1、 帮助开发人员掌握thinkphp入门 2、 快速利用thinkphp进行项目开发...

汤圆
2012/12/25
0
1
php开发笔记-windows-linux-thinkphp开发环境搭建

文章来自我的博客:https://www.lwxshow.com/dev/php/thinkphp-configuration-environment.html 使用最新版本的3.1.3版本 php开发笔记-windows-thinkphp开发环境搭建 1.下载ThinkPHP框架 http...

卢卫湘
2013/06/09
0
0
ThinkPHP3.0新特性: 快捷查询

新版增加了快捷查询方式,可以进一步简化查询条件的写法,例如: 一、实现不同字段相同的查询条件 $User = M("User"); // 实例化User对象 $map['name|title'] = 'thinkphp'; // 把查询条件传...

岭南六少
2012/02/27
0
0
ThinkPHP 查询数据 select(findAll) 方法

ThinkPHP 查询数据 ThinkPHP 查询数据主要提供以下几类查询: select:普通查询,同 findAll() 方法 find:取得符合查询条件的一条记录 getBy动态查询:根据某个字段取得符合查询条件的一条记...

WangEven
2012/05/10
0
0
thinkphp_图片上传裁剪功能_已迁移

准备材料 THINKPHP jQuery表单插件 cropper 裁剪插件 思路: 利用THINKPHP上传文件类与图片裁剪类,前台想办法组合参数给后台 那怎么样可以异步提交文件呢 关键就是 jquery表单插件了 后台准...

辣条拌鱼翅
2015/09/25
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Zookeeper总结

Zookeeper的部分概念 什么是zookeeeper? Zookeeper是一个分布式服务的协调中心 zookeeper节点的角色类型? Leader(领导者)、Follower(跟随者)、Observer(观察者) Leader 负责更新系统...

DemonsI
24分钟前
1
0
Redis学习笔记

常用命令 从Docker进入Redis的命令 sudo docker exec -it redis /bin/bash

OSC_fly
25分钟前
0
0
SqlServer查询某个日期的数据

select * from View_ZJMONITORINGCORROSION where ENTERDATE > CONVERT(datetime,DATEADD(day,1,'2017/12/28 14:53:07'))...

笑丶笑
26分钟前
0
0
常用编码规范

Standard characters https://ascii.cl/

yeahlife
28分钟前
0
0
flannel实战

docker swarm mode的出现是个里程碑,官方原生的编排调度看起来都成雏形了,但是swarm mode和容器外部系统的对接、网络性能始终不尽人意,swarm mode下各种开源周边不能使用,感觉swarm mod...

China_OS
30分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部