微信公众号开发工作小结

做了一个月的微信公众号和微信网页,做一下总结,以便以后回顾,主要涉及到的功能:

1.用户关注之后收到自动回复的一条消息(此功能可继续拓展:用户回复指定消息比如:“回复 数字1 查看内容1,回复2查看内容2”)

2.消息推送 :用户进行体检测量后,机器上传数据到公司平台,上传成功之后可将检测数据实时推送到用户的微信上。

3.微信网页:主要涉及到授权,其他大部分是重复工作了 ;


1.给用户发送消息,微信里面的交互分为两种事件类型:①  Event  ② Message  事件(关注,取关之类)和消息 (文字,图片,音视频),产生交互之后,微信会将事件通知我们(基本都是以xml格式)的服务器。通知的地址为:公众号---基本配置---服务器配置---服务器地址(URL);此处可以收到的有用的内容为: 用户的 openid   ,消息内容 ,针对两个参数  可以实现:用户回复指定消息比如:“回复 数字1 查看内容1,回复2查看内容2” 这一点。

 @RequestMapping(value = "security", method = RequestMethod.POST)
    public void DoPost(HttpServletRequest request, HttpServletResponse response) {
        String respXML = null;
        try {
            Map map = MessageUtil.parseXml(request);
            String msgtype = map.get("MsgType");
            //进入事件处理
            if (MessageUtil.REQ_MESSAGE_TYPE_EVENT.equals(msgtype)) {
                respXML = EventDispatcher.processEvent(map);
            } else {
                //进入消息处理
                System.out.println("进入消息处理");
                response.setCharacterEncoding("utf-8");
                //进入消息处理
                respXML = MsgDispatcher.processMessage(map);
            }
            PrintWriter out = response.getWriter();
            out.print(respXML);
            out.flush();
            out.close();
        } catch (Exception e) {
            logger.error(e, e);
        }
    }

下面是事件处理:

public class EventDispatcher {

    public static String processEvent(Map map) {
        String resp = null;
        String openid = map.get("FromUserName"); //用户 openid
        String mpid = map.get("ToUserName");   //公众号原始 ID
        
        //普通回复文本消息
        TextMessage txtmsg = new TextMessage();
        txtmsg.setToUserName(openid);
        txtmsg.setFromUserName(mpid);
        txtmsg.setCreateTime(new Date().getTime());
        txtmsg.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
        if (map.get("Event").equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {
            //关注事件
            System.out.println(openid + ":你好,==============这是关注事件!");
            try {
                String eventKey = map.get("EventKey"); //关注事件KEY值,qrscene_为前缀,后面为二维码的参数值
                if (eventKey != null) {
                    //获取二维码中的参数
                    String param = eventKey.substring(8);
                    String uid = param.substring(4);
                    System.out.println("该用户的uid:" + uid + ",openid:" + openid);
                    //获取到了用户的uid和openid后可以引导用户进行账号绑定功能
                }
            } catch (Exception e) {
                System.out.println("无参关注事件" + e.getMessage());
            }
            //常规的关注事件
            System.out.println("进入常规关注事件流程");
            resp = "亲爱的朋友,欢迎您关注";
            txtmsg.setContent(resp);
            //String 转为xml格式返回给微信服务器
            return MessageUtil.textMessageToXml(txtmsg);

        }

        if (map.get("Event").equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) { //取消关注事件
            System.out.println("==============这是取消关注事件!");
        }

        if (map.get("Event").equals(MessageUtil.EVENT_TYPE_SCAN)) { //扫描二维码事件
            System.out.println("==============这是扫描二维码事件!");
        }

2.消息推送:

工作项目中的使用场景是: 检测设备通过仪器检测出值,然后上传到  公司的 平台进行 数据的处理和存储过程,那么  为保证数据的一致性,在数据存储成功之后,调用  发送消息模板的方法

  @RequestMapping(value = "sendTemplate", method = RequestMethod.POST)
    public void sendTemplate(HttpServletRequest request) throws IOException {
        JSONObject inparams = getParams(request);
        int uid = inparams.getIntValue("uid");
        TMemberBase user = userDao.getMemberBaseByUid(uid);
        String openid = null;
        String data_type = inparams.getString("data_type");
        String measure_data = inparams.getString("measure_data");
        String name = inparams.getString("name");
        JSONObject data = JSONObject.parseObject(measure_data);
        TreeMap> params = new TreeMap>();
        //根据具体模板参数组装  
        //{{first.DATA}}
        //检测项目:{{keyword1.DATA}}
        //检测值:{{keyword2.DATA}}
        //评估结果:{{keyword3.DATA}}
        //检测日期:{{keyword4.DATA}}
        //检测地点: S{{keyword5.DATA}}
        //{{remark.DATA}}
        params.put("first", WechatTemplateMsg.item("尊敬的" + name + ",您刚刚进行了健康检测", "#333"));
        String[] fieldNames = null;
        String keyword2;

        params.put("keyword1", WechatTemplateMsg.item("血压", "#157efb"));//检测项
        keyword2 = "收缩压:" + data.getString("sbp") + "mmHg, 舒张压:" + data.getString("dbp") + "mmHg";
        params.put("keyword2", WechatTemplateMsg.item(keyword2, "#157efb"));//检测值
        params.put("keyword3", WechatTemplateMsg.item("正常", "#157efb"));//评估结果
        params.put("keyword4", WechatTemplateMsg.item(data.getString("time"), "#157efb"));//检测日期
        params.put("keyword5", WechatTemplateMsg.item(data.getString("address"), "#157efb"));//检测地点

        params.put("remark", WechatTemplateMsg.item("您的检测结果正常,请继续保持", "#333"));//remark

        WechatTemplateMsg wechatTemplateMsg = new WechatTemplateMsg();//封装发送给微信的消息格式
        wechatTemplateMsg.setTouser(openid);//用户的id
        wechatTemplateMsg.setData(params);//要发送的数据(map)
        String json = JSON.toJSONString(wechatTemplateMsg);
        String re = HttpUtils.doPost(json, Constants.SEND_TEMPLATE_MESSAGE + TOKEN);
        JSONObject message = JSON.parseObject(re);
        String errcode = message.getString("errcode");
        String errmsg = message.getString("errmsg");
        String msgid = message.getString("msgid");
        System.out.println("收到消息发送的回复" + re);


你可能感兴趣的:(技术类)