android天气预报应用(二)
一、官方文档使用说明
以下是文档中的原话,copy过来。
1、产品概述
SmartWeatherAPI 接口(简称”SWA”接口)是×××面向网络媒体、手机厂商、第三方气象服务机构等用户,通过 web 方式提供数据气象服务的官方载体。
2、使用说明该数据主要包括实况、指数、常规预报等数据内容。
3、调用规范
规范用于指导开放平台用户合理调用实况、指数、常规预报等服务数据。
请求方式:http get
接口组成:由固定 URL 加 5 个不同的参数组成,完整 URL 需客户端经过固定方式加密后使用。
数据返回:json
完整 URL:http://webapi.weather.com.cn/data/?areaid=""&type=""&date=""&appid=""&key=".urlencode($key);注意:这里的appid只取字符串的前六位。
固定 URL:http://webapi.weather.com.cn/data/这里边的难点就在于请求URL的最后一个参数key=".urlencode($key),它是一个通过php的函数算出来的。具体如下:
加密方式:
private_key 仅负责与 public_key 共同合成 key 传参,私钥不可见,客户端与服务端各存储一份;public_key 为不包含 key 在内的完整 URL 其它部分(此处appid 为完整 appid)
示例:
http://webapi.weather.com.cn/data/?areaid=101010100&type=forecast&date=201211281030&appid= cf2d61521456sads
key 的算法
key=base64_encode(hash_hmac('sha1',$public_key,$private_key,TRUE));
key 加密后通过 urlencode 对其编码后传参
注:每一个产品使用用户分配一个唯一标识 appid,用于统计用户访问情况、区分用户提供差异服务,终端用户按照终端型号分配,一个型号对应一个标识。由于key的算法在web端开发是十分顺手的,只需要将上面那串代码写到php中就OK了,然而将上述算法迁徙到java中还是费了笔者不少的功夫,这里笔者将无私的分享给大家。具体代码如下:
01.
/**
02.
* 计算签名
03.
* @param baseString 明文
04.
* @param keyString 私钥
05.
* @return 秘钥
06.
* @throws GeneralSecurityException
07.
* @throws UnsupportedEncodingException
08.
*/
09.
public
static
String computeSignature(String baseString, String keyString)
10.
throws
GeneralSecurityException, UnsupportedEncodingException {
11.
12.
SecretKey secretKey =
null
;
13.
14.
byte
[] keyBytes = keyString.getBytes();
15.
secretKey =
new
SecretKeySpec(keyBytes,
"HmacSHA1"
);
16.
17.
Mac mac = Mac.getInstance(
"HmacSHA1"
);
18.
19.
mac.init(secretKey);
20.
21.
byte
[] text = baseString.getBytes();
22.
23.
return
new
String(Base64.encodeBase64(mac.doFinal(text))).trim();
24.
}
Java对PHP服务器hmac_sha1签名认证方法的匹配实现
参考地址:http://4789781.blog.51cto.com/4779781/1436699
转载于:https://blog.51cto.com/4789781/1436698