如何开发微信公众号

        最近参与了公司的一款微信产品开发,然后就自己也弄了个公众号玩玩,目前主要开发了智能机器人聊天、心理测试、旅游攻略查询、工资查询、游戏攻略查询、天气预报查询等几个功能,公众号名字叫:各种好玩。开发参考源码关注公众号后回复“源码”即可获取下载地址。


1、你要申请一个微信公众号,申请资料不复杂,一般几天内就给你审核下来了。
2、微信开发大多采用PHP开发,微信官方文档都是以PHP为案例的。我用的开发框架是 SpringMVC+iBATIS+mySql。这应该是目前比较主流的框架吧。
3、怎么接入公众号呢?

公众号审核通过以后就可以进入开发者中心,配置你的URL和token,提交配置URL正确响应微信发送的Token验证后就可以接入了。

开发者提交信息后,微信服务器将发送GET请求到填写的URL上,然后你处理微信的请求参数返回指定的参数就可以验证成功了。
当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。
接入这一块对新人来说可能有点复杂,具体代码看下面,接入完了之后其实就跟你普通web开发没什么区别了。

关于SpringMVC、iBATIS框架的配置我就不细说了 网上有很多资料,也可以参考我给的源码自己动手配一下能够有个更加直观的映像
下面我说下微信的接入和响应

@RequestMapping(value="/weixin",method=RequestMethod.GET,produces="text/html;charset=UTF-8")
public void checkWeixin(HttpServletRequest request,HttpServletResponseresponse) throws IOException{
   String echostr =request.getParameter("echostr");
   if (checkWeixinReques(request)&& echostr != null) {
     response.setHeader("Content-Type","application/octet-stream");
     response.setContentLength(echostr.length());
     response.getWriter().println(echostr);
   }
}

这是我token验证的代码,checkWeixinReques(request)方法用于校验signature、timestamp、nonce三个参数。排序、加密、比较。不出于安全考虑你也可以不校验直接返回echostr。具体方法见源码。

4、如何POST处理消息和回复?
当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。我们可以用dom4j将XML数据解析处理。

InputStream inputStream = request.getInputStream();
SAXReader reader = new SAXReader();
Document document = reader.read(inputStream);
Element root = document.getRootElement();
List<Element> elementList = root.elements();
for (Element e : elementList)
//遍历xml将数据写入map
map.put(e.getName(), e.getText());
inputStream.close();


主要参数有toUserName、fromUserName、msgType、content等,具体参见微信官网文档 http://mp.weixin.qq.com/wiki/index.php?title=%E9%A6%96%E9%A1%B5 或者源码。普通公众号你能获取到用户的唯一信息是用户对于你这个公众号的openId作为唯一标识符。
解析出来后你就可以根据用户发送的内容content来做不同的业务处理了。处理完成之后你可以回复用户文本内容text或者图文类容news。
文本消息格式如下:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
</xml>
其他格式见官网文档,可使用XStream将内容组装成XML格式。具体用法百度或者参见源码。

 

5、下面拿我的一个菜单实例天气预报来简单说说吧

 

天气预报网上有很多接口,我用的是百度的API,http://api.map.baidu.com/telematics/v3/weather?location=北京&output=json&ak=5slgyqGDENN7Sy7pw29IUvrZ
你需要传3个参数过去,location是地址,output是数据返回方式可选json或者xml格式。用的是json格式,json数据结构你返回一个看下就清楚了。
用GET方式请求之后你会得到一个String类型的json格式数据。
以下是我对json数据jsonStr的处理示例。

//json数据处理
JSONObject jsonObj = JSONObject.fromObject(jsonStr);
//获取状态
String status = jsonObj.getString("status");
String date = jsonObj.getString("date");
if("success".equals(status)){
//获取结果集合
String results = jsonObj.getString("results");
JSONArray jsonArray = JSONArray.fromObject(results);
jsonObj = jsonArray.getJSONObject(0);
String pm25 = jsonObj.getString("pm25");
city = jsonObj.getString("currentCity");
//获取指数集合
String indexStr = jsonObj.getString("index");
jsonArray = JSONArray.fromObject(indexStr);
List<WeatherIndexVo> weatherIndexList = JSONArray.toList(jsonArray,newWeatherIndexVo(),
new JsonConfig());
StringBuffer weaIndexSb = new StringBuffer();
for(WeatherIndexVo weatherIndexVo:weatherIndexList){
if("穿衣".equals(weatherIndexVo.getTitle()) ||"运动".equals(weatherIndexVo.getTitle())){
weaIndexSb.append(weatherIndexVo.getTitle()+":\n"+
weatherIndexVo.getZs()+","+weatherIndexVo.getDes()+"\n");
}
}
//获取天气集合
String weatherStr = jsonObj.getString("weather_data");
jsonArray = JSONArray.fromObject(weatherStr);
List<WeatherVo> weatherList = JSONArray.toList(jsonArray,new WeatherVo(),
new JsonConfig());
StringBuffer weaSb = new StringBuffer();
for(WeatherVo weatherVo:weatherList){
weaSb.append(weatherVo.getDate()+":"+weatherVo.getWeather()+","
+weatherVo.getWind()+","+weatherVo.getTemperature()+"\n");
}
respMsg = date+city+"天气:\r\n"+"PM2.5:"+pm25+"\n"+weaSb.toString()+"\r\n"
+weaIndexSb.toString()+"\r\n查询其他地区请回复地名+天气,如:上海天气。";
}else{
respMsg = "亲,不好意思天气查询失败 %>_<% ";
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值