诚然博客

  • 首页
  • HTML
  • Jquery
  • PHP
  • ThinkPHP
  • Linux
  • 琐事
  1. 首页
  2. ThinkPHP
  3. 正文

​thinkphp 增加支付宝支付功能

2016年2月26日 2348点热度

推荐先把支付宝的id key申请好,容易测试些,申请过程中也是欲仙欲死的,用公司的账号申请,直接开一个域名shop.xxx.com,然后装一个ecshop原版进去,模板就用原始的,团购去掉,ecshop自带的测试数据 移动充值哪那里要删掉(不然说你价格过低,有欺诈嫌疑,当时看的我都哭了),要申请的自己去体会吧,申请的是即使到帐支付,然后下载即时到账交易接口(create_direct_pay_by_user)(DEMO下载),飞机票

这里就使用PHP-UTF-8的,

在你的项目里打开thinkphp目录,进入Extend/Vendor,建立一个文件夹取名Alipay,然后把刚下载下来的demo里的lib文件夹里面的四个文件复制到这里来,改名(alipay_core.function.php,alipay_md5.function.php,alipay_notify.class.php,alipay_submit.class.php),然后,打开alipay_submit.class.php和alipay_notify.class.php文件,把以下代码去掉:

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

为啥要去掉呢,因为待会儿我们直接在控制器里引入就行了,

然后在你的项目配置文件里配置好支付宝的相关参数,例子如下

'alipay_config'=>array(
         'partner' =>'208802xxxxxxxx',   //这里是你在成功申请支付宝接口后获取到的PID;
        'key'=>'kgut3dmxxxxxxxxx',//这里是你在成功申请支付宝接口后获取到的Key
        'sign_type'=>strtoupper('MD5'),
        'input_charset'=> strtolower('utf-8'),
        'cacert'=> getcwd().'\\cacert.pem',
        'transport'=> 'http',
        'seller_email'=>'admin@xueqianduan.cn', //这里就是你的卖家账号了
    ),
'alipay'   =>array(
 //这里是卖家的支付宝账号,也就是你申请接口时注册的支付宝账号
'seller_email'=>'admin@xueqianduan.cn',
//这里是异步通知页面url,提交到项目的Pay控制器的notifyurl方法;
'notify_url'=>'http://www.xxx.com/Pay/notifyurl', 
//这里是页面跳转通知url,提交到项目的Pay控制器的returnurl方法;
'return_url'=>'http://www.xxx.com/Pay/returnurl', 
),

上面的notify_url和return_url地址都是你项目里的回调函数,下面会讲到

然后在项目中新建一个控制器PayAction.class.php,这个地方不要求一样,看自己的需求,在这里我就直接把我的贴上来了

class PayAction extends Action{
    //在类初始化方法中,引入相关类库    
    public function _initialize() {
        vendor('Alipay.Corefunction');
        vendor('Alipay.Md5function');
        vendor('Alipay.Notify');
        vendor('Alipay.Submit');    //引入刚刚的四个文件
    }
    
    public function doalipay(){
        
        $alipay_config=C('alipay_config'); //通过C方法读取配置文件

        //支付类型
        $payment_type = "1";
        //必填,不能修改
        //服务器异步通知页面路径
        $notify_url = C('alipay.notify_url');
        //需http://格式的完整路径,不能加?id=123这类自定义参数
        //页面跳转同步通知页面路径
        $return_url = C('alipay.return_url');
        //需http://格式的完整路径,不能加?id=123这类自定义参数,不能写成http://localhost/
        //商户订单号
        $out_trade_no = I('order_id');
        //商户网站订单系统中唯一订单号,必填
        //订单名称
        $subject = '啥啥网站充值_'.I('order_price');
        //必填
        //付款金额
        $total_fee = floatval(I('order_price'));
        //必填
        //订单描述
        $body = '网站充值!';
        //商品展示地址
        $show_url ='http://www.xxx.com/goods/id/123';
        //需以http://开头的完整路径,例如:http://www.商户网址.com/myorder.html
        //防钓鱼时间戳
        $anti_phishing_key = "";
        //若要使用请调用类文件submit中的query_timestamp函数
        //客户端的IP地址
        $exter_invoke_ip = get_client_ip();
        //非局域网的外网IP地址,如:221.0.0.1
        /************************************************************/
        //构造要请求的参数数组,无需改动
        $parameter = array(
            "service" => "create_direct_pay_by_user",
            "partner" => trim($alipay_config['partner']),
            "seller_email" => trim($alipay_config['seller_email']),
            "payment_type"=> $payment_type,
            "notify_url"=> $notify_url,
            "return_url"=> $return_url,
            "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,"get", "确认");
        echo $html_text;
    }
    
        /******************************
        服务器异步通知页面方法
        
        *******************************/
    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'];       //买家支付宝帐号;
         
           if($_POST['trade_status'] == 'TRADE_FINISHED') {
                       //
           }else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
             
             //这里就写上你的内部的处理流程了
             
            }
                echo "success";        //请不要修改或删除,因为这是异步通知,你处理好,就会echo出success这7个字符,支付宝的服务器才能知道你已经处理了,不然支付宝会以一定的时间不停的发送这个到你这儿来
         }else {
                //验证失败
                echo "fail";
        }  
    }
    
        /*
        页面跳转处理方法;也就是同步通知
        */
    function returnurl(){
        unset($_GET['_URL_']); //这里要写一下,不然你的同步通知永远是支付失败的,这个_URL_是thinkphp待进去的,即使他的值是空的,支付宝会把这个参数用来算结果的,结果想想就知道了。
        $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'];       //买家支付宝帐号;
            
if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
     
      //这里就写你的项目处理函数了
   
    }else {
       //这里是支付失败,你的项目处理函数
    }
}else {
    //验证失败
    //如要调试,请看alipay_notify.php页面的verifyReturn函数
    echo "支付失败!";
    }
}
}

支付宝有两种通知,一个是异步,一个是同步。同步就是用户跳转支付宝支付完成后,支付宝又跳转回来,但是有的用户在跳转开始前就关闭了页面,这个时候就无法通知到商户了,所以就出现了异步通知,支付宝直接post相关参数过来告诉你订单支付的情况,所以在通知这里千万要写上你的订单状态判断!别重复写入了。

如果有啥不懂得可以留言@我,虽然我也是初学者!

标签: 暂无
最后更新:2016年2月26日

诚然

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

COPYRIGHT © 2012-现在 诚然博客. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

鄂ICP备2022012104号