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语法(5)
Oct 09 PHP
PHP clearstatcache()函数详解
Mar 02 PHP
php关于array_multisort多维数组排序的使用说明
Jan 04 PHP
PHP操作数组相关函数
Feb 03 PHP
PHP随机数生成代码与使用实例分析
Apr 08 PHP
ThinkPHP中的系统常量和预定义常量集合
Jul 01 PHP
PHP开发框架kohana3 自定义路由设置示例
Jul 14 PHP
php基于表单密码验证与HTTP验证用法实例
Jan 06 PHP
ThinkPHP提示错误Fatal error: Allowed memory size的解决方法
Feb 12 PHP
PHP常用的小程序代码段
Nov 14 PHP
PDO::quote讲解
Jan 29 PHP
ThinkPHP框架整合微信支付之刷卡模式图文详解
Apr 10 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 自写函数代码 获取关键字 去超链接
2010/02/08 PHP
php使用百度天气接口示例
2014/04/22 PHP
PHP7新功能总结
2019/04/14 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
gearman中任务的优先级和返回状态实例分析
2020/02/27 PHP
ExtJS 2.0实用简明教程 之获得ExtJS
2009/04/29 Javascript
js对象的比较
2011/02/26 Javascript
js 中{},[]中括号,大括号使用详解
2011/05/12 Javascript
jQuery ui插件的使用方法代码实例
2013/05/08 Javascript
JavaScript跨域方法汇总
2014/10/16 Javascript
JavaScript点击按钮后弹出透明浮动层的方法
2015/05/11 Javascript
jquery实现的简单二级菜单效果代码
2015/09/22 Javascript
深入浅出webpack之externals的使用
2017/12/04 Javascript
angular的输入和输出的使用方法
2018/09/22 Javascript
Vue动画事件详解及过渡动画实例
2019/02/09 Javascript
vue自定义键盘信息、监听数据变化的方法示例【基于vm.$watch】
2019/03/16 Javascript
详解vue中$nextTick和$forceUpdate的用法
2019/12/11 Javascript
javascript实现拖拽碰撞检测
2020/03/12 Javascript
javascript实现移动端红包雨页面
2020/06/23 Javascript
python实现给字典添加条目的方法
2014/09/25 Python
使用Python脚本将Bing的每日图片作为桌面的教程
2015/05/04 Python
python学习之第三方包安装方法(两种方法)
2015/07/30 Python
利用Python将文本中的中英文分离方法
2018/10/31 Python
Python字符串格式化输出代码实例
2019/11/22 Python
Python try except异常捕获机制原理解析
2020/04/18 Python
Python sublime安装及配置过程详解
2020/06/29 Python
matplotlib设置颜色、标记、线条,让你的图像更加丰富(推荐)
2020/09/25 Python
HTML5实现QQ聊天气泡效果
2017/06/26 HTML / CSS
毕业自我鉴定
2013/11/05 职场文书
满月酒主持词
2014/03/27 职场文书
教师优秀党员事迹材料
2014/08/14 职场文书
党的群众路线教育实践活动个人对照检查材料(医生)
2014/11/05 职场文书
上级领导检查欢迎词
2015/09/30 职场文书
2016年小学生教师节广播稿
2015/12/18 职场文书
《我在为谁工作》:工作的质量往往决定生活的质量
2019/12/27 职场文书
Java中Dijkstra(迪杰斯特拉)算法
2022/05/20 Java/Android