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;
}