1<?php 2 3class Sign { 4 5 /** 6 * 获取数据签名 7 * 8 * @param array $param 签名数组 9 * @param string $code 安全校验码 10 * @param string $sign_type 签名类型 11 * @return string 签名字符串 12 */ 13 public static function getSign($param, $code, $sign_type = 'MD5'){ 14 //去除数组中的空值和签名参数(sign/sign_type) 15 $param = self::paramFilter($param); 16 //按键名升序排列数组 17 $param = self::paramSort($param); 18 //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串 19 $param_str = self::createLinkstring($param); 20 //把拼接后的字符串再与安全校验码直接连接起来 21 $param_str = $param_str . $code; 22 //创建签名字符串 23 return self::createSign($param_str, $sign_type); 24 } 25 26 /** 27 * 校验数据签名 28 * 29 * @param string $sign 接口收到的签名 30 * @param array $param 签名数组 31 * @param string $code 安全校验码 32 * @param string $sign_type 签名类型 33 * @return boolean true正确,false失败 34 */ 35 public static function checkSign($sign, $param, $code, $sign_type = 'MD5'){ 36 return $sign == self::getSign($param, $code, $sign_type); 37 } 38 39 /** 40 * 去除数组中的空值和签名参数 41 * 42 * @param array $param 签名数组 43 * @return array 去掉空值与签名参数后的新数组 44 */ 45 private static function paramFilter($param){ 46 $param_filter = array(); 47 foreach ($param as $key => $val) { 48 if($key == 'sign' || $key == 'sign_type' || !strlen($val)){ 49 continue; 50 } 51 $param_filter[$key] = $val; 52 } 53 return $param_filter; 54 } 55 56 /** 57 * 按键名升序排列数组 58 * 59 * @param array $param 排序前的数组 60 * @return array 排序后的数组 61 */ 62 private static function paramSort($param){ 63 ksort($param); 64 reset($param); 65 return $param; 66 } 67 68 /** 69 * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串 70 * 71 * @param array $param 需要拼接的数组 72 * @return string 拼接完成以后的字符串 73 */ 74 private static function createLinkstring($param){ 75 $str = ''; 76 foreach ($param as $key => $val) { 77 $str .= "{$key}={$val}&"; 78 } 79 //去掉最后一个&字符 80 $str = substr($str, 0, strlen($str) - 1); 81 //如果存在转义字符,那么去掉转义 82 if(get_magic_quotes_gpc()){ 83 $str = stripslashes($str); 84 } 85 return $str; 86 } 87 88 /** 89 * 创建签名字符串 90 * 91 * @param string $param 需要加密的字符串 92 * @param string $type 签名类型 默认值:MD5 93 * @return string 签名结果 94 */ 95 private static function createSign($param, $type = 'MD5'){ 96 $type = strtolower($type); 97 if($type == 'md5'){ 98 return md5($param); 99 } 100 if($type == 'dsa'){ 101 exit('DSA 签名方法待后续开发,请先使用MD5签名方式'); 102 } 103 exit("接口暂不支持" . $type . "类型的签名方式"); 104 } 105} 106 107?>
PHP签名
Wesley13
2021-10-11
1282 0 0
点赞
收藏
评论区
加载中...