zoukankan      html  css  js  c++  java
  • JAVA获取微信小程序openid和获取公众号openid,以及通过openid获取用户信息

    https://www.cnblogs.com/lxwt/p/10154540.html?tdsourcetag=s_pcqq_aiomsg

    一,首先说明下这个微信的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 }
    复制代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    /**
         * 小程序换取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);
     
        }<br>这个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以及用户信息的代码,微信开发文档上面看感觉功力不深厚是很难看懂的,这个我也是通过网上或者同事慢慢总结出来的。  请大家多多指教,谢谢!

  • 相关阅读:
    bzoj 3226 [Sdoi2008]校门外的区间(线段树)
    bzoj 1513 [POI2006]Tet-Tetris 3D(二维线段树)
    cf293E Close Vertices(树分治+BIT)
    点分治练习:不虚就是要AK
    点分治练习: boatherds
    bzoj 4016 [FJOI2014]最短路径树问题(最短路径树+树分治)
    bzoj 1876 [SDOI2009]SuperGCD(高精度+更相减损)
    464 整数排序Ⅱ
    445 余弦相似度
    488 快乐数
  • 原文地址:https://www.cnblogs.com/telwanggs/p/11905017.html
Copyright © 2011-2022 走看看