1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > thinkphp整合支付宝担保交易接口

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

时间:2023-10-21 01:45:29

相关推荐

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

* 日期:-07-19

* 说明:

* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。

* 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。

* 提示:如何获取安全校验码和合作身份者id

* 1.用您的签约支付宝账号登录支付宝网站()

* 2.点击“商家服务”(/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://开头的完整路径,如:/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

* 日期:-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

* 日期:-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

* 修改日期:-07-23

* 说明:

* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。

* 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。

*************************注意*************************

* 如果您在接口集成过程中遇到问题,可以按照下面的途径来解决

* 1、商户服务中心(/support/helperApply.htm?action=consultationApply),提交申请集成协助,我们会有专业的技术工程师主动联系您协助解决

* 2、商户帮助中心(/support/232511-16307/0-16307.htm?sh=Y&info_type=9)

* 3、支付宝论坛(/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" "/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();

}

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。