起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2513|回复: 1

[分享] 二。app移动开发和微信开发

[复制链接]

32

主题

91

帖子

397

积分

中级会员

Rank: 3Rank: 3

积分
397
QQ
发表于 2015-7-16 15:44:52 | 显示全部楼层 |阅读模式
二。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数据格式进行的)








32

主题

91

帖子

397

积分

中级会员

Rank: 3Rank: 3

积分
397
QQ
 楼主| 发表于 2015-7-16 15:45:27 | 显示全部楼层
已结帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2024-5-18 12:11 , Processed in 0.063077 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表