如下是即时到帐的接口整合thinkphp3.2.3 不过一样适合批量付款接口php
这里对如下长长的论文总结html
一、下载到支付宝接口源码-复制 alipay_core.function.php、alipay_md5.function.php、alipay_notify.class.php、alipay_submit.class.php 这四个文件重命名并复制到ThinkPHP/Library/Vendor/Batchpay(本身建立的文件夹)
mysql
二、新建控制器用vendor加载类文件
web
三、去除对应的require_once
sql
四、notify_url.php alipayapi.php 这两个文件封装成两个方法。
thinkphp
===============无情的分割线================数据库
thinkphp3.2.3 成功对接支付宝接口,thinkphp小巧开源的一款框架 博主仍是比较看好了 今天须要作个项目 看了下 官方的一些文档 对3.2的支付宝的教程
首先登录支付宝集成接口的地址 下载你须要的文档
https://doc.open.alipay.com/doc2/detail?treeId=62&articleId=103566&docType=1
ok下载下来文档 压缩包内 2个文件夹
分别是
MD5签名版本和 RSA签名版本
本人愚见 web开发用 md5 app 选择RSA签名 因此咱们选择 md5签名版本
api
相对于之前 asp 已被成功的抛弃!哈哈哈哈哈 选择本身的程序 和对应的编码
我是用的create_direct_pay_by_user-PHP-UTF-8 文件夹下的
ok 下一步 找到你的项目的 ThinkPHP\Library\Vendor\ 下 打开
新建立文件夹 Alipay 注意大小写
而后 [code]alipay_core.function.php重命名为:Corefunction.php;
alipay_md5.function.php重命名为:Md5function.php;
alipay_notify.class.php重命名为:Notify.php;
alipay_submit.class.php重命名为:Submit.php;
//而后,打开Submit.php文件,把如下代码去掉;
require_once("alipay_core.function.php");
require_once("alipay_md5.function.php");
//一样,打开Notify.php文件,把如下两段代码去掉
require_once("alipay_core.function.php");
require_once("alipay_md5.function.php");
复制代码
数组
一、在配置文件中Conf/Config.php文件中对支付宝相关参数进行配置:代码以下服务器
//支付宝配置参数
'alipay_config'=>array(
'partner' =>'20********50', //这里是你在成功申请支付宝接口后获取到的PID;
'key'=>'9t***********ie',//这里是你在成功申请支付宝接口后获取到的Key
'sign_type'=>strtoupper('MD5'),
'input_charset'=> strtolower('utf-8'),
'cacert'=> getcwd().'\\cacert.pem',
'transport'=> 'http',
),
//以上配置项,是从接口包中alipay.config.php 文件中复制过来,进行配置;
'alipay' =>array(
//这里是卖家的支付宝帐号,也就是你申请接口时注册的支付宝帐号
'seller_email'=>'pay@xxx.com',
//这里是异步通知页面url,提交到项目的Pay控制器的notifyurl方法;
'notify_url'=>'http://www.liuyuyao.com/Pay/notifyurl',
//这里是页面跳转通知url,提交到项目的Pay控制器的returnurl方法;
'return_url'=>'http://www.liuyuyao.com/Pay/returnurl',
//支付成功跳转到的页面,我这里跳转到项目的User控制器,myorder方法,并传参payed(已支付列表)
'successpage'=>'User/myorder?ordtype=payed',
//支付失败跳转到的页面,我这里跳转到项目的User控制器,myorder方法,并传参unpay(未支付列表)
'errorpage'=>'User/myorder?ordtype=unpay',
),
复制代码
二、新建一个PayController代码以下:位置是你的项目的Controller 下 不懂的本身去看手册
代码以下
<?php
namespace Home\Controller;
use Think\Controller;
class PayController extends Controller {
//在类初始化方法中,引入相关类库
public function _initialize() {
vendor('Alipay.Corefunction');
vendor('Alipay.Md5function');
vendor('Alipay.Notify');
vendor('Alipay.Submit');
}
//doalipay方法
/*该方法其实就是将接口文件包下alipayapi.php的内容复制过来
而后进行相关处理
*/
public function doalipay(){
/*********************************************************
把alipayapi.php中复制过来的以下两段代码去掉,
第一段是引入配置项,
第二段是引入submit.class.php这个类。
为何要去掉??
第一,配置项的内容已经在项目的Config.php文件中进行了配置,咱们只需用C函数进行调用便可;
第二,这里调用的submit.class.php类库咱们已经在PayAction的_initialize()中已经引入;因此这里再也不须要;
*****************************************************/
// require_once("alipay.config.php");
// require_once("lib/alipay_submit.class.php");
//这里咱们经过TP的C函数把配置项参数读出,赋给$alipay_config;
$alipay_config=C('alipay_config');
/**************************请求参数**************************/
$payment_type = "1"; //支付类型 //必填,不能修改
$notify_url = C('alipay.notify_url'); //服务器异步通知页面路径
$return_url = C('alipay.return_url'); //页面跳转同步通知页面路径
$seller_email = C('alipay.seller_email');//卖家支付宝账户必填
$out_trade_no = $_POST['trade_no'];//商户订单号 经过支付页面的表单进行传递,注意要惟一!
$subject = $_POST['ordsubject']; //订单名称 //必填 经过支付页面的表单进行传递
$total_fee = $_POST['ordtotal_fee']; //付款金额 //必填 经过支付页面的表单进行传递
$body = $_POST['ordbody']; //订单描述 经过支付页面的表单进行传递
$show_url = $_POST['ordshow_url']; //商品展现地址 经过支付页面的表单进行传递
$anti_phishing_key = "";//防钓鱼时间戳 //若要使用请调用类文件submit中的query_timestamp函数
$exter_invoke_ip = get_client_ip(); //客户端的IP地址
/************************************************************/
//构造要请求的参数数组,无需改动
$parameter = array(
"service" => "create_direct_pay_by_user",
"partner" => trim($alipay_config['partner']),
"payment_type" => $payment_type,
"notify_url" => $notify_url,
"return_url" => $return_url,
"seller_email" => $seller_email,
"out_trade_no" => $out_trade_no,
"subject" => $subject,
"total_fee" => $total_fee,
"body" => $body,
"show_url" => $show_url,
"anti_phishing_key" => $anti_phishing_key,
"exter_invoke_ip" => $exter_invoke_ip,
"_input_charset" => trim(strtolower($alipay_config['input_charset']))
);
//创建请求
$alipaySubmit = new \ AlipaySubmit($alipay_config);
$html_text = $alipaySubmit->buildRequestForm($parameter,"post", "确认");
echo $html_text;
}
/******************************
服务器异步通知页面方法
其实这里就是将notify_url.php文件中的代码复制过来进行处理
*******************************/
function notifyurl(){
/*
同理去掉如下两句代码;
*/
//require_once("alipay.config.php");
//require_once("lib/alipay_notify.class.php");
//这里仍是经过C函数来读取配置项,赋值给$alipay_config
$alipay_config=C('alipay_config');
//计算得出通知验证结果
$alipayNotify = new \ AlipayNotify($alipay_config);
$verify_result = $alipayNotify->verifyNotify();
if($verify_result) {
//验证成功
//获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
$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(!checkorderstatus($out_trade_no)){
orderhandle($parameter);
//进行订单处理,并传送从支付宝返回的参数;
}
}
echo "success"; //请不要修改或删除
}else {
//验证失败
echo "fail";
}
}
/*
页面跳转处理方法;
这里其实就是将return_url.php这个文件中的代码复制过来,进行处理;
*/
function returnurl(){
//头部的处理跟上面两个方法同样,这里不罗嗦了!
$alipay_config=C('alipay_config');
$alipayNotify = new \ AlipayNotify($alipay_config);//计算得出通知验证结果
$verify_result = $alipayNotify->verifyReturn();
if($verify_result) {
//验证成功
//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表
$out_trade_no = $_GET['out_trade_no']; //商户订单号
$trade_no = $_GET['trade_no']; //支付宝交易号
$trade_status = $_GET['trade_status']; //交易状态
$total_fee = $_GET['total_fee']; //交易金额
$notify_id = $_GET['notify_id']; //通知校验ID。
$notify_time = $_GET['notify_time']; //通知的发送时间。
$buyer_email = $_GET['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($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
if(!checkorderstatus($out_trade_no)){
orderhandle($parameter); //进行订单处理,并传送从支付宝返回的参数;
}
$this->redirect(C('alipay.successpage'));//跳转到配置项中配置的支付成功页面;
}else {
echo "trade_status=".$_GET['trade_status'];
$this->redirect(C('alipay.errorpage'));//跳转到配置项中配置的支付失败页面;
}
}else {
//验证失败
//如要调试,请看alipay_notify.php页面的verifyReturn函数
echo "支付失败!";
}
}
}
?>
}
复制代码
这儿说下 有不少朋友Class 'Home\Controller\AlipaySubmit' not found 发生过如下的错误
执行new方法实例化的时候就报错
Class 'Home\Controller\Alipay' not found
其实这样的 须要在你的 $alipaySubmit = new AlipaySubmit($alipay_config); 等等 new 后面加一个 /
三、这里有几个支付处理过程当中须要用到的函数,我把这些函数写到了项目的Common/common.php中没有的本身建立 固然你也开业写到其余位置
<?
//在线交易订单支付处理函数
//函数功能:根据支付接口传回的数据判断该订单是否已经支付成功;
//返回值:若是订单已经成功支付,返回true,不然返回false;
function checkorderstatus($ordid){
$Ord=M('Orderlist');
$ordstatus=$Ord->where('ordid='.$ordid)->getField('ordstatus');
if($ordstatus==1){
return true;
}else{
return false;
}
}
//处理订单函数
//更新订单状态,写入订单支付后返回的数据
function orderhandle($parameter){
$ordid=$parameter['out_trade_no'];
$data['payment_trade_no'] =$parameter['trade_no'];
$data['payment_trade_status'] =$parameter['trade_status'];
$data['payment_notify_id'] =$parameter['notify_id'];
$data['payment_notify_time'] =$parameter['notify_time'];
$data['payment_buyer_email'] =$parameter['buyer_email'];
$data['ordstatus'] =1;
$Ord=M('Orderlist');
$Ord->where('ordid='.$ordid)->save($data);
}
/*-----------------------------------
2013.8.13更正
下面这个函数,其实不须要,你们能够把他删掉,
具体看我下面的修正补充部分的说明
------------------------------------*/
//获取一个随机且惟一的订单号;
function getordcode(){
$Ord=M('Orderlist');
$numbers = range (10,99);
shuffle ($numbers);
$code=array_slice($numbers,0,4);
$ordcode=$code[0].$code[1].$code[2].$code[3];
$oldcode=$Ord->where("ordcode='".$ordcode."'")->getField('ordcode');
if($oldcode){
getordcode();
}else{
return $ordcode;
}
}
复制代码
访问 Pay下的doalipay 弹出支付错误 这样基本没有问题了
由于你的 config里面的签约的一些信息没有正确配置 须要本身申请配置之后
还差一个订单记录的数据库
打开你的mysql 运行 sql 记得修改数据库前缀
CREATE TABLE `liuyuao_orderlist` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`userid` int(11) DEFAULT NULL,
`username` varchar(255) DEFAULT NULL,
`ordid` varchar(255) DEFAULT NULL,
`ordtime` int(11) DEFAULT NULL,
`productid` int(11) DEFAULT NULL,
`ordtitle` varchar(255) DEFAULT NULL,
`ordbuynum` int(11) DEFAULT '0',
`ordprice` float(10,2) DEFAULT '0.00',
`ordfee` float(10,2) DEFAULT '0.00',
`ordstatus` int(11) DEFAULT '0',
`payment_type` varchar(255) DEFAULT NULL,
`payment_trade_no` varchar(255) DEFAULT NULL,
`payment_trade_status` varchar(255) DEFAULT NULL,
`payment_notify_id` varchar(255) DEFAULT NULL,
`payment_notify_time` varchar(255) DEFAULT NULL,
`payment_buyer_email` varchar(255) DEFAULT NULL,
`ordcode` varchar(255) DEFAULT NULL,
`isused` int(11) DEFAULT '0',
`usetime` int(11) DEFAULT NULL,
`checkuser` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
)
文章来源于: http://www.thinkphp.cn/topic/39616.html