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

SmaterWeatherApi---签名加密和数据訪问--简单粗暴一步搞定的更多相关文章

  1. Spring ORM数据訪问——Hibernate

    Hibernate 我们将首先介绍Spring环境中的Hibernate 5.然后介绍使用Hibernate 5来演示Spring集成O-R映射器的方法. 本节将具体介绍很多问题,并显示DAO实现和事 ...

  2. 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】

    说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...

  3. NGINX之——配置HTTPS加密反向代理訪问–自签CA

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46695495 出于公司内部訪问考虑,採用的CA是本机Openssl自签名生成的,因 ...

  4. 虚拟dom?diff算法?key?Vue原理的核心三问?打包教你搞定。

    为什么需要虚拟DOM 先介绍浏览器加载一个HTML文件需要做哪些事,帮助我们理解为什么我们需要虚拟DOM.webkit引擎的处理流程,如下图所示: 所有浏览器的引擎工作流程都差不多,如上图大致分5步: ...

  5. opencv-从图像旋转学习Mat数据訪问

    先看一个简单的样例 代码: // ConsoleApplication3_6_23.cpp : Defines the entry point for the console application. ...

  6. Java并发学习之十五——使用读写锁同步数据訪问

    本文是学习网络上的文章时的总结.感谢大家无私的分享. 读写锁重要的是写锁的使用,仅仅用一个入口. 以下是读写锁使用的样例 package chapter2; import java.util.conc ...

  7. FineUIPro v3.5.0发布了,减少 90% 的上行数据量,15行代码全搞定!

    一切为客户着想 一切的一切还得从和一位台湾客户的沟通说起: 客户提到将ViewState保存在服务器端以减少上行数据量,从而加快页面的回发速度. 但是在FineUI中,控件状态都保存在FState中, ...

  8. 如何在MAC上使用SVN,简单几行命令搞定

    如果你要使用SVN管理代码,如果不是迫不得已,还是看看git吧,但是SVN也要知道怎么用,原理是相似的. 首先,要准备的东西:svnX软件 https://pan.baidu.com/s/1mhEay ...

  9. 【路由达人】简单两步搞定小米路由新增功能-DDNS(解析域名地址转向在线工具)

    DDNS(Dynamic Domain Name Server)是动态域名服务的缩写! 简单来说目前ISP大多为我们提供动态IP(如ADSL拨号上网),而很多设备或服务需要通过远程访问时需要一个固定的 ...

随机推荐

  1. python (3):wxPython打包app,报错

    1,打包app报错 如图: 使用py2app,mac下打包成app.异常.程序直接退出. 没有详细的错误信息,client程序直接崩溃了. 2.原因 代码没有几行: #!/usr/bin/python ...

  2. js jsp 时间 日期 控件 插件 简单 实用

    js时间控件一般都是找网上的用,这东西平常很少涉及到,一用到找起来却烦死人,不是没用就是太复杂,今天向大家推荐一个简单实用的控件,该控件在不断更新,而且有专门的网站对它进行维护,所以值得一看. 先说它 ...

  3. SQL SERVER数据库服务操作

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  4. 如何让你的 footer 总是在浏览器底部无论什么分辨率无论什么浏览器?

    一个可以用的CSS驱动的可粘在底部的Footer 我们曾经都或多或少的试过用CSS来把Footer固定在底部的经理,但是他们总是不能正常的粘在底部,不是吗?可喜的是,痛苦的研究如何让footer粘在底 ...

  5. Spark学习笔记-如何运行wordcount(使用jar包)

    IDE:eclipse Spark:spark-1.1.0-bin-hadoop2.4 scala:2.10.4 创建scala工程,编写wordcount程序如下 package com.luoga ...

  6. Java语言中有4种访问修饰符

    转载:http://wuhaidong.iteye.com/blog/851754 Java语言中有4种访问修饰符 在Java语言中有4中访问修饰符:package(默认).private.publi ...

  7. No enclosing instance of type test8 is accessible. Must qualify the allocation with an enclosing instance of type test8 (e.g. x.new A() where x is an

    在编译一个例子时,结果编译时出现: No enclosing instance of type test8 is accessible. Must qualify the allocation wit ...

  8. BZOJ 1264 基因匹配Match(LCS转化LIS)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1264 题意:给出两个数列,每个数列的长度为5n,其中1-n每个数字各出现5次.求两个数列 ...

  9. C# 序列化过程中的已知类型(Known Type)

    WCF下的序列化与反序列化解决的是数据在两种状态之间的相互转化:托管类型对象和XML.由于类型定义了对象的数据结构,所以无论对于序列化还是反序列化,都必须事先确定对象的类型.如果被序列化对象或者被反序 ...

  10. SuperSpider——打造功能强大的爬虫利器

    SuperSpider——打造功能强大的爬虫利器   1.爬虫的介绍 图1-1  爬虫(spider) 网络爬虫(web spider)是一个自动的通过网络抓取互联网 上的网页的程序,在当今互联网 中 ...