<?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;
	}

}
