SmaterWeatherApi---签名加密和数据訪问--简单粗暴一步搞定

-----------------------------------------------------更新-2014-07-09------------------------------------------------------

JAVA(Android)版的实现方法。用于android开发在本地实现生成签名。

import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import android.util.Base64;
import android.util.Log;
/**
*JAVA版。
*调用方法:String apiUrl=SmartWeatherUrlUtil.getInterfaceURL(城市编号,数据类型);
*/
public class SmartWeatherUrlUtil {
	private final static String TAG = "WeatherUrlUtil";
	private static final String MAC_NAME = "HmacSHA1";
	private static final String ENCODING = "UTF-8";
	private static final String appid = "你的appid";
	private static final String private_key = "你的private_key";
	private static final String url_header="http://open.weather.com.cn/data/?";

	/**
	 * 使用 HMAC-SHA1 签名方法对对encryptText进行签名
	 * 
	 * @param url
	 *            被签名的字符串
	 * @param privatekey
	 *            密钥
	 * @return
	 * @throws Exception
	 */
	private static byte[] HmacSHA1Encrypt(String url, String privatekey)
			throws Exception {
		byte[] data = privatekey.getBytes(ENCODING);
		// 依据给定的字节数组构造一个密钥,第二參数指定一个密钥算法的名称
		SecretKey secretKey = new SecretKeySpec(data, MAC_NAME);
		// 生成一个指定 Mac 算法 的 Mac 对象
		Mac mac = Mac.getInstance(MAC_NAME);
		// 用给定密钥初始化 Mac 对象
		mac.init(secretKey);
		byte[] text = url.getBytes(ENCODING);
		// 完毕 Mac 操作
		return mac.doFinal(text);
	}
	/**
	 * 获取URL通过privatekey加密后的码
	 * @param url
	 * @param privatekey
	 * @return
	 * @throws Exception
	 */
	private static String getKey(String url, String privatekey) throws Exception {
		byte[] key_bytes = HmacSHA1Encrypt(url, privatekey);
		String base64encoderStr = Base64.encodeToString(key_bytes, Base64.NO_WRAP);
		return URLEncoder.encode(base64encoderStr, ENCODING);
	}
	/**
	 * 获得接口的URL地址
	 * @param areaid
	 * @param type
	 * @param date
	 * @return
	 * @throws Exception
	 */
	private static String getInterfaceURL(String areaid,String type,String date) throws Exception{
		String keyurl=url_header+"areaid="+areaid+"&type="+type+"&date="+date+"&appid=";
		String key=getKey(keyurl+appid,private_key);
		String appid6 = appid.substring(0, 6);
		
		return keyurl+appid6+"&key=" + key;
	}
	
	public static String getInterfaceURL(String areaid,String type){
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddhhmm");
        String date = dateFormat.format(new Date());
		//String type="forecast3d";//"index";//"forecast3d";"observe"
		try {
			return getInterfaceURL(areaid,type,date);
		} catch (Exception e) {
			Log.e(TAG, e.getMessage(),e.fillInStackTrace());
		}
		return null;
	}

}



----------------------------------------2014-07-04------------------------------------------------------------

使用中国天气网接口真是蛋碎一地可怜

有兴趣的能够去了解一下http://smart.weather.com.cn/wzfw/smart/weatherapi.shtml

年初的时候停用了之前的接口,改为申请使用。于是发个了申请邮件,中间各种曲折。

。一万字。

总算是申请下来了。只是接口文档啊,看的我累觉不爱,文档上仅仅有php版的kay生成方法,我在androi上使用,那些加密方法不知道用java怎样实现

一怒之下,就写个php版的吧,本来是仅仅想写个生成key的接口的,后来想了想 多写了几行 直接来个一步搞定,省去了client上多步网络操作和字符串拼接


叨叨了半天。直接看效果吧


演示样例:




完整代码:

<?

php /*----------这个文件须要传到自己的外网空间,没有的话 能够整个免费的云空间 我用的是魔泊网的 --------------*/ /*----------作用:訪问这个文件 仅仅须要传 type和areaid 这两个參数。就能得直接到 天气数据了/ 不用来来回回的签名拼接等等等一大堆麻烦的东西了--------------*/ //中国天气网SmartWeatherAPI签名接口 //签名生成完直接訪问数据 // 參数type:请求数据类型;areaid: 城市ID //appid $app_id='你自己的appid'; //privatekey $privatekey='你自己的privatekey'; if(isset($_REQUEST['type'])&&isset($_REQUEST['areaid'])){ //接收參数 $type=$_REQUEST['type']; $areaid=$_REQUEST['areaid']; //格式化当前时间yyyyMMddHHmm $date=date('YmdHi', time()); //api请求固定部分 $api_head='http://open.weather.com.cn/data/?

areaid='.$areaid.'&type='.$type.'&date='.$date; //拼接publickey $publickey=$api_head.'&appid='.$app_id; //生成key $sign_key=base64_encode(hash_hmac('sha1',$publickey,$privatekey,true)); //截取appid前6位 $api_url_appid=substr($app_id,0,6); //拼接和urlencode处理终于url $api_url=$api_head.'&appid='.$api_url_appid.'&key='.urlencode($sign_key); //省事省究竟。直接运行 生成的url 訪问数据 echo file_get_contents($api_url); }else{ echo 'error'; } ?

>



posted @ 2016-01-31 21:12  blfshiye  阅读(301)  评论(0编辑  收藏  举报