一个小DEMO,通过发送地理位置,获取今明两天的气温情况。

代码部署在了OpenShift平台;地区定位以及天气服务由雅虎提供。

微信文档:

http://mp.weixin.qq.com/cgi-bin/readtemplate?t=wxm-callbackapi-doc&lang=zh_CN

如果你愿意,扫描下面的QR码测试一下。

1.[图片] qrcode_for_gh_217ace14c180_430.jpg

2.[文件] src.tar.gz ~ 1MB     下载(3054)

3.[代码][Java]代码

package com.rhcloud.insongr.srv.wechat.servlet;

import java.io.IOException;

import java.io.PrintWriter;

import java.io.StringReader;

import java.io.Writer;

import java.net.MalformedURLException;

import java.net.URL;

import java.util.Date;

import java.util.List;

import java.util.Scanner;

import java.util.logging.Logger;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.xml.bind.JAXBContext;

import javax.xml.bind.JAXBException;

import javax.xml.bind.Marshaller;

import javax.xml.bind.Unmarshaller;

import com.rhcloud.insongr.srv.wechat.bean.WeChatReqBean;

import com.rhcloud.insongr.srv.wechat.bean.WeChatRespBean;

import com.rhcloud.insongr.srv.wechat.common.Constants;

import com.rhcloud.insongr.srv.yahoo.geocode.ResultSet;

import com.rhcloud.insongr.srv.yahoo.weather.YahooWeather;

import com.rhcloud.insongr.srv.yahoo.weather.yweather.Forecast;

import com.sun.xml.bind.marshaller.CharacterEscapeHandler;

@WebServlet(urlPatterns = "/WeChatServlet")

public class WeChatServlet extends HttpServlet {

private static final long serialVersionUID = -2776902810130266533L;

private static Logger log = Logger.getLogger(WeChatServlet.class.getName());

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

String signature = req.getParameter("signature");

String timestamp = req.getParameter("timestamp");

String nonce = req.getParameter("nonce");

String echostr = req.getParameter("echostr");

// 此处需要检验signature对网址接入合法性进行校验。

// 没看出来有什么用,没弄。

// 详见:文档

log.info(signature + " : " + timestamp + " : " + nonce + " : " + echostr);

PrintWriter out = resp.getWriter();

out.write(echostr);

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

Scanner scanner = new Scanner(req.getInputStream());

resp.setContentType("application/xml");

resp.setCharacterEncoding("UTF-8");

PrintWriter out = resp.getWriter();

try {

// 1、获取用户发送的信息

StringBuffer sb = new StringBuffer(100);

while (scanner.hasNextLine()) {

sb.append(scanner.nextLine());

}

// 2、解析用户的信息

JAXBContext jc = JAXBContext.newInstance(WeChatReqBean.class);

Unmarshaller u = jc.createUnmarshaller();

WeChatReqBean reqBean = (WeChatReqBean) u.unmarshal(new StringReader(sb.toString()));

// 3、判定用户是否发的是地理位置的PO,并查询天气

String content = getContent(reqBean);

// 4、创建一个回复消息

jc = JAXBContext.newInstance(WeChatRespBean.class);

Marshaller m = jc.createMarshaller();

m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

m.setProperty(CharacterEscapeHandler.class.getName(), new CharacterEscapeHandler() {

@Override

public void escape(char[] arg0, int arg1, int arg2, boolean arg3,

Writer arg4) throws IOException {

arg4.write(arg0, arg1, arg2);

}

});

m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);

WeChatRespBean respBean = createRespBean(reqBean, content);

m.marshal(respBean, out);

out.flush();

} catch (JAXBException e) {

log.info(e.getMessage());

} finally {

if (scanner != null) {

scanner.close();

scanner = null;

}

if (out != null) {

out.close();

out = null;

}

}

}

/**

* @param reqBean

* @param content

* @return

*/

private WeChatRespBean createRespBean(WeChatReqBean reqBean, String content) {

WeChatRespBean respBean = new WeChatRespBean();

respBean.setFromUserName(reqBean.getToUserName());

respBean.setToUserName(reqBean.getFromUserName());

respBean.setMsgType("text");

respBean.setCreateTime(new Date().getTime());

respBean.setContent(content);

return respBean;

}

/**

* @param reqBean

* @throws JAXBException

* @throws MalformedURLException

*/

private String getContent(WeChatReqBean reqBean) throws JAXBException, MalformedURLException {

StringBuffer content = new StringBuffer("亲,");

switch (reqBean.getMsgType()) {

case Constants.MSGTYPE_TEXT:

if ("Hello2BizUser".equals(reqBean.getContent())) {

// 这是新用户关注时默认发的一条信息。可以做一个欢迎处理。

content.append("这是一个测试哈。想查天气,给我发一个地理位置的PO。[愉快]");

} else {

content.append("我没功夫和你聊天,我很忙的。想查天气,给我发一个地理位置的PO。[右哼哼]");

}

break;

case Constants.MSGTYPE_LOCATION:

// 此处先调用Yahoo的PlaceFinder服务,获取用户当前所在地的woeid。

// 再调用Yahoo的Weather服务获取天气情况。

// 如果用兴趣,可以尝试做一个小黄鸡的服务。小黄鸡

String placeUrl = "http://where.yahooapis.com/geocode?location=" + reqBean.getLocation_X() + "+" + reqBean.getLocation_Y() + "&gflags=R";

JAXBContext jc = JAXBContext.newInstance(ResultSet.class);

Unmarshaller u = jc.createUnmarshaller();

URL url = new URL(placeUrl);

ResultSet resultSet = (ResultSet) u.unmarshal(url);

content.append(resultSet.getResult().getCity() + ":");

String weatherUrl = String.format("http://weather.yahooapis.com/forecastrss?w=%s&u=c", resultSet.getResult().getWoeid());

url = new URL(weatherUrl);

jc = JAXBContext.newInstance(YahooWeather.class);

u = jc.createUnmarshaller();

YahooWeather weather = (YahooWeather) u.unmarshal(url);

List list = weather.getChannel().getItem().getForecasts();

content.append("今天最低温度" + list.get(0).getLow() + "℃,最高温度" + list.get(0).getHigh() + "℃;");

content.append("明天最低温度" + list.get(1).getLow() + "℃,最高温度" + list.get(1).getHigh() + "℃。");

if (list.get(0).getHigh() <= 15 || list.get(1).getHigh() <= 15) {

content.append("天凉,注意保暖哦。");

} else if(list.get(0).getHigh() <= 25 || list.get(1).getHigh() <= 25) {

if (list.get(0).getCode() >= 26 && list.get(0).getCode() <= 32) {

content.append("晴空万里,出去走走吧。");

}

} else {

content.append("出去看看大街上的黑丝吧。");

}

break;

case Constants.MSGTYPE_IMAGE:

content.append("好漂亮的图片。[色]");

break;

default:

content.append("想查天气,请给我发一个地理位置的PO。");

break;

}

return content.toString();

}

}

微信公众平台java接口_微信公众平台自动消息接口(JAVA)相关推荐

  1. 微信公众平台开发教程(二) 基本原理及消息接口

    微信公众平台开发教程(二) 基本原理及消息接口 一.基本原理 在开始做之前,大家可能对这个很感兴趣,但是又比较茫然.是不是很复杂?很难学啊? 其实恰恰相反,很简单.为了打消大家的顾虑,先简单介绍了微信 ...

  2. java微信公众平台开发接口_微信公众平台API的Java通讯实现

    微信公众平台 相信大家也不陌生,官方网站提供了一个简单的php程序Demo 因为微信平台采用HTTP方式承载微信的协议,而且不是双向通讯,也就是说只能由微信服务器主动请求我们的服务器.其实当你使用我开 ...

  3. java微信公众号开发教程_微信公众平台开发教程(java版本含代码) 中文PDF版 3.13MB...

    本文档将对即将推出的微信公众帐号开发系列连载教程做简单的说明. 教程主要是面向有一定 Java 编程基础的朋友, 目录: 微信公众帐号开发教程第 1 篇-引言  2 微信公众帐号开发教程第 2 篇-微 ...

  4. 微信用户绑定java实例_微信开放平台 帐号管理 绑定在同一个开放平台帐号下的公众号及小程序让用户unionid一致...

    第三方平台在获得此权限后,可以代替已授权的公众号/小程序创建开放平台帐号或进行绑定/解绑操作. 绑定在同一个开放平台帐号下的公众号及小程序,用户unionid一致.开发者可调用"获取用户基本 ...

  5. 微信公众号开发java流程_微信公众号开发教程java 编程语言的特点及选择

    微信公众号开发教程java 编程语言的特点及选择 微信公众号为用户提供了相关的工具,来对微信公众号进行一个简单的开发.但是如果想实现一些复杂的功能,其实还是要借助于一些编程语言的使用.所以要了解,在微 ...

  6. 注册一个公众号多少钱_微信公众号申请注册收费吗?要钱吗?多少钱?

    [导读]微信公众号申请注册收费吗?要钱吗?多少钱?很多企业或个人在申请微信公众号之前都会存在这样的疑问,都不清楚具体是否需要收费,因此我们小编专门对此问题进行了详细解答. 微信公众号申请注册收费吗?要 ...

  7. python爬虫公众号_python爬虫_微信公众号推送信息爬取的实例

    问题描述 利用搜狗的微信搜索抓取指定公众号的最新一条推送,并保存相应的网页至本地. 注意点 搜狗微信获取的地址为临时链接,具有时效性. 公众号为动态网页(JavaScript渲染),使用request ...

  8. 微信订阅号签到功能_微信公众号积分签到功能怎么添加,怎么制作微信签到赚积分...

    导读:在公众号里做每日签到的好处是可以提高粉丝的活跃度和粘性,签到送积分,可以换礼物,这样比较能留住粉丝,该怎么设置呢,因为这个是会员卡里的一个插件,首先我们需要先添加好会员卡功能,下面分享具体教程. ...

  9. 个人公众号注销方法_微信公众号怎么注销,注销方法

    [导读]2017年微信公众号怎么注销?注销方法有哪些?根据最新消息,2017年4月12日起,微信公众号可以自主注销,用户在核实身份信息或者验证帐号主体后,可以在公众号后台-"公众号设置&qu ...

  10. php公众号提现功能,微信公众号打赏的钱怎么提现_微信公众号打赏功能_微信公众号打赏从哪里取出来...

    微信公众号打赏的钱怎么提现,微信公众号打赏功能.微信公众号之前打赏功能可以立即取现,但是最近出现了一些变动,会有人问微信公众号打赏为什么不能立刻取现?小编为大家带来了微信公众号打赏取现时间调整. 微信 ...

最新文章

  1. 在CentOS 6.3 64bit上安装Apache Trafficserver 4.2.3挂载SAS硬盘和SSD
  2. 构建弹性架构组件—ELB和ASG
  3. printf 中转义字符大全
  4. WePy 整合云开发
  5. ITK:将图像翻转到指定的轴上
  6. SAP Spartacus如何为不同的environment设置不同的baseUrl
  7. Vmware 连接局域网通过桥接方式
  8. iOS基本UI元素示例教程
  9. c语言c99和c90,C89 / C90,C99和C11的兼容性
  10. 小夜灯离线语音识别芯片IC 声控小夜灯IC
  11. 2019蓝桥杯Java决赛题答案_2019第十届蓝桥杯Java题
  12. Longhorn,企业级云原生容器分布式存储 - 监控(Prometheus+AlertManager+Grafana)
  13. 什么是腾讯云主机安全,主要有哪些功能作用?
  14. 零基础学前端之SEO 基础知识学习--SEO优化学习教程【学习笔记】
  15. arcmap制作地闪密度专题图
  16. layui使用formselect4完成的下拉框多选,拼音搜索
  17. C语言100题练习计划 27——字符串替换
  18. [综述] 细粒度图像分析2019
  19. 如何选择正确的RF连接器
  20. 手把手教你做智能LED灯(一) 功能规划与设计方案

热门文章

  1. obs直播录屏软件下载使用教程-制作短视频录制视频教程
  2. 2.14 使用透视变形命令修复倾斜的建筑物(新) [Ps教程]
  3. origintangent插件_origin斜率插件下载|
  4. Mp4文件中提取H264码流
  5. Linux系统里文件句柄数量修改
  6. 揭秘!量子计算的可怕之处在哪?摩尔定律到达极限会发生什么?
  7. 用python制作一个学生信息管理软件_python实现简单学生信息管理系统
  8. 数字化如何赋能电力调度、提升电网调度精准度灵活性、提升新能源消纳能力?互联网人如何参与泛在电力物联网和能源互联网?
  9. GIT个人版本管理和局域网团队版本管理
  10. 怎么编辑pdf里面的文字?好用工具分享