RefillPhone.php 7.2 KB

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