一,首先说明下这个微信的openid
为了识别用户,每个用户针对每个公众号会产生一个安全的OpenID,如果需要在多公众号、移动应用之间做用户共通,则需前往微信开放平台,将这些公众号和应用绑定到一个开放平台账号下,绑定后,一个用户虽然对多个公众号和应用有多个不同的OpenID,但他对所有这些同一开放平台账号下的公众号和应用,只有一个UnionID
我用简单自己理解的话来说就是 这个 你在每个公众号 或者小程序 都是在这个小程序或者这个公众号下会有一个openid 你去别的公众号 或者 小程序 这个是会改变的 但是unionid是不管你在哪个小程序或者公众号是唯一不变的。
微信官方提供了 了一个 可以通过用户的openid来获取用户信息,前提是用户必须关注了你的公众号,这个好像要做的话需要关联一个需要三百块钱认证的那个啥来着。这个就先不说了吧,现在我们要说的问题是如何获取openid
二,小程序获取openid
1 /** 2 * 微信小程序获取openid 3 * @author Mr.Lin 4 */ 5 public class GetOpenIDUtil { 6 // 网页授权接口 7 // public final static String GetPageAccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";// 8 // public final static String GetPageAccessTokenUrl = "https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=CODE&grant_type=authorization_code"; 9 public final static String GetPageAccessTokenUrl = "https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=CODE&grant_type=authorization_code"; 10 public static Map<String,Object> oauth2GetOpenid(String appid,String code,String appsecret) { 11 String requestUrl = GetPageAccessTokenUrl.replace("APPID", appid).replace("SECRET", appsecret).replace("CODE", code); 12 HttpClient client = null; 13 Map<String,Object> result =new HashMap<String,Object>(); 14 try { 15 client = new DefaultHttpClient(); 16 HttpGet httpget = new HttpGet(requestUrl); 17 ResponseHandler<String> responseHandler = new BasicResponseHandler(); 18 String response = client.execute(httpget, responseHandler); 19 JSONObject OpenidJSONO=JSONObject.fromObject(response); 20 String openid =String.valueOf(OpenidJSONO.get("openid")); 21 String session_key=String.valueOf(OpenidJSONO.get("session_key")); 22 String unionid=String.valueOf(OpenidJSONO.get("unionid")); 23 String errcode=String.valueOf(OpenidJSONO.get("errcode")); 24 String errmsg=String.valueOf(OpenidJSONO.get("errmsg")); 25 26 result.put("openid", openid); 27 result.put("sessionKey", session_key); 28 result.put("unionid", unionid); 29 result.put("errcode", errcode); 30 result.put("errmsg", errmsg); 31 } catch (Exception e) { 32 e.printStackTrace(); 33 } finally { 34 client.getConnectionManager().shutdown(); 35 } 36 return result; 37 } 38 }
/** * 小程序换取openid * * @param code 识别得到用户id必须的一个值 得到网页授权凭证和用户id * @return */ @RequestMapping("/get/openid") public @ResponseBody Object GetOpenid(String 你的小程序APPID, String code, String 你的小程序秘钥) { if (code == null || code.length() == 0) { throw new CustomException("code不能为空!"); } return GetOpenIDUtil.oauth2GetOpenid(appid, code, appsecret); }
这个code的话我这个一般是前端生成比较好,所以你后台的话,把接口给前端,让他那边传个code,
三,获取公众号openid~
1 public class HttpGetUtil { 2 public static String httpRequestToString(String url, 3 Map<String,String> params) { 4 String result = null; 5 try { 6 InputStream is = httpRequestToStream(url, params); 7 BufferedReader in = new BufferedReader(new InputStreamReader(is, 8 "UTF-8")); 9 StringBuffer buffer = new StringBuffer(); 10 String line = ""; 11 while ((line = in.readLine()) != null) { 12 buffer.append(line); 13 } 14 result = buffer.toString(); 15 } catch (Exception e) { 16 return null; 17 } 18 return result; 19 } 20 21 private static InputStream httpRequestToStream(String url, 22 Map<String, String> params) { 23 InputStream is = null; 24 try { 25 String parameters = ""; 26 boolean hasParams = false; 27 for(String key : params.keySet()){ 28 String value = null; 29 try { 30 value = URLEncoder.encode(params.get(key), "UTF-8"); 31 } catch (UnsupportedEncodingException e) { 32 e.printStackTrace(); 33 } 34 parameters += key +"="+ value +"&"; 35 hasParams = true; 36 } 37 if(hasParams){ 38 parameters = parameters.substring(0, parameters.length()-1); 39 } 40 41 42 url += "?"+ parameters; 43 44 URL u = new URL(url); 45 HttpURLConnection conn = (HttpURLConnection) u.openConnection(); 46 conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 47 conn.setRequestProperty("Accept-Charset", "UTF-8"); 48 conn.setRequestProperty("contentType", "utf-8"); 49 conn.setConnectTimeout(50000); 50 conn.setReadTimeout(50000); 51 conn.setDoInput(true); 52 //设置请求方式,默认为GET 53 conn.setRequestMethod("GET"); 54 55 56 is = conn.getInputStream(); 57 } catch (UnsupportedEncodingException e) { 58 e.printStackTrace(); 59 } catch (MalformedURLException e) { 60 e.printStackTrace(); 61 } catch (IOException e) { 62 e.printStackTrace(); 63 } 64 return is; 65 } 66 67 public static String GetCodeRequest1 = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect"; 68 public static String getCodeRequest(String appid){ 69 HttpClient client = null; 70 String result = null; 71 String appId = appid; 72 String REDIRECT_URI= "";//回调请求地址 73 String SCOPE="snsapi_base"; 74 75 GetCodeRequest1 = GetCodeRequest1.replace("APPID", urlEnodeUTF8(appId)); 76 GetCodeRequest1 = GetCodeRequest1.replace("REDIRECT_URI",urlEnodeUTF8(REDIRECT_URI)); 77 GetCodeRequest1 = GetCodeRequest1.replace("SCOPE", SCOPE); 78 result = GetCodeRequest1; 79 80 System.out.println(REDIRECT_URI); 81 82 return result; 83 } 84 public static String urlEnodeUTF8(String str){ 85 String result = str; 86 try { 87 result = URLEncoder.encode(str,"UTF-8"); 88 } catch (Exception e) { 89 e.printStackTrace(); 90 } 91 return result; 92 } 93 }
@RequestMapping("/get/gzh/openid") public @ResponseBody String GetGZHOpenid(HttpServletRequest request, HttpServletResponse response) throws IOException { String code = request.getParameter("code");//获取code Map params = new HashMap(); params.put("secret", 你的公众号秘钥); params.put("appid", 你的公众号APPID); params.put("grant_type", "authorization_code"); params.put("code", code); String result = HttpGetUtil.httpRequestToString( "https://api.weixin.qq.com/sns/oauth2/access_token", params); JSONObject jsonObject = JSONObject.fromObject(result); String openid = jsonObject.get("openid").toString(); LOGGER.debug("code------" + code); LOGGER.debug("得到的openid为:" + openid); return openid; }
四,通过微信获取的openid来获取用户信息
1 /** 2 * 获取accessToken 3 * 4 */ 5 public class GetAccessTokenUtil { 6 // 网页授权接口 7 public final static String GetPageAccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET"; 8 public static Map<String, String> getAccessToken(String appid, String appsecret) { 9 String requestUrl = GetPageAccessTokenUrl.replace("APPID", appid).replace("APPSECRET", appsecret); 10 HttpClient client = null; 11 Map<String, String> result = new HashMap<String, String>(); 12 String accessToken = null; 13 try { 14 client = new DefaultHttpClient(); 15 HttpGet httpget = new HttpGet(requestUrl); 16 ResponseHandler<String> responseHandler = new BasicResponseHandler(); 17 String response = client.execute(httpget, responseHandler); 18 JSONObject OpenidJSONO = JSONObject.fromObject(response); 19 accessToken = String.valueOf(OpenidJSONO.get("access_token")); 20 result.put("accessToken", accessToken); 21 } catch (Exception e) { 22 e.printStackTrace(); 23 } finally { 24 client.getConnectionManager().shutdown(); 25 } 26 return result; 27 } 28 }
//通过openid获取用户的信息,这个看你需要获取用户的哪些信息,
// https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140839 这个是微信官方的获取unionid机制 用户信息
public class GetBasicInformation { // 网页授权接口 public final static String GetPageAccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN"; public static Map<String, String> getAccessToken(String access_token, String openid) { String requestUrl = GetPageAccessTokenUrl.replace("ACCESS_TOKEN", access_token).replace("OPENID", openid); HttpClient client = null; Map<String, String> result = new HashMap<String, String>(); try { client = new DefaultHttpClient(); HttpGet httpget = new HttpGet(requestUrl); ResponseHandler<String> responseHandler = new BasicResponseHandler(); String response = client.execute(httpget, responseHandler); JSONObject OpenidJSONO = JSONObject.fromObject(response); // String accessToken = String.valueOf(OpenidJSONO.get("access_token")); String subscribe = String.valueOf(OpenidJSONO.get("subscribe")); String nickname = new String(String.valueOf(OpenidJSONO.get("nickname")).getBytes("ISO8859-1"),"UTF-8"); String sex = String.valueOf(OpenidJSONO.get("sex")); String language = String.valueOf(OpenidJSONO.get("language")); String city = new String(String.valueOf(OpenidJSONO.get("city")).getBytes("ISO8859-1"),"UTF-8"); String province = new String(String.valueOf(OpenidJSONO.get("province")).getBytes("ISO8859-1"),"UTF-8"); String country = new String(String.valueOf(OpenidJSONO.get("country")).getBytes("ISO8859-1"),"UTF-8"); String headimgurl = String.valueOf(OpenidJSONO.get("headimgurl")); String subscribeTime = String.valueOf(OpenidJSONO.get("subscribe_time")); String unionid = String.valueOf(OpenidJSONO.get("unionid")); // String accessToken =new String(String.valueOf(OpenidJSONO.get("access_token")).getBytes("ISO8859-1"),"UTF-8"); // String openid =new String(String.valueOf(OpenidJSONO.get("openid")).getBytes("ISO8859-1"),"UTF-8"); // String openid =new String(String.valueOf(OpenidJSONO.get("openid")).getBytes("ISO8859-1"),"UTF-8"); // String openid =new String(String.valueOf(OpenidJSONO.get("openid")).getBytes("ISO8859-1"),"UTF-8"); // String openid =new String(String.valueOf(OpenidJSONO.get("openid")).getBytes("ISO8859-1"),"UTF-8"); // String openid =new String(String.valueOf(OpenidJSONO.get("openid")).getBytes("ISO8859-1"),"UTF-8"); // String openid =new String(String.valueOf(OpenidJSONO.get("openid")).getBytes("ISO8859-1"),"UTF-8"); // String openid =new String(String.valueOf(OpenidJSONO.get("openid")).getBytes("ISO8859-1"),"UTF-8"); // String openid =new String(String.valueOf(OpenidJSONO.get("openid")).getBytes("ISO8859-1"),"UTF-8"); // String openid =new String(String.valueOf(OpenidJSONO.get("openid")).getBytes("ISO8859-1"),"UTF-8"); // String openid =new String(String.valueOf(OpenidJSONO.get("openid")).getBytes("ISO8859-1"),"UTF-8"); // String openid = String.valueOf(OpenidJSONO.get("openid")); // result.put("accessToken", accessToken); result.put("subscribe", subscribe); result.put("nickname", nickname); result.put("sex", sex); result.put("language", language); result.put("city", city); result.put("province", province); result.put("country", country); result.put("headimgurl", headimgurl); result.put("subscribeTime", subscribeTime); result.put("unionid", unionid); // System.out.println(accessToken+"==================="+unionid); } catch (Exception e) { e.printStackTrace(); } finally { client.getConnectionManager().shutdown(); } return result; } }
1 /** 2 * 微信公众号获取微信unionid和其他个人信息 需要关注公众号 3 * 4 * @param openid 5 * @return 6 */ 7 @RequestMapping("/basic/Information") 8 public @ResponseBody 9 Map basicInformation(String openid) { 10 //得到access_token 11 String accessToken = GetAccessTokenUtil.getAccessToken(你的公众号APPID, 你的公众号APPID对应的秘钥).get("accessToken"); 12 LOGGER.debug("accessToken------" + accessToken); 13 return GetBasicInformation.getAccessToken(accessToken, openid); 14 }
总结:这个就是微信小程序和微信公众号获取openid 以及通过openid获取unionid以及用户信息的代码,微信开发文档上面看感觉功力不深厚是很难看懂的,这个我也是通过网上或者同事慢慢总结出来的。 请大家多多指教,谢谢!