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

posted @ 2014-03-25 18:11  dingxiaoyue  阅读(936)  评论(0编辑  收藏  举报