* @version : HUOSDK 8.0 */ namespace huoCheck; class HuoApiV2 { private $key = ''; /** * 构造函数 * * @param string $key 秘钥 */ function __construct($key = '') { $this->key = $key; } /** * 设置秘钥 * * @param string $key 秘钥 */ public function setKey($key) { $this->key = $key; } /** * 参数校验结果 * * @param string $script_name 调用的API方法, * @param array $params 调用API时带的参数 * @param string $method 请求方法 post / get * * @return bool 结果数组 */ public function check($script_name, $params, $method = 'post') { return self::verifySign($method, $script_name, $params, $this->key, get_val($params, 'sign')); } /** * 校验签名是否正确 * * @param $method * @param $url_path * @param $params * @param $secret * @param $sign * * @return bool */ static public function verifySign($method, $url_path, $params, $secret, $sign) { unset($params['sign']); unset($params['version']); unset($params['s']); // 再计算签名 $_check_sign = self::makeSign($method, $url_path, $params, $secret); //Log::error('---------服务器签名------'.$_check_sign.'-----提交签名----'.$sign.'------'); return strtoupper($_check_sign) == strtoupper($sign); } /** * 生成签名 * * @param string $method 请求方法 "get" or "post" * @param string $url_path * @param array $params 表单参数 * @param string $secret 密钥 * * @return string */ static public function makeSign($method, $url_path, $params, $secret) { $mk = self::makeSource($method, $url_path, $params); $my_sign = md5($mk.'&'.$secret); //Log::error('---------我是签名原串------'.$mk.'&'.$secret.'-----我是签名----'.$my_sign.'------'); return $my_sign; } static private function makeSource($method, $url_path, $params) { $_params = $params; $_str = strtoupper($method).'&'.rawurlencode($url_path).'&'; ksort($_params); reset($_params); $query_string = array(); foreach ($_params as $key => $val) { if (is_array($val)) { ksort($val); reset($val); foreach ($val as $_k2 => $_v2) { array_push($query_string, $key.'-'.$_k2.'='.$_v2); } } else { array_push($query_string, $key.'='.$val); } } $query_string = join('&', $query_string); return $_str.str_replace('~', '%7E', rawurlencode($query_string)); } }