PHP7中文手册2018 带注释 最新chm版
首先到支付宝官网下载支付宝接口代码:根据自己的需求选择支付宝接口,下面的为即时到账收款接口
下载地址:http://club.alipay.com/read-htm-tid-9976972.html
下 载完成解压以后。把create_direct_pay_by_user-PHP-UTF-8此文件夹中的lib目录下的四个文件复制到 Thinkphp/Vendor/下。然后创建一个目录Alipay然后粘贴到些文件夹下,也可以根据自己的情况改变文件名在action类中引入就可以
vendor('Alipay.alipay_core');
vendor('Alipay.alipay_md5');
vendor('Alipay.alipay_notify');
vendor('Alipay.alipay_submit');
1、写支付宝配置文件conf/alipay.config.php/
//支付宝配置参数'alipay_config'=>array(
'partner' =>'XXX',//这里是你在成功申请支付宝接口后获取到的PID;
'key'=>'XXXX',//这里是你在成功申请支付宝接口后获取到的Key
'sign_type'=>strtoupper('MD5'),
'input_charset'=> strtolower('utf-8'),
'cacert'=> getcwd().'\\cacert.pem',
'transport'=> 'http',
),
//以上配置项,是从接口包中alipay.config.php 文件中复制过来,进行配置;
'alipay' =>array(
//这里是卖家的支付宝账号,也就是你申请接口时注册的支付宝账号
'seller_email'=>'你的支付宝帐号',
//这里是异步通知页面url,提交到项目的Pay控制器的notifyurl方法;
'notify_url'=>'http://XXX.com/notifyurl',
//这里是页面跳转通知url,提交到项目的Pay控制器的returnurl方法;
'return_url'=>'http://XXX.com/returnurl',
//支付成功跳转到的页面,我这里跳转到项目的User控制器,myorder方法,并传参payed(已支付列表)
'successpage'=>'/Myaccount/topup/?ordtype=payed',
//支付失败跳转到的页面,我这里跳转到项目的User控制器,myorder方法,并传参unpay(未支付列表)
'errorpage'=>'XXx.com/XX/Xx?ordtype=unpay',
)
配置成功以后。下一步写一个下单html页面,然后点击跳转到
在此Action中的顶部或在入口文件中一定要写字符集;否则会出现签名不正确:
header("Content-type:text/html;charset=utf-8");我在此纠结了好长时间
public function doalipay(){
/*********************************************************
第一段是引入配置项,
第二段是引入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');
$AlipaySubmit = new AlipaySubmit();
//生成订单号
$pay_id = $alipay_config['partner'];
//生成订单号
$trade_no = '生成一个唯一订单号';
/**************************请求参数**************************/
$payment_type ="1"; //支付类型 //必填,不能修改
$notify_url =C('alipay.notify_url'); //服务器异步通知页面路径
$return_url =C('alipay.return_url'); //页面跳转同步通知页面路径
$seller_email =C('alipay.seller_email');//卖家支付宝帐户必填
$out_trade_no =$trade_no;//商户订单号 通过支付页面的表单进行传递,注意要唯一!
$total_fee =$this->_post('ordtotal_fee','intval'); //付款金额 //必填 通过支付页面的表单进行传递
$subject ='订单名称’; //订单名称 //必填 通过支付页面的表单进行传递
$body ='订单描述';//订单描述 通过支付页面的表单进行传递
$anti_phishing_key ="";//防钓鱼时间戳 //若要使用请调用类文件submit中的query_timestamp函数
$exter_invoke_ip=get_client_ip(); //客户端的IP地址
/************************************************************/
//将订单添加到数据库
$data = array(
//此处为你要插入数据库的值
)
$insert_state = $this->addOrderData($data);
//这个是插入数据库的方法(自己根据网站的需求写一个入库的方法就可以)
if ( !$insert_state ){
$this->error('添加订单失败');
}
//构造要请求的参数数组,无需改动
$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,
"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(){
//这里还是通过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(!$this->checkorderstatus($out_trade_no)){
!$this->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(!$this->checkorderstatus($out_trade_no)){
$this->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 "支付失败!";
}
}
/**
* 获取订单状态
* @param unknown_type $ordid
*/
private function checkorderstatus($ordid){
$order_M = D('Order');
$ordstatus=$order_M->getFieldVal( array('ordid'=>$ordid),'ordstatus' );
if($ordstatus==1){
return true;
}else{
return false;
}
}
//处理订单函数
//更新订单状态,写入订单支付后返回的数据
private 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;
$order_M = D('Order');
$update_ord = $order_M->updateData( array('ordid'=>$ordid),$data );
}
转载请注明:谷谷点程序 » Thinkphp 与支付宝接口