12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- <?php namespace App\Servers\Encrypts;
- /**
- * 接口签名
- *
- * @author 刘相欣
- */
- class ApiSign
- {
- /**
- * 接口签名加密
- *
- * @param Array $data 需要加密的内容
- * @param Array $appid appid
- * @param Array $appkey key
- *
- * @return Array
- *
- * */
- public function encode($data,$appid,$appkey)
- {
- // 没有签名
- if( !empty($data['sign']) ) return ['error'=>'sign字段不允许参与'];
- // 没有随机字符串
- if( !isset($data['nonce']) ) $data['nonce'] = (string) random_int(100000,999999);
- // 时间戳
- if( !isset($data['timestamp']) ) $data['timestamp'] = time();
- // 组合参数
- $data['appid'] = $appid ? $appid :'ald930ea5d5a258f4f';
- // 组合参数
- $appkey = $appkey ? $appkey :'192006250b4c09247ec02edce69f6a2d';
- // 键名字典排序
- ksort($data);
- // 空字符串
- $param = '';
- // 循环参数对象,拼接url字符串
- foreach ( $data as $key => $value ) {
- // 如果键值为空(空字符串 空数组 空集合 空对象 字符串0 数字0 NULL FALSE),此参数省略;另 '000' 这类0组成的字符串 不为空
- if( strtolower($value) == 'false' || strtolower($value) == 'null' || empty($value) || ( is_numeric($value) && $value == 0 && substr_count($value,'.') == 1 ) ) continue;
- // 判断键值是否是数组,对象 ,如果是的话,键值转json字符串
- if( is_array( $value ) || is_object($value) ) $value = json_encode($value,JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE);
- // 如果键值为真则 键值转md5加密(此处小写) 为假则直接拼接,0特殊处理
- $param .= '&'.$key.'='.$value;
- }
- // 转码
- $param = ltrim($param,'&');
- // 解码
- $param = rawurldecode($param);
- // 拼接私钥数据
- $param .= '&key='.$appkey;
- // 数据加密(MD5后转大写)
- $data['sign'] = strtoupper(md5($param));
- // 验签通过
- return $data;
- }
- }
|