PHP开发的API接口签名生成和验证过程离不开签名验证。我们在设计签名验证时,请注意以下几点:可变性:每个签名必须是不同的。时效性:每个请求的时效性、过期失效等。唯一性:每个签名都是唯一的。完整性:验证传入数据不被篡改的能力。1.签名参数sign的生成方法第一步:将除sign本身和值为空的参数外的所有参数(注意都是参数)按照参数名字母从小到大的顺序排序。第二步:然后将排序后的参数按照参数1值1参数2值2...参数n值n进行排序(这里的参数和值必须是传输参数的原始值,不能进行处理,比如“不能转换成”再拼接)组成字符串。Step3:在步骤2得到的字符串前面拼接分配给访问方的验证密钥key。Step2:在上一步得到的字符串前面加上验证密钥key(这里的keykey是赋值的)由接口提供方提供给接口接入方),然后计算md5值得到一个32位的字符串,再转为大写。第四步:计算第三步中的字符串的md5值(32位),然后转换为大写,将得到的字符串作为sign的值。例子:假设传输的数据是/interface.php?sign=sign_value&p2=v2&p1=v1&method=cancel&p3=&pn=vn(其实最好是邮寄),sign参数对应的sign_value就是value的签名。第一步拼接字符串,先去掉sign参数本身,然后去掉值为空的参数p3,留下p2=v2&p1=v1&method=cancel&pn=vn,然后按照参数名字符升序排序,method=取消&p1=v1&p2=v2&pn=vn。第二步,拼接参数名和值,最后得到methodcancelp1v1p2v2pnvn。第三步,在上面拼接得到的字符串前添加验证密钥key。我们假设是abc,得到一个新的字符串abcmethodcancelp1v1p2v2pnvn的第四步,然后计算这个字符串的md5,假设是abcdef,然后转换成大写,得到ABCDEF的值,也就是签名值的标志。注意,在计算md5之前,请确保接口和访问方的字符串编码一致。比如统一使用utf-8编码或者GBK编码。如果编码方式不一致,计算出的签名将无法通过验证。2、签名验证方法:根据上述生成签名参数sign的方法规则,计算参数的签名值,与参数中通知的sign对应的参数值进行比较。如果一致,则验证通过。如果不是,则说明参数已被修改。3.直接看下面的代码'abc@qq.com','sex'=>'1','age'=>'16','addr'=>'guangzhou','key'=>$key,'timestamp'=>time(),);//获取符号函数getSign($secret,$data){//对数组的值进行键排序ksort($data);//生成url形式$params=http_build_query($data);//生成符号$sign=md5($params.$secret);return$sign;}//发送数据加号$data['sign']=getSign($secret,$data);/**后台验证标志是否合法@param[type]$secret[description]@param[type]$data[description]@return[type][description]*/functionverifySign($secret,$data){//验证参数中是否有签名if(!isset($data['sign'])||!$data['sign']){echo'发送数据的签名不存在';die();}if(!isset($data['timestamp'])||!$data['timestamp']){echo'发送的数据参数无效';die();}//验证请求,10分钟无效if(time()-$data['timestamp']>600){echo'验证无效,请重新发送请求';die();}$sign=$data['sign'];unset($data['sign']);ksort($data);$params=http_build_query($data);//$secret传入key查询api数据库得到$sign2=md5($params.$secret);if($sign==$sign2){die('验证通过');}else{die('请求无效');}}?>本文由博客群等运营工具平台OpenWrite发布发布,多发布等
