热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ThinkPHP3.2中集成财付通支付

提供各种官方和用户发布的代码示例,代码参考,欢迎大家交流学习
ThinkPHP3.2中集成财付通支付
在项目过程中用到了支付宝和财付通的支付接口问题,发现在TP还未有人写财付通的实例,我仿照前辈们写的一个案例http://www.thinkphp1.cn/code/240.html写了一个

一、把接口集成开发包中文件提出来,用的php(utf8)版

把classes文件夹中的文件复制到TP目录下的Library\Think 新建一个Tenpay目录。
二,加入命名空间,方便调用


三、在项目配置文件中加入接口配置参数
//财付通配置参数
'tenpay_config' => array(
'partner' => '**********', //这里是你在成功申请财付通接口后获取到的商户号;
'key' => '*******************', //这里是你在成功申请财付通接口后获取到的密钥
'return_url' => '********/tenreturnurl',
'notify_url' => '********/tennotifyurl',
),
三、在支付操作的控制器中加入代码如下
public function tenpay($data) {
$tenpay_cOnfig= C('tenpay_config');
/* 获取提交的订单号 */
$out_trade_no = $data["orderid"];
/* 获取提交的商品名称 */
$product_name = $data["title"];
/* 获取提交的商品价格 */
$order_price = $data["money"];
/* 获取提交的备注信息 */
$remarkexplain = $data["remark"];
/* 支付方式 */
$trade_mode = 1;

$strDate = date("Ymd");
$strTime = date("His");

/* 商品价格(包含运费),以分为单位 */
$total_fee = $order_price * 100;

/* 商品名称 */
$desc = "商品:" . $product_name . ",备注:" . $remarkexplain;

/* 创建支付请求对象 */
$reqHandler = new \Think\Tenpay\RequestHandler();
$reqHandler->init();
$reqHandler->setKey(trim($tenpay_config['key']));
$reqHandler->setGateUrl("https://gw.tenpay.com/gateway/pay.htm");

//----------------------------------------
//设置支付参数
//----------------------------------------
$reqHandler->setParameter("partner", trim($tenpay_config['partner']));
$reqHandler->setParameter("out_trade_no", $out_trade_no);
$reqHandler->setParameter("total_fee", $total_fee); //总金额
$reqHandler->setParameter("return_url", $tenpay_config['return_url']);
$reqHandler->setParameter("notify_url", $tenpay_config['notify_url']);
$reqHandler->setParameter("body", $desc);
$reqHandler->setParameter("bank_type", "DEFAULT"); //银行类型,默认为财付通
//用户ip
$reqHandler->setParameter("spbill_create_ip", $_SERVER['REMOTE_ADDR']); //客户端IP
$reqHandler->setParameter("fee_type", "1"); //币种
$reqHandler->setParameter("subject", $desc); //商品名称,(中介交易时必填)
//系统可选参数
$reqHandler->setParameter("sign_type", "MD5"); //签名方式,默认为MD5,可选RSA
$reqHandler->setParameter("service_version", "1.0"); //接口版本号
$reqHandler->setParameter("input_charset", "utf-8"); //字符集
$reqHandler->setParameter("sign_key_index", "1"); //密钥序号
//业务可选参数
$reqHandler->setParameter("attach", ""); //附件数据,原样返回就可以了
$reqHandler->setParameter("product_fee", ""); //商品费用
$reqHandler->setParameter("transport_fee", "0"); //物流费用
$reqHandler->setParameter("time_start", date("YmdHis")); //订单生成时间
$reqHandler->setParameter("time_expire", ""); //订单失效时间
$reqHandler->setParameter("buyer_id", ""); //买方财付通帐号
$reqHandler->setParameter("goods_tag", ""); //商品标记
$reqHandler->setParameter("trade_mode", $trade_mode); //交易模式(1.即时到帐模式,2.中介担保模式,3.后台选择(卖家进入支付中心列表选择))
$reqHandler->setParameter("transport_desc", ""); //物流说明
$reqHandler->setParameter("trans_type", "1"); //交易类型
$reqHandler->setParameter("agentid", ""); //平台ID
$reqHandler->setParameter("agent_type", ""); //代理模式(0.无代理,1.表示卡易售模式,2.表示网店模式)
$reqHandler->setParameter("seller_id", ""); //卖家的商户号
//请求的URL
$reqUrl = $reqHandler->getRequestURL();
//获取debug信息,建议把请求和debug信息写入日志,方便定位问题
/**/
$reqHandler->doSend2($reqUrl);
$debugInfo = $reqHandler->getDebugInfo();
}
声明一下,$data是商品的参数,里面必须包含订单号,商品名称,订单描述,商品价格。上述代码中的doSend2函数是一个跳转函数,修改的是ResponseHandler.class.php中的dosend函数。function doSend2($url) {
header("Location:" . $url);
exit;
}
四、支付成功跳转处理
/*
财付通页面跳转处理方法;

*/

function tenreturnurl() {
/* 创建支付应答对象 */
$tenpay_cOnfig= C('tenpay_config');
$resHandler = new \Think\Tenpay\ResponseHandler();
$resHandler->setKey(trim($tenpay_config['key']));

//判断签名
if ($resHandler->isTenpaySign()) {
//通知id
$notify_id = $resHandler->getParameter("notify_id");
//商户订单号
$out_trade_no = $resHandler->getParameter("out_trade_no");
//财付通订单号
$transaction_id = $resHandler->getParameter("transaction_id");
//金额,以分为单位
$total_fee = $resHandler->getParameter("total_fee");
//如果有使用折扣券,discount有值,total_fee+discount=原请求的total_fee
$discount = $resHandler->getParameter("discount");
//支付结果
$trade_state = $resHandler->getParameter("trade_state");
//交易模式,1即时到账
$trade_mode = $resHandler->getParameter("trade_mode");
//支付完成时间
$time_end = $resHandler->getParameter("time_end");
$parameter = array(
"out_trade_no" => $out_trade_no, //商户订单编号;
"trade_no" => $transaction_id, //财付通订单号;
"total_fee" => $total_fee, //交易金额;
"trade_status" => $trade_state, //交易状态
"notify_id" => $notify_id, //通知校验ID。
"notify_time" => $time_end, //通知的发送时间。
);
if ("1" == $trade_mode) {
if ("0" == $trade_state) {
$status = CommonController::checkorderstatus($out_trade_no);
if (!$status) {
CommonController::orderhandle($parameter);
//进行订单处理,并传送从支付宝返回的参数;
}
$this->success("支付成功", U('Home/Order/Payscuess', array('id' => $out_trade_no)));
} else {
//当做不成功处理
$this->error("支付失败");
}
}
} else {
$this->error("认证签名失败," . $resHandler->getDebugInfo());
}
}

/*
财付通异步通知处理方法;

*/

function tennotifyurl() {
$tenpay_cOnfig= C('tenpay_config');
/* 创建支付应答对象 */
$resHandler = new \Think\Tenpay\ResponseHandler();
$resHandler->setKey(trim($tenpay_config['key']));
//判断签名
if ($resHandler->isTenpaySign()) {

//通知id
$notify_id = $resHandler->getParameter("notify_id");

//通过通知ID查询,确保通知来至财付通
//创建查询请求
$queryReq = new \Think\Tenpay\RequestHandler();
$queryReq->init();
$queryReq->setKey(trim($tenpay_config['key']));
$queryReq->setGateUrl("https://gw.tenpay.com/gateway/simpleverifynotifyid.xml");
$queryReq->setParameter("partner", trim($tenpay_config['partner']));
$queryReq->setParameter("notify_id", $notify_id);

//通信对象
$httpClient = new \Think\Tenpay\client\TenpayHttpClient();
$httpClient->setTimeOut(5);
//设置请求内容
$httpClient->setReqContent($queryReq->getRequestURL());

//后台调用
if ($httpClient->call()) {
//设置结果参数
$queryRes = new \Think\Tenpay\client\ClientResponseHandler();
$queryRes->setContent($httpClient->getResContent());
$queryRes->setKey(trim($tenpay_config['key']));

if ($resHandler->getParameter("trade_mode") == "1") {
//判断签名及结果(即时到帐)
//只有签名正确,retcode为0,trade_state为0才是支付成功
if ($queryRes->isTenpaySign() && $queryRes->getParameter("retcode") == "0" && $resHandler->getParameter("trade_state") == "0") {

//通知id
$notify_id = $resHandler->getParameter("notify_id");
//商户订单号
$out_trade_no = $resHandler->getParameter("out_trade_no");
//财付通订单号
$transaction_id = $resHandler->getParameter("transaction_id");
//金额,以分为单位
$total_fee = $resHandler->getParameter("total_fee");
//如果有使用折扣券,discount有值,total_fee+discount=原请求的total_fee
$discount = $resHandler->getParameter("discount");
//支付结果
$trade_state = $resHandler->getParameter("trade_state");
//交易模式,1即时到账
$trade_mode = $resHandler->getParameter("trade_mode");
//支付完成时间
$time_end = $resHandler->getParameter("time_end");
$parameter = array(
"out_trade_no" => $out_trade_no, //商户订单编号;
"trade_no" => $transaction_id, //财付通订单号;
"total_fee" => $total_fee, //交易金额;
"trade_status" => $trade_state, //交易状态
"notify_id" => $notify_id, //通知校验ID。
"notify_time" => $time_end, //通知的发送时间。
);
$status = CommonController::checkorderstatus($out_trade_no);
if (!$status) {
CommonController::orderhandle($parameter);
//进行订单处理,并传送从支付宝返回的参数;
}
echo "success";
} else {

echo "fail";
}
}
} else {
//通信失败
echo "fail";
//后台调用通信失败,写日志,方便定位问题
echo "
call err:" . $httpClient->getResponseCode() . "," . $httpClient->getErrInfo() . "
";
}
} else {
echo "
" . "认证签名失败" . "
";
echo $resHandler->getDebugInfo() . "
";
}
}
其中的checkorderstatus和orderhandle用的是上述支付宝即时交易案例中的订单处理函数 //处理订单函数
//更新订单状态,写入订单支付后返回的数据
function orderhandle($parameter) {
$ordid = $parameter['out_trade_no'];
$data['trade_no'] = $parameter['trade_no'];
$data['trade_status'] = $parameter['trade_status'];
$data['notify_id'] = $parameter['notify_id'];
$data['notify_time'] = $parameter['notify_time'];
$data['buyer_email'] = $parameter['buyer_email'];
$data['paystatus'] = 1;
$Ord = M('order');
$Ord->where('orderid=' . $ordid)->save($data);
}
//在线交易订单支付处理函数
//函数功能:根据支付接口传回的数据判断该订单是否已经支付成功;
//返回值:如果订单已经成功支付,返回true,否则返回false;
function checkorderstatus($ordid) {
$Ord = M('order');
$ordstatus = $Ord->where('orderid=' . $ordid)->getField('paystatus');
if ($ordstatus == 1) {
return true;
} else {
return false;
}
}
其他请参看http://www.thinkphp1.cn/code/240.html中的案例,支付接口的方法大致都是一样的,下面提供财付通集成开发包

附件 php(utf8).zip ( 60.83 KB 下载:330 次 )

AD:真正免费,域名+虚机+企业邮箱=0元

推荐阅读
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 电销机器人作为一种人工智能技术载体,可以帮助企业提升电销效率并节省人工成本。然而,电销机器人市场缺乏统一的市场准入标准,产品品质良莠不齐。创业者在代理或购买电销机器人时应注意谨防用录音冒充真人语音通话以及宣传技术与实际效果不符的情况。选择电销机器人时需要考察公司资质和产品品质,尤其要关注语音识别率。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
author-avatar
佳鈺佳琴欣怡
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有