购并支付宝功效,ThinkPHP完毕支付宝接口成效实例

2019-05-06 06:44 来源:未知

1.

最近做系统,需要实现在线支付功能,毫不犹豫,选择的是支付宝的接口支付功能。这里我用的是即时到帐的接口,具体实现的步骤如下:
一、下载支付宝接口包
下载地址:

具体如何下载,我就不在罗嗦了~~

本文实例讲述了ThinkPHP实现支付宝接口功能的方法。分享给大家供大家参考。具体分析如下:

图片 1

很多人反映,用支付宝的接口到最后面会出现验证错误。其实,这里需要对接口程序进行一下改造。需要添加几个自定义函数。为了让大家以后避免出现同样的问题,我把我改造好的支付宝接口程序上传了(--> 猛戳这里下载附件)。大家可以下载下来,解压后放到框架的Vendor目录中即可~

最近做系统,需要实现在线支付功能,毫不犹豫,选择的是支付宝的接口支付功能,这里我用的是即时到帐的接口,具体实现的步骤如下:

 

二、重新整理接口包文件,这一步应该算是比较关键的(个人认为)
下载下来的接口包文件有很多语言的源码,
图片 2
我们选择 create_direct_pay_by_user-PHP-UTF-8 这个名称的接口文件。里面包括如下文件:
图片 3
images文件里是支付宝相关的一些标志的图片,我们暂不管他,lib文件很重要,是整个接口的核心类文件;
alipay.config.php是相关参数的配置文件
alipayapi.php 是支付宝接口入口文件
notify_url.php 是服务器异步通知页面文件;
return_url.php 是页面跳转同步通知文件;

一、下载支付宝接口包

打开Submit.php文件,把以下代码去掉;require_once("alipay_core.function.php");require_once("alipay_md5.function.php");

在ThinkPHP的框架文件下,找到Extend 进入,再进入Vendor,在Vendor文件夹下,新建文件夹Alipay,把支付宝作为第三方类库引入。然后,复制支付宝接口文件包中lib文件里的所有文件。一共4个文件,如下:
图片 4
现在对以上文件进行重命名,
alipay_core.function.php重命名为:Corefunction.php;
alipay_md5.function.php重命名为:Md5function.php;
alipay_notify.class.php重命名为:Notify.php;
alipay_submit.class.php重命名为:Submit.php;

下载地址:

同样,打开Notify.php文件,把以下两段代码去掉require_once("alipay_core.function.php");require_once("alipay_md5.function.php");

然后,打开Submit.php文件,把以下代码去掉;

具体如何下载,我就不在罗嗦了~~

2.

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

二、重新整理接口包文件,这一步应该算是比较关键的(个人认为),下载下来的接口包文件有很多语言的源码

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

复制代码

图片 5

'alipay_config'=>array(
  'partner' =>'208****73', //这里是你在成功申请支付宝接口后获取到的PID;
  'key'=>'p3****g48',//这里是你在成功申请支付宝接口后获取到的Key
  'sign_type'=>strtoupper('MD5'),
  'input_charset'=> strtolower('utf-8'),
  'cacert'=> getcwd().'\cacert.pem',
  'transport'=> 'http',
  //这里是卖家的支付宝账号,也就是你申请接口时注册的支付宝账号
  'sign_type'=>'MD5',
),
'alipay' =>array(
  //这里是卖家的支付宝账号,也就是你申请接口时注册的支付宝账号
  'seller_email'=>'123@qq.com',
  //这里是异步通知页面url,提交到项目的Pay控制器的notifyurl方法;
  'notify_url'=>'',
  //这里是页面跳转通知url,提交到项目的Pay控制器的returnurl方法;
  'return_url'=>'',
  //支付成功跳转到的页面,我这里跳转到项目的User控制器,myorder方法,并传参payed(已支付列表)
  'successpage'=>'User/myorder?ordtype=payed',
  //支付失败跳转到的页面,我这里跳转到项目的User控制器,myorder方法,并传参unpay(未支付列表)
  'errorpage'=>'User/myorder?ordtype=unpay',
),

同样,打开Notify.php文件,把以下两段代码去掉

我们选择 create_direct_pay_by_user-PHP-UTF-8 这个名称的接口文件,里面包括如下文件:

02 .PayController  控制器中定义相关方法

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

图片 6

 html:

复制代码

images文件里是支付宝相关的一些标志的图片,我们暂不管他,lib文件很重要,是整个接口的核心类文件;

 <input onkeyup="value=value.replace(/[^d]/g,'') "
onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))"
type="text" datatype="*" placeholder="请输入充值金额" value="" id="pay" name="pay"> 

为什么要去掉以上两个文件中的这两段代码,因为在项目中调用接口文件的时候,我把所有4个核心文件都通过vendor来进行引入。所以,这不再需要导入。

alipay.config.php是相关参数的配置文件

 <div onclick="save();" class="p-btn">确认</div>

到此,支付宝接口包相关核心类库的整理基本完成。现在开始在项目中调用;

alipayapi.php 是支付宝接口入口文件

function save(){

三、在项目中调用支付宝接口
调用分两步:
1、在配置文件中Conf/Config.php文件中对支付宝相关参数进行配置:

notify_url.php 是服务器异步通知页面文件;

。。。。

  1. //支付宝配置参数
  2. 'alipay_config'=>array(
  3.        'partner' =>'20********50',   //这里是你在成功申请支付宝接口后获取到的PID;
  4.     'key'=>'9t***********ie',//这里是你在成功申请支付宝接口后获取到的Key
  5.     'sign_type'=>strtoupper('MD5'),
  6.     'input_charset'=> strtolower('utf-8'),
  7.     'cacert'=> getcwd().'\cacert.pem',
  8.     'transport'=> 'http',
  9.       ),
  10.      //以上配置项,是从接口包中alipay.config.php 文件中复制过来,进行配置;
  11.     
  12. 'alipay'   =>array(
  13.  //这里是卖家的支付宝账号,也就是你申请接口时注册的支付宝账号
  14. 'seller_email'=>'pay@xxx.com',
    1. //这里是异步通知页面url,提交到项目的Pay控制器的notifyurl方法;
  15. 'notify_url'=>'', 
    1. //这里是页面跳转通知url,提交到项目的Pay控制器的returnurl方法;
  16. 'return_url'=>'',
    1. //支付成功跳转到的页面,我这里跳转到项目的User控制器,myorder方法,并传参payed(已支付列表)
  17. 'successpage'=>'User/myorder?ordtype=payed',   
    1. //支付失败跳转到的页面,我这里跳转到项目的User控制器,myorder方法,并传参unpay(未支付列表)
  18. 'errorpage'=>'User/myorder?ordtype=unpay', 
  19. ),

return_url.php 是页面跳转同步通知文件;

$.ajax({
  url:"{:U('User/payorder')}",
  data:{"phone":phone,"pay":pay,"hideuid":hideuid},
  type:'post',
  success:function (data) {
    if(data.success ==1){
      layer.alert(data.message '点击确定前往支付',{icon:6},function () {
        window.location.href = Think.U('Portal/Pay/chongzhi','ordernumber=' data.newnum);
      });
    }
  }
});

复制代码

在ThinkPHP的框架文件下,找到Extend 进入,再进入Vendor,在Vendor文件夹下,新建文件夹Alipay,把支付宝作为第三方类库引入,然后,复制支付宝接口文件包中lib文件里的所有文件,一共4个文件,如下:

}

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

图片 7

UserController:

  1. <?php
  2. class PayAction extends Action{
  3.        //在类初始化方法中,引入相关类库    
  4.        public function _initialize() {
  5.         vendor('Alipay.Corefunction');
  6.         vendor('Alipay.Md5function');
  7.         vendor('Alipay.Notify');
  8.         vendor('Alipay.Submit');    
  9.     }
  10.     
  11.     //doalipay方法
  12.         /*该方法其实就是将接口文件包下alipayapi.php的内容复制过来
  13.           然后进行相关处理
  14.         */
  15.     public function doalipay(){
  16.             /*********************************************************
  17.             把alipayapi.php中复制过来的如下两段代码去掉,
  18.             第一段是引入配置项,
  19.             第二段是引入submit.class.php这个类。
  20.            为什么要去掉??
  21.             第一,配置项的内容已经在项目的Config.php文件中进行了配置,我们只需用C函数进行调用即可;
  22.             第二,这里调用的submit.class.php类库我们已经在PayAction的_initialize()中已经引入;所以这里不再需要;
  23.             *****************************************************/
  24.        // require_once("alipay.config.php");
  25.        // require_once("lib/alipay_submit.class.php");
  26.        
  27.        //这里我们通过TP的C函数把配置项参数读出,赋给$alipay_config;
  28.        $alipay_config=C('alipay_config');  
  29.  
  30.         /**************************请求参数**************************/
    1.         $payment_type = "1"; //支付类型 //必填,不能修改
  31.         $notify_url = C('alipay.notify_url'); //服务器异步通知页面路径
  32.         $return_url = C('alipay.return_url'); //页面跳转同步通知页面路径
  33.         $seller_email = C('alipay.seller_email');//卖家支付宝帐户必填
  34.         $out_trade_no = $_POST['trade_no'];//商户订单号 通过支付页面的表单进行传递,注意要唯一!
  35.         $subject = $_POST['ordsubject'];  //订单名称 //必填 通过支付页面的表单进行传递
  36.         $total_fee = $_POST['ordtotal_fee'];   //付款金额  //必填 通过支付页面的表单进行传递
  37.         $body = $_POST['ordbody'];  //订单描述 通过支付页面的表单进行传递
  38.         $show_url = $_POST['ordshow_url'];  //商品展示地址 通过支付页面的表单进行传递
  39.         $anti_phishing_key = "";//防钓鱼时间戳 //若要使用请调用类文件submit中的query_timestamp函数
  40.         $exter_invoke_ip = get_client_ip(); //客户端的IP地址 
  41.         /************************************************************/
  42.     
  43.         //构造要请求的参数数组,无需改动
  44.     $parameter = array(
  45.         "service" => "create_direct_pay_by_user",
  46.         "partner" => trim($alipay_config['partner']),
  47.         "payment_type"    => $payment_type,
  48.         "notify_url"    => $notify_url,
  49.         "return_url"    => $return_url,
  50.         "seller_email"    => $seller_email,
  51.         "out_trade_no"    => $out_trade_no,
  52.         "subject"    => $subject,
  53.         "total_fee"    => $total_fee,
  54.         "body"            => $body,
  55.         "show_url"    => $show_url,
  56.         "anti_phishing_key"    => $anti_phishing_key,
  57.         "exter_invoke_ip"    => $exter_invoke_ip,
  58.         "_input_charset"    => trim(strtolower($alipay_config['input_charset']))
  59.         );
  60.         //建立请求
  61.         $alipaySubmit = new AlipaySubmit($alipay_config);
  62.         $html_text = $alipaySubmit->buildRequestForm($parameter,"post", "确认");
  63.         echo $html_text;
  64.     }
  65.     
    1.         /******************************
  66.         服务器异步通知页面方法
  67.         其实这里就是将notify_url.php文件中的代码复制过来进行处理
  68.         
  69.         *******************************/
  70.     function notifyurl(){
  71.                 /*
  72.                 同理去掉以下两句代码;
  73.                 */ 
  74.                 //require_once("alipay.config.php");
  75.                 //require_once("lib/alipay_notify.class.php");
  76.                 
  77.                 //这里还是通过C函数来读取配置项,赋值给$alipay_config
  78.         $alipay_config=C('alipay_config');
    1.         //计算得出通知验证结果
  79.         $alipayNotify = new AlipayNotify($alipay_config);
  80.         $verify_result = $alipayNotify->verifyNotify();
    1.         if($verify_result) {
  81.                //验证成功
  82.                    //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
  83.            $out_trade_no   = $_POST['out_trade_no'];      //商户订单号
  84.            $trade_no       = $_POST['trade_no'];          //支付宝交易号
  85.            $trade_status   = $_POST['trade_status'];      //交易状态
  86.            $total_fee      = $_POST['total_fee'];         //交易金额
  87.            $notify_id      = $_POST['notify_id'];         //通知校验ID。
  88.            $notify_time    = $_POST['notify_time'];       //通知的发送时间。格式为yyyy-MM-dd HH:mm:ss。
  89.            $buyer_email    = $_POST['buyer_email'];       //买家支付宝帐号;
  90.                    $parameter = array(
  91.              "out_trade_no"     => $out_trade_no, //商户订单编号;
  92.              "trade_no"     => $trade_no,     //支付宝交易号;
  93.              "total_fee"     => $total_fee,    //交易金额;
  94.              "trade_status"     => $trade_status, //交易状态
  95.              "notify_id"     => $notify_id,    //通知校验ID。
  96.              "notify_time"   => $notify_time,  //通知的发送时间。
  97.              "buyer_email"   => $buyer_email,  //买家支付宝帐号;
  98.            );
  99.            if($_POST['trade_status'] == 'TRADE_FINISHED') {
  100.                        //
  101.            }else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {                           if(!checkorderstatus($out_trade_no)){
  102.                orderhandle($parameter); 
  103.                            //进行订单处理,并传送从支付宝返回的参数;
  104.                }
  105.             }
  106.                 echo "success";        //请不要修改或删除
  107.          }else {
  108.                 //验证失败
  109.                 echo "fail";
  110.         }    
  111.     }
  112.     
  113.     /*
  114.         页面跳转处理方法;
  115.         这里其实就是将return_url.php这个文件中的代码复制过来,进行处理; 
  116.         */
  117.     function returnurl(){
  118.                 //头部的处理跟上面两个方法一样,这里不罗嗦了!
  119.         $alipay_config=C('alipay_config');
  120.         $alipayNotify = new AlipayNotify($alipay_config);//计算得出通知验证结果
  121.         $verify_result = $alipayNotify->verifyReturn();
  122.         if($verify_result) {
  123.             //验证成功
  124.             //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表
  125.         $out_trade_no   = $_GET['out_trade_no'];      //商户订单号
  126.         $trade_no       = $_GET['trade_no'];          //支付宝交易号
  127.         $trade_status   = $_GET['trade_status'];      //交易状态
  128.         $total_fee      = $_GET['total_fee'];         //交易金额
  129.         $notify_id      = $_GET['notify_id'];         //通知校验ID。
  130.         $notify_time    = $_GET['notify_time'];       //通知的发送时间。
  131.         $buyer_email    = $_GET['buyer_email'];       //买家支付宝帐号;
  132.             
  133.         $parameter = array(
  134.             "out_trade_no"     => $out_trade_no,      //商户订单编号;
  135.             "trade_no"     => $trade_no,          //支付宝交易号;
  136.             "total_fee"      => $total_fee,         //交易金额;
  137.             "trade_status"     => $trade_status,      //交易状态
  138.             "notify_id"      => $notify_id,         //通知校验ID。
  139.             "notify_time"    => $notify_time,       //通知的发送时间。
  140.             "buyer_email"    => $buyer_email,       //买家支付宝帐号
  141.         );
  142.         
  143. if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
  144.         if(!checkorderstatus($out_trade_no)){
  145.              orderhandle($parameter);  //进行订单处理,并传送从支付宝返回的参数;
  146.     }
  147.         $this->redirect(C('alipay.successpage'));//跳转到配置项中配置的支付成功页面;
  148.     }else {
  149.         echo "trade_status=".$_GET['trade_status'];
  150.         $this->redirect(C('alipay.errorpage'));//跳转到配置项中配置的支付失败页面;
  151.     }
  152. }else {
  153.     //验证失败
  154.     //如要调试,请看alipay_notify.php页面的verifyReturn函数
  155.     echo "支付失败!";
  156.     }
  157. }
  158. }
  159. ?>

现在对以上文件进行重命名.

payorder 方法:保存订单表数据,返回新增的订单号,使ajax 跳转到chongzhi 页面(在该页面中,点击支付,前往topay 支付)

复制代码

alipay_core.function.php重命名为:Corefunction.php;

PayController:

php thinkphp

alipay_md5.function.php重命名为:Md5function.php;

// 前往支付 啊
图片 8

来源:

alipay_notify.class.php重命名为:Notify.php;

图片 9


alipay_submit.class.php重命名为:Submit.php;

 

然后,打开Submit.php文件,把以下代码去掉;

生成订单号 createOrderNo ,返回 2017052300001  00001 同一天,根据number(即订单数,无论订单下几个参会人) 1即可(同样适用于一个订单下多人参与)

require_once("alipay_core.function.php");

图片 10

require_once("alipay_md5.function.php");同样,打开Notify.php文件,把以下两段代码去掉require_once("alipay_core.function.php");

 

require_once("alipay_md5.function.php");为什么要去掉以上两个文件中的这两段代码,因为在项目中调用接口文件的时候,我把所有4个核心文件都通过vendor来进行引入。所以,这不再需要导入。

 

到此,支付宝接口包相关核心类库的整理基本完成。现在开始在项目中调用;

 锁就是数据库锁,最常见的体现就是事务。查询对象时需要防止同时操作的话也需要加锁

三、在项目中调用支付宝接口

 

调用分两步:

图片 11

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

 

复制代码 代码如下:

 lock                                                                                                      lock

//支付宝配置参数 
 
'alipay_config'=>array( 
       'partner' =>'20********50',   //这里是你在成功申请支付宝接口后获取到的PID; 
    'key'=>'9t***********ie',//这里是你在成功申请支付宝接口后获取到的Key 
    'sign_type'=>strtoupper('MD5'), 
    'input_charset'=> strtolower('utf-8'), 
    'cacert'=> getcwd().'\cacert.pem', 
    'transport'=> 'http', 
      ), 
     //以上配置项,是从接口包中alipay.config.php 文件中复制过来,进行配置; 
     
'alipay'   =>array( 
 //这里是卖家的支付宝账号,也就是你申请接口时注册的支付宝账号 
'seller_email'=>'pay@xxx.com', 
 
//这里是异步通知页面url,提交到项目的Pay控制器的notifyurl方法; 
'notify_url'=>'',  
 
//这里是页面跳转通知url,提交到项目的Pay控制器的returnurl方法; 
'return_url'=>'', 
 
//支付成功跳转到的页面,我这里跳转到项目的User控制器,myorder方法,并传参payed(已支付列表) 
'successpage'=>'User/myorder?ordtype=payed',    
 
//支付失败跳转到的页面,我这里跳转到项目的User控制器,myorder方法,并传参unpay(未支付列表) 
'errorpage'=>'User/myorder?ordtype=unpay',  
),

 

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

 支付宝服务器异步通知页面方法

复制代码 代码如下:

图片 12

<?php 
class PayAction extends Action{ 
       //在类初始化方法中,引入相关类库     
       public function _initialize() { 
        vendor('Alipay.Corefunction'); 
        vendor('Alipay.Md5function'); 
        vendor('Alipay.Notify'); 
        vendor('Alipay.Submit');     
    } 
     
    //doalipay方法 
         
    public function doalipay(){ 
             
       // require_once("alipay.config.php"); 
       // require_once("lib/alipay_submit.class.php"); 
        
       //这里我们通过TP的C函数把配置项参数读出,赋给$alipay_config; 
       $alipay_config=C('alipay_config');   
 
         
 
        $payment_type = "1"; //支付类型 //必填,不能修改 
        $notify_url = C('alipay.notify_url'); //服务器异步通知页面路径 
        $return_url = C('alipay.return_url'); //页面跳转同步通知页面路径 
        $seller_email = C('alipay.seller_email');//卖家支付宝帐户必填 
        $out_trade_no = $_POST['trade_no'];//商户订单号 通过支付页面的表单进行传递,注意要唯一! 
        $subject = $_POST['ordsubject'];  //订单名称 //必填 通过支付页面的表单进行传递 
        $total_fee = $_POST['ordtotal_fee'];   //付款金额  //必填 通过支付页面的表单进行传递 
        $body = $_POST['ordbody'];  //订单描述 通过支付页面的表单进行传递 
        $show_url = $_POST['ordshow_url'];  //商品展示地址 通过支付页面的表单进行传递 
        $anti_phishing_key = "";//防钓鱼时间戳 //若要使用请调用类文件submit中的query_timestamp函数 
        $exter_invoke_ip = get_client_ip(); //客户端的IP地址  
     
        //构造要请求的参数数组,无需改动 
    $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, 
        "show_url"    => $show_url, 
        "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; 
    } 
         
    function notifyurl(){ 
                  
                //require_once("alipay.config.php"); 
                //require_once("lib/alipay_notify.class.php"); 
                 
                //这里还是通过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(!checkorderstatus($out_trade_no)){ 
               orderhandle($parameter);  
                           //进行订单处理,并传送从支付宝返回的参数; 
               } 
            } 
                echo "success";        //请不要修改或删除 
         }else { 
                //验证失败 
                echo "fail"; 
        }     
    } 
     
    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)){ 
             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 "支付失败!"; 
    } 


?>

 

3、这里有几个支付处理过程中需要用到的函数,我把这些函数写到了项目的Common/common.php中,这样不用手动调用,即可直接使用这些函数,代码如下:

 (同步接口)支付成功后 跳转回该页面

复制代码 代码如下:

图片 13

//Orderlist数据表,用于保存用户的购买订单记录; 
 
//在线交易订单支付处理函数 
//函数功能:根据支付接口传回的数据判断该订单是否已经支付成功; 
//返回值:如果订单已经成功支付,返回true,否则返回false; 
function checkorderstatus($ordid){ 
    $Ord=M('Orderlist'); 
    $ordstatus=$Ord->where('ordid='.$ordid)->getField('ordstatus'); 
    if($ordstatus==1){ 
        return true; 
    }else{ 
        return false;     
    } 

 
//处理订单函数 
//更新订单状态,写入订单支付后返回的数据 
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; 
    $Ord=M('Orderlist'); 
    $Ord->where('ordid='.$ordid)->save($data); 
}  
 
//获取一个随机且唯一的订单号; 
function getordcode(){ 
    $Ord=M('Orderlist'); 
    $numbers = range (10,99); 
    shuffle ($numbers);  
    $code=array_slice($numbers,0,4);  
    $ordcode=$code[0].$code[1].$code[2].$code[3]; 
    $oldcode=$Ord->where("ordcode='".$ordcode."'")->getField('ordcode'); 
    if($oldcode){ 
        getordcode(); 
    }else{ 
        return $ordcode; 
    } 
}

图片 14

四、总结几点

 

1、接口包中lib文件中的文件复制到Vendor后,重命名为TP规范的命名规则,为的是调用方便,当然你要改成其他名称也可以;

 充值后修改状态:

2、把执行支付操作(doalipay),处理异步返回结果(notifyurl),处理跳转返回结果(returnurl)三个支付接口的核心页面写到一个PayAction控制器中。

图片 15

3、提交支付的页面中,可以在提交之前先把一些参数要传递的内容先通过隐藏域的方法组合好,比如金额先计算好,订单名称,订单描述等先用字符串组合好。然后提交表单,这样,在doalipay方法中只要直接构造传递参数,直接进行提交就行过了。

 

4、支付返回后的处理因为要在异步和跳转两个方法中都要进行相应的判断和处理,所以,把这些判断和处理写到一个自定义函数中,这样只要调用函数即可,使得代码更加清晰明了。

 finishchongzhi

5、notify_url和return_url两种模式的返回url必须使用

图片 16

以上代码在ThinkPHP3.0中正常使用!!

 

更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》及《ThinkPHP常用方法总结》

总结:

希望本文所述对大家的ThinkPHP框架程序设计有所帮助。

1.把执行支付操作(toalipay),处理异步返回结果(notifyurl_phone),处理跳转返回结果(returnurl_phone)三个支付接口的核心页面写到一个PayAction控制器中。

您可能感兴趣的文章:

  • thinkPHP框架对接支付宝即时到账接口回调操作示例
  • php支付宝在线支付接口开发教程
  • php支付宝接口用法分析
  • php进行支付宝开发中return_url和notify_url的区别分析
  • 支付宝 接口开发帮助(asp,php,asp.net,jsp)
  • php支付宝手机网页支付类实例
  • PHP 接入支付宝即时到账功能
  • PHP后台微信支付和支付宝支付开发
  • 纯PHP代码实现支付宝批量付款
  • php app支付宝回调(异步通知)详解

2.提交支付的页面中,可以在提交之前先把一些参数要传递的内容先通过隐藏域的方法组合好,比如金额先计算好,订单名称,订单描述等先用字符串组合好。然后提交表单,这样,在toalipay方法中只要直接构造传递参数,直接进行提交就行过了。

3.支付返回后的处理因为要在异步和跳转两个方法中都要进行相应的判断和处理,所以,把这些判断和处理写到一个自定义函数中,这样只要调用函数即可,使得代码更加清晰明了。

4.notify_url和return_url两种模式的返回url必须使用

 

版权声明:本文由韦德娱乐1946_韦德娱乐1946网页版|韦德国际1946官网发布于网络编程,转载请注明出处:购并支付宝功效,ThinkPHP完毕支付宝接口成效实例