当前位置:首页 > CMS教程 > Thinkphp > 列表

了解php实现的支付宝网页支付功能【基于TP5框架】

发布:smiling 来源: PHP粉丝网  添加日期:2022-07-20 16:45:14 浏览: 评论:0 

本文实例讲述了php实现的支付宝网页支付功能,分享给大家供大家参考,具体如下:

1.提交支付请求

  1. require_once './payment/zfb/pagepay/service/AlipayTradeService.php'
  2.  
  3. require_once './payment/zfb/pagepay/buildermodel/AlipayTradePagePayContentBuilder.php'
  4.  
  5. $payInfo=Db::name('pay_type')->where(['pay_id'=>1])->find(); 
  6.  
  7. $zfb=json_decode($payInfo['pay_json'],true); 
  8.  
  9. $config=[ 
  10.  
  11.   'app_id'=>$zfb['app_id'], 
  12.  
  13.   'merchant_private_key'=>$zfb['merchant_private_key'], 
  14.  
  15.   'notify_url'=>config('z_notify_url'), 
  16.  
  17.   'return_url'=>config('z_return_url'), 
  18.  
  19.   'charset'=>config('charset'), 
  20.  
  21.   'sign_type'=>config('sign_type'), 
  22.  
  23.   'gatewayUrl'=>config('gatewayUrl'), 
  24.  
  25.   'alipay_public_key'=>$zfb['alipay_public_key'
  26.  
  27. ]; 
  28.  
  29. //商品订单号 
  30.  
  31. $out_trade_no=$orderData['order_number']; 
  32.  
  33. //订单名称,必填 
  34.  
  35. $subject='充值订单'
  36.  
  37. //付款金额 
  38.  
  39. $total_amount=$money
  40.  
  41. //商品描述 
  42.  
  43. $body = $out_trade_no . '-' . $this->agent_id.'-'.$money
  44.  
  45. $payRequestBuilder = new \AlipayTradePagePayContentBuilder(); 
  46.  
  47. $payRequestBuilder->setBody($body); 
  48.  
  49. $payRequestBuilder->setSubject($subject); 
  50.  
  51. $payRequestBuilder->setTotalAmount($total_amount); 
  52.  
  53. $payRequestBuilder->setOutTradeNo($out_trade_no); 
  54.  
  55. $aop = new \AlipayTradeService($config); 
  56.  
  57. $response = $aop->pagePay($payRequestBuilder,$config['return_url'],$config['notify_url']); 
  58.  
  59. echo $response

2.异步回调支付宝参数认证

  1. $pay=Db::name('pay_type')->where(['pay_id'=>1])->find(); 
  2.  
  3.   $zfb=json_decode($pay['pay_json'],true); 
  4.  
  5.   $config = [ 
  6.  
  7.     'app_id' => $zfb['app_id'], 
  8.  
  9.     'merchant_private_key' => $zfb['merchant_private_key'], 
  10.  
  11.     'notify_url' => config('z_notify_url'), 
  12.  
  13.     'return_url' => config('z_return_url'), 
  14.  
  15.     'charset' => config('charset'), 
  16.  
  17.     'sign_type' => config('sign_type'), 
  18.  
  19.     'gatewayUrl' => config('gatewayUrl'), 
  20.  
  21.     'alipay_public_key' => $zfb['alipay_public_key'
  22.  
  23.   ]; 
  24.  
  25.   $arr=$_POST
  26.  
  27.   $alipaySevice = new \AlipayTradeService($config); 
  28.  
  29.   $alipaySevice->writeLog(var_export($_POST,true)); 
  30.  
  31.   $result = $alipaySevice->check($arr); 
  32.  
  33.   /* 实际验证过程建议商户添加以下校验。 
  34.  
  35.   1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号, 
  36.  
  37.   2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额), 
  38.  
  39.   3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方 
  40.  
  41.   (有的时候,一个商户可能有多个seller_id/seller_email) 
  42.  
  43.   4、验证app_id是否为该商户本身。 
  44.  
  45.   */ 
  46.  
  47.   if($result) {//验证成功 
  48.  
  49.     //////////////////////////////////////////////////////////////////////////////// 
  50.  
  51.     //请在这里加上商户的业务逻辑程序代 
  52.  
  53.     //——请根据您的业务逻辑来编写程序(以下代码仅作参考)—— 
  54.  
  55.     //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表 
  56.  
  57.     //商户订单号 
  58.  
  59.     $out_trade_no = $_POST['out_trade_no']; 
  60.  
  61.     //支付宝交易号 
  62.  
  63.     $trade_no = $_POST['trade_no']; 
  64.  
  65.     //交易状态 
  66.  
  67.     $trade_status = $_POST['trade_status']; 
  68.  
  69.     //交易金额 
  70.  
  71.     $total_amount = $_POST['total_amount']; 
  72.  
  73.     if($_POST['trade_status'] == 'TRADE_FINISHED') { 
  74.  
  75.       //判断该笔订单是否在商户网站中已经做过处理 
  76.  
  77.       //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细, 
  78.  
  79.       并执行商户的业务程序 
  80.  
  81.       //请务必判断请求时的total_amount与通知时获取的total_fee为一致的 
  82.  
  83.       //如果有做过处理,不执行商户的业务程序 
  84.  
  85.       //注意: 
  86.  
  87.       //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知 
  88.  
  89.     } else if ($_POST['trade_status'] == 'TRADE_SUCCESS') { 
  90.  
  91.       //判断该笔订单是否在商户网站中已经做过处理 
  92.  
  93.       //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细, 
  94.  
  95.       并执行商户的业务程序 
  96.  
  97.       //请务必判断请求时的total_amount与通知时获取的total_fee为一致的 
  98.  
  99.       //如果有做过处理,不执行商户的业务程序 
  100.  
  101.       //注意: 
  102.  
  103.       //付款完成后,支付宝系统发送该交易状态通知 
  104.  
  105.       //此处应该更新一下订单状态,商户自行增删操作 
  106.  
  107.        这里写你的逻辑程序 
  108.  
  109.     } 
  110.  
  111.     //——请根据您的业务逻辑来编写程序(以上代码仅作参考)—— 
  112.  
  113.     echo 'success'
  114.  
  115.   }else { 
  116.  
  117.     //验证失败 
  118.  
  119.     echo "fail"
  120.  
  121.   } 
  122.  

3.同步回调页面跳转处理 同步只是做一个跳转处理 不要写任何数据处理

  1. $pay=Db::name('pay_type')->where(['pay_id'=>1])->find(); 
  2.  
  3. $zfb=json_decode($pay['pay_json'],true); 
  4.  
  5. $config = [ 
  6.  
  7.   'app_id' => $zfb['app_id'], 
  8.  
  9.   'merchant_private_key' => $zfb['merchant_private_key'], 
  10.  
  11.   'notify_url' => config('z_notify_url'), 
  12.  
  13.   'return_url' => config('z_return_url'), 
  14.  
  15.   'charset' => config('charset'), 
  16.  
  17.   'sign_type' => config('sign_type'), 
  18.  
  19.   'gatewayUrl' => config('gatewayUrl'), 
  20.  
  21.   'alipay_public_key' => $zfb['alipay_public_key'
  22.  
  23. ]; 
  24.  
  25. $arr=$_GET
  26.  
  27. $alipaySevice = new \AlipayTradeService($config); 
  28.  
  29. $result = $alipaySevice->check($arr); 
  30.  
  31. /* 实际验证过程建议商户添加以下校验。 
  32.  
  33. 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号, 
  34.  
  35. 2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额), 
  36.  
  37. 3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方 
  38.  
  39. (有的时候,一个商户可能有多个seller_id/seller_email) 
  40.  
  41. 4、验证app_id是否为该商户本身。 
  42.  
  43. */ 
  44.  
  45. if($result) {//验证成功 
  46.  
  47.   /////////////////////////////////////////////////////////////////////////////// 
  48.  
  49.   //请在这里加上商户的业务逻辑程序代码 
  50.  
  51.   //——请根据您的业务逻辑来编写程序(以下代码仅作参考)—— 
  52.  
  53.   //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表 
  54.  
  55.   //商户订单号 
  56.  
  57.   $out_trade_no = htmlspecialchars($_GET['out_trade_no']); 
  58.  
  59.   //支付宝交易号 
  60.  
  61.   $trade_no = htmlspecialchars($_GET['trade_no']); 
  62.  
  63.   $this->success("支付成功",url('Index/index')); 
  64.  
  65.   //——请根据您的业务逻辑来编写程序(以上代码仅作参考)—— 
  66.  
  67.   /////////////////////////////////////////////////////////////////////////// 
  68.  
  69.  
  70. else { 
  71.  
  72.   //验证失败 
  73.  
  74.   echo "验证失败"
  75.  
  76. }

Tags: php付宝网页支付

分享到: