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&java(三)
Oct 09 PHP
不重新编译PHP为php增加openssl模块的方法
Jun 14 PHP
Ajax+PHP快速上手及简单应用说明
Jul 24 PHP
php数组编码转换示例详解
Mar 11 PHP
php实现获取局域网所有用户的电脑IP和主机名、及mac地址完整实例
Jul 18 PHP
PHP+Mysql+jQuery实现发布微博程序 php篇
Oct 15 PHP
php 在字符串指定位置插入新字符的简单实现
Jun 28 PHP
完美解决php 导出excle的.csv格式的数据时乱码问题
Feb 18 PHP
PHP时间处理类操作示例
Sep 05 PHP
Yii2框架配置文件(Application属性)与调试技巧实例分析
May 27 PHP
TP5框架使用QueryList采集框架爬小说操作示例
Mar 26 PHP
详解php中流行的rpc框架
May 29 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二分查找二种实现示例
2014/03/12 PHP
PHP实现基于面向对象的mysqli扩展库增删改查操作工具类
2017/07/18 PHP
php使用fputcsv实现大数据的导出操作详解
2020/02/27 PHP
基于PHP实现生成随机水印图片
2020/12/09 PHP
Js callBack 返回前一页的js方法
2008/11/30 Javascript
JS 事件绑定函数代码
2010/04/28 Javascript
document.getElementById方法在Firefox与IE中的区别
2010/05/18 Javascript
javascript 循环读取JSON数据的代码
2010/07/17 Javascript
DB.ASP 用Javascript写ASP很灵活很好用很easy
2011/07/31 Javascript
extjs关于treePanel+chekBox全部选中以及清空选中问题探讨
2013/04/02 Javascript
IE、FF浏览器下修改标签透明度
2014/01/28 Javascript
JavaScript日期时间与时间戳的转换函数分享
2015/01/31 Javascript
jQuery数据缓存用法分析
2015/02/20 Javascript
JS实现兼容性好,带缓冲的动感网页右键菜单效果
2015/09/18 Javascript
使用Bootstrap美化按钮实例代码(demo)
2017/02/03 Javascript
详解node child_process模块学习笔记
2018/01/24 Javascript
微信小程序Getuserinfo解决方案图解
2018/08/24 Javascript
vue 实现Web端的定位功能 获取经纬度
2019/08/08 Javascript
Vue 解决路由过渡动画抖动问题(实例详解)
2020/01/05 Javascript
JavaScript中作用域链的概念及用途讲解
2020/08/06 Javascript
教你用Type Hint提高Python程序开发效率
2016/08/08 Python
Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
2017/07/11 Python
python批量设置多个Excel文件页眉页脚的脚本
2018/03/14 Python
Atom的python插件和常用插件说明
2018/07/08 Python
python如何获取apk的packagename和activity
2020/01/10 Python
pycharm的python_stubs问题
2020/04/08 Python
Python二元算术运算常用方法解析
2020/09/15 Python
CSS3线性渐变简单实现以及该属性在浏览器中的不同
2012/12/12 HTML / CSS
HTML5之SVG 2D入门6—视窗坐标系与用户坐标系及变换概述
2013/01/30 HTML / CSS
职业教育毕业生求职信
2013/11/09 职场文书
《浅水洼里的小鱼》听课反思
2014/02/28 职场文书
药店促销活动总结
2014/07/10 职场文书
民主生活会批评与自我批评总结
2014/10/17 职场文书
九华山导游词
2015/02/03 职场文书
天气温馨提示语
2015/07/14 职场文书
详解如何用Python实现感知器算法
2021/06/18 Python