支付宝即时到账DEMO配置与使用
支付宝网页即时到账功能,可让用户在线向开发者的支付宝账号支付资金,交易资金即时到账,帮助开发者快速回笼资金。
当用户进行支付操作时候可以直接跳转到支付宝支付页面进行支付


1. 准备
关于支付宝签约即时到账和PID获取、密钥生成这里不做叙述,官方文档步骤也很清楚:传送门
支付宝即时到账DEMO下载:下载
2. DEMO目录结构

简单使用需要的文件说明
./alipay.config.php --- 配置文件
./alipayapi.php ------- 接口文件
./notify_url.php ------ 服务器异步通知文件
./return_url.php ----- 服务器同步跳转文件
./log.txt -------------- 日志
3. 配置alipay.config.php
在配置文件中有详细的说明,主要配置有
$alipay_config['partner'] = '208862160xxxxxxx'; // 合作者身份ID $alipay_config['private_key'] = "xxxxxxxxxxxxx”; // 商户的私钥,此处填写原始私钥去头去尾 $alipay_config['notify_url'] = "http://xxxx/alipay/notify_url.php"; // 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 $alipay_config['return_url'] = "http://xxxx/alipay/return_url.php"; // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
其他配置按实际情况配置
4. 前端支付请求
请求一般都是form表单post请求alipayapi.php,涉及到金钱操作的我们都要小心严谨,这种请求代码需要封装到后端,不能前端展示出来
例如,我们可以后端封装个方法来进行处理,请求这个方法将代码echo到页面直接进行二次跳转
/**
* 支付宝支付
* @param string $id ID
*/
public function getAlipayParam($id)
{
$form = <<<FORM
<form style='display: none;' action='提交URL' name='payForm' method='post'>
<input name='WIDout_trade_no' value='订单编号'>
<input name='WIDsubject' value='订单名称'>
<input name='WIDtotal_fee' value='金额'>
<input name='WIDbody' value='商品描述'>
<input name='extra_common_param' value='公共回参'>
</form>
<script>
function submitForm() {
document.payForm.submit();
}
submitForm();
</script>
FORM;
echo $form;
}
在DEMO中(alipay.php)接受的请求参数并不多,实际上请求参数是很全面的:请求参数列表
我们可以根据实际需求进行扩展,实际开发中为了安全,请求的name可以适当的进行改变
/**************************请求参数**************************/
//商户订单号,商户网站订单系统中唯一订单号,必填
$out_trade_no = $_POST['WIDout_trade_no'];
//订单名称,必填
$subject = $_POST['WIDsubject'];
//付款金额,必填
$total_fee = $_POST['WIDtotal_fee'];
//商品描述,可空
$body = $_POST['WIDbody'];
//公共回传参数
$extra_common_param = $_POST['extra_common_param'];
5. 支付
跳转到支付页面进行支付
6. 支付结果异步处理
关于异步通知的参数:服务器异步通知参数列表
前面提到异步通知请求到notify_url.php(根据个人配置)
异步通知主要负责处理支付结果的业务逻辑,这个需要自己根据项目需求更改编写
例如
<?php
/* *
* 功能:支付宝服务器异步通知页面
* 版本:3.5
* 日期:2016-06-25
* 说明:
* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
* 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
*************************页面功能说明*************************
* 创建该页面文件时,请留心该页面文件中无任何HTML代码及空格。
* 该页面不能在本机电脑测试,请到服务器上做测试。请确保外部可以访问该页面。
* 该页面调试工具请使用写文本函数logResult,该函数已被默认关闭,见alipay_notify_class.php中的函数verifyNotify
* 如果没有收到该页面返回的 success 信息,支付宝会在24小时内按一定的时间策略重发通知
*/
require_once("alipay.config.php");
require_once("admin.config.php");
require_once("lib/alipay_notify.class.php");
require_once("log.php");
//计算得出通知验证结果
$alipayNotify = new AlipayNotify($alipay_config);
$verify_result = $alipayNotify->verifyNotify();
//初始化日志
$logHandler = new CLogFileHandler('logs/'.date('y-m-d').'.log');
$log = Log::Init($logHandler, 15);
if($verify_result) {//验证成功
Log::DEBUG(json_encode($_POST));
// 操作类型
$extra_common_param = $_POST['extra_common_param'];
// 订单编号
$code = $_POST['out_trade_no'];
// 支付宝交易号
$trade_no = $_POST['trade_no'];
// 交易状态
$trade_status = $_POST['trade_status'];
/**
* 判断交易状态
* ------------------------------------------------------------------------
* 判断该笔订单是否在商户网站中已经做过处理
* 如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
* 请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
* 如果有做过处理,不执行商户的业务程序
* ------------------------------------------------------------------------
* 调试用,写文本函数记录程序运行情况是否正常
* logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
*/
if ($trade_status == 'TRADE_FINISHED') {
//注意:退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
} elseif ($trade_status == 'TRADE_SUCCESS') {
//注意:付款完成后,支付宝系统发送该交易状态通知
switch ($extra_common_param) {
case AdminConfig::OPER_PLACE_ORDER:
// 判断该订单是否处理过
$url = AdminConfig::BACKOFFICE_URL . 'xxx/xxx/xxx/' . $code . '/outtradeNo/' . $trade_no;
$is_order = request($url);
if ($is_order == 'success') { // 订单未处理
// 修改订单的相关状态为已支付
$url = AdminConfig::BACKOFFICE_URL . 'xxx/xxx/xxx/' . $code . '/outtradeNo/' . $trade_no;
request($url);
}
break;
case AdminConfig::OPER_RECHARGE:
//修改充值订单支付状态为已支付
$id = $_POST['out_trade_no'];
$outtrade_no = $_POST['trade_no'];
$money = $_POST['total_fee'];
$url = AdminConfig::ORDER_URL . 'xxx/xxx/id/'.$id.'/money/'.$money.'/outtradeno/'.$outtrade_no;
request($url);
break;
}
}
echo "success"; //请不要修改或删除
}
else {
//验证失败
echo "fail";
}
/**
* 发送请求
* @param string $url 请求地址
* @param array $data 请求数据
* @param string $type 请求类型
* @param boolean $ssl 是否是HTTPS请求
* @return string 响应主体Content
*/
function request($url, $data=array(), $type='get', $ssl=false)
{
// curl请求
$curl = curl_init();
// 设置curl选项
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_AUTOREFERER, true); // referer 请求来源
curl_setopt($curl, CURLOPT_TIMEOUT, 10); // 设置超时时间
// SSL相关
if ($ssl) {
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 是否在服务端进行验证
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, '2'); // 检查服务器SSL证书中是否存在一个公用名
}
// POST请求
if ($type == 'post') {
curl_setopt($curl, CURLOPT_POST, true); // 是否为post请求
curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // 处理请求数据
}
// 处理响应结果
curl_setopt($curl, CURLOPT_HEADER, false); // 是否处理响应头
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // 是否返回响应结果
// 发送请求
$response = curl_exec($curl);
if (false === $response) {
return false;
}
return $response;
}
?>
7. 支付结果同步处理
关于同步通知的参数:服务器同步通知参数列表
前面提到同步通知请求到return_url.php(根据个人配置)
同步通知主要负责处理支付结果的结果展示,这个需要自己根据项目需求更改编写
例如
/**
* 判断该笔订单是否在商户网站中已经做过处理
* 如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
* 如果有做过处理,不执行商户的业务程序
*/
if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
// 交易成功或交易成功且订单结束
switch ($extra_common_param) {
case AdminConfig::OPER_PLACE_ORDER: // 订单支付
$url = AdminConfig::ORDER_URL . 'xxx/orderPaySuccessShow';
header("Location:$url");
break;
case AdminConfig::OPER_RECHARGE:
$url = AdminConfig::ORDER_URL . 'xxx/rechargeSuccessShow';
header("Location:$url");
break;
default:
echo 'Undefined operation type!!';
break;
}
}
else {
// 交易状态未成功
switch ($extra_common_param) {
case AdminConfig::OPER_PLACE_ORDER: // 订单支付
$url = AdminConfig::ORDER_URL . 'xxx/orderPayFailShow';
header("Location:$url");
break;
case AdminConfig::OPER_RECHARGE:
$url = AdminConfig::ORDER_URL . 'xxx/rechargeFailShow';
break;
default:
echo 'Undefined operation type!!';
break;
}
}
8. 关于交易状态

其他一些细节性问题请大家参阅官方文档,文档永远是最好的教程!
支付宝即时到账DEMO配置与使用的更多相关文章
- ***CodeIgniter框架集成支付宝即时到账支付SDK
本文为CI集成支付宝即时到账支付接口 1.下载支付宝官方demo ;即时到账交易接口(create_direct_pay_by_user)(DEMO下载) 原文地址:https://doc.open. ...
- PHP 接入支付宝即时到账功能
首先请到支付宝那边申请一个及时到账的接口账户,需要提交相关材料申请.然后根据即时到账的API文档进行接入.API文档提供了各种语言版本的demo,我这里是下的php版demo,然后再进行相关修改操作. ...
- PHP实现支付宝即时到账功能
本文实例为大家分享了PHP支付宝即时到账功能的实现代码,供大家参考,具体内容如下 首先需要下载即时到账交易接口,传送门https://doc.open.alipay.com/doc2/detail?t ...
- *CodeIgniter框架集成支付宝即时到账SDK
客户的网站需要支付功能,我们选择了业界用的最多的支付宝即时到账支付.申请了两次将近两周的时间终于下来了,于是我开始着手测试SDK整合支付流程. SDK中的代码并不复杂,就是构造请求发送,接收并验证签名 ...
- 实战 Spring MVC接入支付宝即时到账 (部分代码)
下面就拿我项目中的部分代码来实践一下. 支付请求 首先,是提交表单 fund.jsp(这里我表单只需要用户填交易金额,其他的订单号之类的全部后台生成) <form id="deposi ...
- PHP九大接口视频教程( 支付宝,QQ,短信接口,微信接口开发, 支付宝即时到账接口开发三级分销全套)
PHP九大接口视频教程( 支付宝,QQ,短信接口,微信接口开发, 支付宝即时到账接口开发三级分销全套) 需要的联系我:QQ: 1844912514 PHP九大接口视频教程( 支付宝,QQ,短信接口 ...
- 支付宝即时到账接口开发 - DEMO讲解
支付宝即时到帐接口 环境要求 PHP5.0以上,且需要开启curl.openssl. 文档地址: https://doc.open.alipay.com/doc2/detail?treeId=62&a ...
- ThinkPHP 3.2 支付宝即时到账接口开发
前言: 一.支付流程 构造请求参数 向支付宝网关发送请求 生成支付宝页面 支付宝交易结果 二.构建支付类 1.官方即时到账文档地址: https://doc.open.alipay.com/doc2/ ...
- thinkphp框架对接支付宝即时到账接口回调的代码
关于支付宝即时收款接口的对接过程,很简单,也有很多人发过,我这里就不在啰嗦了,对接完成后,在线支付成功后的回调,相对来说,是个难点,,我重点分享下我的经验. 我在开发二代旅游CMS(http://ww ...
随机推荐
- Net分布式系统之五:微服务架构
因工作较忙,抽时间将框架遇到的问题和框架升级设计进行记录. 一.背景&问题 之前框架是一个基于SOA思想设计的分布式框架.各应用通过服务方式提供使用,服务之间通信是RPC方式调用,具体实现基于 ...
- JS中常用的几种时间格式处理-【笔记整理】
//此处整理点平时常用到的时间格式处理方法 ------------------------------------------- //时间格式化函数 Date.prototype.format = ...
- 使用java API操作hdfs--读取hdfs文件并打印
在myclass之中创建类文件,这个myclass目录是自己创建的. 编译的时候会报如下的错误: 很明显就是没有导入包的结果 见这个API网站,则可以找到响应的包,当然还有java的api文档 htt ...
- 学习笔记:javascript 窗口对象(window)
1.窗口对象属性 属性 描述 closed 返回窗口是否已被关闭. defaultStatus 设置或返回窗口状态栏中的默认文本. document 对 Document 对象的只读引用.请参阅 Do ...
- String深度解析
文章出处:http://my.oschina.net/xiaohui249/blog/170013 一.引题 String类型是比较特殊的一种类型,同时也是面试经常被问到的一个知识点,本文结合java ...
- CI 图片上传路径问题的解决
很久没有用CI了,新公司需要用ci ,图片上传的功能,我都搞半天,伤心 1. 要看源码,upload.php里do_upload()是上传的主要函数. public function do_uploa ...
- 【2017-05-21】WebForm内置对象:Session、Cookie,登录和状态保持
1.Request -获取请求对象 string s =Request["key"]; 2.Response - 响应请求对象 Response.Redirect(" ...
- 18、面向对象基本原则及UML类图简介
18.1.面向对象基本原则 18.1.1.面向抽象原则 抽象类特点: a.抽象类中可以有abstract方法,也可以有非abstract方法. b.抽象类不能用new运算符创建对象. c.如果一个非抽 ...
- 用C语言模仿Python函数
首先得说明一点,C 语言不是函数式编程语言,要想进行完全的函数式编程,还得先写个虚拟机,然后再写个解释器才行(相当于 CPython ). 下面我们提供一个例子,说明 C 语言函数可以"适度 ...
- 关于微信小程序遇到的wx.request({})问题
域名请求错误问题 当我们在编写小程序,要发送请求时,wx.request({})时或许会遇到如下的问题: 一:这是因为微信小程序的开发中,域名只能是https方式请求,所以我们必须在小程序微信公众平台 ...
