thinkphp整合支付宝担保交易接口

第一步:

先下载支付宝担保交易的demo(php utf-8)。

 

第二步:

首先在项目Lib目录下简历自己的lib库,比如thlib;

将alipay_notify.class.php、alipay_submit.class.php拷贝到thlib目录下;

 

第三步:

将alipay_core.function.php、alipay_md5.function.php、cacert.pem拷贝到项目的Common目录下,并在该目录下的common.php中加入如下代码:

//获取支付宝接口的配置,可以自己根据情况修改,比如partner、key等。

function return_alipay_config(){
/* *
* 配置文件
* 版本:3.3
* 日期:2012-07-19
* 说明:
* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
* 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。

* 提示:如何获取安全校验码和合作身份者id
* 1.用您的签约支付宝账号登录支付宝网站(www.alipay.com)
* 2.点击“商家服务”(https://b.alipay.com/order/myorder.htm)
* 3.点击“查询合作者身份(pid)”、“查询安全校验码(key)”

* 安全校验码查看时,输入支付密码后,页面呈灰色的现象,怎么办?
* 解决方法:
* 1、检查浏览器配置,不让浏览器做弹框屏蔽设置
* 2、更换浏览器或电脑,重新登录查询。
*/

//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
//合作身份者id,以2088开头的16位纯数字
$alipay_config['partner'] = '2088402103732808';

//安全检验码,以数字和字母组成的32位字符
$alipay_config['key'] = 'cpykdfpz5r0jdnbv5l1nqwcn4iikpnen';


//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑


//签名方式 不需修改
$alipay_config['sign_type'] = strtoupper('MD5');

//字符编码格式 目前支持 gbk 或 utf-8
$alipay_config['input_charset']= strtolower('utf-8');

//ca证书路径地址,用于curl中ssl校验
//请保证cacert.pem文件在当前文件夹目录中
$alipay_config['cacert'] = dirname(__FILE__).'\\cacert.pem';

//访问模式,根据自己的服务器是否支持ssl访问,若支持请选择https;若不支持请选择http
$alipay_config['transport'] = 'http';
return $alipay_config;
}

//应用支付宝提供的支付有关的公用方法

require_once("alipay_core.function.php");
require_once("alipay_md5.function.php");

至此已经配好了这个支付宝接口,然后在控制器中就能够运用了。现在支付的控制器中引入支付接口的lib库,可在构造函数中引入。

/**
*构造函数
*
*@author Julian
*/
protected function _initialize() {
import("@.thlib.alipay_submit");
import("@.thlib.alipay_notify");
//parent::_initialize();
$this->checkLogin();
}

 

然后支付的方法:

/**
*用支付宝付款,调用接口进行付款
*
*@author Julian
*/
public function pay(){
header("Content-type:text/html;charset=utf-8");
$alipay_config = return_alipay_config();   //common中新增的获取配置的公用方法
/**************************请求参数**************************/
$order_id = $_GET['order_id'];
if(!$order_id){
$this->error('订单号不能为空!');
die();
}
//获取订单信息。
$order_info = M('order_list')->where(array('order_id'=>$order_id))->find();
if(!$order_info){
$this->error('不存在此订单');
die();
}
//var_dump($order_info);
//算出总价格。
//$length = count($order_info);
$all_money = $order_info['price'];
// for ($i=0; $i < $length; $i++) {
// $all_money += $order_info[$i]['product_num']*$order_info[$i]['product_price'];
// }
//echo $all_money;
//获取收货地址信息.
$address_info = M('buyer_address')->where(array('buyer_id'=>$_SESSION['users']['uid'],'is_default'=>1))->find();
if(!$address_info){
$this->error('请设置收货地址信息',U('center/index'));
}
//var_dump($address_info);
// die();
//支付类型
$payment_type = "1";
//必填,不能修改
//服务器异步通知页面路径
$notify_url = get_domain().U('pay/notify_url');
//需http://格式的完整路径,不能加?id=123这类自定义参数

//页面跳转同步通知页面路径
$return_url = get_domain().U('pay/return_url');
//需http://格式的完整路径,不能加?id=123这类自定义参数,不能写成http://localhost/
//卖家支付宝帐户
$seller_email = '18767135924';
//必填

//商户订单号
$out_trade_no = $order_id;
//商户网站订单系统中唯一订单号,必填

//订单名称
$subject = $order_id;
//必填

//付款金额
$price = $all_money;
//必填

//商品数量
$quantity = "1";
//必填,建议默认为1,不改变值,把一次交易看成是一次下订单而非购买一件商品
//物流费用
$logistics_fee = "0.00";
//必填,即运费
//物流类型
$logistics_type = "EXPRESS";
//必填,三个值可选:EXPRESS(快递)、POST(平邮)、EMS(EMS)
//物流支付方式
$logistics_payment = "SELLER_PAY";
//必填,两个值可选:SELLER_PAY(卖家承担运费)、BUYER_PAY(买家承担运费)
//订单描述
// $logistics_fee_1 = "0.00";
// //必填,即运费
// //物流类型
// $logistics_type_1 = "EMS";
// //必填,三个值可选:EXPRESS(快递)、POST(平邮)、EMS(EMS)
// //物流支付方式
// $logistics_payment_1 = "BUYER_PAY";

$body = $order_id;
//商品展示地址
$show_url = get_domain().U('order/index');
//需以http://开头的完整路径,如:http://www.xxx.com/myorder.html

//收货人姓名
$receive_name = $address_info['receive_name'];
//如:张三

//收货人地址
$receive_address = $address_info['address'];
//如:XX省XXX市XXX区XXX路XXX小区XXX栋XXX单元XXX号

//收货人邮编
$receive_zip = $address_info['postcode'];
//如:123456

//收货人电话号码
$receive_phone = $address_info['telphone'];
//如:0571-88158090

//收货人手机号码
$receive_mobile = $address_info['telphone'];
//如:13312341234
/************************************************************/

//构造要请求的参数数组,无需改动
$parameter = array(
"service" => "create_partner_trade_by_buyer",
"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,
"price" => $price,
"quantity" => $quantity,
"logistics_fee" => $logistics_fee,
"logistics_type" => $logistics_type,
"logistics_payment" => $logistics_payment,
// "logistics_fee_1" => $logistics_fee_1,
// "logistics_type_1" => $logistics_type_1,
// "logistics_payment_1" => $logistics_payment_1,
"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($alipay_config['input_charset']))
);


//var_dump($parameter);die();
//建立请求
$alipaySubmit = new AlipaySubmit($alipay_config);
$html_text = $alipaySubmit->buildRequestForm($parameter,"get", "确认");
echo $html_text;
}

//支付宝服务器异步通知页面

/* *
* 功能:支付宝服务器异步通知页面
* 版本:3.3
* 日期:2012-07-23
* 说明:
* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
* 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。


*************************页面功能说明*************************
* 创建该页面文件时,请留心该页面文件中无任何HTML代码及空格。
* 该页面不能在本机电脑测试,请到服务器上做测试。请确保外部可以访问该页面。
* 该页面调试工具请使用写文本函数logResult,该函数已被默认关闭,见alipay_notify_class.php中的函数verifyNotify
* 如果没有收到该页面返回的 success 信息,支付宝会在24小时内按一定的时间策略重发通知
*/
public function notify_url(){
$alipay_config = return_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'];


if($_POST['trade_status'] == 'WAIT_BUYER_PAY') {
//该判断表示买家已在支付宝交易管理中产生了交易记录,但没有付款

//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序

echo "success"; //请不要修改或删除

//调试用,写文本函数记录程序运行情况是否正常
//logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
}
else if($_POST['trade_status'] == 'WAIT_SELLER_SEND_GOODS') {
//该判断表示买家已在支付宝交易管理中产生了交易记录且付款成功,但卖家没有发货
$where['order_id'] = array('eq' , $out_trade_no);
$data = array('status'=>1,'alipay_id'=>$trade_no );
D('orders')->where($where)->setField($data );
D('order_list')->where($where)->setField($data );
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序

echo "success"; //请不要修改或删除

//调试用,写文本函数记录程序运行情况是否正常
//logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
}
else if($_POST['trade_status'] == 'WAIT_BUYER_CONFIRM_GOODS') {
//该判断表示卖家已经发了货,但买家还没有做确认收货的操作

//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序

echo "success"; //请不要修改或删除

//调试用,写文本函数记录程序运行情况是否正常
//logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
}
else if($_POST['trade_status'] == 'TRADE_FINISHED') {
//该判断表示买家已经确认收货,这笔交易完成

//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序

echo "success"; //请不要修改或删除

//调试用,写文本函数记录程序运行情况是否正常
//logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
}
else {
//其他状态判断
echo "success";

//调试用,写文本函数记录程序运行情况是否正常
//logResult ("这里写入想要调试的代码变量值,或其他运行的结果记录");
}

//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
else {
//验证失败
echo "fail";

//调试用,写文本函数记录程序运行情况是否正常
//logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
}
}

//支付宝页面跳转同步通知页面

/* *
* 功能:支付宝页面跳转同步通知页面
* 版本:3.3
* 日期:2012-07-23
* 说明:
* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
* 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。

*************************页面功能说明*************************
* 该页面可在本机电脑测试
* 可放入HTML等美化页面的代码、商户业务逻辑程序代码
* 该页面可以使用PHP开发工具调试,也可以使用写文本函数logResult,该函数已被默认关闭,见alipay_notify_class.php中的函数verifyReturn
*/
public function return_url(){
echo '<!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8">';
//计算得出通知验证结果
$alipay_config = return_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'];


if($_GET['trade_status'] == 'WAIT_SELLER_SEND_GOODS') {
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序
$where['order_id'] = array('eq' , $out_trade_no);
$data = array('status'=>1,'alipay_id'=>$trade_no );
D('orders')->where($where)->setField($data );
D('order_list')->where($where)->setField($data );
}
else {
echo "trade_status=".$_GET['trade_status'];
}

echo "验证成功<br />";
echo "trade_no=".$trade_no;
$this->redirect(U('order/index',array('ctp'=>1)));

//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
else {
//验证失败
//如要调试,请看alipay_notify.php页面的verifyReturn函数
echo "验证失败";
}
echo '<title>支付宝纯担保交易接口</title></head><body></body></html>';
}

//确认发货接口接入页

/* *
* 功能:确认发货接口接入页
* 版本:3.3
* 修改日期:2012-07-23
* 说明:
* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
* 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。

*************************注意*************************
* 如果您在接口集成过程中遇到问题,可以按照下面的途径来解决
* 1、商户服务中心(https://b.alipay.com/support/helperApply.htm?action=consultationApply),提交申请集成协助,我们会有专业的技术工程师主动联系您协助解决
* 2、商户帮助中心(http://help.alipay.com/support/232511-16307/0-16307.htm?sh=Y&info_type=9)
* 3、支付宝论坛(http://club.alipay.com/read-htm-tid-8681712.html)
* 如果不想使用扩展功能请把扩展功能参数赋空值。
*/
public function confirm(){
header("Content-type:text/html;charset=utf-8");
//echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>支付宝确认发货接口接口</title></head><body>';
$alipay_config = return_alipay_config();
if(IS_GET){
/**************************请求参数**************************/
$last_url = $_SERVER['HTTP_REFERER'];
//支付宝交易号
$trade_no = $_GET['alipay'];
//echo $last_url.'<br>';
//echo $trade_no;die();
//必填
$order_info = M('order_list')->where(array('alipay_id'=>$trade_no))->find();
if(!$order_info){
$this->error('无此订单');
die();
}
//物流公司名称
$logistics_name = $order_info['logistics_name'];
//必填

//物流发货单号

$invoice_no = $order_info['invoice_no'];
//物流运输类型
$transport_type = $order_info['transport_type'];
//三个值可选:POST(平邮)、EXPRESS(快递)、EMS(EMS)


/************************************************************/

//构造要请求的参数数组,无需改动
$parameter = array(
"service" => "send_goods_confirm_by_platform",
"partner" => trim($alipay_config['partner']),
"trade_no" => $trade_no,
"logistics_name" => $logistics_name,
"invoice_no" => $invoice_no,
"transport_type" => $transport_type,
"_input_charset" => trim(strtolower($alipay_config['input_charset']))
);

//建立请求
$alipaySubmit = new AlipaySubmit($alipay_config);
$html_text = $alipaySubmit->buildRequestHttp($parameter);
//print_r($alipaySubmit);
//解析XML
//注意:该功能PHP5环境及以上支持,需开通curl、SSL等PHP配置环境。建议本地调试时使用PHP开发软件
$doc = new DOMDocument();
$doc->loadXML($html_text);

//请在这里加上商户的业务逻辑程序代码

//——请根据您的业务逻辑来编写程序(以下代码仅作参考)——

//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表

//解析XML
if( ! empty($doc->getElementsByTagName( "alipay" )->item(0)->nodeValue) ) {
$alipay = $doc->getElementsByTagName( "alipay" )->item(0)->nodeValue;
$where['alipay_id'] = array('eq' , $trade_no);
$data = array('status'=>2);
D('orders')->where($where)->setField($data );
D('order_list')->where($where)->setField($data );
//echo $alipay;
//$this->redirect($last_url);
header("Location: $last_url");
exit;
}
//echo '</body></html>';
//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
}else{
$this->display();
}
}

posted @ 2014-08-04 11:52  JulianJiang  阅读(969)  评论(0编辑  收藏  举报