ThinkPHP3.2中集成财付通支付
在项目过程中用到了支付宝和财付通的支付接口问题,发现在TP还未有人写财付通的实例,我仿照前辈们写的一个案例http://www.thinkphp.cn/code/240.html写了一个
一、把接口集成开发包中文件提出来,用的php(utf8)版
把classes文件夹中的文件复制到TP目录下的LibraryThink 新建一个Tenpay目录。
二,加入命名空间,方便调用
三、在项目配置文件中加入接口配置参数
//财付通配置参数<br>
'tenpay_config' => array(<br>
'partner' => '**********', //这里是你在成功申请财付通接口后获取到的商户号;<br>
'key' => '*******************', //这里是你在成功申请财付通接口后获取到的密钥<br>
'return_url' => '********/tenreturnurl',<br>
'notify_url' => '********/tennotifyurl',<br>
),
//财付通配置参数
'tenpay_config' => array(
'partner' => '**********', //这里是你在成功申请财付通接口后获取到的商户号;<br>
'key' => '*******************', //这里是你在成功申请财付通接口后获取到的密钥<br>
'return_url' => '********/tenreturnurl',<br>
'notify_url' => '********/tennotifyurl',<br>
),
三、在支付操作的控制器中加入代码如下
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 ThinkTenpayRequestHandler();
$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", ""); //ThinkPHP3.2中集成财付通支付数据,原样返回就可以了
$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) {<br>
header("Location:" . $url);<br>
exit;<br>
}
function doSend2($url) {
header("Location:" . $url);
exit;<br>
}<br>四、支付成功跳转处理<br>
<br>/*<br>
财付通页面跳转处理方法;<br>
<br>
*/<br>
<br>
function tenreturnurl() {<br>
/* 创建支付应答对象 */<br>
$tenpay_config = C('tenpay_config');<br>
$resHandler = new ThinkTenpayResponseHandler();<br>
$resHandler->setKey(trim($tenpay_config['key']));<br>
<br>
//判断签名<br>
if ($resHandler->isTenpaySign()) {<br>
//通知id<br>
$notify_id = $resHandler->getParameter("notify_id");<br>
//商户订单号<br>
$out_trade_no = $resHandler->getParameter("out_trade_no");<br>
//财付通订单号<br>
$transaction_id = $resHandler->getParameter("transaction_id");<br>
//金额,以分为单位<br>
$total_fee = $resHandler->getParameter("total_fee");<br>
//如果有使用折扣券,discount有值,total_fee discount=原请求的total_fee<br>
$discount = $resHandler->getParameter("discount");<br>
//支付结果<br>
$trade_state = $resHandler->getParameter("trade_state");<br>
//交易模式,1即时到账<br>
$trade_mode = $resHandler->getParameter("trade_mode");<br>
//支付完成时间<br>
$time_end = $resHandler->getParameter("time_end");<br>
$parameter = array(
"out_trade_no" => $out_trade_no, //商户订单编号;
"trade_no" => $transaction_id, //财付通订单号;
"total_fee" => $total_fee, //交易金额; "trade_status" => $trade_state, //交易状态<br>
"notify_id" => $notify_id, //通知校验ID。<br>
"notify_time" => $time_end, //通知的发送时间。<br>
);<br>
if ("1" == $trade_mode) {<br>
if ("0" == $trade_state) {<br>
$status = CommonController::checkorderstatus($out_trade_no);<br>
if (!$status) {<br>
CommonController::orderhandle($parameter);<br>
//进行订单处理,并传送从支付宝返回的参数;<br>
}<br>
$this->success("支付成功", U('Home/Order/Payscuess', array('id' => $out_trade_no)));<br>
} else {<br>
//当做不成功处理<br>
$this->error("支付失败");<br>
}<br>
}<br>
} else {<br>
$this->error("认证签名失败," . $resHandler->getDebugInfo());<br>
}<br>
}<br>
<br>
/*<br>
财付通异步通知处理方法;<br>
<br>
*/<br>
<br>
function tennotifyurl() {<br>
$tenpay_config = C('tenpay_config');<br>
/* 创建支付应答对象 */<br>
$resHandler = new ThinkTenpayResponseHandler();<br>
$resHandler->setKey(trim($tenpay_config['key']));<br>
//判断签名<br>
if ($resHandler->isTenpaySign()) {<br>
<br>
//通知id<br>
$notify_id = $resHandler->getParameter("notify_id");<br>
<br>
//通过通知ID查询,确保通知来至财付通<br>
//创建查询请求<br>
$queryReq = new ThinkTenpayRequestHandler();<br>
$queryReq->init();<br>
$queryReq->setKey(trim($tenpay_config['key']));<br>
$queryReq->setGateUrl("https://gw.tenpay.com/gateway/simpleverifynotifyid.xml");<br> $queryReq->setParameter("partner", trim($tenpay_config['partner']));<br>
$queryReq->setParameter("notify_id", $notify_id);<br>
<br>
//通信对象<br>
$httpClient = new ThinkTenpayclientTenpayHttpClient();<br>
$httpClient->setTimeOut(5);<br>
//设置请求内容<br>
$httpClient->setReqContent($queryReq->getRequestURL());<br>
<br>
//后台调用<br>
if ($httpClient->call()) {<br>
//设置结果参数<br>
$queryRes = new ThinkTenpayclientClientResponseHandler();<br>
$queryRes->setContent($httpClient->getResContent());<br>
$queryRes->setKey(trim($tenpay_config['key']));<br>
<br>
if ($resHandler->getParameter("trade_mode") == "1") {<br>
//判断签名及结果(即时到帐)<br>
//只有签名正确,retcode为0,trade_state为0才是支付成功<br>
if ($queryRes->isTenpaySign() && $queryRes->getParameter("retcode") == "0" && $resHandler->getParameter("trade_state") == "0") {<br>
<br>
//通知id<br>
$notify_id = $resHandler->getParameter("notify_id");<br>
//商户订单号<br>
$out_trade_no = $resHandler->getParameter("out_trade_no");<br>
//财付通订单号<br>
$transaction_id = $resHandler->getParameter("transaction_id");<br>
//金额,以分为单位<br>
$total_fee = $resHandler->getParameter("total_fee");<br>
//如果有使用折扣券,discount有值,total_fee discount=原请求的total_fee<br>
$discount = $resHandler->getParameter("discount");<br>
//支付结果<br> $trade_state = $resHandler->getParameter("trade_state");<br>
//交易模式,1即时到账<br>
$trade_mode = $resHandler->getParameter("trade_mode");<br>
//支付完成时间<br>
$time_end = $resHandler->getParameter("time_end");<br>
$parameter = array(<br>
"out_trade_no" => $out_trade_no, //商户订单编号;<br>
"trade_no" => $transaction_id, //财付通订单号;<br>
"total_fee" => $total_fee, //交易金额;<br>
"trade_status" => $trade_state, //交易状态<br>
"notify_id" => $notify_id, //通知校验ID。<br>
"notify_time" => $time_end, //通知的发送时间。<br>
);<br>
$status = CommonController::checkorderstatus($out_trade_no);<br>
if (!$status) {<br>
CommonController::orderhandle($parameter);<br>
//进行订单处理,并传送从支付宝返回的参数;<br>
}<br>
echo "success";<br>
} else {<br>
<br>
echo "fail";<br>
}<br>
}<br>
} else {<br>
//通信失败<br> echo "fail";<br>
//后台调用通信失败,写日志,方便定位问题<br>
echo "<br>call err:" . $httpClient->getResponseCode() . "," . $httpClient->getErrInfo() . "<br>";<br>
}<br>
} else {<br>
echo "<br>" . "认证签名失败" . "<br>";<br>
echo $resHandler->getDebugInfo() . "<br>";<br>
}<br>
}
其中的checkorderstatus和orderhandle用的是上述支付宝即时交易案例中的订单处理函数 //处理订单函数<code class="prettyprint linenums lang-php"> //处理订单函数<br>
//更新订单状态,写入订单支付后返回的数据<br>
function orderhandle($parameter) {<br>
$ordid = $parameter['out_trade_no'];<br>
$data['trade_no'] = $parameter['trade_no'];<br>
$data['trade_status'] = $parameter['trade_status'];<br>
$data['notify_id'] = $parameter['notify_id'];<br>
$data['notify_time'] = $parameter['notify_time'];<br>
$data['buyer_email'] = $parameter['buyer_email'];<br>
$data['paystatus'] = 1;<br>
$Ord = M('order');<br>
$Ord->where('orderid=' . $ordid)->save($data);<br>
}<br>
//在线交易订单支付处理函数<br>
//函数功能:根据支付接口传回的数据判断该订单是否已经支付成功;<br>
//返回值:如果订单已经成功支付,返回true,否则返回false;<br>
function checkorderstatus($ordid) {<br>
$Ord = M('order');<br>
$ordstatus = $Ord->where('orderid=' . $ordid)->getField('paystatus');<br>
if ($ordstatus == 1) {<br>
return true;<br>
} else {<br>
return false;<br>
}<br>
}
//更新订单状态,写入订单支付后返回的数据
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.thinkphp.cn/code/240.html中的案例,支付接口的方法大致都是一样的,下面提供财付通集成开发包 php(utf8).zip ( 60.83 KB 下载:330 次 ) AD:真正免费,域名 虚机 企业邮箱=0元