下载支付宝接口包    点击这里        提取密码:aryp

整个接口核心类文件

alipay.config.php是相关参数的配置文件
alipayapi.php 是支付宝接口入口文件
notify_url.php 是服务器异步通知页面文件;
return_url.php 是页面跳转同步通知文件;

第一步:

把接口包放到项目中  在ThinkPHP的框架文件下,找到Library进入,再进入Vendor,在Vendor文件夹下,新建文件夹Alipay,把支付宝作为第三方类库引入。然后,复制支付宝接口文件包中上面4个文件。一共4个文件放入项目Alipay中

打开Submit.phpNotify.php把以下两段代码注释掉;

require_once("alipay_core.function.php");
require_once("alipay_md5.function.php");

因为在项目中会通过vendor来引入4个核心文件,所以,这里不再需要导入。

第二步:

1、在配置文件中Conf/Config.php文件中对支付宝相关参数进行配置:

'alipay_config'=>array(
        'partner'        => '*****',  //这里是你在成功申请支付宝接口后获取到的PID;
        //收款支付宝账号,一般情况下收款账号就是签约账号
        'seller_id'    => '*****', 
        //安全检验码,以数字和字母组成的32位字符
        'key'            => '***',    //这里是你在成功申请支付宝接口后获取到的Key
        //签名方式 不需修改
        //这里是异步通知页面url,提交到项目的Pay控制器的notifyurl方法;
        'notify_url'=>'http://update.my/index.php/Home/Pay/notifyurl.html',
        //这里是页面跳转通知url,提交到项目的Pay控制器的returnurl方法;
        'return_url'=>'http://update.my/index.php/Home/Pay/returnurl.html',
        'sign_type'    => strtoupper('MD5'),
        //字符编码格式 目前支持 gbk 或 utf-8
        'input_charset'=> strtolower('utf-8'),
        //ca证书路径地址,用于curl中ssl校验
        //请保证cacert.pem文件在当前文件夹目录中
        'cacert'    => VENDOR_PATH.'Alipay/cacert.pem',
        //访问模式,根据自己的服务器是否支持ssl访问,若支持请选择https;若不支持请选择http
        'transport'    => 'http',
        // 支付类型 ,无需修改
        'payment_type' => "1",
        // 产品类型,无需修改
        'service' => "create_direct_pay_by_user",
        //↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
        // 防钓鱼时间戳  若要使用请调用类文件submit中的query_timestamp函数
        'anti_phishing_key' => "",
        'exter_invoke_ip' => "",
    ),
        
    //以上配置项,是从接口包中alipay.config.php 文件中复制过来,进行配置;
    'alipay' =>array(

//支付成功跳转到的页面,我这里跳转到项目的User控制器,myorder方法,并传参payed(已支付列表)
        'successpage'=>'/index.php/',
        //支付失败跳转到的页面,我这里跳转到项目的User控制器,myorder方法,并传参unpay(未支付列表)
        'errorpage'=>'/index.php/Home/Test',
    ),

2、新建一个PayController控制器代码如下:

<?php
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');    
     }
    
    
   
        /*该方法其实就是将接口文件包下alipayapi.php的内容复制过来
          然后进行相关处理
        */
    public function doalipay(){
        $alipay_config=C('alipay_config');
        $order_sn = filter_var(I('get.order_sn'),FILTER_SANITIZE_NUMBER_INT);
        if(empty($order_sn)) {
            //$this->redirect('Myorder/index',3,'您提交的订单号无效,请提交正确的订单');
            echo "<script>alert('您提交的订单号无效,请提交正确的订单!');window.location.href='".U('/Home/Pay/index')."';</script>";
            exit();
        } else {
            $order = M()->table('[meeting_order]')->where(array('trade_no'=>$order_sn))->find();  
            if(empty($order)) {
                //$this->redirect('Myorder/index',3,'您提交的订单号未知,请提交正确的订单');
                echo "<script>alert('您提交的订单号未找到,请提交正确的订单!');window.location.href='".U('/Home/Pay/index')."';</script>";
                exit();
            }
            if($order['paystatus'] >0) {
                //$this->redirect('Myorder/index',3,'请不要重复提交订单');
                echo "<script>alert('请不要重复提交订单!');window.location.href='".U('/Home/Pay/index')."';</script>";
                exit();
            }
        }
        
        /**************************请求参数**************************/
        //商户订单号,商户网站订单系统中唯一订单号,必填
        $out_trade_no = $order_sn;
        
        //订单名称,必填
        $subject ='订单'.$order_sn;
        
        //付款金额,必填
        $total_fee =$order['money'];
        //商品描述,可空
        $body = $order['name'];        
        
        //构造要请求的参数数组,无需改动
        $parameter = array(
                "service"       => $alipay_config['service'],
                "partner"       => $alipay_config['partner'],
                "seller_id"  => $alipay_config['seller_id'],
                "payment_type"    => $alipay_config['payment_type'],
                "notify_url"    => $alipay_config['notify_url'],
                "return_url"    => $alipay_config['return_url'],
                "anti_phishing_key"=>$alipay_config['anti_phishing_key'],
                "exter_invoke_ip"=>$alipay_config['exter_invoke_ip'],
                "out_trade_no"    => $out_trade_no,//订单号
                "subject"    => $subject,
                "total_fee"    => $total_fee,
                "body"    => $body,
                "_input_charset"    => trim(strtolower($alipay_config['input_charset']))
                //其他业务参数根据在线开发文档,添加参数.文档地址:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.kiX33I&treeId=62&articleId=103740&docType=1
                //如"参数名"=>"参数值"
        
        );
        
        //var_dump($parameter);exit();
        
        //建立请求
        $alipaySubmit = new \AlipaySubmit($alipay_config);
        $html_text = $alipaySubmit->buildRequestForm($parameter,"post", "确认");
        echo $html_text;
    }

/******************************
        服务器异步通知页面方法
        其实这里就是将notify_url.php文件中的代码复制过来进行处理
        
        *******************************/
    function notifyurl(){
        $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') {  
                     //checkorderstatus($out_trade_no,$total_fee,$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,$total_fee,$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、上面有函数调用checkorderstatus函数判断订单是否支付,把这个函数写到了项目的Common/functions.php

//在线交易订单支付处理函数
    //函数功能:根据支付接口传回的数据判断该订单是否已经支付成功;
    //返回值:如果订单已经成功支付,返回true,否则返回false;
    function checkorderstatus($ordid,$total_fee,$parameter){
        $order = M()->table('[meeting_order]')->where(array('trade_no'=>$ordid))->find();
        if($order['cost']==$total_fee){
            if($order['paystatus']==0){
                $rs=M()->table('[meeting_order]')->where(array('trade_no'=>$ordid))->save(array('paystatus'=>1));
                if($rs){
                    if($order['status']==1){
                        $data['status']=2;
                        $data['addtime']=time();
                        $ordstatus=M()->table('[meeting_order]')->where(array('trade_no'=>$ordid))->save($data);
                        if($ordstatus){
                            return true;
                        }
                        else{
                            return false;
                        }
                    }
                    else{
                        return false;
                    }
                }
                else{
                    return false;
                }
            }
            else{
                return  false;
            }
        }
    }

以上就是pc支付宝接口所有代码,其他业务逻辑根据自己需求进行修改!

四、总结几点
1、接口包中的文件复制到Vendor后,要符合TP规范的命名规则,为的是调用方便,当然你要改成其他名称也可以;
2、把执行支付操作(doalipay),处理异步返回结果(notifyurl),处理跳转返回结果(returnurl)三个支付接口的核心页面写到一个PayAction控制器中。
3、提交支付的页面中,可以在提交之前先把一些参数要传递的内容先通过隐藏域的方法组合好,比如金额先计算好,订单名称,订单描述等先用字符串组合好。然后提交表单,这样,在doalipay方法中只要直接构造传递参数,直接进行提交就行过了。
4、支付返回后的处理因为要在异步和跳转两个方法中都要进行相应的判断和处理,所以,把这些判断和处理写到一个自定义函数中,这样只要调用函数即可,使得代码更加清晰明了。
5、notify_url和return_url两种模式的返回url必须使用http://xxxxxxx这样的绝对路径,因为里是从支付宝平台返回到你的项目页面。不能使用相对路径。本地可以自己配置站点域名

thinkphp3.2接入支付宝支付接口(PC端)的更多相关文章

  1. 前端:微信支付和支付宝支付在pc端和h5页面中的应用

    1:h5微信支付 使用的是https://pay.weixin.qq.com/wiki/doc/api/index.html  中的 (1):公司需要首先要配置公众号微信支付地址和测试白名单(支付的时 ...

  2. 25-javaweb接入支付宝支付接口

    想熟悉支付宝接口支付,后面可能会用,不如在课设中试试手.好吧听说支付宝不微信支付要简单些,就拿支付宝的先练下手吧. 基本学习流程,百度一下,找篇博客看下. 推荐下面这个篇博客,讲的挺好的,复制过来. ...

  3. python调用支付宝支付接口

    python调用支付宝支付接口详细示例—附带Django demo代码   项目演示: 一.输入金额 二.跳转到支付宝付款 三.支付成功 四.跳转回自己网站 在使用支付宝接口的前期准备: 1.支付宝公 ...

  4. python调用支付宝支付接口详细示例—附带Django demo代码

    项目演示: 一.输入金额 二.跳转到支付宝付款 三.支付成功 四.跳转回自己网站 在使用支付宝接口的前期准备: 1.支付宝公钥 2.应用公钥 3.应用私钥 4.APPID 5.Django 1.11. ...

  5. 客服端与服务端APP支付宝支付接口联调的那些坑

    根据支付宝官方提供的文档的建议: TIPS:这一步应在商户服务端完成,商户服务端直接将组装和签名后的请求串orderString传给客户端,客户端直接传给SDK发起请求.文档和Demo是为了示例效果在 ...

  6. thinkphp5.0 微信公众号接入支付宝支付

    ---恢复内容开始--- 真是无力吐槽这个需求了,想骂客户,好端端的非要在微信公众号接入支付宝,都知道微信公众号是拒绝支付宝的,屏蔽了支付宝,所以在微信公众号接入支付宝的话就必须手动复制链接跳出微信内 ...

  7. php 微信公众号接入支付宝支付

    真是无力吐槽这个需求了,好端端的非要在微信公众号接入支付宝,都知道微信公众号是拒绝支付宝的,屏蔽了支付宝,所以在微信公众号接入支付宝的话就必须手动复制链接跳出微信内置浏览器,强制性打开web浏览器完成 ...

  8. Android 接入支付宝支付实现

    接上篇android接入微信支付文章,这篇我们带你来接入支付宝支付服务 简介 首先要说明的是个人感觉接入支付宝比微信简单多了,很轻松的,所以同学们不要紧张~ 当然还是老规矩啦,上来肯定的贴上官网地址, ...

  9. Android接入支付宝支付实现

    接上篇android接入微信支付文章,这篇我们带你来接入支付宝支付服务 简介 首先要说明的是个人感觉接入支付宝比微信简单多了,很轻松的,所以同学们不要紧张~ 当然还是老规矩啦,上来肯定的贴上官网地址, ...

随机推荐

  1. lintcode中等难度5道题

    1.整数转罗马数字 对任一个罗马数字可以 由12个罗马字符进行加法操作完成,且大数在左,小数在右,可以将一个数字进行拆分来求解 2.买卖股票的最佳时机 II 可将问题转换为只要相连的两天prices[ ...

  2. 服网LNMP集群 w/ MySQL PaaS-1.0

    平台: arm 类型: ARM 模板 软件包: haproxy linux mysql nginx application server arm basic software fuwang infra ...

  3. OpenSSL context 的几个参数

    NAME SYNOPSIS DESCRIPTION NOTES BUGS RETURN VALUES EXAMPLES SEE ALSO NAME SSL_CTX_set_verify, SSL_se ...

  4. [Git] Create a new repository on the command line

    echo "# xxx" >> README.md git init git add README.md git commit -m "first commi ...

  5. jq实现剪裁图片设置为头像

    有时候我们需要设置为这样,就是将某些图片设置为剪裁成设置的尺寸:就是这样的 插件的地址: http://www.htmleaf.com/jQuery/Image-Effects/20150421171 ...

  6. linux 命令——24 Linux文件类型与扩展名

    Linux文件类型和Linux文件的文件名所代表的意义是两个不同的概念.我们通过一般应用程序而创建的比如file.txt.file.tar.gz ,这些文件虽然要用不同的程序来打开,但放在Linux文 ...

  7. IOS 隐式动画(非Root Layer)

    ● 每一个UIView内部都默认关联着一个CALayer,我们可用称这个Layer为Root Layer(根 层) ● 所有的非Root Layer,也就是手动创建的CALayer对象,都存在着隐式动 ...

  8. 【总结】Oracle sql 中的字符(串)替换与转换

    1.REPLACE 语法:REPLACE(char, search_string,replacement_string) 用法:将char中的字符串search_string全部转换为字符串repla ...

  9. codeforces 600A Extract Numbers

    模拟题,意思是一个字符串,单词直接用','或';'来分割,可以为空,把不含前导0的整数和其他单词分别放入A和B.按照一定格式输出. 没有用stl的习惯.维护两个下标i,j,表示开区间(i,j),两段补 ...

  10. Codeforces Round #324 (Div. 2) A B C D E

    A,水题不多说. #include<bits/stdc++.h> using namespace std; //#define LOCAL int main() { #ifdef LOCA ...