PageRenderTime 51ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/api/trade/api_tenpay.php

https://github.com/kuaileshike/upload
PHP | 582 lines | 441 code | 135 blank | 6 comment | 47 complexity | 6edb66a67f895900b9dbd38745f37010 MD5 | raw file
  1. <?php
  2. /**
  3. * [Discuz!] (C)2001-2099 Comsenz Inc.
  4. * This is NOT a freeware, use is subject to license terms
  5. *
  6. * $Id: api_tenpay.php 31606 2012-09-13 07:26:35Z monkey $
  7. */
  8. define('IN_API', true);
  9. define('CURSCRIPT', 'api');
  10. if(!defined('IN_DISCUZ')) {
  11. exit('Access Denied');
  12. }
  13. define('DISCUZ_PARTNER', $_G['setting']['ec_tenpay_bargainor']);
  14. define('DISCUZ_SECURITYCODE', $_G['setting']['ec_tenpay_key']);
  15. define('DISCUZ_AGENTID', '1204737401');
  16. define('DISCUZ_TENPAY_OPENTRANS_CHNID', $_G['setting']['ec_tenpay_opentrans_chnid']);
  17. define('DISCUZ_TENPAY_OPENTRANS_KEY', $_G['setting']['ec_tenpay_opentrans_key']);
  18. define('STATUS_SELLER_SEND', 3);
  19. define('STATUS_WAIT_BUYER', 4);
  20. define('STATUS_TRADE_SUCCESS', 5);
  21. define('STATUS_REFUND_CLOSE', 9);
  22. class RequestHandler {
  23. var $gateUrl;
  24. var $key;
  25. var $parameters;
  26. var $debugInfo;
  27. function __construct() {
  28. $this->RequestHandler();
  29. }
  30. function RequestHandler() {
  31. $this->gateUrl = "https://www.tenpay.com/cgi-bin/med/show_opentrans.cgi";
  32. $this->key = "";
  33. $this->parameters = array();
  34. $this->debugInfo = "";
  35. }
  36. function init() {
  37. }
  38. function getGateURL() {
  39. return $this->gateUrl;
  40. }
  41. function setGateURL($gateUrl) {
  42. $this->gateUrl = $gateUrl;
  43. }
  44. function getKey() {
  45. return $this->key;
  46. }
  47. function setKey($key) {
  48. $this->key = $key;
  49. }
  50. function getParameter($parameter) {
  51. return $this->parameters[$parameter];
  52. }
  53. function setParameter($parameter, $parameterValue) {
  54. $this->parameters[$parameter] = $parameterValue;
  55. }
  56. function getAllParameters() {
  57. $this->createSign();
  58. return $this->parameters;
  59. }
  60. function getRequestURL() {
  61. $this->createSign();
  62. $reqPar = "";
  63. ksort($this->parameters);
  64. foreach($this->parameters as $k => $v) {
  65. $reqPar .= $k . "=" . urlencode($v) . "&";
  66. }
  67. $reqPar = substr($reqPar, 0, strlen($reqPar)-1);
  68. $requestURL = $this->getGateURL() . "?" . $reqPar;
  69. return $requestURL;
  70. }
  71. function getDebugInfo() {
  72. return $this->debugInfo;
  73. }
  74. function doSend() {
  75. header("Location:" . $this->getRequestURL());
  76. exit;
  77. }
  78. function createSign() {
  79. $signPars = "";
  80. ksort($this->parameters);
  81. foreach($this->parameters as $k => $v) {
  82. if("" !== $v && "sign" !== $k) {
  83. $signPars .= $k . "=" . $v . "&";
  84. }
  85. }
  86. $signPars .= "key=" . $this->getKey();
  87. $sign = strtolower(md5($signPars));
  88. $this->setParameter("sign", $sign);
  89. $this->_setDebugInfo($signPars . " => sign:" . $sign);
  90. }
  91. function _setDebugInfo($debugInfo) {
  92. $this->debugInfo = $debugInfo;
  93. }
  94. }
  95. class ResponseHandler {
  96. var $key;
  97. var $parameters;
  98. var $debugInfo;
  99. function __construct() {
  100. $this->ResponseHandler();
  101. }
  102. function ResponseHandler() {
  103. $this->key = "";
  104. $this->parameters = array();
  105. $this->debugInfo = "";
  106. foreach($_GET as $k => $v) {
  107. $this->setParameter($k, $v);
  108. }
  109. foreach($_POST as $k => $v) {
  110. $this->setParameter($k, $v);
  111. }
  112. }
  113. function getKey() {
  114. return $this->key;
  115. }
  116. function setKey($key) {
  117. $this->key = $key;
  118. }
  119. function getParameter($parameter) {
  120. return $this->parameters[$parameter];
  121. }
  122. function setParameter($parameter, $parameterValue) {
  123. $this->parameters[$parameter] = $parameterValue;
  124. }
  125. function getAllParameters() {
  126. return $this->parameters;
  127. }
  128. function isTenpaySign() {
  129. $signPars = "";
  130. ksort($this->parameters);
  131. foreach($this->parameters as $k => $v) {
  132. if("sign" !== $k && "" !== $v) {
  133. $signPars .= $k . "=" . $v . "&";
  134. }
  135. }
  136. $signPars .= "key=" . $this->getKey();
  137. $sign = strtolower(md5($signPars));
  138. $tenpaySign = strtolower($this->getParameter("sign"));
  139. $this->_setDebugInfo($signPars . " => sign:" . $sign .
  140. " tenpaySign:" . $this->getParameter("sign"));
  141. return $sign == $tenpaySign;
  142. }
  143. function getDebugInfo() {
  144. return $this->debugInfo;
  145. }
  146. function _setDebugInfo($debugInfo) {
  147. $this->debugInfo = $debugInfo;
  148. }
  149. }
  150. class MediPayRequestHandler extends RequestHandler {
  151. function __construct() {
  152. $this->MediPayRequestHandler();
  153. }
  154. function MediPayRequestHandler() {
  155. $this->setGateURL("https://www.tenpay.com/cgi-bin/med/show_opentrans.cgi");
  156. }
  157. function init() {
  158. $this->setParameter("attach", "1");
  159. $this->setParameter("chnid", "");
  160. $this->setParameter("cmdno", "12");
  161. $this->setParameter("encode_type", "1");
  162. $this->setParameter("mch_desc", "");
  163. $this->setParameter("mch_name", "");
  164. $this->setParameter("mch_price", "");
  165. $this->setParameter("mch_returl", "");
  166. $this->setParameter("mch_type", "");
  167. $this->setParameter("mch_vno", "");
  168. $this->setParameter("need_buyerinfo", "");
  169. $this->setParameter("seller", "");
  170. $this->setParameter("show_url", "");
  171. $this->setParameter("transport_desc", "");
  172. $this->setParameter("transport_fee", "");
  173. $this->setParameter("version", "2");
  174. $this->setParameter("sign", "");
  175. }
  176. }
  177. class MediPayResponseHandler extends ResponseHandler {
  178. function doShow() {
  179. $strHtml = "<html><head>\r\n" .
  180. "<meta name=\"TENCENT_ONLINE_PAYMENT\" content=\"China TENCENT\">" .
  181. "</head><body></body></html>";
  182. echo $strHtml;
  183. exit;
  184. }
  185. function isTenpaySign() {
  186. $signParameterArray = array(
  187. 'attach',
  188. 'buyer_id',
  189. 'cft_tid',
  190. 'chnid',
  191. 'cmdno',
  192. 'mch_vno',
  193. 'retcode',
  194. 'seller',
  195. 'status',
  196. 'total_fee',
  197. 'trade_price',
  198. 'transport_fee',
  199. 'version'
  200. );
  201. ksort($signParameterArray);
  202. foreach($signParameterArray as $k ) {
  203. $v = $this->getParameter($k);
  204. if(isset($v)) {
  205. $signPars .= $k . "=" . urldecode($v) . "&";
  206. }
  207. }
  208. $signPars .= "key=" . $this->getKey();
  209. $sign = strtolower(md5($signPars));
  210. $tenpaySign = strtolower($this->getParameter("sign"));
  211. $this->_setDebugInfo($signPars . " => sign:" . $sign .
  212. " tenpaySign:" . $this->getParameter("sign"));
  213. return $sign == $tenpaySign;
  214. }
  215. }
  216. function credit_payurl($price, &$orderid, $bank = 'DEFAULT') {
  217. include_once DISCUZ_ROOT . './source/class/class_chinese.php';
  218. global $_G;
  219. $date = dgmdate(TIMESTAMP, 'YmdHis');
  220. $suffix = dgmdate(TIMESTAMP, 'His').rand(1000, 9999);
  221. $transaction_id = DISCUZ_PARTNER.$date.$suffix;
  222. $orderid = dgmdate(TIMESTAMP, 'YmdHis').random(14);
  223. $chinese = new Chinese(strtoupper(CHARSET), 'GBK');
  224. $subject = $chinese->Convert(lang('forum/misc', 'credit_forum_payment').' '.$_G['setting']['extcredits'][$_G['setting']['creditstrans']]['title'].' '.intval($price * $_G['setting']['ec_ratio']).' '.$_G['setting']['extcredits'][$_G['setting']['creditstrans']]['unit']);
  225. $reqHandler = new RequestHandler();
  226. $reqHandler->setGateURL("https://gw.tenpay.com/gateway/pay.htm");
  227. $reqHandler->init();
  228. $reqHandler->setKey(DISCUZ_SECURITYCODE);
  229. $reqHandler->setParameter("partner", DISCUZ_PARTNER);
  230. $reqHandler->setParameter("out_trade_no", $orderid);
  231. $reqHandler->setParameter("total_fee", $price * 100);
  232. $reqHandler->setParameter("return_url", $_G['siteurl'].'api/trade/notify_credit.php');
  233. $reqHandler->setParameter("notify_url", $_G['siteurl'].'api/trade/notify_credit.php');
  234. $reqHandler->setParameter("body", $subject);
  235. $reqHandler->setParameter("bank_type", $bank);
  236. $reqHandler->setParameter("spbill_create_ip", $_G['clientip']);
  237. $reqHandler->setParameter("fee_type", "1");
  238. $reqHandler->setParameter("subject", $subject);
  239. $reqHandler->setParameter("sign_type", "MD5");
  240. $reqHandler->setParameter("service_version", "1.0");
  241. $reqHandler->setParameter("input_charset", "GBK");
  242. $reqHandler->setParameter("sign_key_index", "1");
  243. $reqHandler->setParameter("attach", "tenpay");
  244. $reqHandler->setParameter("time_start", $date);
  245. $reqHandler->setParameter("trade_mode","1");
  246. $reqHandler->setParameter("trans_type","1");
  247. $reqHandler->setParameter("agentid", DISCUZ_AGENTID);
  248. $reqHandler->setParameter("agent_type","2");
  249. $reqUrl = $reqHandler->getRequestURL();
  250. return $reqUrl;
  251. }
  252. function trade_payurl($pay, $trade, $tradelog) {
  253. global $_G;
  254. $key = DISCUZ_TENPAY_OPENTRANS_KEY;
  255. $chnid = DISCUZ_TENPAY_OPENTRANS_CHNID;
  256. $seller = $trade['tenpayaccount'];
  257. $mch_desc = $trade['subject'];
  258. $mch_name = $trade['subject'];
  259. $mch_price = $tradelog['baseprice'] * $tradelog['number'] * 100;
  260. $mch_returl = $_G['siteurl'].'api/trade/notify_trade.php';
  261. $mch_vno = $tradelog['orderid'];
  262. $show_url = $_G['siteurl'].'api/trade/notify_trade.php';
  263. $transport_desc = $pay['logistics_type'];
  264. $transport_fee = $tradelog['transportfee'] * 100;
  265. if(strtolower(CHARSET) == 'gbk') {
  266. $encode_type = '1';
  267. } else {
  268. $encode_type = '2';
  269. }
  270. $mch_type = '1';
  271. $need_buyerinfo = '1';
  272. if($pay['logistics_type'] == 'VIRTUAL') {
  273. $mch_type = '2';
  274. $need_buyerinfo = '2';
  275. }
  276. $reqHandler = new MediPayRequestHandler();
  277. $reqHandler->init();
  278. $reqHandler->setKey($key);
  279. $reqHandler->setParameter("chnid", $chnid);
  280. $reqHandler->setParameter("encode_type", $encode_type);
  281. $reqHandler->setParameter("mch_desc", $mch_desc);
  282. $reqHandler->setParameter("mch_name", $mch_name);
  283. $reqHandler->setParameter("mch_price", $mch_price);
  284. $reqHandler->setParameter("mch_returl", $mch_returl);
  285. $reqHandler->setParameter("mch_type", $mch_type);
  286. $reqHandler->setParameter("mch_vno", $mch_vno);
  287. $reqHandler->setParameter("need_buyerinfo", $need_buyerinfo);
  288. $reqHandler->setParameter("seller", $seller);
  289. $reqHandler->setParameter("show_url", $show_url);
  290. $reqHandler->setParameter("transport_desc", $transport_desc);
  291. $reqHandler->setParameter("transport_fee", $transport_fee);
  292. $reqHandler->setParameter('attach', 'tenpay');
  293. $reqUrl = $reqHandler->getRequestURL();
  294. return $reqUrl;
  295. }
  296. function invite_payurl($amount, $price, &$orderid, $bank = 'DEFAULT') {
  297. include_once DISCUZ_ROOT . './source/class/class_chinese.php';
  298. global $_G;
  299. $date = dgmdate(TIMESTAMP, 'YmdHis');
  300. $suffix = dgmdate(TIMESTAMP, 'His').rand(1000, 9999);
  301. $transaction_id = DISCUZ_PARTNER.$date.$suffix;
  302. $orderid = dgmdate(TIMESTAMP, 'YmdHis').random(14);
  303. $chinese = new Chinese(strtoupper(CHARSET), 'GBK');
  304. $subject = $chinese->Convert(lang('forum/misc', 'invite_forum_payment').' '.intval($amount).' '.lang('forum/misc', 'invite_forum_payment_unit'));
  305. $reqHandler = new RequestHandler();
  306. $reqHandler->setGateURL("https://gw.tenpay.com/gateway/pay.htm");
  307. $reqHandler->init();
  308. $reqHandler->setKey(DISCUZ_SECURITYCODE);
  309. $reqHandler->setParameter("partner", DISCUZ_PARTNER);
  310. $reqHandler->setParameter("out_trade_no", $orderid);
  311. $reqHandler->setParameter("total_fee", $price * 100);
  312. $reqHandler->setParameter("return_url", $_G['siteurl'].'api/trade/notify_invite.php');
  313. $reqHandler->setParameter("notify_url", $_G['siteurl'].'api/trade/notify_invite.php');
  314. $reqHandler->setParameter("body", $subject);
  315. $reqHandler->setParameter("bank_type", $bank);
  316. $reqHandler->setParameter("spbill_create_ip", $_G['clientip']);
  317. $reqHandler->setParameter("fee_type", "1");
  318. $reqHandler->setParameter("subject", $subject);
  319. $reqHandler->setParameter("sign_type", "MD5");
  320. $reqHandler->setParameter("service_version", "1.0");
  321. $reqHandler->setParameter("input_charset", "GBK");
  322. $reqHandler->setParameter("sign_key_index", "1");
  323. $reqHandler->setParameter("attach", "tenpay");
  324. $reqHandler->setParameter("time_start", $date);
  325. $reqHandler->setParameter("trade_mode","1");
  326. $reqHandler->setParameter("trans_type","1");
  327. $reqHandler->setParameter("agentid", DISCUZ_AGENTID);
  328. $reqHandler->setParameter("agent_type","2");
  329. $reqUrl = $reqHandler->getRequestURL();
  330. return $reqUrl;
  331. }
  332. function trade_notifycheck($type) {
  333. global $_G;
  334. if($type == 'credit' || $type == 'invite') {
  335. if(!DISCUZ_SECURITYCODE) {
  336. exit('Access Denied');
  337. }
  338. $resHandler = new ResponseHandler();
  339. $resHandler->setKey(DISCUZ_SECURITYCODE);
  340. $resHandler->setParameter("bankname", "");
  341. } else {
  342. if(!DISCUZ_TENPAY_OPENTRANS_KEY) {
  343. exit('Access Denied');
  344. }
  345. $resHandler = new MediPayResponseHandler();
  346. $resHandler->setKey(DISCUZ_TENPAY_OPENTRANS_KEY);
  347. }
  348. if($type == 'credit' || $type == 'invite') {
  349. if($resHandler->isTenpaySign() && DISCUZ_PARTNER == $_GET['partner']) {
  350. return array(
  351. 'validator' => !$_GET['trade_state'],
  352. 'order_no' => $_GET['out_trade_no'],
  353. 'trade_no' => $_GET['transaction_id'],
  354. 'price' => $_GET['total_fee'] / 100,
  355. 'bargainor_id' => $_GET['partner'],
  356. 'location' => true,
  357. );
  358. }
  359. } elseif($type == 'trade') {
  360. if($resHandler->isTenpaySign()) {
  361. return array(
  362. 'validator' => $resHandler->getParameter('retcode') == '0',
  363. 'order_no' => $resHandler->getParameter('mch_vno'),
  364. 'trade_no' => $resHandler->getParameter('cft_tid'),
  365. 'price' => $resHandler->getParameter('total_fee') / 100.0,
  366. 'status' => $resHandler->getParameter('status'),
  367. 'location' => true,
  368. );
  369. }
  370. } else {
  371. return array(
  372. 'validator' => FALSE,
  373. 'location' => 'forum.php?mod=memcp&action=credits&operation=addfunds&return=fail'
  374. );
  375. }
  376. }
  377. function trade_setprice($data, &$price, &$pay, &$transportfee) {
  378. if($data['transport'] == 3) {
  379. $pay['logistics_type'] = 'VIRTUAL';
  380. }
  381. if($data['transport'] != 3) {
  382. if($data['fee'] == 1) {
  383. $pay['logistics_type'] = 'POST';
  384. $pay['logistics_fee'] = $data['trade']['ordinaryfee'];
  385. if($data['transport'] == 2) {
  386. $price = $price + $data['trade']['ordinaryfee'];
  387. $transportfee = $data['trade']['ordinaryfee'];
  388. }
  389. } elseif($data['fee'] == 2) {
  390. $pay['logistics_type'] = 'EMS';
  391. $pay['logistics_fee'] = $data['trade']['emsfee'];
  392. if($data['transport'] == 2) {
  393. $price = $price + $data['trade']['emsfee'];
  394. $transportfee = $data['trade']['emsfee'];
  395. }
  396. } else {
  397. $pay['logistics_type'] = 'EXPRESS';
  398. $pay['logistics_fee'] = $data['trade']['expressfee'];
  399. if($data['transport'] == 2) {
  400. $price = $price + $data['trade']['expressfee'];
  401. $transportfee = $data['trade']['expressfee'];
  402. }
  403. }
  404. }
  405. }
  406. function trade_getorderurl($orderid) {
  407. return "https://www.tenpay.com/med/tradeDetail.shtml?b=1&trans_id=$orderid";
  408. }
  409. function trade_typestatus($method, $status = -1) {
  410. switch($method) {
  411. case 'buytrades' : $methodvalue = array(1, 3);break;
  412. case 'selltrades' : $methodvalue = array(2, 4);break;
  413. case 'successtrades' : $methodvalue = array(5);break;
  414. case 'tradingtrades' : $methodvalue = array(1, 2, 3, 4);break;
  415. case 'closedtrades' : $methodvalue = array(6, 10);break;
  416. case 'refundsuccess' : $methodvalue = array(9);break;
  417. case 'refundtrades' : $methodvalue = array(9, 10);break;
  418. case 'unstarttrades' : $methodvalue = array(0);break;
  419. }
  420. return $status != -1 ? in_array($status, $methodvalue) : $methodvalue;
  421. }
  422. function trade_getstatus($key, $method = 2) {
  423. $language = lang('forum/misc');
  424. $status[1] = array(
  425. 'WAIT_BUYER_PAY' => 1,
  426. 'WAIT_SELLER_CONFIRM_TRADE' => 2,
  427. 'WAIT_SELLER_SEND_GOODS' => 3,
  428. 'WAIT_BUYER_CONFIRM_GOODS' => 4,
  429. 'TRADE_FINISHED' => 5,
  430. 'TRADE_CLOSED' => 6,
  431. 'REFUND_SUCCESS' => 9,
  432. 'REFUND_CLOSED' => 10,
  433. );
  434. $status[2] = array(
  435. 0 => $language['trade_unstart'],
  436. 1 => $language['trade_waitbuyerpay'],
  437. 2 => $language['trade_waitsellerconfirm'],
  438. 3 => $language['trade_waitsellersend'],
  439. 4 => $language['trade_waitbuyerconfirm'],
  440. 5 => $language['trade_finished'],
  441. 6 => $language['trade_closed'],
  442. 9 => $language['trade_refundsuccess'],
  443. 10 => $language['trade_refundclosed']
  444. );
  445. return $method == -1 ? $status[2] : $status[$method][$key];
  446. }
  447. ?>