RefillPhone.php 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. <?php
  2. namespace refill\huiyuan;
  3. require_once(BASE_HELPER_RAPI_PATH . '/huiyuan/config.php');
  4. use refill;
  5. use Log;
  6. use QueueClient;
  7. class RefillPhone extends refill\IRefillPhone
  8. {
  9. public function __construct($cfgs)
  10. {
  11. parent::__construct($cfgs);
  12. }
  13. private function req_params(int $phone, int $amount, int $card_type, string $order_sn)
  14. {
  15. $params['agent_id'] = config::AGENT_ID;
  16. $params['bill_id'] = $order_sn;
  17. $params['bill_time'] = date("YmdHis", time() - 1);
  18. $params['supply_type'] = 1;
  19. $params['supply_id'] = 1;
  20. $params['product_code'] = config::Product[$card_type][$amount];
  21. $params['product_num'] = 1;
  22. $params['region_id'] = -1;
  23. $params['server_id'] = -1;
  24. $params['charge_account'] = $phone;
  25. $params['charge_amt'] = config::charge_amt[$amount];
  26. $params['client_ip'] = config::API_IP;
  27. $params['notify_url'] = config::NOTIFY_URL;
  28. $params['time_stamp'] = date("YmdHis");
  29. return $params;
  30. }
  31. public function add($card_no, $card_type, $amount, $params,&$net_errno = 0)
  32. {
  33. $order_id = $params['order_id'];
  34. $order_sn = $params['order_sn'];
  35. $params = $this->req_params($card_no, $amount, $card_type, $order_sn);
  36. $sign = $this->sign($params);
  37. $params['sign'] = $sign;
  38. $resp = http_request(config::ORDER_URL, $params, 'POST', false, config::ExtHeaders, $net_errno);
  39. if (empty($resp)) {
  40. return [false, '网络错误', true];
  41. }
  42. else
  43. {
  44. Log::record($resp, Log::DEBUG);
  45. $resp = $this->decode_tag($resp);
  46. $ret_code = $resp['ret_code'];
  47. if (empty($resp)) {
  48. return [false, '网络错误', true];
  49. }
  50. elseif ($ret_code === '0')
  51. {
  52. $bill_status = $resp['bill_status'];
  53. if ($bill_status === '成功' || $bill_status === '失败') {
  54. QueueClient::async_push("QueryRefillState",['order_id' => $order_id],5);
  55. }
  56. return [true, $resp['jnet_bill_no'], false];
  57. }
  58. elseif (in_array($ret_code, ['-1', '997', '998'], true)) {
  59. QueueClient::async_push("QueryRefillState", ['order_id' => $order_id], 5);
  60. return [true, $resp['jnet_bill_no'], false];
  61. }
  62. elseif (in_array($ret_code, config::ERR_NOS, true)) {
  63. return [false, $resp['ret_msg'], false];
  64. }
  65. elseif (in_array($ret_code, ['5', '100', '999'], true)) {
  66. $net_errno = "HTTP-{$ret_code}";
  67. return [false, $resp['ret_msg'], true];
  68. }
  69. else {
  70. $err = 998;
  71. $net_errno = "HTTP-{$err}";
  72. return [false, $resp['ret_msg'], true];
  73. }
  74. }
  75. }
  76. public function query($refill_info)
  77. {
  78. $params['agent_id'] = config::AGENT_ID;
  79. $params['bill_id'] = $refill_info['order_sn'];
  80. $params['time_stamp'] = date("YmdHis");
  81. $key = config::KEY;
  82. $content = "agent_id={$params['agent_id']}&bill_id={$params['bill_id']}&time_stamp={$params['time_stamp']}|||{$key}";
  83. $params['sign'] = md5($content);
  84. $resp = http_request(config::QUERY_URL, $params, 'POST', false, config::ExtHeaders);
  85. if (empty($resp)) {
  86. return [false, '网络错误'];
  87. }
  88. else
  89. {
  90. $resp = $this->decode_tag($resp);
  91. if (empty($resp)) {
  92. return [false, '网络错误'];
  93. }
  94. elseif ($resp['ret_code'] === '0')
  95. {
  96. $status = $resp['bill_status'];
  97. if ($status === '成功') {
  98. $order_state = ORDER_STATE_SUCCESS;
  99. } elseif ($status === '失败') {
  100. $order_state = ORDER_STATE_CANCEL;
  101. } elseif ($status === '处理中') {
  102. $order_state = ORDER_STATE_SEND;
  103. } else {
  104. return [false, $resp['ret_msg']];
  105. }
  106. return [true, $order_state];
  107. }
  108. elseif ($resp['ret_code'] === '-1')
  109. {
  110. if($resp['bill_status'] === '失败' ||$resp['ret_msg'] === '接口单失败'){
  111. return [true, ORDER_STATE_CANCEL];
  112. }else{
  113. return [false, $resp['ret_msg']];
  114. }
  115. }
  116. elseif ($resp['ret_code'] === '8' && (time() - $refill_info['commit_time'] >= 600))
  117. {
  118. return [true, ORDER_STATE_NOEXIST];
  119. }
  120. else
  121. {
  122. return [false, $resp['ret_msg']];
  123. }
  124. }
  125. }
  126. public function balance()
  127. {
  128. $params['agent_id'] = config::AGENT_ID;
  129. $params['time_stamp'] = date("YmdHis");
  130. $key = config::KEY;
  131. $content = "agent_id={$params['agent_id']}&time_stamp={$params['time_stamp']}|||{$key}";
  132. $params['sign'] = md5($content);
  133. $resp = http_request(config::BALANCE_URL, $params, 'POST', false, config::ExtHeaders);
  134. if (empty($resp)) {
  135. return [false, '网络错误'];
  136. }
  137. else
  138. {
  139. Log::record($resp, Log::DEBUG);
  140. $resp = $this->decode_tag($resp);
  141. if (empty($resp)) {
  142. return [false, '网络错误'];
  143. } elseif ($resp['ret_code'] === '0') {
  144. return [true, $resp['can_used_amt']];
  145. } else {
  146. return [false, $resp['ret_msg']];
  147. }
  148. }
  149. }
  150. private function sign($params)
  151. {
  152. $key = config::KEY;
  153. $content = "agent_id={$params['agent_id']}&bill_id={$params['bill_id']}&bill_time={$params['bill_time']}&supply_type={$params['supply_type']}&supply_id={$params['supply_id']}";
  154. $content .= "&product_code={$params['product_code']}&product_num={$params['product_num']}&region_id={$params['region_id']}&server_id={$params['server_id']}";
  155. $content .= "&charge_account={$params['charge_account']}&time_stamp={$params['time_stamp']}|||{$key}";
  156. return md5($content);
  157. }
  158. public function decode_tag($squery)
  159. {
  160. if(empty($squery)) return false;
  161. $squery = urldecode($squery);
  162. $squery = mb_convert_encoding($squery, "UTF-8", "GB2312");
  163. $result = [];
  164. $params = preg_split('/&/', $squery);
  165. foreach ($params as $pair)
  166. {
  167. if(empty($pair)) continue;
  168. $kv = explode('=', $pair);
  169. $count = count($kv);
  170. if($count === 1) {
  171. $key = $kv[0];
  172. $val = "";
  173. }
  174. elseif($count === 2) {
  175. $key = $kv[0];
  176. $val = urldecode($kv[1]);
  177. }
  178. else {
  179. continue;
  180. }
  181. if(!empty($key)) {
  182. $result[$key] = $val;
  183. }
  184. }
  185. return $result;
  186. }
  187. }