文档章节

Thinkphp 与支付宝接口

webphp
 webphp
发布于 2017/07/26 11:28
字数 1679
阅读 12
收藏 1
点赞 0
评论 0

今天应项目需求,在开发过程中要开发支付宝接口,如下是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
博文 91
码字总数 91650
作品 0
海淀
程序员
ThinkPHP: URL不区分大小写

ThinkPHP 要实现URL全部小写,需要修改配置:/ThinkPHP/Conf/convention.php的参数: URLCASEINSENSITIVE=true 注意如果发现不生效,请检查一下是否开启了debug模式,如果有开启,ThinkPHP默...

swingcoder ⋅ 06/11 ⋅ 0

ThinkPHP 3.2 版本升级了哪些内容

ThinkPHP 3.2 版本升级了哪些内容 ThinkPHP 3.2发布了挺长时间了,这里也总结下这次ThinkPHP 3.2到底发生了哪些变化,方便程序员们进行开发。 前言 ThinkPHP 3.2 基于 ThinkPHP 3.1 的基础上...

thinkyoung ⋅ 2015/10/15 ⋅ 0

ThinkPHP中的三大自动简介

ThinkPHP中的三大自动简介 文章TAG:thinkphp 自动简介 过期已备案域名,注册就能用!终身VIP会员,畅享源码下载织梦精美仿站,火热预定中! 本文较为详细的讲述了ThinkPHP中的三大自动,是非...

thinkyoung ⋅ 2015/10/10 ⋅ 0

XAMPP和ThinkPHP 5.0的安装和验证

工欲善其事必先利其器,对搞开发的攻城狮来讲,其器就是各种开发工具和开发环境,而这些在刚入门的时候由于不熟悉,往往是花费时间和精力最多的地方。记得我上大学那会,自学PHP光安装Apach...

仃虽楠 ⋅ 05/09 ⋅ 0

ThinkPHP 框架SQL注入技术分析

  4月12号,ThinkPHP官方团队发布“ThinkPHP5.0.17&5.1.9版本发布——包含安全更新”通知,提醒用户第一时间更新框架版本,在这次更新中,包含了对由360企业安全集团代码卫士团队报送的一个...

FreeBuf ⋅ 04/28 ⋅ 0

ThinkPHP5配置Nginx实现兼容pathinfo模式访问

ThinkPHP项目,当使用Apache服务器时,Apache服务器本身支持pathinfo模式,ThinkPHP的4种访问模式都没问题;当使用Nginx时,碰到问题,必须使用兼容模式访问。 查找很多文档,归纳原因及解决...

makingdifference ⋅ 05/11 ⋅ 0

PHP学习路线图 最全PHP自学指南

对于广大零基础的PHP自学者,往往不知道如何系统的学习PHP,导致平白浪费了很多时间。本文将为大家带来最详细的php学习路线图,同时还会附上相应的权威教程,让广大PHP自学者少走许多弯路。 ...

W3Cschool小编 ⋅ 04/24 ⋅ 0

thinkphp模型层Model、Logic、Service讲解

thinkphp模型层Model、Logic、Service讲解 时间:2014-08-24 15:54:56 编辑:一切随缘 文章来源:php教程网 已阅读:771 次 js特效源码,就从这里开始 我有疑问【PHP186论坛提问】 jS游戏桌球...

thinkyoung ⋅ 2015/09/01 ⋅ 0

thinkphp四种url访问方式详解

本文实例分析了thinkphp的四种url访问方式。分享给大家供大家参考。具体分析如下: 一、什么是MVC thinkphp的MVC模式非常灵活,即使只有三个中和一个也可以运行。 M -Model 编写model类 对数据...

thinkyoung ⋅ 2015/10/21 ⋅ 0

thinkphp系统常量与自定义常量

thinkphp系统常量与自定义常量 时间 2014-03-03 13:41:14 CSDN博客 原文 http://blog.csdn.net/wuji_1/article/details/20367675 主题 ThinkPHP ----------------------------------------A......

thinkyoung ⋅ 2015/08/27 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

1.01-StringUtils的使用

import org.apache.commons.lang.StringUtils; 一、StringUtils 常用的方法: 1. 判断某一字符串是否为空 , 为空的标准是 str==null 或 str.length()==0 StringUtils.isEmpty(null) ==>tr......

静以修身2025 ⋅ 18分钟前 ⋅ 0

几道Spring 面试题

1、BeanFactory 接口和 ApplicationContext 接口有什么区别? ApplicationContext 接口继承BeanFactory接口 Spring核心工厂是BeanFactory BeanFactory采取延迟加载,第一次getBean时才会初始...

职业搬砖20年 ⋅ 20分钟前 ⋅ 0

包饺子

http://storage.slide.news.sina.com.cn/slidenews/77_ori/2018_24/74766_826131_625489.gif

霜叶情 ⋅ 21分钟前 ⋅ 0

兑吧:从自建HBase迁移到阿里云HBase实战经验

摘要: 业务介绍 兑吧集团包含兑吧网络和推啊网络,兑吧网络是一家致力于帮助互联网企业提升运营效率的用户运营服务平台,提供积分商城和媒体运营服务。推啊网络是一家互动式广告平台,经过多...

猫耳m ⋅ 32分钟前 ⋅ 0

xml解析

方法一: String s_xml1 = "<xml>" + "<head>lalalalal</head>" + "<body>1234</body>" + "</xml>"; try { DocumentBuilderFactory documentBuilderFactory......

GithubXD ⋅ 33分钟前 ⋅ 0

reuse stream

Although Java streams were designed to be operated only once, programmers still ask how to reuse a stream. From a simple web search, we can find many posts with this same issue ......

idoz ⋅ 33分钟前 ⋅ 0

兑吧:从自建HBase迁移到阿里云HBase实战经验

摘要: 业务介绍 兑吧集团包含兑吧网络和推啊网络,兑吧网络是一家致力于帮助互联网企业提升运营效率的用户运营服务平台,提供积分商城和媒体运营服务。推啊网络是一家互动式广告平台,经过多...

阿里云云栖社区 ⋅ 35分钟前 ⋅ 0

从世界杯看国内运动体育社交新能量

2018年世界杯已正式拉开帷幕,一场全世界球迷的狂欢也正式开始。 世界杯影响力:30亿+球迷的狂欢+社交话题 世界杯这个超级IP和对社交网络的引爆让更多的人目光聚焦到国内运动体育社交这个层...

ThinkSNS账号 ⋅ 36分钟前 ⋅ 0

不固定值替换

<?php$arr = 20;$data = str_replace(array(10,20,30,40),array("blue","red","green","yellow"),$arr);print_r($data);...

nsns ⋅ 37分钟前 ⋅ 0

Job for nginx.service failed 错误解决方案

今天刚在centos7上安装了nginx-1.2.11,/etc/init.d/nginx start启动时,出现 Job for nginx.service failed because the control process exited with error code. See "systemctl status n......

河图再现 ⋅ 39分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部