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


Posted in PHP onSeptember 16, 2019

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

1.提交支付请求

require_once './payment/zfb/pagepay/service/AlipayTradeService.php';
require_once './payment/zfb/pagepay/buildermodel/AlipayTradePagePayContentBuilder.php';
$payInfo=Db::name('pay_type')->where(['pay_id'=>1])->find();
$zfb=json_decode($payInfo['pay_json'],true);
$config=[
  'app_id'=>$zfb['app_id'],
  'merchant_private_key'=>$zfb['merchant_private_key'],
  'notify_url'=>config('z_notify_url'),
  'return_url'=>config('z_return_url'),
  'charset'=>config('charset'),
  'sign_type'=>config('sign_type'),
  'gatewayUrl'=>config('gatewayUrl'),
  'alipay_public_key'=>$zfb['alipay_public_key']
];
//商品订单号
$out_trade_no=$orderData['order_number'];
//订单名称,必填
$subject='充值订单';
//付款金额
$total_amount=$money;
//商品描述
$body = $out_trade_no . '-' . $this->agent_id.'-'.$money;
$payRequestBuilder = new \AlipayTradePagePayContentBuilder();
$payRequestBuilder->setBody($body);
$payRequestBuilder->setSubject($subject);
$payRequestBuilder->setTotalAmount($total_amount);
$payRequestBuilder->setOutTradeNo($out_trade_no);
$aop = new \AlipayTradeService($config);
$response = $aop->pagePay($payRequestBuilder,$config['return_url'],$config['notify_url']);
echo $response;

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

$pay=Db::name('pay_type')->where(['pay_id'=>1])->find();
  $zfb=json_decode($pay['pay_json'],true);
  $config = [
    'app_id' => $zfb['app_id'],
    'merchant_private_key' => $zfb['merchant_private_key'],
    'notify_url' => config('z_notify_url'),
    'return_url' => config('z_return_url'),
    'charset' => config('charset'),
    'sign_type' => config('sign_type'),
    'gatewayUrl' => config('gatewayUrl'),
    'alipay_public_key' => $zfb['alipay_public_key']
  ];
  $arr=$_POST;
  $alipaySevice = new \AlipayTradeService($config);
  $alipaySevice->writeLog(var_export($_POST,true));
  $result = $alipaySevice->check($arr);
  /* 实际验证过程建议商户添加以下校验。
  1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
  2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
  3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)
  4、验证app_id是否为该商户本身。
  */
  if($result) {//验证成功
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //请在这里加上商户的业务逻辑程序代
    //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
    //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
    //商户订单号
    $out_trade_no = $_POST['out_trade_no'];
    //支付宝交易号
    $trade_no = $_POST['trade_no'];
    //交易状态
    $trade_status = $_POST['trade_status'];
    //交易金额
    $total_amount = $_POST['total_amount'];
    if($_POST['trade_status'] == 'TRADE_FINISHED') {
      //判断该笔订单是否在商户网站中已经做过处理
      //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
      //请务必判断请求时的total_amount与通知时获取的total_fee为一致的
      //如果有做过处理,不执行商户的业务程序
      //注意:
      //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
    } else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
      //判断该笔订单是否在商户网站中已经做过处理
      //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
      //请务必判断请求时的total_amount与通知时获取的total_fee为一致的
      //如果有做过处理,不执行商户的业务程序
      //注意:
      //付款完成后,支付宝系统发送该交易状态通知
      //此处应该更新一下订单状态,商户自行增删操作
       这里写你的逻辑程序
    }
    //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
    echo 'success';
  }else {
    //验证失败
    echo "fail";
  }
}

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

$pay=Db::name('pay_type')->where(['pay_id'=>1])->find();
$zfb=json_decode($pay['pay_json'],true);
$config = [
  'app_id' => $zfb['app_id'],
  'merchant_private_key' => $zfb['merchant_private_key'],
  'notify_url' => config('z_notify_url'),
  'return_url' => config('z_return_url'),
  'charset' => config('charset'),
  'sign_type' => config('sign_type'),
  'gatewayUrl' => config('gatewayUrl'),
  'alipay_public_key' => $zfb['alipay_public_key']
];
$arr=$_GET;
$alipaySevice = new \AlipayTradeService($config);
$result = $alipaySevice->check($arr);
/* 实际验证过程建议商户添加以下校验。
1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)
4、验证app_id是否为该商户本身。
*/
if($result) {//验证成功
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //请在这里加上商户的业务逻辑程序代码
  //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
  //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表
  //商户订单号
  $out_trade_no = htmlspecialchars($_GET['out_trade_no']);
  //支付宝交易号
  $trade_no = htmlspecialchars($_GET['trade_no']);
  $this->success("支付成功",url('Index/index'));
  //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
else {
  //验证失败
  echo "验证失败";
}

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

PHP 相关文章推荐
PHP批量采集下载美女图片的实现代码
Jun 03 PHP
完美解决:Apache启动问题―(OS 10022)提供了一个无效的参数
Jun 08 PHP
解析ajax事件的调用顺序
Jun 17 PHP
解决Codeigniter不能上传rar和zip压缩包问题
Mar 07 PHP
PHP实现克鲁斯卡尔算法实例解析
Aug 22 PHP
Laravel 4 初级教程之视图、命名空间、路由
Oct 30 PHP
php购物车实现方法
Jan 03 PHP
php使用array_search函数实现数组查找的方法
Jun 12 PHP
PHP HTTP 认证实例详解
Nov 03 PHP
php操作access数据库的方法详解
Feb 22 PHP
Laravel学习教程之IOC容器的介绍与用例
Aug 15 PHP
Laravel构建即时应用的一种实现方法详解
Aug 31 PHP
PHP实现的AES 128位加密算法示例
Sep 16 #PHP
Laravel项目中timeAgo字段语言转换的改善方法示例
Sep 16 #PHP
php解决crontab定时任务不能写入文件问题的方法分析
Sep 16 #PHP
PHP实现一个限制实例化次数的类示例
Sep 16 #PHP
thinkPHP5框架路由常用知识点汇总
Sep 15 #PHP
php项目中类的自动加载实例讲解
Sep 12 #PHP
php+jQuery ajax实现的实时刷新显示数据功能示例
Sep 12 #PHP
You might like
PHP操作MongoDB时的整数问题及对策说明
2011/05/02 PHP
PHP按行读取、处理较大CSV文件的代码实例
2014/04/09 PHP
php按字符无乱码截取中文的方法
2015/03/27 PHP
Laravel框架实现利用监听器进行sql语句记录功能
2018/06/06 PHP
javascript 数组排序函数
2009/08/20 Javascript
解决jQuery插件tipswindown与hintbox冲突
2010/11/05 Javascript
JavaScript游戏之优化篇
2010/11/08 Javascript
javascript当中的代码嗅探扩展原生对象和原型(prototype)
2013/01/11 Javascript
JQuery使用$.ajax和checkbox实现下次不在通知功能
2015/04/16 Javascript
js检测用户输入密码强度
2015/10/22 Javascript
JavaScript中的原始值和复杂值
2016/01/07 Javascript
多种JQuery循环滚动文字图片效果代码
2020/06/23 Javascript
jQuery基于扩展实现的倒计时效果
2016/05/14 Javascript
AngularJS控制器之间的通信方式详解
2016/11/03 Javascript
jQuery元素选择器实例代码
2017/02/06 Javascript
JavaScript解析机制与闭包原理实例详解
2019/03/08 Javascript
websocket4.0+typescript 实现热更新的方法
2019/08/14 Javascript
[28:28]Ti4 冒泡赛第二天NEWBEE vs NaVi 2
2014/07/15 DOTA
以windows service方式运行Python程序的方法
2015/06/03 Python
Python实现代码统计工具(终极篇)
2016/07/04 Python
python使用ddt过程中遇到的问题及解决方案【推荐】
2018/10/29 Python
python使用zip将list转为json的方法
2018/12/31 Python
详解python中自定义超时异常的几种方法
2019/07/29 Python
Python3 shutil(高级文件操作模块)实例用法总结
2020/02/19 Python
Python基于当前时间批量创建文件
2020/05/07 Python
Keras Convolution1D与Convolution2D区别说明
2020/05/22 Python
使用CSS3在触屏上为按钮实现激活效果
2013/09/27 HTML / CSS
LG西班牙网上商店:Tienda LG Online Es
2019/07/30 全球购物
澳大利亚领先的在线礼品网站:Gifts Australia
2020/08/15 全球购物
哈曼俄罗斯官方网上商店:Harman.club
2020/07/24 全球购物
你常见到的runtime exception
2016/09/05 面试题
Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?
2012/06/05 面试题
DBA数据库管理员JAVA程序员架构师必看
2016/02/07 面试题
对孩子的寄语
2014/04/09 职场文书
委托书格式范文
2015/01/28 职场文书
Python中json.load()和json.loads()有哪些区别
2021/06/07 Python