公众号 SuperLishun,想要源码的可以关注公众号,给我留言。
百度微信公众号,首先要申请自己的微信公众号,我只申请了个订阅号,先把基本的调通,如下图
这里我们可以手动群发图文消息,设置自动回复消息,设置目录等等,但是作为开发者,我们要学着使用微信的API去做这些事情。
首先你需要有一个服务器,用来供微信调用,我这里用的是阿里云的服务器,作为测试1核2G内存就够了,1个月也就是100块钱,可以用来玩玩,如下图
这两个基础的东西准备好后,就可以开始配置自己的微信后台服务器了,将微信的页面拉到最下面有个开发者,点击,然后开启开发者,注意开发者开启后,手动设置的那些自动回复的等功能将不能生效了,然后设置好自己的服务器URL,token等。URL就是JAVA程序中的事件,比如http://192.168.0.1:80/wechat/accept ,微信后台必须设置80端口。如下图
阿里ECS服务器我安装的是Java环境,已经帮我们装好了ngnix,Java,tomcat等,将ngnix中的拦截打开,允许自己的IP段访问,我在用的时候tomcat不行,换上自己的tomcat,就OK了,要先发布好后台程序,再填写微信的配置才能通过,微信后台会向你提供的URL发请求来验证服务器是否可用。
贴出Controller的代码,如下
@Controller
@RequestMapping({"/wechat"})
public class WechatController
{
@RequestMapping(method={org.springframework.web.bind.annotation.RequestMethod.GET, org.springframework.web.bind.annotation.RequestMethod.POST})
public String wechat(HttpServletRequest request, HttpServletResponse response)
throws Exception
{
/*微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。*/
String signature = request.getParameter("signature");
/*时间戳*/
String timestamp = request.getParameter("timestamp");
/*随机数*/
String nonce = request.getParameter("nonce");
/*随机字符串*/
String echostr = request.getParameter("echostr");
Boolean isGet = Boolean.valueOf(request.getMethod().equals("GET"));
System.out.println(DateUtil.format(new Date(), "HHmmssSSS") + "|signature:" + signature + " ,timestamp:" + timestamp + " ,nonce:" + nonce + " ,echostr:" + echostr);
/*GET请求:开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。*/
if (isGet.booleanValue())
{
/** 加密/校验流程如下:
1. 将token、timestamp、nonce三个参数进行字典序排序
2. 将三个参数字符串拼接成一个字符串进行sha1加密
3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信*/
if (Tools.checkSignature(WechatConfig.TOKEN, signature, timestamp, nonce))
{
response.getWriter().write(echostr);
return null;
}
System.out.println(DateUtil.format(new Date(), "HHmmssSSS") + "|微信请求非法签名, 请求被拒绝");
return null;
} else
/* GET请求只做服务器验证,POST请求处理所有微信来的事件 */
doPost(request, response);
return null;
}
private void doPost(HttpServletRequest request, HttpServletResponse response)
{
response.setCharacterEncoding("UTF-8");
response.setContentType("text/xml");
OutMessage oms = new OutMessage();
try
{
ServletInputStream in = request.getInputStream();
XStream xs = XStreamFactory.init(false);
xs.alias("xml", InMessage.class);
String xmlMsg = Tools.inputStream2String(in);
System.out.println(xmlMsg);
InMessage msg = (InMessage)xs.fromXML(xmlMsg);
WechatUser wechatUser = new WechatUser();
wechatUser.setOpenId(msg.getFromUserName());
String type = msg.getMsgType().toLowerCase();
/* 根据微信传过来的type判断是属于哪种类型,然后做相应处理,下面根据自己需要来处理,把信息写到oms 中*/
switch (type)
{
case "text":
System.out.println(type);
break;
case "voice":
System.out.println(msg);
break;
case "event":
break;
}
if (oms != null)
{
oms.setCreateTime(Long.valueOf(new Date().getTime()));
oms.setToUserName(msg.getFromUserName());
oms.setFromUserName(msg.getToUserName());
xs = XStreamFactory.init(false);
xs.alias("xml", OutMessage.class);
xs.alias("item", Articles.class);
xs.toXML(oms, response.getWriter());
System.out.println(DateUtil.format(new Date(), "HHmmssSSS") + "|信息回馈成功");
System.out.println(DateUtil.format(new Date(), "HHmmssSSS") + "|" + xs.toXML(oms));
}
}
catch (Exception e)
{
System.out.println(e.getLocalizedMessage());
}
}
}
至此就可以验证微信服务器,成为开发者了。后续有时间我会列出其他微信API的使用方法。
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/u011506468/article/details/47190007