关于letcode:通用签名生成算法

签名生成的通用步骤如下: 第一步,设所有发送或者接管到的数据为汇合M,将汇合M内非空参数值的参数依照参数名ASCII码从小到大排序(字典序),应用URL键值对的格局(即key1=value1&key2=value2…)拼接成字符串stringA。 特地留神以下重要规定: ◆ 参数名ASCII码从小到大排序(字典序);◆ 如果参数的值为空不参加签名;◆ 参数名辨别大小写;◆ 验证调用返回或微信被动告诉签名时,传送的sign参数不参加签名,将生成的签名与该sign值作校验。◆ 微信接口可能减少字段,验证签名时必须反对减少的扩大字段第二步,在stringA最初拼接上key失去stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将失去的字符串所有字符转换为大写,失去sign值signValue。 举例: 假如传送的参数如下:appid: wxd930ea5d5a258f4fmch_id: 10000100device_info: 1000body: test 第一步:对参数依照key=value的格局,并依照参数名ASCII字典序排序如下:appid="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=10000100第二步:拼接API密钥:string=stringA+"&key=192006250b4c09247ec02edce69f6a2d" //注:key为实现依据sign_source调配的密钥key sign=strtoupper(md5(string))/注:MD5签名形式 例子: $requestUrl = 'http://api-common-baidu.com/v1/api/family/getfamilyInfo'; //接口申请地址$params['user_id'] = $user_id;$params['member_id'] = $member_id;$params['sign_source'] = 'baidu_hao123';$signKey = 'c3609e87bfd28c2f34aba9f18269bd0e';//调配的keyksort($params);$string = http_build_query($params);$sign = $string."&key=".$signKey;$params['sign'] = strtoupper(md5($sign));$result = Curl::to($requestUrl)->withData($params)->post();$result = json_decode($result,true);sha1版本 // 验证签名public function checkSignature($token,$signature,$timestamp,$nonce){ $tmpStr = $this->sign($token, $timestamp, $nonce); // 将sha1加密后的字符串可与signature比照 if(empty($tmpStr)){ return false; } if($tmpStr!=strtoupper($signature)){ return false; } return true;}// 生成签名public function sign($token, $timestamp, $nonce){ $arr = [$token,$timestamp,$nonce]; sort($arr,SORT_FLAG_CASE|SORT_LOCALE_STRING); $content=""; for ($i=0;$i<count($arr);$i++){ $content .=$arr[$i]; } $signature = sha1($content); $signature = strtoupper($signature); Log::log('info','create-signature',["signature"=>$signature]); return $signature;0 = SORT_REGULAR -默认。把每一项按惯例顺序排列(Standard ASCII,不扭转类型)。 ...

October 24, 2022 · 3 min · jiezi