|
二。x5微信开发
第一。首先登陆微信公众平台,
第二。打开服务端web-inf 下weixin-config.xml进行配置,填写相关参数:
<xml>
<appId>wx21ca7231b3d0e232</appId>
<secret>5ba66d1d69ad6d4e3151d69b8279b595</secret>
<token>123</token>
<aesKey></aesKey>
<accessToken></accessToken>
<expiresIn></expiresIn>
<openId></openId>
<appKey></appKey>
</xml>
第三。打开com.justep.weixin.mp下的DefaultServlet.java
public class DefaultServlet extends HttpServlet {
private static final long serialVersionUID = -3085539764084393258L;
@Override
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {
WxMpServiceInstance.getInstance().doResponse(request, response);
}
}
ctrl+双击WxMpServiceInstance打开,类WxMpServiceInstance中就是实现了微信的很多相关接口。
类中WxMpServiceInstance主要代码:
public WxMpServiceInstance() {
try {
InputStream inputStream = WxMpServiceInstance.class.getResourceAsStream("/../weixin.config.xml");
WxMpXMLInMemoryConfigStorage config = WxMpXMLInMemoryConfigStorage.fromXml(inputStream);
wxMpConfigStorage = config;
wxMpService = new WxMpServiceImpl();
wxMpService.setWxMpConfigStorage(config);
wxMpMessageRouter = new WxMpMessageRouter(wxMpService);
this.addTestRouter(); //-------------------构造方法,TEst和menu路由
this.addMenuRouter();
} catch (JAXBException e) {
throw new RuntimeException(e);
}
}
//----------------test 路由实现 拦截内容为test的消息
private void addTestRouter() {
WxMpMessageHandler handler = new WxMpMessageHandler() {
@Override
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException {
System.out.println("响应test指令********************");
WxMpXmlOutTextMessage m = WxMpXmlOutMessage.TEXT().content("成功收到测试指令").fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName()).build();
return m;
}
};
wxMpMessageRouter.rule().async(false).content("test").handler(handler).end();
}
// 创建菜单
private void buildMenu() {
List<WxMenuButton> x5Meuns = new ArrayList<WxMenuButton>();
List<WxMenuButton> tabs=new ArrayList<WxMenuButton>();
//-------------主菜单----------//
WxMenuButton tab1=new WxMenuButton();
tab1.setName("项目填报");
tab1.setType(WxConsts.BUTTON_CLICK);
tab1.setKey("x5Meuns");
//------------项目填报 包含项目填报子菜单--------//
WxMenuButton indexPage = new WxMenuButton();
indexPage.setName("测量面积");
indexPage.setType(WxConsts.BUTTON_VIEW);
indexPage.setUrl("http://gykj-public.wicp.net/x5/UI2/demo/baas/writeproject/clmjActivity.w");
x5Meuns.add(indexPage);
//----------项目填报 包含入户调查t子菜单-----------//
WxMenuButton nextPage = new WxMenuButton();
nextPage.setName("入户调查");
nextPage.setType(WxConsts.BUTTON_VIEW);
nextPage.setUrl("http://gykj-public.wicp.net/x5/UI2/demo/baas/writeproject/rhdcActivity.w");
x5Meuns.add(nextPage);
//----------项目填报 包含test子菜单-----------//
WxMenuButton thirdPage = new WxMenuButton();
thirdPage.setName("公示签字");
thirdPage.setType(WxConsts.BUTTON_VIEW);
thirdPage.setUrl("http://gykj-public.wicp.net/x5/UI2/demo/baas/writeproject/gsqzActivity.w");
x5Meuns.add(thirdPage);
//-----------将x5Meuns所包含的子菜单,统统加到testMain主菜单下-----也就是一级目录包含子菜单--//
tab1.setSubButtons(x5Meuns);
//---------中级目录包含子菜单------------//
tabs.add(tab1);
//tabs.add(tab2);
WxMenu x5Menu = new WxMenu();
x5Menu.setButtons(tabs);
try {
wxMpService.menuDelete();
wxMpService.menuCreate(x5Menu);
} catch (WxErrorException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
// 接收到menu指令后重构菜单
private void addMenuRouter() {
WxMpMessageHandler handler = new WxMpMessageHandler() {
@Override
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException {
System.out.println("响应menu指令********************");
buildMenu();
WxMpXmlOutTextMessage m = WxMpXmlOutMessage.TEXT().content("菜单已重构").fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName()).build();
return m;
}
};
// 拦截内容为menu的消息
wxMpMessageRouter.rule().async(false).content("menu").handler(handler).end();
}
//-----------------------第一次微信访问后台服务器
public void doResponse(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String signature = request.getParameter("signature");
String nonce = request.getParameter("nonce");
String timestamp = request.getParameter("timestamp");
response.setContentType("text/html;charset=utf-8");
response.setStatus(HttpServletResponse.SC_OK);
if (!wxMpService.checkSignature(timestamp, nonce, signature)) {
// 消息签名不正确,说明不是公众平台发过来的消息
response.getWriter().println("非法请求");
return;
}
String echostr = request.getParameter("echostr");
if (StringUtils.isNotBlank(echostr)) {
// 说明是一个仅仅用来验证的请求,回显echostr
response.getWriter().println(echostr);
return;
}
String encryptType = StringUtils.isBlank(request.getParameter("encrypt_type")) ? "raw" : request.getParameter("encrypt_type");
WxMpXmlMessage inMessage = null;
if ("raw".equals(encryptType)) {
// 明文传输的消息
inMessage = WxMpXmlMessage.fromXml(request.getInputStream());
} else if ("aes".equals(encryptType)) {
// 是aes加密的消息
String msgSignature = request.getParameter("msg_signature");
inMessage = WxMpXmlMessage.fromEncryptedXml(request.getInputStream(), wxMpConfigStorage, timestamp, nonce, msgSignature);
} else {
response.getWriter().println("不可识别的加密类型");
return;
}
WxMpXmlOutMessage outMessage = wxMpMessageRouter.route(inMessage);
if (outMessage != null) {
if ("raw".equals(encryptType)) {
response.getWriter().write(outMessage.toXml());
} else if ("aes".equals(encryptType)) {
response.getWriter().write(outMessage.toEncryptedXml(wxMpConfigStorage));
}
return;
}
}
}
第四: 其实微信向服务端发送消息接收消息都是通过(url加上xml数据格式进行的)
|
|