getMillisecond(); $header['app_id'] = config::APP_ID; $header['req_no'] = 'YZ' . $timestamp; $header['timestamp'] = $timestamp; $header['sign_nonce'] = $this->createNoncestr(); $header['sign'] = $this->sign($params, $header); return ['header' => $header, 'body' => $params]; } private function req_params(int $phone, int $amount, $card_type, string $order_sn) { $params['product_id'] = config::operator[$card_type] . $amount; $params['phone'] = $phone; $params['type'] = 1; $params['kh_order_id'] = $order_sn; $params['ext_content'] = ''; return $params; } public function add($card_no, $card_type, $amount, $params, &$net_errno = 0) { $params = $this->req_params($card_no, $amount, $card_type, $params['order_sn']); $params = $this->header_params($params); $params = json_encode($params); $resp = http_post_data(config::ORDER_URL, $params, config::ExtHeaders, $net_errno); if (empty($resp)) { return [false, '系统错误', true]; } else { Log::record($resp, Log::DEBUG); $resp = json_decode($resp, true); if (empty($resp)) { return [false, '系统错误', true]; } elseif ($resp['body']['code'] === '200') { return [true, $resp['body']['order_id'], false]; } elseif ($resp['body']['code'] === '9999') { $net_errno = "HTTP-9999"; return [false, $resp['body']['msg'], true]; } else { return [false, $resp['body']['msg'], false]; } } } public function query($refill_info) { $params['kh_order_id'] = $refill_info['order_sn']; $params = $this->header_params($params); $params = json_encode($params); $resp = http_post_data(config::QUERY_URL, $params, config::ExtHeaders); if (empty($resp)) { return [false, '网络错误', '']; } else { Log::record($resp, Log::DEBUG); $resp = json_decode($resp, true); $resp = $resp[0]; if (empty($resp)) { return [false, '网络错误', '']; } elseif ($resp['body']['code'] === '200') { $official_sn = ''; $status = $resp['body']['status']; if ($status === '3') { $official_sn = $resp['body']['ext_content']; $updata['official_sn'] = $official_sn; Model('refill_order')->edit($refill_info['order_id'], $updata); $order_state = ORDER_STATE_SUCCESS; } elseif ($status === '2') { $order_state = ORDER_STATE_CANCEL; } elseif ($status === '1') { $order_state = ORDER_STATE_SEND; } else { return [false, $status, $official_sn]; } return [true, $order_state, $official_sn]; } elseif ($resp['body']['code'] === '220005' && (time() - $refill_info['commit_time'] > 1800)) { return [true, ORDER_STATE_NOEXIST]; } else { return [false, $resp['body']['msg'], '']; } } } public function balance() { $params['type'] = 1; $params = $this->header_params($params); $params = json_encode($params); $resp = http_post_data(config::BALANCE_URL, $params, config::ExtHeaders); if (empty($resp)) { return [false, '系统错误']; } else { Log::record($resp, Log::DEBUG); $resp = json_decode($resp, true); if (empty($resp)) { return [false, '系统错误']; } elseif ($resp['body']['code'] === '200') { return [true, $resp['body']['balance']]; } else { return [false, $resp['body']['msg']]; } } } private function sign($params, $header) { $params = array_merge($params, $header); $content = ''; ksort($params); foreach ($params as $key => $val) { if (false === $this->check_empty($val)) { $content .= "{$key}={$val}&"; } } $content = rtrim($content, '&'); $res = openssl_pkey_get_private(config::PRIVATE_KEY); openssl_sign($content, $sign, $res, OPENSSL_ALGO_SHA1); return base64_encode($sign); } /** * 获取毫秒级别的时间戳 */ private function getMillisecond() { $cur = microtime(true); $cur = intval($cur * 1000); return $cur; } private function createNoncestr($length = 32) { $chars = "abcdefghijklmnopqrstuvwxyz0123456789"; $str = ""; for ($i = 0; $i < $length; $i++) { $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1); } return $str; } }