JAVA获取微信小程序openid和获取公众号openid,以及通过openid获取用户信息

Wesley13
• 阅读 1369

一,首先说明下这个微信的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以及用户信息的代码,微信开发文档上面看感觉功力不深厚是很难看懂的,这个我也是通过网上或者同事慢慢总结出来的。  请大家多多指教,谢谢!

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
马丁路德 马丁路德
3年前
小程序静默登录与维护自定义登录态
1.背景在小程序中,openid是一个用户对于一个小程序/公众号的标识,开发者可以通过这个标识识别出用户,就如同你的身份证一样。2.什么是静默登录?在普通的应用中,用户通过表单验证登录建立用户体系,这种常见的登录方式一般是通过登录页面表单进行登录,对用户来说是有感的。在小程序中,由于是基于微信,可以通过微信官方提供的API能力,使我们能够无感知得获取
Wesley13 Wesley13
3年前
PHP微信小程序支付——签名错误
!(https://static.oschina.net/uploads/space/2018/0509/141657_Tqix_3477605.png)先分清几个概念:微信公众平台、微信开放平台、微信商户平台1.微信公众平台、微信开放平台、微信商户平台是三个不同的平台2.微信公众平台:用于公众号、小程序等等的设置平台,包括APPID、APP
Stella981 Stella981
3年前
ASP微信支付v4.0版本,最新的asp微信公众号支付源码
ASP微信支付v4.0版本,最新的asp微信公众号支付源码,不需要安装证书,只要一个文件用到.net环境就可以用<!includefile"wxpay.Api.asp"<!includefile"WxApi.asp"<%SETWxNewWxAPIIfSession("openid")
Wesley13 Wesley13
3年前
.NET之微信小程序获取用户UnionID
前言:  在实际项目开发中我们经常会遇到账号统一的问题,如何在不同端或者是不同的登录方式下保证同一个会员或者用户账号唯一(便于用户信息的管理)。这段时间就有一个这样的需求,之前有个客户做了一个微信小程序商城(店主端的),然后现在又要做一个会员购物端的小程序商场。首先之前用户登录凭证都是使用微信openid来做的唯一标识,而现在客户需求是要做到用户
Stella981 Stella981
3年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这