最近做了一个类似于日程提醒的小程序,需要把用户语音识别出的日程或提醒按照设置的提醒日期通过微信公众号推送给对应的用户进行提醒这样子.这是需求背景.
这个项目我已经做完了,但是中间遇到很多坑,所以想出篇帖子,让大家不浪费爬坑的时间.后面我会尽量把所有需要的代码什么的,都贴上来,尽量做到拿了就能用的程度.
接下来,就是一个又一个的坑需要爬了.首先我说一下小程序与公众号开发的一个完整流程.与一些细节.
1.小程序开发首先需要appid 与secret 也就是账号密码,用来获取用户的unionid与openid.(需要根据js_code来获取)这两个名叫id的东西,都是用户的唯一标识,(以前不同的appid获取到的用户openid都是一样的,现在不一样了) unionid是干什么用的,我一会会说.
2.公众号开发也需要一个appid跟secret,这个跟小程序的不一样,具体怎么拿,跟小程序一样.有了appid与secret我们就可以获取到公众号用户的openid与unionid了(需要根据code来获取),(获取之前还需要先获取assess_token,这是一个微信的接口,用来验证身份,微信设置一个开发者账号每天可以请求200次的限制,每个token有7200s的有效时间...所以这里获取到的话,需要放到redis或者java缓存中去,然后设置一个7200s的过期时间,用的时候从缓存取,缓存里没有再请求.后面我会说怎么获取)这里的openid与小程序的openid是不一样的,但是unionid可以弄成一样的.怎么弄呢,看第三步.
3.这时候应该上微信公众平台把小程序绑定到其下.然后再注册一个微信开放平台,并且获取开发者资质,(一年好像是300).然后把你的小程序与公众号都绑定到开放平台下,这样的话,你的小程序获取到的unionid跟公众号获取到的unionid就是一样的了,这样就可以用它来进行小程序与公众号用户的关联了.
------------------------------------------------------然后进行代码------------------------------------------------------
1.根据js_code获取小程序用户的openid与unionid (js_code 是小程序在调用wx.login的时候获取到的.) 代码如下:
@RequestMapping(value = "/checkUserByOpenid", method = RequestMethod.GET)
public @ResponseBody Map checkUserByOpenid(HttpServletRequest request,HttpServletResponse response,
@RequestParam("js_code") String js_code) throws Exception {
response.setHeader("Access-Control-Allow-Origin", "*");
/*星号表示所有的域都可以接受,*/
response.setHeader("Access-Control-Allow-Methods", "GET,POST");
HashMap<String, Object> jsonMap = new HashMap<String, Object>();
// if(js_code!=null && !"".equals(js_code)){
String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + appid + "&secret=" + secret + "&js_code=" + js_code + "&grant_type=" + grant_type;
String httpsRtn = HttpsPostUtil.doPost(url, "UTF-8");
Map json = mapper.readValue(httpsRtn, Map.class);
String openid = (String) json.get("openid");
//用openid获取unionid等敏感信息------------小程序
String unionid = (String) json.get("unionid");
//此处开始你的逻辑代码
jsonMap.put("message", "success");
// }
return jsonMap;
}