zoukankan      html  css  js  c++  java
  • PHP集成支付宝快速实现充值功能

    http://blog.lixiphp.com/php-alipay-fast-chongzhi/#axzz2wy4huhBm


    本文将介绍如何快速通过PHP类库来集成、整合支付宝来实现充值功能。如果你的系统想要扩充积分、账户余额等功能,那么就要选择一个第三方支付系统来充值。

    支付宝集成时,需要三大步:

    1、通过表单提交信息,系统整合信息,提交信息到支付宝;

    2、用户进行支付后,支付宝后台通知系统处理;

    3、支付宝后台通知完成后,支付宝前台跳转到系统返回地址;

    支付宝PHP类

    • PHP 类alipay_notify,主要功能是付款过程中服务器通知处理。
    • PHP 类alipay_service,根据支付宝外部服务接口生成支付宝地址。

    我把这2个类,集中到一个文件alipay.class.inc中,点击这里查看并下载PHP支付宝类源码

    下面主要主要讲解通过支付宝的PHP类来实现整合。

    PHP支付宝集成

    第一步,建立提交充值的基本信息:

    zhifubao-chongzhi PHP支付宝集成 建立提交充值的基本信息

    第二步,验证用户提交的金额正确,通过表单验证后,通过支付宝alipay_service类生成支付宝链接,然后跳转到支付宝链接。

    function index() { 
      $total = intval($_POST['total']); 
      if (!$total) { 
        $total = 1; 
      } 
      $pay_bank = trim($_POST['pay_bank']); 
      $account = $_POST['_account']; 
      $base_path = ‘http://’.$_SERVER['HTTP_HOST'].base_path(); 
      $order_id = date(‘YmdHis’, time()); //时间值作为唯一的订单ID号 
      $subject = $body = ‘LixiPHP充值’.$total.’元’; 
      $out_trade_no = date(‘YmdHis’, time()).’-’.$account->student['sid']; 
      //合作身份者ID,以2088开头的16位纯数字 
      $partner = ’20887015**9*7**’; 
      //安全检验码,以数字和字母组成的32位字符 
      $security_code = ‘gc2qxh4**ab***3jp8*****2ptxewks4′; 
      //签约支付宝账号或卖家支付宝帐户 
      $seller_email = ‘seller@alipay.com’; 
      $_input_charset = "UTF-8"; 
      $sign_type = "MD5"; //签名方式 
      $transport = ‘https’;//字符编码格式 
      $parameter = array( 
        "service"        => "create_direct_pay_by_user",  //交易类型 
        "partner"        => $partner,         //合作商户号 
        "return_url"     => $base_path.’alipay/return’,      //同步返回 
        "notify_url"     => $base_path.’alipay/notify’,      //异步返回 
        "_input_charset" => ‘UTF-8′,  //字符集,默认为GBK 
        "subject"        => $subject,       //商品名称,必填 
        "body"           => $subject,       //商品描述,必填 
        "out_trade_no"   => $out_trade_no,     //商品外部交易号,必填(保证唯一性) 
        "price"          => $total,           //商品单价,必填(价格不能为0) 
        "payment_type"   => "1",              //默认为1,不需要修改 
        "quantity"       => "1",              //商品数量,必填 
        "paymethod"        => ‘directPay’, 
        "defaultbank"        => $pay_bank, 
        "logistics_fee"      =>’0.00′,        //物流配送费用 
        "logistics_payment"  =>’BUYER_PAY’,   //物流费用付款方式:SELLER_PAY(卖家支付)、BUYER_PAY(买家支付)、BUYER_PAY_AFTER_RECEIVE(货到付款) 
        "logistics_type"     =>’EXPRESS’,     //物流配送方式:POST(平邮)、EMS(EMS)、EXPRESS(其他快递) 
        //"receive _mobile" => ”,         //收货人手机 
        "show_url"       => $base_path,        //商品相关网站 
        "seller_email"   => $seller_email,     //卖家邮箱,必填 
      ); 
      require("../libraries/payment/alipay.class.inc"); 
      $alipay = new alipay_service($parameter, $security_code, $sign_type); 
      $link = $alipay->create_url(); 
      header("Location: ".$link); 
    }

    用户跳转到支付宝支付界面后,默认的支付银行是在提交表单前选择的网上银行,选择支付宝的话就是使用支付宝余额支付。然后就是等待用户支付了。用户完成支付后,请会发生下面的几个步骤,当然如果用户放弃支付的话,就没有后面的处理了。

    第三步,用户进行支付后,支付宝后台通知系统处理。系统处理页面主要是根据生成支付宝链接是使用的notify_url来决定的。它处理完成后,成功返回success,失败返回fail,如果支付宝收到的是fail,那么支付宝还会在隔1小时,1天,1周等周期再次通知服务器处理,这里的周期需求向支付宝询问。如果支付宝收到的是success,注意支付宝好像在一个月后要发送一次TRADE_FINISHED表示交易完成,这个一定不要再给用户加一次充值了。

    function alipay_notify() { 
      $out_trade_no = date(‘YmdHis’, time()).’-’.$account->student['sid']; 
      //合作身份者ID,以2088开头的16位纯数字 
      $partner = ’20887015**9*7**’; 
      //安全检验码,以数字和字母组成的32位字符 
      $security_code = ‘gc2qxh4**ab***3jp8*****2ptxewks4′; 
      //签约支付宝账号或卖家支付宝帐户 
      $seller_email = ‘seller@alipay.com’; 
      $sign_type = "MD5"; 
      $_input_charset = ‘UTF-8′; 
      $transport = ‘https’; 
      require("../libraries/payment/alipay.class.inc"); 
      $alipay = new alipay_notify($partner,$security_code,$sign_type,$_input_charset,$transport); 
      $verify_result = $alipay->notify_verify(); 
      //支付宝 Notice verify 
      if($verify_result) { 
        //认证合格 
        //获取支付宝的反馈参数 
        //获取支付宝传递过来的订单号 
        $order_id      = $_POST['out_trade_no']; 
        //获取支付宝传递过来的总价格 
        $total_fee     = $_POST['total_fee']; 
        //拆分订单号为订单和学员ID 
        $txn_id = explode(‘-’, $order_id); 
        $real_orderid = $txn_id[0]; //get the real order 
        $sid = $txn_id[1]; 
        if($_POST['trade_status'] == ‘TRADE_SUCCESS’) { 
          //这里放入你自定义代码,比如根据不同的trade_status进行不同操作 
          mysql_query("UPDATE {student} set balance = balance+%d where sid = %d", (int) $total_fee, $sid); 
          mysql_query("INSERT INTO {payment_receipts} (sid, order_id, amount, received) VALUES (%d, ‘%s’, %f, %d)", $sid, $real_orderid, (int) $total_fee, time()); 
          echo "success"; 
        } 
        else { 
          echo "fail"; 
        } 
      } 
      else { 
        echo "fail"; 
      } 
    }

    第四步,用户完成支付后,支付宝前台跳转到系统返回地址。这个页面其实可以只做一个非常简单页面,不用做任何验证。但是为了安全建议也做一下返回验证。但是最后不要在返回页面做数据库操作。

    function alipay_return() { 
      $out_trade_no = date(‘YmdHis’, time()).’-’.$account->student['sid']; 
      //合作身份者ID,以2088开头的16位纯数字 
      $partner = ’20887015**9*7**’; 
      //安全检验码,以数字和字母组成的32位字符 
      $security_code = ‘gc2qxh4**ab***3jp8*****2ptxewks4′; 
      //签约支付宝账号或卖家支付宝帐户 
      $seller_email = ‘seller@alipay.com’; 
      $sign_type = "MD5"; 
      $_input_charset = ‘UTF-8′; 
      $transport = ‘https’; 
      require("../libraries/payment/alipay.class.inc"); 
      $alipay = new alipay_notify($partner,$security_code,$sign_type,$_input_charset,$transport); 
      $verify_result = $alipay->return_verify(); 
      $order_id    = $_GET['out_trade_no'];   //获取订单号 
      $total_fee  = (int) $_GET['total_fee'];      //获取总价格 
      $txn_id = explode(‘-’, $order_id); 
      $real_orderid = $txn_id[0]; //get the real order 
      $sid = $txn_id[1]; 
      //认证合格 
      if($verify_result) { 
        $output = ‘<h2>恭喜您,学员ID’.$sid.’充值’.$total_fee.’元成功!</h2>’; 
        $student = mysql_query("SELECT uid, balance FROM {student} WHERE sid = %d", $sid); 
        $output .= ‘<p>您目前的余额’.$student->balance.’元。</p>’; 
        $output .= l(‘查看记录’, ‘user/’.$student->uid.’/depositlogs’); 
        return $output; 
      } 
      else { 
        $output = ‘<h2>你的订单支付过程出现故障!</h2>’; 
        $output .= ‘<p>您的交易信息是无效的,如果你使用的是已有的返回信息的话,那么交易已经成立,你可以查看我的订单历史。<br>如果你是黑客的话,俺是守法的好公民,希望你能饶了我这个小店。’; 
        $output .= ‘</p><p><a href="/">返回首页</a></p>’; 
        return $output; 
      } 
    }

    如果用户是恶意修改网址参数,将会看到:

    callback return failed  如果用户是恶意修改网址参数

    如果用户正常通过支付宝自动跳转回来的,将会看到:

    callback return success 如果用户正常通过支付宝自动跳转回来的

    好的,赶快将以上方法和代码应用到你的积分、账户余额系统把!

    除非注明,文章均为LixiPHP原创,转载请注明本文地址:http://blog.lixiphp.com/php-alipay-fast-chongzhi/


    查看更多: PHP集成支付宝快速实现充值功能 | LixiPHP - 专注于建设高品质网站! http://blog.lixiphp.com/php-alipay-fast-chongzhi/#ixzz2wy56UqHs

  • 相关阅读:
    linux基础命令:alias
    linux基础命令:find
    Linux下which、whereis、locate命令的区别
    逆元知识普及(进阶篇) ——from Judge
    BZOJ 3620: 似乎在梦中见过的样子
    HDU contest808 ACM多校第7场 Problem
    P3203 [HNOI2010]弹飞绵羊 —— 懒标记?分块?LCT?...FAQ orz
    可持久化数组(线段树)[模板题]
    可持久化并(xian)查(duan)集(shu)
    主席树(静态)的轻松入门
  • 原文地址:https://www.cnblogs.com/dingxiaoyue/p/4926816.html
Copyright © 2011-2022 走看看