VM暫存
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

500 wiersze
14KB

  1. <?php
  2. /**
  3. * API 代碼
  4. */
  5. abstract class TWGC_API_NO
  6. {
  7. const BalanceInquiry = 1; // 1: 查詢 BarCode
  8. const Register = 2; // 2: 卡片記名
  9. const VirtualCardActivation = 3;// 3: 虛擬卡開卡
  10. const Refund = 4; // 4: 退款
  11. const CheckResult = 5; // 5: 確認交易結果
  12. const BalanceMaintenance3 = 6; // 6: 會員綁定卡片消費
  13. const UnRegister = 7; // 7: 取消卡片記名
  14. const Reload2 = 8; // 8: 卡片儲值
  15. const GetOTPin2 = 9; // 9: 拿PIN碼
  16. const Suspend = 10; // 10: 停用
  17. }
  18. /**
  19. * 取得APP TOKEN服務的類別。
  20. */
  21. class TWGCAgent {
  22. public $issuerIdentity = "issuerIdentity";
  23. public $IssuerID = "IssuerID";
  24. public $StoreID = "StoreID";
  25. public $POSID = "POSID";
  26. public $ServiceURL = "ServiceURL";
  27. /**
  28. * 取得TWGC 服務的建構式。
  29. */
  30. function __construct() {
  31. $this->TWGCAgent();
  32. }
  33. /**
  34. * 取得TWGC 服務的實體。
  35. */
  36. function TWGCAgent() {
  37. }
  38. /**
  39. * API 1: 查詢 BarCode
  40. *
  41. * 說明: 查詢 BarCode 狀態、餘額及紅利點數
  42. *
  43. * [data]
  44. * *BarCode:卡號
  45. */
  46. public function BalanceInquiry($data) {
  47. extract($data);
  48. if (empty($POSTime)) {
  49. $POSTime = date('Y/m/d H:i:s', time());
  50. }
  51. if (empty($MbrPhone)) { $MbrPhone = ""; }
  52. $BarCode_str = '';
  53. if (isset($BarCode)) {
  54. $BarCode_str = '<BarCode>'. $BarCode .'</BarCode>';
  55. }
  56. $Card_str = $BarCode_str;
  57. $xml =
  58. '<DPReq>
  59. <IssuerID>'. $this->IssuerID .'</IssuerID>
  60. <StoreID>'. $this->StoreID .'</StoreID>
  61. <POSID>'. $this->POSID .'</POSID>
  62. <CustTrxNo>'. $CustTrxNo .'</CustTrxNo>
  63. <Detail>
  64. <Card>'. $Card_str .'</Card>
  65. </Detail>
  66. <MbrPhone>'. $MbrPhone .'</MbrPhone>
  67. <POSTime>'. $POSTime .'</POSTime>
  68. </DPReq>';
  69. return $this->getResultXml(__FUNCTION__, $xml);
  70. }
  71. /**
  72. * API 2: 卡片記名
  73. *
  74. * 說明: 將 BarCode 綁定 UserID
  75. *
  76. * [data]
  77. * *UserID:會員編號 (最多 20 字元)
  78. * UserName:會員姓名
  79. * UserSex:會員性別 (M/F/空字串 )
  80. * Birthday:會員生日 (YYYY/MM/DD)
  81. * Addr:會員地址
  82. * Email:會員電子郵件
  83. * TelHZone:會員市內電話區碼
  84. * TelH:會員市內電話
  85. * MbrPhone:手機號碼
  86. * Memo:備註
  87. * *BarCode:記名卡號
  88. */
  89. public function Register($data) {
  90. extract($data);
  91. if (empty($POSTime)) {
  92. $POSTime = date('Y/m/d H:i:s', time());
  93. }
  94. if (empty($Birthday)) {
  95. $Birthday = $POSTime;
  96. }
  97. if (empty($UserName)) { $UserName = ""; }
  98. if (empty($UserSex)) { $UserSex = ""; }
  99. if (empty($Addr)) { $Addr = ""; }
  100. if (empty($Email)) { $Email = ""; }
  101. if (empty($TelHZone)) { $TelHZone = ""; }
  102. if (empty($TelH)) { $TelH = ""; }
  103. if (empty($MbrPhone)) { $MbrPhone = ""; }
  104. if (empty($Memo)) { $Memo = ""; }
  105. if (empty($StaffID)) { $StaffID = ""; }
  106. $xml =
  107. '<DPReq>
  108. <IssuerID>'. $this->IssuerID .'</IssuerID>
  109. <StoreID>'. $this->StoreID .'</StoreID>
  110. <POSID>'. $this->POSID .'</POSID>
  111. <CustTrxNo>'. $CustTrxNo .'</CustTrxNo>
  112. <UserID>'. $UserID .'</UserID>
  113. <MbrPhone>'. $MbrPhone .'</MbrPhone>
  114. <BarCode>'. $BarCode .'</BarCode>
  115. <POSTime>'. $POSTime .'</POSTime>
  116. <StaffID>'. $StaffID .'</StaffID>
  117. </DPReq>';
  118. /*
  119. $xml =
  120. '<DPReq>
  121. <IssuerID>'. $this->IssuerID .'</IssuerID>
  122. <StoreID>'. $this->StoreID .'</StoreID>
  123. <POSID>'. $this->POSID .'</POSID>
  124. <CustTrxNo>'. $CustTrxNo .'</CustTrxNo>
  125. <UserID>'. $UserID .'</UserID>
  126. <UserName>'. $UserName .'</UserName>
  127. <UserSex>'. $UserSex .'</UserSex>
  128. <Birthday>'. $Birthday .'</Birthday>
  129. <Addr>'. $Addr .'</Addr>
  130. <Email>'. $Email .'</Email>
  131. <TelHZone>'. $TelHZone .'</TelHZone>
  132. <TelH>'. $TelH .'</TelH>
  133. <MbrPhone>'. $MbrPhone .'</MbrPhone>
  134. <Memo>'. $Memo .'</Memo>
  135. <BarCode>'. $BarCode .'</BarCode>
  136. <POSTime>'. $POSTime .'</POSTime>
  137. <StaffID>'. $StaffID .'</StaffID>
  138. </DPReq>';
  139. */
  140. return $this->getResultXml(__FUNCTION__, $xml);
  141. }
  142. /**
  143. * API 3: 虛擬卡開卡
  144. *
  145. * 說明: 用 EAN 去建立任意面額的 BarCode, 剛建立好的 BarCode 未綁定 UserID
  146. *
  147. * [data]
  148. * *EAN:卡號前 13碼
  149. * *Amount:卡片面額
  150. * Timeout:未收到開卡結果的Timeout時間,0~999
  151. */
  152. public function VirtualCardActivation($data) {
  153. extract($data);
  154. if (empty($TransTime)) {
  155. $TransTime = date('Y/m/d H:i:s', time());
  156. }
  157. if (empty($Timeout)) { $Timeout = 100; } // 未收到開卡結果的Timeout時間,0~999
  158. $EAN_str = '';
  159. if (isset($EAN)) {
  160. $EAN_str = '<EAN>'. $EAN .'</EAN>';
  161. }
  162. $Amount_str = '';
  163. if (isset($Amount)) {
  164. $Amount_str = '<Amount>'. $Amount .'</Amount>';
  165. }
  166. $Card_str = $EAN_str.$Amount_str;
  167. $xml =
  168. '<DPReq>
  169. <IssuerID>'. $this->IssuerID .'</IssuerID>
  170. <StoreID>'. $this->StoreID .'</StoreID>
  171. <POSID>'. $this->POSID .'</POSID>
  172. <CustTrxNo>'. $CustTrxNo .'</CustTrxNo>
  173. <TransTime>'. $TransTime .'</TransTime>
  174. <Timeout>'. $Timeout .'</Timeout>
  175. <Detail>
  176. <Card>'. $Card_str .'</Card>
  177. </Detail>
  178. </DPReq>';
  179. return $this->getResultXml(__FUNCTION__, $xml);
  180. }
  181. /**
  182. * API 4: 退款
  183. *
  184. * 說明: 退款作業 (取消消費交易)
  185. *
  186. * [data]
  187. * *CustTrxNo:原交易序號
  188. * *AuthCode:原交易授權碼
  189. */
  190. public function Refund($data) {
  191. extract($data);
  192. if (empty($POSTime)) {
  193. $POSTime = date('Y/m/d H:i:s', time());
  194. }
  195. if (empty($MbrPhone)) { $MbrPhone = ""; }
  196. if (empty($StaffID)) { $StaffID = ""; }
  197. $xml =
  198. '<DPReq>
  199. <IssuerID>'. $this->IssuerID .'</IssuerID>
  200. <StoreID>'. $this->StoreID .'</StoreID>
  201. <POSID>'. $this->POSID .'</POSID>
  202. <CustTrxNo>'. $CustTrxNo .'</CustTrxNo>
  203. <AuthCode>'. $AuthCode .'</AuthCode>
  204. <MbrPhone>'. $MbrPhone .'</MbrPhone>
  205. <POSTime>'. $POSTime .'</POSTime>
  206. <StaffID>'. $StaffID .'</StaffID>
  207. </DPReq>';
  208. return $this->getResultXml(__FUNCTION__, $xml);
  209. }
  210. /**
  211. * API 5: 確認交易結果
  212. *
  213. * 說明: 確認交易結果
  214. *
  215. * [data]
  216. * *CustTrxNo:原交易序號
  217. */
  218. public function CheckResult($data) {
  219. extract($data);
  220. if (empty($POSTime)) {
  221. $POSTime = date('Y/m/d H:i:s', time());
  222. }
  223. if (empty($MbrPhone)) { $MbrPhone = ""; }
  224. $xml =
  225. '<DPReq>
  226. <IssuerID>'. $this->IssuerID .'</IssuerID>
  227. <StoreID>'. $this->StoreID .'</StoreID>
  228. <POSID>'. $this->POSID .'</POSID>
  229. <CustTrxNo>'. $CustTrxNo .'</CustTrxNo>
  230. <MbrPhone>'. $MbrPhone .'</MbrPhone>
  231. <POSTime>'. $POSTime .'</POSTime>
  232. </DPReq>';
  233. return $this->getResultXml(__FUNCTION__, $xml);
  234. }
  235. /**
  236. * API 6: 會員綁定卡片消費
  237. *
  238. * 說明: 使用 已綁定 MemberID 的 BarCode 消費
  239. *
  240. * [data]
  241. * *MemberID:會員編號 (ex. 車號)
  242. * *BarCode:卡號
  243. * ReqAmount:總交易金額 總交易金額 (包含非 卡片交易金額 )
  244. * *Amount:卡片 交易金額 (包含使 用紅利點數金額 )
  245. * ProductID:商品代號
  246. * ReedemPointsForCash:使用紅利點數折抵功能,會以紅利可折抵的最大金額扣除紅利,並優先扣除 , 使用請填 “Y”,不使用則不填
  247. */
  248. public function BalanceMaintenance3($data, $redeem) {
  249. extract($data);
  250. if (empty($POSTime)) {
  251. $POSTime = date('Y/m/d H:i:s', time());
  252. }
  253. $RedeemPointsForCash = "";
  254. if ($redeem) {
  255. $RedeemPointsForCash = "Y"; // 紅利點數折抵
  256. }
  257. if (empty($ReqAmount)) { $ReqAmount = ""; }
  258. if (empty($MbrPhone)) { $MbrPhone = ""; }
  259. if (empty($StaffID)) { $StaffID = ""; }
  260. if (empty($ProductID)) { $ProductID = ""; }
  261. $xml =
  262. '<DPReq>
  263. <IssuerID>'. $this->IssuerID .'</IssuerID>
  264. <StoreID>'. $this->StoreID .'</StoreID>
  265. <POSID>'. $this->POSID .'</POSID>
  266. <MemberID>'. $MemberID .'</MemberID>
  267. <BarCode>'. $BarCode .'</BarCode>
  268. <ReqAmount>'. $ReqAmount .'</ReqAmount>
  269. <Amount>'. $Amount .'</Amount>
  270. <CustTrxNo>'. $CustTrxNo .'</CustTrxNo>
  271. <MbrPhone>'. $MbrPhone .'</MbrPhone>
  272. <POSTime>'. $POSTime .'</POSTime>
  273. <StaffID>'. $StaffID .'</StaffID>
  274. <ProductID>'. $ProductID .'</ProductID>
  275. <RedeemPointsForCash>'. $RedeemPointsForCash .'</RedeemPointsForCash>
  276. </DPReq>';
  277. return $this->getResultXml(__FUNCTION__, $xml);
  278. }
  279. /**
  280. * API 7: 取消卡片記名
  281. *
  282. * 說明: 取消卡片記名
  283. *
  284. * [data]
  285. * *UserID:要取消記名的會員編號
  286. * *MbrPhone:要取消記名的會員電話
  287. * *BarCode:要取消記名的卡號
  288. */
  289. public function UnRegister($data) {
  290. extract($data);
  291. if (empty($POSTime)) { $POSTime = date('Y/m/d H:i:s', time()); }
  292. if (empty($MbrPhone)) { $MbrPhone = ""; }
  293. if (empty($StaffID)) { $StaffID = ""; }
  294. $xml =
  295. '<DPReq>
  296. <IssuerID>'. $this->IssuerID .'</IssuerID>
  297. <StoreID>'. $this->StoreID .'</StoreID>
  298. <POSID>'. $this->POSID .'</POSID>
  299. <CustTrxNo>'. $CustTrxNo .'</CustTrxNo>
  300. <UserID>'. $UserID .'</UserID>
  301. <MbrPhone>'. $MbrPhone .'</MbrPhone>
  302. <BarCode>'. $BarCode .'</BarCode>
  303. <POSTime>'. $POSTime .'</POSTime>
  304. <StaffID>'. $StaffID .'</StaffID>
  305. </DPReq>';
  306. return $this->getResultXml(__FUNCTION__, $xml);
  307. }
  308. /**
  309. * API 8: 卡片儲值
  310. *
  311. * 說明:
  312. * 1. 實體卡: 括開銀漆後會有 PIN 碼, 輸入 PIN 即可代表該卡片
  313. * 2. 虛擬卡: 要先向 TWGC 取得一個一次性的密碼作為 PIN 碼, 進行儲值交易 (GetOTPin2)
  314. *
  315. * [data]
  316. * *Amount:儲值金額最大共10碼數字,單位為元
  317. * PromotionID:促銷活動代號 (填空字串即可)
  318. * PIN:儲值碼
  319. *
  320. */
  321. public function Reload2($data) {
  322. extract($data);
  323. if (empty($POSTime)) { $POSTime = date('Y/m/d H:i:s', time()); }
  324. if (empty($PIN)) { $PIN = ""; }
  325. if (empty($MbrPhone)) { $MbrPhone = ""; }
  326. if (empty($StaffID)) { $StaffID = ""; }
  327. if (empty($PromotionID)) { $PromotionID = ""; }
  328. $xml =
  329. '<DPReq>
  330. <IssuerID>'. $this->IssuerID .'</IssuerID>
  331. <StoreID>'. $this->StoreID .'</StoreID>
  332. <POSID>'. $this->POSID .'</POSID>
  333. <CustTrxNo>'. $CustTrxNo .'</CustTrxNo>
  334. <PIN>'. $PIN .'</PIN>
  335. <Amount>'. $Amount .'</Amount>
  336. <MbrPhone>'. $MbrPhone .'</MbrPhone>
  337. <POSTime>'. $POSTime .'</POSTime>
  338. <StaffID>'. $StaffID .'</StaffID>
  339. <PromotionID>'. $PromotionID .'</PromotionID>
  340. </DPReq>';
  341. return $this->getResultXml(__FUNCTION__, $xml);
  342. }
  343. /**
  344. * API 9: 取得卡片儲值 PIN 碼
  345. *
  346. * 說明:
  347. * GetOTPin2 會回傳一個圖檔 (以 base64 解碼還原為圖檔), 圖檔裡有 PIN 碼
  348. *
  349. * [data]
  350. * *RequestTime:本機時間
  351. * *PasswordType:固定填寫 ‘TWGCAPP’
  352. * *Size:回傳圖檔大小 (L/M/S)
  353. */
  354. public function GetOTPin2($data) {
  355. extract($data);
  356. if (empty($RequestTime)) { $RequestTime = date('Y/m/d H:i:s', time()); }
  357. if (empty($PasswordType)) { $PasswordType = "TWGCAPP"; }
  358. if (empty($Size)) { $Size = "S"; }
  359. $xml =
  360. '<DPReq>
  361. <RequestTime>'. $RequestTime .'</RequestTime>
  362. <PasswordType>'. $PasswordType .'</PasswordType>
  363. <BarCode>'. $BarCode .'</BarCode>
  364. <Size>'. $Size .'</Size>
  365. </DPReq>';
  366. return $this->getResultXml(__FUNCTION__, $xml);
  367. }
  368. /**
  369. * API 10: 停用
  370. *
  371. * 說明: 停用 Barcode
  372. *
  373. * [data]
  374. * *BarCode:要停用的卡號
  375. * *Reason: 停用原因 (1.遺失, 2.損壞, 3.更換新卡而停用本卡, 4.單純停用)
  376. */
  377. public function Suspend($data) {
  378. extract($data);
  379. if (empty($PIN)) { $PIN = ""; }
  380. if (empty($MbrPhone)) { $MbrPhone = ""; }
  381. if (empty($TransTime)) { $TransTime = date('Y-m-d H:i:s', time()); }
  382. if (empty($Reason)) { $Reason = "4"; } // 4.單純停用
  383. $xml =
  384. '<DPReq>
  385. <IssuerID>'. $this->IssuerID .'</IssuerID>
  386. <StoreID>'. $this->StoreID .'</StoreID>
  387. <POSID>'. $this->POSID .'</POSID>
  388. <CustTrxNo>'. $CustTrxNo .'</CustTrxNo>
  389. <BarCode>'. $BarCode .'</BarCode>
  390. <PIN>'. $PIN .'</PIN>
  391. <MbrPhone>'. $MbrPhone .'</MbrPhone>
  392. <TransTime>'. $TransTime .'</TransTime>
  393. <Reason>'. $Reason .'</Reason>
  394. </DPReq>';
  395. return $this->getResultXml(__FUNCTION__, $xml);
  396. }
  397. /**
  398. * 取得 TWGC 回傳 XML
  399. */
  400. private function getResultXml($function, $xml) {
  401. $url = $this->ServiceURL.'/'.$function;
  402. $parameters =
  403. array(
  404. 'issuerIdentity' => $this->issuerIdentity,
  405. 'xml' => base64_encode($xml)
  406. );
  407. $spResult = $this->ServerPost($url, $parameters);
  408. // parse result
  409. $result_decode = base64_decode(substr(simplexml_load_string($spResult), 5));
  410. //echo json_encode(simplexml_load_string($result_decode));
  411. return simplexml_load_string($result_decode);
  412. }
  413. private function ServerPost($url, $parameters=array()) {
  414. $ch = curl_init();
  415. curl_setopt($ch, CURLOPT_URL, $url);
  416. curl_setopt($ch, CURLOPT_HEADER, FALSE);
  417. curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  418. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  419. curl_setopt($ch, CURLOPT_POST, TRUE);
  420. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($parameters));
  421. $rs = curl_exec($ch);
  422. curl_close($ch);
  423. return $rs;
  424. }
  425. }