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 相关文章推荐
关于时间计算的结总
Dec 06 PHP
PHP ajax 分页类代码
Nov 13 PHP
一个PHP验证码类代码分享(已封装成类)
Jul 17 PHP
PHP中获取内网用户MAC地址(WINDOWS/linux)的实现代码
Aug 11 PHP
php数组函数序列之each() - 获取数组当前内部指针所指向元素的键名和键值,并将指针移到下一位
Oct 31 PHP
在PHP中设置、使用、删除Cookie的解决方法
May 06 PHP
解析PHP中如何将数组变量写入文件
Jun 06 PHP
在Mac OS上搭建PHP的Yii框架及相关测试环境
Feb 14 PHP
详解Yii2 定制表单输入字段的标签和样式
Jan 04 PHP
php 7新特性之类型申明详解
Jun 06 PHP
基于Laravel实现的用户动态模块开发
Sep 21 PHP
PHP封装cURL工具类与应用示例
Jul 01 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
PHP5.2下chunk_split()函数整数溢出漏洞 分析
2007/06/06 PHP
PHP中IP地址与整型数字互相转换详解
2014/08/20 PHP
Smarty变量用法详解
2016/05/11 PHP
thinkphp框架实现数据添加和显示功能
2016/06/29 PHP
PHP使用星号隐藏用户名,手机和邮箱的实现方法
2016/09/22 PHP
laravel5表单唯一验证的实例代码
2019/09/30 PHP
解决laravel资源加载路径设置的问题
2019/10/14 PHP
JS 控制小数位数的实现代码
2011/08/02 Javascript
js实现jquery的offset()方法实例
2015/01/10 Javascript
针对初学者的jQuery入门指南
2015/08/15 Javascript
javascript编程异常处理实例小结
2015/11/30 Javascript
图文详解Javascript中的上下文和作用域
2017/02/15 Javascript
Angularjs实现上传图片预览功能
2017/09/01 Javascript
JavaScript编程设计模式之构造器模式实例分析
2017/10/25 Javascript
详解使用jQuery.i18n.properties实现js国际化
2018/05/04 jQuery
Javascript实现秒表倒计时功能
2018/11/17 Javascript
koa router 多文件引入的方法示例
2019/05/22 Javascript
JS数组方法push()、pop()用法实例分析
2020/01/18 Javascript
[00:43]FTP典藏礼包 DOTA2三大英雄霸气新套装
2014/03/21 DOTA
跟老齐学Python之不要红头文件(1)
2014/09/28 Python
Python实现二分查找算法实例
2015/05/26 Python
解决python2.7用pip安装包时出现错误的问题
2017/01/23 Python
Python中shapefile转换geojson的示例
2019/01/03 Python
python交换两个变量的值方法
2019/01/12 Python
Python3使用PySynth制作音乐的方法
2019/09/09 Python
Python SSL证书验证问题解决方案
2020/01/13 Python
Python requests模块安装及使用教程图解
2020/06/30 Python
详解python方法之绑定方法与非绑定方法
2020/08/17 Python
python实现学生信息管理系统(精简版)
2020/11/27 Python
巴西香水和化妆品购物网站:The Beauty Box
2019/09/03 全球购物
师范生实习个人的自我评价
2013/09/28 职场文书
竞选班干部演讲稿
2014/04/24 职场文书
机械设备与数控技术专业求职信
2014/08/10 职场文书
2014年信息技术工作总结
2014/12/16 职场文书
运动会闭幕词
2015/01/28 职场文书
年会邀请函范文
2015/01/30 职场文书