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

来源:互联网 发布:淘宝执行运营工资高吗 编辑:程序博客网 时间:2024/04/26 22:38

-----------------------------------------------------更新-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的接口的,后来想了想 多写了几行 直接来个一步搞定,省去了客户端上多步网络操作和字符串拼接


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


示例:




完整代码:

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


7 0
原创粉丝点击