下载支付宝接口包    点击这里        提取密码: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. 索引是否也能提高UPDATE,DELETE,INSERT速度 解释

    insert 不会提高,insert 用不到索引,只会增加维护索引的时间. update ,更新索引列不会提高,少量更新非索引列,会有提高 : 更新索引列,索引要重新维护,更新非索引列,倒是没什么影响 ...

  2. cms-首页搭建

    主页面主要有3个部分构成,头部.主体内容部分.尾部 1.头部: <%@ page language="java" contentType="text/html; c ...

  3. php使用GD库实现图片水印和缩略图——生成图片缩略图

    今天呢,就来学习一下在php中使用PD库来实现对图片水印的文字水印方法,不需要PS哦! 首先,准备素材 (1)准备一张图片 (2)准备一张水印(最好是透明的,即背景是白色底) (3)准备一中字体(在电 ...

  4. Extjs4.1+desktop+SSH2 搭建环境 项目能跑起来

    linux开发感觉可能就是日常办公的时候,用别的软件会有问题,java开发还是没什么区别的,换回window开发: push 它: 每次看到右上那红红的叉,我还以为又出错了: 这个项目用resin,下 ...

  5. C++各大有名科学计算库(转)

    在 C++中,库的地位是非常高的.C++之父 Bjarne Stroustrup先生多次表示了设计库来扩充功能要好过设计更多的语法的言论.现实中,C++的库门类繁多,解决的问题也是极其广泛,库从轻量级 ...

  6. JavaScript中的confirm的用法

    confirm()方法用于显示一个带有指定消息和ok以及取消按钮的对话框confirm(message,ok,cancel); message:表示在弹出框的对话框中现实的文本信息如果用户点击确定按钮 ...

  7. window10启用administrator 和启用组策略编辑器

    1,启用administrator账户 net user administrator /active:yes 2,启用组策略编辑器    新建一个文本文件.把下面代码粘贴进去.修改后缀名为.cmd  ...

  8. java基础面试题:switch语句能否作用在byte上,能否作用在long上,能否作用在String上?

    package com.swift; public class Switch_Test { public static void main(String[] args) { /* * switch语句 ...

  9. 解决ndk编译lua时遇到 undefined reference to '__srget'的问题

    今天用ndk r10d版本编译lua时,遇到几个错误,提示没有找到__srget 没有定义,于是看了国外的大神的解决方法, 是因为ndk在r10c之后的版本已经将getc函数屏蔽了,所以导致编译器找不 ...

  10. 【Django】URL中传递中文的问题

     开发环境:Ubuntu16.04+Django 1.11.9+Python2.7 在开发中,在做查找某些信息这个功能的时候,遇到的一个问题.需要在URL中传递查找的关键字,当关键字为中文的时候,并不 ...