ThinkPHP整合支付宝即时到账接口调用
首先是在支付宝的蚂蚁金服开放平台下载PHP的demo:
https://doc.open.alipay.com/doc2/detail?treeId=62&articleId=103566&docType=1
下载地址如上,里面有个MD5加密方式UTF8的PHP的demo可以拿来用,可以直接在localhost上跑,传入合适的参数即使体验支付一次,这点和微信支付接口调用的demo相同。
现在我们尝试将其中demo的lib类文件整合到thinkphp之中去。
将四个lib改名放入Vendor文件夹:(文件在我的文件之中),相比官方demo仅仅改动里面的PHP文件include

点击支付并传入订单ID:
public function pay_request()
{
$id = intval($_GET['order_id']);//传入订单ID
if($id){
$o = D('order_info');
$order_info = $o->where('order_id = %d',$id)->find();//查询出所有订单信息
if(empty($order_info['paycode'])){
$order_info['paycode'] = 'Alipay';
}
$class = 'Com\\Pay\\'.$order_info['paycode'];
// import($path);
$pay = new $class;//实例化支付宝类
$pay->getCode($order_info);
}
}
类文件:
Alipay.class.php:
在alipay里面引用vendor文件夹里面类库文件操作:
/**
* 引入支付宝
*/
vendor('Alipay.Corefunction');
vendor('Alipay.Md5function');
vendor('Alipay.Notify');
vendor('Alipay.Submit');
在这里复习一下ThinkPHP之中第三方类库的引用:
1、当你把类文件放在liberary下面的任意一个文件夹时候,比如alipay.class.php,给他加上相应文件夹对应的命名空间就可以直接实例化;
保存到 ThinkPHP/Library/Org/Util/Auth.class.php。
namespace Org\Util;class Auth { }
引用:
new \Org\Util\Auth();
此时系统会自动加载那个类文件并进行实例化。
2、注册命名空间(自己在任意位置(用常量写出绝对路径)创建文件夹并且声明为一个命名空间);类库映射(命名空间过多导致类文件加载慢)加快类文件的加载。这两个不考虑使用,仅作了解。
3、第三方类库文件的引用,比如上面的vendor文件夹下面的Alipay文件夹下面的四个类文件(里面连namespace都木有,直接就是class{###}),引用有两种方法:第一种是在任意文件夹下面乱放,然后用import方法
// 导入Org类库包 Library/Org/Util/Date.class.php类库import("Org.Util.Date"); // 导入Home模块下面的 Application/Home/Util/UserUtil.class.php类库import("Home.Util.UserUtil"); // 导入当前模块下面的类库 import("@.Util.Array"); // 导入Vendor类库包 Library/Vendor/Zend/Server.class.phpimport('Vendor.Zend.Server');
这个我们不考虑如何具体使用,我们以后规定,统统放在vendor文件夹下面,然后我们就用一个方便的方法引用类文件,
如果你的第三方类库都放在Vendor目录下面,并且都以.php为类文件后缀,也没用采用命名空间的话,那么可以使用系统内置的Vendor函数简化导入。例如,我们把 Zend 的 Filter\Dir.php 放到 Vendor 目录下面,这个时候 Dir 文件的路径就是 Vendor\Zend\Filter\Dir.php,我们使用vendor 方法导入只需要使用:
Vendor('Zend.Filter.Dir'); 具体看看上面alipay四个类文件的引用;
'YUMING' => 'https://www.homewide.cn',
<?php
namespace Com\Pay;
class Alipay
{
private $config;
public function __construct($config = null)
{
if($config){
$this->config = unserialize($config);
}else{
$this->config = array(
'pid'=>'**卖家申请成功后得到的PID****',
'key'=>'**卖家申请成功后获取的key**',
'seller_email'=>'***卖家支付宝账号**',
'notify_url'=>(C('YUMING').U('Home/Login/pay_respone')),//C(‘yunyin’)这个常量是网址www.haveadream.win
'return_url'=>(C('YUMING').U('Home/User/my_order')),
);
}
//这里我们通过TP的C函数把配置项参数读出,赋给$alipay_config;
$this->config['alipay_config'] = array(
'partner' =>$this->config['pid'], //这里是你在成功申请支付宝接口后获取到的PID;
'key'=>$this->config['key'],//这里是你在成功申请支付宝接口后获取到的Key
'sign_type'=>strtoupper('MD5'),
'input_charset'=> strtolower('utf-8'),
// 'cacert'=> getcwd().'\\domain.crt',
'cacert'=> getcwd().'\\cacert.pem',
'transport'=> 'http',
);
/**
* 引入支付宝
*/
vendor('Alipay.Corefunction');
vendor('Alipay.Md5function');
vendor('Alipay.Notify');
vendor('Alipay.Submit');
}
/*生成支付按钮*/
public function getCode($order_info)//跑这个方法的时候就已经在construct函数里面将config数据传递进去了
{
/*********************************************************
把alipayapi.php中复制过来的如下两段代码去掉,
第一段是引入配置项,
第二段是引入submit.class.php这个类。
为什么要去掉??
第一,配置项的内容已经在项目的Config.php文件中进行了配置,我们只需用C函数进行调用即可;
第二,这里调用的submit.class.php类库我们已经在PayAction的_initialize()中已经引入;所以这里不再需要;
*****************************************************/
/**************************请求参数**************************/
$payment_type = "1"; //支付类型 //必填,不能修改
$notify_url = $this->config['notify_url']; //服务器异步通知页面路径
$return_url = $this->config['return_url']; //页面跳转同步通知页面路径
$seller_email = $this->config['seller_email'];//卖家支付宝帐户必填
$out_trade_no = $order_info['order_sn'];//商户订单号 通过支付页面的表单进行传递,注意要唯一!
$subject = '家安采购订单'; //订单名称 //必填 通过支付页面的表单进行传递
$total_fee = $order_info['pay_money']; //付款金额 //必填 通过支付页面的表单进行传递
//$total_fee = 0.01; //付款金额 //必填 通过支付页面的表单进行传递
$body = '采购上家安'; //订单描述 通过支付页面的表单进行传递
$show_url = ''; //商品展示地址 通过支付页面的表单进行传递
$anti_phishing_key = "";//防钓鱼时间戳 //若要使用请调用类文件submit中的query_timestamp函数
$exter_invoke_ip = get_client_ip(); //客户端的IP地址,这个方法是ThinkPHP之中自带的方法的
//商品数量
$quantity = "1";
//必填,建议默认为1,不改变值,把一次交易看成是一次下订单而非购买一件商品
//物流费用
$logistics_fee = "0.00";
//必填,即运费
//物流类型
$logistics_type = "EXPRESS";
//必填,三个值可选:EXPRESS(快递)、POST(平邮)、EMS(EMS)
//物流支付方式
$logistics_payment = "SELLER_PAY";
//必填,两个值可选:SELLER_PAY(卖家承担运费)、BUYER_PAY(买家承担运费)
//订单描述
//收货人姓名
$receive_name = $order_info['consignee'];
//如:张三
//收货人地址
$receive_address = 'XX省XXX市XXX区XXX路XXX小区XXX栋XXX单元XXX号';
//如:XX省XXX市XXX区XXX路XXX小区XXX栋XXX单元XXX号
//收货人邮编
$receive_zip = '123456';
//如:123456
//收货人电话号码
$receive_phone = '0000-0000000';
//如:0571-88158090
//收货人手机号码
$receive_mobile = '13***21';
//如:13312341234
/************************************************************/
//构造要请求的参数数组,无需改动
$parameter = array(
"service" => "create_direct_pay_by_user",
"partner" => trim($this->config['pid']),
"payment_type" => $payment_type,
"notify_url" => $notify_url,
"return_url" => $return_url,
"seller_email" => $seller_email,
"out_trade_no" => $out_trade_no,
"subject" => $subject,
"price" => $total_fee,
"quantity" => $quantity,
"logistics_fee" => $logistics_fee,
"logistics_type" => $logistics_type,
"logistics_payment" => $logistics_payment,
"body" => $body,
"show_url" => $show_url,
"receive_name" => $receive_name,
"receive_address" => $receive_address,
"receive_zip" => $receive_zip,
"receive_phone" => $receive_phone,
"receive_mobile" => $receive_mobile,
"_input_charset" => trim(strtolower($this->config['alipay_config']['input_charset']))
);
// var_dump($parameter);die;
// var_dump($parameter);die;
//建立请求
$alipaySubmit = new \AlipaySubmit($this->config['alipay_config']);
$html_text = $alipaySubmit->buildRequestForm($parameter,"post", "");
echo $html_text;die;
}
public function respone()
{
// file_put_contents('./pay.txt',var_export($_REQUEST,true));
/*
同理去掉以下两句代码;
*/
//require_once("alipay.config.php");
//require_once("lib/alipay_notify.class.php");
//计算得出通知验证结果
$alipayNotify = new \AlipayNotify($this->config['alipay_config']);
$verify_result = $alipayNotify->verifyNotify();
// if(!$verify_result){
// file_put_contents('./pay.txt','验证失败',FILE_APPEND);
// }else{
// file_put_contents('./pay.txt','验证成功!',FILE_APPEND);
// }
if($verify_result) {
// file_put_contents('./pay.txt','进来了',FILE_APPEND);
//验证成功
//获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
$out_trade_no = $_POST['out_trade_no']; //商户订单号
$trade_no = $_POST['trade_no']; //支付宝交易号
$trade_status = $_POST['trade_status']; //交易状态
$total_fee = $_POST['total_fee']; //交易金额
$notify_id = $_POST['notify_id']; //通知校验ID。
$notify_time = $_POST['notify_time']; //通知的发送时间。格式为yyyy-MM-dd HH:mm:ss。
$buyer_email = $_POST['buyer_email']; //买家支付宝帐号;
$parameter = array(
"out_trade_no" => $out_trade_no, //商户订单编号;
"trade_no" => $trade_no, //支付宝交易号;
"total_fee" => $total_fee, //交易金额;
"trade_status" => $trade_status, //交易状态
"notify_id" => $notify_id, //通知校验ID。
"notify_time" => $notify_time, //通知的发送时间。
"buyer_email" => $buyer_email, //买家支付宝帐号;
);
if($_POST['trade_status'] == 'TRADE_FINISHED') {
}else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
if(!check_order_status($out_trade_no)){
// file_put_contents('./pay.txt','1进来了',FILE_APPEND);
$data = array(
'order_sn'=>$out_trade_no,
'des'=>('订单交易:'.$out_trade_no),
'money'=>$total_fee,
);
orderhandle($data);
//进行订单处理,并传送从支付宝返回的参数;
}
}
echo "success"; //请不要修改或删除
}else {
//验证失败
echo "fail";
// file_put_contents('./pay.txt',var_export($verify_result,true),FILE_APPEND);
// file_put_contents('./pay.txt',var_export($this->config,true),FILE_APPEND);
file_put_contents('./pay.txt','验证失败',FILE_APPEND);
}
}
}
?>
U('Home/Login/pay_respone')://服务器异步通知页面路径
public function pay_respone()
{
// file_put_contents('./pay.txt',var_export($_REQUEST,true));
if(IS_POST){
$o = D('order_info');
$order_info = $o->where('order_sn = "%s"',$_POST['out_trade_no'])->find();
if(empty($order_info['paycode'])){
$order_info['paycode'] = 'Alipay';
}
$class = 'Com\\Pay\\'.$order_info['paycode'];
// import($path);
$pay = new $class;
$pay->respone();
}
}
U('Home/User/my_order')://页面跳转同步通知页面路径
public function my_order(){
/* 取出左边分类栏目start */
$c = D('category');
$left_menu = $c->get_category();
$this->assign('category_menu',$left_menu);
/* 取出左边分类栏目end */
//取出该采购商所有订单信息
$o = D('order_info');
$list = $o->getList();
$page = $o->getPage();
$countNum = $o->getCount();
// var_dump($res);
$this->assign('list',$list);
$this->assign('page',$page);
$this->assign('countNum',$countNum);
//获取总金额
$this->assign('countMoney',sprintf('%.2f',$o->get_order_count_num()));
$other = array(
'is_submit'=>$o->get_order_num('is_submit'),
'is_send'=>$o->get_order_num('is_send'),
'is_ok'=>$o->get_order_num('is_ok'),
'is_cancel'=>$o->get_order_num('is_cancel'),
);
$this->assign($other);
$this->display();
}
上面就是所有的alipay的接口调用,以及回调数据处理了
付款成功跳转的HTML:
<div class="status">
<ul class="title_tab">
<li id="btn_alreadyCommit" onclick="location.href='{:U('User/my_order',array('other'=>'is_submit'))}'" class="li <?php if($_GET['other'] == 'is_submit'){echo 'cur';} ?>" style="cursor:pointer">已提交<em class="f_bold c_f00">({$is_submit})</em></li>
<li id="btn_alreadySure" onclick="location.href='{:U('User/my_order',array('other'=>'is_send'))}'" class="li <?php if($_GET['other'] == 'is_send'){echo 'cur';} ?>" style="cursor:pointer">已发货<em class="f_bold c_f00">({$is_send})</em></li>
<li id="btn_alreadyComplay" class="li <?php if($_GET['other'] == 'is_ok'){echo 'cur';} ?>" onclick="location.href='{:U('User/my_order',array('other'=>'is_ok'))}'" style="cursor:pointer">交易完成<em class="f_bold c_f00">({$is_ok})</em></li>
<li id="btn_alreadyCancel" onclick="location.href='{:U('User/my_order',array('other'=>'is_cancel'))}'" class="li <?php if($_GET['other'] == 'is_cancel'){echo 'cur';} ?>" style="cursor:pointer">已取消<em class="f_bold c_f00">({$is_cancel})</em></li>
</ul>
</div>

更详细参考文档:
http://www.thinkphp.cn/code/240.html
说了那么多,四个官方给的lib里面的类文件还是得看啊,兄弟!!!
ThinkPHP整合支付宝即时到账接口调用的更多相关文章
- PHP九大接口视频教程( 支付宝,QQ,短信接口,微信接口开发, 支付宝即时到账接口开发三级分销全套)
PHP九大接口视频教程( 支付宝,QQ,短信接口,微信接口开发, 支付宝即时到账接口开发三级分销全套) 需要的联系我:QQ: 1844912514 PHP九大接口视频教程( 支付宝,QQ,短信接口 ...
- thinkphp框架对接支付宝即时到账接口回调的代码
关于支付宝即时收款接口的对接过程,很简单,也有很多人发过,我这里就不在啰嗦了,对接完成后,在线支付成功后的回调,相对来说,是个难点,,我重点分享下我的经验. 我在开发二代旅游CMS(http://ww ...
- ThinkPHP 3.2 支付宝即时到账接口开发
前言: 一.支付流程 构造请求参数 向支付宝网关发送请求 生成支付宝页面 支付宝交易结果 二.构建支付类 1.官方即时到账文档地址: https://doc.open.alipay.com/doc2/ ...
- 支付宝即时到账接口开发 - DEMO讲解
支付宝即时到帐接口 环境要求 PHP5.0以上,且需要开启curl.openssl. 文档地址: https://doc.open.alipay.com/doc2/detail?treeId=62&a ...
- thinkPHP 接支付宝及时到账接口
支付宝及时到帐接口,现在整理以下: 1.先将支付宝提供的公共类库函数库文件防盗thinkPHP的Vender目录下建的一个alipay文件下,以便之后的调用. //四个文件我分别给他们改了下名字,因为 ...
- PHP实现支付宝即时到账功能
本文实例为大家分享了PHP支付宝即时到账功能的实现代码,供大家参考,具体内容如下 首先需要下载即时到账交易接口,传送门https://doc.open.alipay.com/doc2/detail?t ...
- ***CodeIgniter框架集成支付宝即时到账支付SDK
本文为CI集成支付宝即时到账支付接口 1.下载支付宝官方demo ;即时到账交易接口(create_direct_pay_by_user)(DEMO下载) 原文地址:https://doc.open. ...
- PHP 接入支付宝即时到账功能
首先请到支付宝那边申请一个及时到账的接口账户,需要提交相关材料申请.然后根据即时到账的API文档进行接入.API文档提供了各种语言版本的demo,我这里是下的php版demo,然后再进行相关修改操作. ...
- *CodeIgniter框架集成支付宝即时到账SDK
客户的网站需要支付功能,我们选择了业界用的最多的支付宝即时到账支付.申请了两次将近两周的时间终于下来了,于是我开始着手测试SDK整合支付流程. SDK中的代码并不复杂,就是构造请求发送,接收并验证签名 ...
随机推荐
- dropdownlist 控件的判断
问题: 三个级联 下拉框.在不点击第一级别直接点击第二级别时,弹出提示窗口."请先选择XXX"之类的,理想的结果是想要下图 这样的: 由于使用的微信公众号的内置浏览器,所以问题来了 ...
- Ibatis 异常:Unable to open connection to "oledb , provider V2.0.0.0 in framework .NET V2.0".
在实际项目中使用了ibatis,然后在开发过程中遇到一些问题,最严重的就是这个“Unable to open connection to "Microsoft SQL Server, pro ...
- 字符串属性使用strong的原因
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- windows Phone 浏览器窗口的尺寸
移动设备的屏幕一般都比PC小很多,移动设备的浏览器会将一个较大的 “虚拟” 窗口映射到移动设备的屏幕上,然后按一定的比例(3:1或2:1)进行缩放.也就是说当我们加载一个普通网页的时候,移动浏览器 ...
- 初探接口测试框架--python系列7
点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是 ...
- C语言学习笔记(1):Hello World!
#include <stdio.h> void main() { printf("Hello World!\n"); } 几乎学习任何语言接触到的第一个语言都是Hell ...
- [神器推荐]node-webkit:跨平台桌面web应用的神器,非常有用(转)
11月8号在清华拍的银杏树 http://finalshares.com/read-931
- Android开发-API指南-任务和回退栈
Task and Back Stack 英文原文: http://developer.android.com/guide/components/tasks-and-back-stack.html 采集 ...
- Node.js log4js日志记录
这次需要给之前弄的文件服务器添加日志记录,一般每天产生的日志会特别多所以安装日期来划分是最好的,这里我用了express框架,为了适应express框架这里在log.js文件中写了use方法. //日 ...
- 能在手机播放的Flash代码
有些使用Flash的广告图片变换代码在手机不支持,在网上搜到了一个解决的方法: Flash嵌入处: <iframe style="width:474px;height:276px; b ...