上篇写了发送模板消息,但在发送时需要获取到发送对象的openid(注:此openid是用户关注此服务号产生的唯一值)才能进行模板的发送。因为发送节点是app下单后发送通知,所以我还需要把关注服务号的用户和app用户关联起来才能进行模板的发送。此关联我是通过自定义菜单来实现的(如果有更简便的可以自动略过......)。
1、创建自定义菜单
此处绑定因为需要和app关联所以我做了个绑定页面所以选择了跳转网页,下面的页面地址就是跳转的url
绑定页面:
我在绑定页面做了短信验证以免出现乱绑定(注:此处其实应该可以自动获取到电话号码,因为我的业务需求所以才做了这个页面)
后台代码:
①用户授权后重定向到跳转绑定页面方法
// 刚才公众平台自定义菜单配置的网页地址就是此方法的url
@RequestMapping(value = "/redirect", method = RequestMethod.GET)
public void weixinRedirect(HttpServletRequest request, HttpServletResponse response) {
logger.info("weixinRedirect,进入重定向方法!");
//配置redirect_uri,即用户同意授权后重定向的地址
String path = "http://XXXXXXXX/oauth"; //此路径为跳转绑定页面的路径
logger.info("weixinRedirect,进入重定向方法!path:{}",path);
//使用 urlEncode 对链接进行处理
String url = "https://open.weixin.qq.com/connect/oauth2/authorize?" +
"appid=XXXXXX" +
"&redirect_uri="+ path +
"&response_type=code" +
"&scope=snsapi_userinfo" +
"&state=STATE" +
"#wechat_redirect";
//引导用户打开url这个网页,即重定向到url
try {
response.sendRedirect(url);
} catch (IOException e) {
e.printStackTrace();
}
}
②跳转绑定页面时就获取到此用户服务号的openid,并回传到页面以便后面使用
@GetMapping(value = "/oauth")
public String weixinOAuth(HttpServletRequest request, HttpServletResponse response, Model model) {
logger.info("weixinOAuth,进入获取OPENID方法!");
//得到code
String code = request.getParameter("code");
String state = request.getParameter("state");
System.out.println("code="+code);
//3、认证服务器,获取code后,请求以下链接获取网页授权access_token
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?" +
"appid=XXXXX" +
"&secret=XXXXX" +
"&code="+code +
"&grant_type=authorization_code";
JSONObject jsonObject = WeiXinUtil.httpRequest(url,"POST",null);
logger.info("weixinOAuth,进入获取OPENID方法! jsonStr:{}",jsonObject);
String access_token = jsonObject.getString("access_token");
String openid = jsonObject.getString("openid");
System.out.println("access_token="+access_token);
System.out.println("openid="+openid);
//4、根据openid和access_token获取资源信息
String URLUserinfo = "https://api.weixin.qq.com/sns/userinfo?" +
"access_token=" + access_token +
"&openid="+openid+
"&lang=zh_CN";
JSONObject jsonobj = WeiXinUtil.httpRequest(URLUserinfo,"GET",null);
System.out.println(jsonobj);
logger.info("weixinOAuth,进入获取OPENID方法! openId:{}",openid);
model.addAttribute("openId",openid);
//判断是否已绑定
String isBind = "N";
List<AppCustomer> customer = appletsService.findCustomerListByWechatServiceNumberOpenid(openid);
AppEmployee employee = appletsService.findEmployeeByWechatServiceNumberOpenid(openid);
if ((null != customer && customer.size() > 0) || null != employee){
isBind = "Y";
}
model.addAttribute("isBind",isBind);
return "/views/bind_applets";
}
③后面的绑定app用户方法就不贴了,绑定成功后就回到关注的聊天窗口了。