微信公众号开发(二)获取用户信息

论坛 期权论坛 脚本     
匿名网站用户   2020-12-20 17:48   22   0


这篇记录下获取用户信息需要注意的地方

通过阅读官方文档以及我个人的实践获取用户信息有以下两种方式:

1:用户关注后直接获取。2:网页授权方式进行获取。

Access_Token获取方式

一般有两种获取方式:一个是只通过AppID、AppSecret进行获取的Access_Token,另一种是网页授权时,先通过重定向的链接传递过来的code和AppID、AppSecret参数获取用户的openID,然后使用openID和Access_Token换取用户信息。

对应的链接如下:

// 网页授权得到用户基本信息接口  
 public final static String GetPageUsersUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";     
 // 关注后获取用户基本信息接口  
 public final static String GetPageUsersUrlSub = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID";     

一、用户关注后直接获取。

方式一,在用户关注公众号后。用户在关注公众号后会向服务器发送关注事件如下:

<xml>
    <ToUserName><![CDATA[gh_30a841420516]]></ToUserName>
    <FromUserName><![CDATA[oIrD71EUqICgN-Lsra63V7PpLYBE]]></FromUserName>
    <CreateTime>1508997434789</CreateTime>
    <MsgType><![CDATA[event]]></MsgType>
    <Event><![CDATA[subscribe]]></Event>
    <EventKey><![CDATA[]]></EventKey>
</xml>

如果发送消息会向服务器发送如下:

<xml>
  <ToUserName><![CDATA[gh_30a841420516]]></ToUserName>
  <FromUserName><![CDATA[oIrD71EUqICgN-Lsra63V7PpLYBE]]></FromUserName>
  <CreateTime><![CDATA[1508997410362]]></CreateTime>
  <MsgType><![CDATA[text]]></MsgType>
  <Content><![CDATA[测试]]></Content>
</xml>

上面的FromUserName就是 用户的openID,

我们只要获取到Access_Token就可以使用下面的链接来拉取用户信息。

 // 关注后获取用户基本信息接口  
 public final static String GetPageUsersUrlSub = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID";     // 关注后获取用户基本信息接口  
 public final static String GetPageUsersUrlSub = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID";     

获取关注事件的代码:

// 事件类型
    String eventType = requestMap.get("Event");
    // 关注订阅公众号
    if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {
     buffer.append("客户您好!").append("/::)").append("\n");
     buffer.append("这是######服务公众号。").append("\n\n");
     buffer.append("请按照如下格式发送消息给我们:#### ").append("     ");
     buffer.append("如 :#####");
     content =  buffer.toString();
     //讲用户信息入库。
     
     Map<String,Object> userInfoMap = new HashMap<String, Object>();
     userInfoMap = UserinofService.getUserInfoSub(fromUserName, access_token);
     Date subTime = new Date(); 
     JDBCUtil.getInstance().saveUser(MessageUtil.EVENT_TYPE_SUBSCRIBE, userInfoMap);
    }


在这段代码

UserinofService.getUserInfoSub(fromUserName, access_token);

我们插入了用户的openID和access_token

实现代码如下:

/**
    * 使用  openID、access_token直接获取用户的信息
    * @param openID
    * @param access_token
    * @return
    */
    public static Map<String,Object> getUserInfoSub(String openID,String access_token) {  
     String requestUrl = ParamesAPI.GetPageUsersUrlSub.replace("ACCESS_TOKEN", access_token).replace("OPENID", openID);  
     Map<String,Object> result =new HashMap<String,Object>();  
     try {     
      
      JSONObject OpenidJSONO=WeixinUtil.HttpRequest(requestUrl, "GET", null);  
      
      //OpenidJSONO可以得到的内容:access_token expires_in  refresh_token openid scope   
      
      String openid =String.valueOf(OpenidJSONO.get("openid"));  
      String nickname=String.valueOf(OpenidJSONO.get("nickname"));  
      String sex=String.valueOf(OpenidJSONO.get("sex"));//用户保存的作用域  
      String province=String.valueOf(OpenidJSONO.get("province"));  
      String city=String.valueOf(OpenidJSONO.get("city"));  
      String country=String.valueOf(OpenidJSONO.get("country"));  
      String headimgurl=String.valueOf(OpenidJSONO.get("headimgurl"));  
      String privilege=String.valueOf(OpenidJSONO.get("privilege"));  
      String unionid=String.valueOf(OpenidJSONO.get("unionid"));  
      
      result.put("openid", openid);  
      result.put("nickname", nickname);  
      result.put("sex",sex);  
      result.put("province", province);  
      result.put("city", city);  
      result.put("country", country);  
      result.put("headimgurl", headimgurl);  
      result.put("privilege", privilege);  
      result.put("unionid", unionid);  
     } catch (Exception e) {  
      e.printStackTrace();   
     }
     return result;  
    }  



二、通过网页授权的方式进行获取

1、这种方式第一点需要先配置网页回调域名:

按照上面的策略配置完回调域名后,最后测试一下是否可用。当然了配置时也会提醒你的。

2、获取code

下面的是我的链接,这个链接配置在自定义菜单的url中即可。

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx7dd2a9413ea84e&redirect_uri=http%3a%2f%2fmy5vne.natappfree.cc%2fWeChat%2findex.jsp&response_type=code&scope=snsapi_userinfo&state=34#wechat_redirect

官方文档如上所示。

接着编写代码获取code。这个在request.getParameter("code");方法获取即可。

3、通过code、AppID、AppSecret获取openID和AccessToken。

/** 
     *  
     * @param code 识别得到用户id必须的一个值 
     * 得到网页授权凭证和用户id 
     * @return 
     */  
    public static Map<String,Object> oauth2GetOpenid(String code) {  
        String appid = ParamesAPI.AppID;//自己的配置appid  
        String appsecret = ParamesAPI.AppSecret;//自己的配置APPSECRET;  
        String requestUrl = ParamesAPI.GetPageAccessTokenUrl.replace("APPID", appid).replace("SECRET", appsecret).replace("CODE", code);  
         
        Map<String,Object> result =new HashMap<String,Object>();  
        try {     
            
            JSONObject OpenidJSONO=WeixinUtil.HttpRequest(requestUrl, "GET", null);  
              
            //OpenidJSONO可以得到的内容:access_token expires_in  refresh_token openid scope   
              
            String Openid =String.valueOf(OpenidJSONO.get("openid"));  
            String AccessToken=String.valueOf(OpenidJSONO.get("access_token"));  
            TokenThread.getAccessToken().setToken(AccessToken);
            String Scope=String.valueOf(OpenidJSONO.get("scope"));//用户保存的作用域  
            String refresh_token=String.valueOf(OpenidJSONO.get("refresh_token"));  
              
            result.put("Openid", Openid);  
            result.put("AccessToken", AccessToken);  
            result.put("scope",Scope);  
            result.put("refresh_token", refresh_token);  
        } catch (Exception e) {  
            e.printStackTrace();   
        }
        return result;  
    }  


使用下面的这个链接:

// 网页授权得到用户基本信息接口  
 public final static String GetPageUsersUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";


上面的链接请求中返回的数据包括了openID和AccessToken。

4、使用openID和AccessToken来拉取用户信息。

实现代码如下:

/** 
     *  
     * @param code 识别得到用户id必须的一个值 
     * 得到网页授权凭证和用户id 
     * @return 
     */  
    public static Map<String,Object> getUserInfo(String openID,String access_token) {  
     String requestUrl = ParamesAPI.GetPageUsersUrl.replace("ACCESS_TOKEN", access_token).replace("OPENID", openID);  
     Map<String,Object> result =new HashMap<String,Object>();  
     try {     
      
      JSONObject OpenidJSONO=WeixinUtil.HttpRequest(requestUrl, "GET", null);  
      
      //OpenidJSONO可以得到的内容:access_token expires_in  refresh_token openid scope   
      
      String openid =String.valueOf(OpenidJSONO.get("openid"));  
      String nickname=String.valueOf(OpenidJSONO.get("nickname"));  
      String sex=String.valueOf(OpenidJSONO.get("sex"));//用户保存的作用域  
      String province=String.valueOf(OpenidJSONO.get("province"));  
      String city=String.valueOf(OpenidJSONO.get("city"));  
      String country=String.valueOf(OpenidJSONO.get("country"));  
      String headimgurl=String.valueOf(OpenidJSONO.get("headimgurl"));  
      String privilege=String.valueOf(OpenidJSONO.get("privilege"));  
      String unionid=String.valueOf(OpenidJSONO.get("unionid"));  
      
      result.put("openid", openid);  
      result.put("nickname", nickname);  
      result.put("sex",sex);  
      result.put("province", province);  
      result.put("city", city);  
      result.put("country", country);  
      result.put("headimgurl", headimgurl);  
      result.put("privilege", privilege);  
      result.put("unionid", unionid);  
     } catch (Exception e) {  
      e.printStackTrace();   
     }
     return result;  
    }  


自我感觉应该注意的是这两种方法他们的请求链接是不一样的,一定要注意,要不会犯错。

留作笔记,以备用之。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1136255
帖子:227251
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP