-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtenpay_notify.php
105 lines (90 loc) · 4.23 KB
/
tenpay_notify.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
<?php
//---------------------------------------------------------
//财付通即时到帐支付后台回调示例,商户按照此文档进行开发即可
//---------------------------------------------------------
require_once('./includes/common.php');
require (SYSTEM_ROOT."tenpay/tenpay.config.php");
require (SYSTEM_ROOT."tenpay/ResponseHandler.class.php");
require (SYSTEM_ROOT."tenpay/RequestHandler.class.php");
require (SYSTEM_ROOT."tenpay/client/ClientResponseHandler.class.php");
require (SYSTEM_ROOT."tenpay/client/TenpayHttpClient.class.php");
@header('Content-Type: text/html; charset=UTF-8');
/* 创建支付应答对象 */
$resHandler = new ResponseHandler();
$resHandler->setKey($tenpay_config['key']);
//判断签名
if($resHandler->isTenpaySign()) {
//通知id
$notify_id = $resHandler->getParameter("notify_id");
//通过通知ID查询,确保通知来至财付通
//创建查询请求
$queryReq = new RequestHandler();
$queryReq->init();
$queryReq->setKey($key);
$queryReq->setGateUrl("https://gw.tenpay.com/gateway/verifynotifyid.xml");
$queryReq->setParameter("partner", $tenpay_config['mch']);
$queryReq->setParameter("notify_id", $notify_id);
//通信对象
$httpClient = new TenpayHttpClient();
$httpClient->setTimeOut(5);
//设置请求内容
$httpClient->setReqContent($queryReq->getRequestURL());
//后台调用
if($httpClient->call()) {
//设置结果参数
$queryRes = new ClientResponseHandler();
$queryRes->setContent($httpClient->getResContent());
$queryRes->setKey($tenpay_config['key']);
//判断签名及结果
//只有签名正确,retcode为0,trade_state为0才是支付成功
if($queryRes->isTenpaySign() && $queryRes->getParameter("retcode") == "0" && $queryRes->getParameter("trade_state") == "0" && $queryRes->getParameter("trade_mode") == "1" ) {
//取结果参数做业务处理
$out_trade_no = $queryRes->getParameter("out_trade_no");
//财付通订单号
$transaction_id = $queryRes->getParameter("transaction_id");
//金额,以分为单位
$total_fee = $queryRes->getParameter("total_fee");
//如果有使用折扣券,discount有值,total_fee+discount=原请求的total_fee
$discount = $queryRes->getParameter("discount");
//------------------------------
//处理业务开始
//------------------------------
$srow=$DB->query("SELECT * FROM pay_order WHERE trade_no='{$out_trade_no}' limit 1 for update")->fetch();
if($srow['status']==0){
if($srow['jkid']!=0)
$DB->query("update `pay_qqconfig` set `today_money` =`today_money`+{$srow['money']} where `id`={$srow['jkid']}");//增加接口支付额度
$DB->query("update `pay_order` set `status` ='1',`endtime` ='$date' where `trade_no`='$out_trade_no'");
processOrder($srow);
}
//------------------------------
//处理业务完毕
//------------------------------
echo "success";
} else {
//错误时,返回结果可能没有签名,写日志trade_state、retcode、retmsg看失败详情。
//echo "验证签名失败 或 业务错误信息:trade_state=" . $queryRes->getParameter("trade_state") . ",retcode=" . $queryRes->getParameter("retcode"). ",retmsg=" . $queryRes->getParameter("retmsg") . "<br/>" ;
echo "fail";
}
//获取查询的debug信息,建议把请求、应答内容、debug信息,通信返回码写入日志,方便定位问题
/*
echo "<br>------------------------------------------------------<br>";
echo "http res:" . $httpClient->getResponseCode() . "," . $httpClient->getErrInfo() . "<br>";
echo "query req:" . htmlentities($queryReq->getRequestURL(), ENT_NOQUOTES, "GB2312") . "<br><br>";
echo "query res:" . htmlentities($queryRes->getContent(), ENT_NOQUOTES, "GB2312") . "<br><br>";
echo "query reqdebug:" . $queryReq->getDebugInfo() . "<br><br>" ;
echo "query resdebug:" . $queryRes->getDebugInfo() . "<br><br>";
*/
}else {
//通信失败
echo "fail";
//后台调用通信失败,写日志,方便定位问题
//echo "<br>call err:" . $httpClient->getResponseCode() ."," . $httpClient->getErrInfo() . "<br>";
}
} else {
//回调签名错误
echo "fail";
//echo "<br>签名失败<br>";
}
//获取debug信息,建议把debug信息写入日志,方便定位问题
//echo $resHandler->getDebugInfo() . "<br>";
?>