微信模板消息技术记录

1.微信公众号申请模板消息功能(2-3个工作日)
2.在模板库中选择需要的模板
3.拿到公众号APPid 和开发者密码
4.设置 微信回调域名(自认为服务器代理)(为了微信登录验证 获取用户openID)

5.生成二维码

/***
     * 二维码生成
     * @param request
     * @param response
     */
    @ApiOperation(value = "二维码生成")
    @RequestMapping(value = "/getCodeImage", method =RequestMethod.GET)
    public void getCodeImage(HttpServletRequest request, HttpServletResponse response){
        String userId = request.getParameter("userId");
        System.out.println("--------------------生成二维码开始----------------------");
//        System.out.println("token:"+token);
        userId=userId;//记录用户token
        //且给token生成对应的二维码

        //获取biztoken
        try{
            //回调地址
            String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
            String backUrl="http://xxx.xxx.xxx.com"+"/jeecg-boot/weixin/auth?userId="+userId;
//            String backUrl=basePath+"/jeecg-boot/weixin/auth";
            //拼接地址
            String url = "https://open.weixin.qq.com/connect/oauth2/authorize"
                    +"?appid="+wx_appid
                    +"&redirect_uri="+backUrl
                    +"&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";
            logger.info("完整地址:"+url);
            //生成二维码
            ServletOutputStream stream = response.getOutputStream();
            String format = "png";
            // 二维码参数
            Map hints = new HashMap<>();
            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
            hints.put(EncodeHintType.MARGIN, 0);
            BitMatrix bitMatrix;
            try {
                bitMatrix = new MultiFormatWriter().encode(url, BarcodeFormat.QR_CODE, 350, 350,hints);
                bitMatrix = deleteWhite(bitMatrix);
                MatrixToImageWriter.writeToStream(bitMatrix, format, stream);
            } catch (WriterException e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("--------------------生成二维码结束----------------------");
    }

6.扫描之后的微信回调

// 扫描之后的微信回调
 @ApiOperation(value = "微信登录")
    @GetMapping("/auth")
    public String auth(@RequestParam("code") String code,@RequestParam("userId") String userId) {
        String aaa = "";
        System.out.println("--------------------登陆认证对比开始----------------------");
        logger.info("开始执行auth方法…");
        //第一步用户同意授权,获取code
        logger.info("第一步获取code值:");
        logger.info("code ="+ code);
        //第二步通过code换取网页授权access_token
        logger.info("第二步通过code换取网页授权access_token值:");
        String accesstokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token";
        accesstokenUrl += "?appid="+wx_appid;
        accesstokenUrl += "&secret="+wx_appsecret;
        accesstokenUrl += "&code=" + code;
        accesstokenUrl += "&grant_type=authorization_code";
        RestTemplate restTemplate = new RestTemplate();
        //返回结果
        String accesstokenResponse = restTemplate.getForObject(accesstokenUrl, String.class);
        logger.info("accesstokenResponse ="+ accesstokenResponse);
        //
        /***解析accesstokenResponse转换成实体类
         * {
         "access_token":"40_B3wmbjM1Q1Hbw4IgQ2sE_pBlPPNMbm9lBivP-GkaHoD1zgQVA7KCE1wTL8l_5SkdVU1zL-gRD3UYhmaTJ-yXrw",
         "expires_in":7200,
         "refresh_token":"40_h8GSRPjO90z1K2yZu0pjSnk_PHX4PUwNY_F67hAiWn6TqyfVntv1-XawvsGuExwXruYUG1pZPkfzbdwbHYQWaw",
         "openid":"op4jLs9hygkoKEy_P_GY1ipJxQ04",
         "scope":"snsapi_userinfo"
         }
         */
        AccessToken accessToken = JSON.parseObject(accesstokenResponse, AccessToken.class);

        //第三步刷新access_token(如果需要)
        logger.info("第三步刷新access_token(如果需要):");
        String refreshUrl ="https://api.weixin.qq.com/sns/oauth2/refresh_token";
        refreshUrl +="?appid="+wx_appid;
        refreshUrl +="&grant_type=refresh_token";
        refreshUrl +="&refresh_token="+accessToken.getRefresh_token();//获取第二步的refresh_token后,请求以下链接获取access_token: c
        String refreshResponse = restTemplate.getForObject(refreshUrl, String.class);
        logger.info("refreshResponse ="+ refreshResponse);

        //第四步拉取用户信息(需scope为 snsapi_userinfo)
        logger.info("第四步拉取用户信息(需scope为 snsapi_userinfo):");
        String userUrl="https://api.weixin.qq.com/sns/userinfo";
        userUrl +="?access_token="+accessToken.getAccess_token();//获取第二步中access_token
        userUrl +="&openid="+accessToken.getOpenid();//获取第二步中的openid
        userUrl +="&lang=zh_CN";
        String userResponse = restTemplate.getForObject(userUrl, String.class);
        logger.info("userResponse ="+ userResponse);

        logger.info("Openid--- ="+ accessToken.getOpenid());


        SysUser sysUser = new SysUser();

        sysUser.setId(userId);
        sysUser.setOpenId(accessToken.getOpenid());
        boolean b = sysUserService.updateById(sysUser);
        //解析数据出来,返回字段注解:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html#2
        //第四步那里
        aaa = accessToken.getOpenid()+"222222222="+b+"111111111111"+userId;
        //模拟登陆将这里将状态改为认证了
        renzheng="ture";
        System.out.println("--------------------登陆认证对比结束----------------------");
        return "绑定成功";

    }

6.设置本地调试白名单ip(不是白名单ip获取不到token
7.设置服务器白名单ip

8.生成消息发送

 public void sendMessage(String userName,String type,String appId,Map<String,String> data)  {
        Logger log = LoggerFactory.getLogger(getClass());
        try {
            String access_token = JwTokenAPI.getAccessToken("wx38ee6c9ced92cc07", "fb064ca5b1f868342d1030b59d51c15c");
            String url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + access_token;
            WxTemplate temp = new WxTemplate();
            temp.setUrl("http://weixin.qq.com/download");
//      等待-------------------------------------------------------------------
            SysUser sysUser = sysUserService.getUserByName(userName);
            if (StringUtil.isNotBlank(sysUser.getOpenId())) {
                temp.setTouser(sysUser.getOpenId());

//        temp.setTouser("o1RVa5tt8XuuT2j6WjNzICWp3kkY");
            temp.setTopcolor("#000000");
            Map<String, TemplateData> m = new HashMap<String, TemplateData>();
            m = workOrderCreationData(appId);
            temp.setData(m);
            String jsonString = JSONObject.fromObject(temp).toString();
            JSONObject jsonObject = httpRequest(url, "POST", jsonString);
            System.out.println(jsonObject);
            int result = 0;
            if (null != jsonObject) {
                if (0 != jsonObject.getInt("errcode")) {
                    result = jsonObject.getInt("errcode");
                    log.error("错误 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
                }
            }
        }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }


public Map<String,TemplateData> workOrderCreationData(String appId){
        // 获取工单信息
        WorkOrder workOrder = workOrderService.getById(appId);
        String status= getNameBycode(workOrder.getOrderStatus());
        Map<String,TemplateData> m = new HashMap<String,TemplateData>();
        TemplateData first = new TemplateData();
        first.setColor("#000000");
        first.setValue("有新的工单了,快去看看吧!");
        m.put("first", first);
        TemplateData keyword1 = new TemplateData();
        keyword1.setColor("#000000");
        keyword1.setValue(workOrder.getOrderTitle());
        m.put("keyword1", keyword1);
        TemplateData keyword2 = new TemplateData();
        keyword2.setColor("#000000");
        keyword2.setValue(workOrder.getOrderType());
        m.put("keyword2", keyword2);
        SysUser userByName = sysUserService.getUserByName(workOrder.getSponsor());
        TemplateData keyword3 = new TemplateData();
        keyword3.setColor("#000000");
        keyword3.setValue(userByName.getRealname());
        m.put("keyword3", keyword3);
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateString = formatter.format(workOrder.getCreateTime());
        TemplateData keyword4 = new TemplateData();
        keyword4.setColor("#000000");
        keyword4.setValue(dateString);
        m.put("keyword4", keyword4);
        TemplateData remark = new TemplateData();
        remark.setColor("#000000");
        remark.setValue("已经指派您为当前工单负责人");
        m.put("remark", remark);
        return m;
    }

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值