搜尋
首頁微信小程式微信開發微信公眾平台開發之獲得ACCESSTOKEN .Net詳解及實例

這篇文章主要介紹了微信公眾平台開發實戰Java版之微信獲取用戶基本信息的相關資料,需要的朋友可以參考下

在關注者與公眾號產生消息交互後,公眾號可取得追蹤者的OpenID(加密後的微訊號,每位使用者對每個公眾號的OpenID是唯一的。對於不同公眾號,同一使用者的openid不同)。

公眾號可透過本介面根據OpenID取得使用者基本資訊,包括暱稱、頭像、性別、所在城市、語言和關注時間。文件:取得使用者的基本資訊。 ?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

#參數說明

##參數

#說明

access_token是#呼叫介面憑證openid

普通使用者的標識,對目前公眾號唯一

lang

否傳回國家地區語言版本, zh_CN 簡體,zh_TW 繁體,en 英文#回傳說明##正常情況下,微信會回傳下述封包給公眾號碼:
 {
  "subscribe": 1, 
  "openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M", 
  "nickname": "Band", 
  "sex": 1, 
  "language": "zh_CN", 
  "city": "广州", 
  "province": "广东", 
  "country": "中国", 
  "headimgurl":  "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0", 
  "subscribe_time": 1382694957,
  "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
  "remark": "",
  "groupid": 0
}
##說明subscribe使用者是否訂閱該公眾號標識,值為0時,代表此使用者沒有關注該公眾號,拉取不到其餘資訊。 #openid使用者的標識,對目前公眾號唯一#nickname使用者的暱稱sex使用者的性別,值為1時是男性,值為2時是女性,值為0時是未知 city用戶所在城市country用戶所在國家province使用者所在省份使用者的語言,簡體中文為zh_CNheadimgurl#使用者頭像,最後一個數值代表正方形頭像大小(有0、46、64、96、132數值可選,0代表640*640正方形頭像),使用者沒有頭像時該項為空。若用戶更換頭像,原有頭像URL將失效。 subscribe_time。如果用戶曾多次關注,則取最後關注時間unionidremark
JSON
參數說明
#參數
language
使用者關注時間,為時間戳
#只有在用戶將公眾號綁定到微信開放平台帳號後,才會出現該字段。詳見:取得使用者個人資訊(UnionID機制)
###公眾號經營者對粉絲的備註,公眾號業者可在微信公眾平台## #使用者管理###介面對粉絲新增備註############groupid#######使用者所在的###分組###ID######### ###

错误时微信会返回错误码等信息,JSON数据包示例如下(该示例为AppID无效错误):

 {"errcode":40013,"errmsg":"invalid appid"}

根据上面的信息,我们定义一个用户信息类来存放用户的基本信息。

package com.souvc.weixin.pojo;
/**
* 类名: WeixinUserInfo 
* 描述: 微信用户的基本信息 
* 开发人员: souvc 
* 创建时间: 2015-11-27 
* 发布版本:V1.0 
 */
public class WeixinUserInfo {
  // 用户的标识
  private String openId;
  // 关注状态(1是关注,0是未关注),未关注时获取不到其余信息
  private int subscribe;
  // 用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间
  private String subscribeTime;
  // 昵称
  private String nickname;
  // 用户的性别(1是男性,2是女性,0是未知)
  private int sex;
  // 用户所在国家
  private String country;
  // 用户所在省份
  private String province;
  // 用户所在城市
  private String city;
  // 用户的语言,简体中文为zh_CN
  private String language;
  // 用户头像
  private String headImgUrl;
  public String getOpenId() {
    return openId;
  }
  public void setOpenId(String openId) {
    this.openId = openId;
  }
  public int getSubscribe() {
    return subscribe;
  }
  public void setSubscribe(int subscribe) {
    this.subscribe = subscribe;
  }
  public String getSubscribeTime() {
    return subscribeTime;
  }
  public void setSubscribeTime(String subscribeTime) {
    this.subscribeTime = subscribeTime;
  }
  public String getNickname() {
    return nickname;
  }
  public void setNickname(String nickname) {
    this.nickname = nickname;
  }
  public int getSex() {
    return sex;
  }
  public void setSex(int sex) {
    this.sex = sex;
  }
  public String getCountry() {
    return country;
  }
  public void setCountry(String country) {
    this.country = country;
  }
  public String getProvince() {
    return province;
  }
  public void setProvince(String province) {
    this.province = province;
  }
  public String getCity() {
    return city;
  }
  public void setCity(String city) {
    this.city = city;
  }
  public String getLanguage() {
    return language;
  }
  public void setLanguage(String language) {
    this.language = language;
  }
  public String getHeadImgUrl() {
    return headImgUrl;
  }
  public void setHeadImgUrl(String headImgUrl) {
    this.headImgUrl = headImgUrl;
  }
}

我们先来看看获取用户信息的接口:

https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

根据分析,获取用户的基本信息需要一个token。

package com.souvc.weixin.pojo;
/**
* 类名: Token 
* 描述: 凭证 
* 开发人员: souvc 
* 创建时间: 2015-11-27 
* 发布版本:V1.0 
 */
public class Token {
  // 接口访问凭证
  private String accessToken;
  // 凭证有效期,单位:秒
  private int expiresIn;
  public String getAccessToken() {
    return accessToken;
  }
  public void setAccessToken(String accessToken) {
    this.accessToken = accessToken;
  }
  public int getExpiresIn() {
    return expiresIn;
  }
  public void setExpiresIn(int expiresIn) {
    this.expiresIn = expiresIn;
  }
}

https请求,需要的信任管理器

package com.souvc.weixin.util;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;
/**
* 类名: MyX509TrustManager 
* 描述:信任管理器 
* 开发人员: souvc 
* 创建时间: 2015-11-27 
* 发布版本:V1.0 
 */
public class MyX509TrustManager implements X509TrustManager {
  // 检查客户端证书
  public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
  }
  // 检查服务器端证书
  public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
  }
  // 返回受信任的X509证书数组
  public X509Certificate[] getAcceptedIssuers() {
    return null;
  }
}

封装了一个公共类:

package com.souvc.weixin.util;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.ConnectException;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import net.sf.json.JSONException;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.souvc.weixin.pojo.Token;
/**
* 类名: CommonUtil 
* 描述: 通用工具类 
* 开发人员: souvc 
* 创建时间: 2015-11-27 
* 发布版本:V1.0 
 */
public class CommonUtil {
  private static Logger log = LoggerFactory.getLogger(CommonUtil.class);
  // 凭证获取(GET)
  public final static String token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
  /**
   * 发送https请求
   * 
   * @param requestUrl 请求地址
   * @param requestMethod 请求方式(GET、POST)
   * @param outputStr 提交的数据
   * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
   */
  public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
    JSONObject jsonObject = null;
    try {
      // 创建SSLContext对象,并使用我们指定的信任管理器初始化
      TrustManager[] tm = { new MyX509TrustManager() };
      SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
      sslContext.init(null, tm, new java.security.SecureRandom());
      // 从上述SSLContext对象中得到SSLSocketFactory对象
      SSLSocketFactory ssf = sslContext.getSocketFactory();
      URL url = new URL(requestUrl);
      HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
      conn.setSSLSocketFactory(ssf);
      conn.setDoOutput(true);
      conn.setDoInput(true);
      conn.setUseCaches(false);
      // 设置请求方式(GET/POST)
      conn.setRequestMethod(requestMethod);
      // 当outputStr不为null时向输出流写数据
      if (null != outputStr) {
        OutputStream outputStream = conn.getOutputStream();
        // 注意编码格式
        outputStream.write(outputStr.getBytes("UTF-8"));
        outputStream.close();
      }
      // 从输入流读取返回内容
      InputStream inputStream = conn.getInputStream();
      InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
      BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
      String str = null;
      StringBuffer buffer = new StringBuffer();
      while ((str = bufferedReader.readLine()) != null) {
        buffer.append(str);
      }
      // 释放资源
      bufferedReader.close();
      inputStreamReader.close();
      inputStream.close();
      inputStream = null;
      conn.disconnect();
      jsonObject = JSONObject.fromObject(buffer.toString());
    } catch (ConnectException ce) {
      log.error("连接超时:{}", ce);
    } catch (Exception e) {
      log.error("https请求异常:{}", e);
    }
    return jsonObject;
  }
  /**
   * 获取接口访问凭证
   * 
   * @param appid 凭证
   * @param appsecret 密钥
   * @return
   */
  public static Token getToken(String appid, String appsecret) {
    Token token = null;
    String requestUrl = token_url.replace("APPID", appid).replace("APPSECRET", appsecret);
    // 发起GET请求获取凭证
    JSONObject jsonObject = httpsRequest(requestUrl, "GET", null);
    if (null != jsonObject) {
      try {
        token = new Token();
        token.setAccessToken(jsonObject.getString("access_token"));
        token.setExpiresIn(jsonObject.getInt("expires_in"));
      } catch (JSONException e) {
        token = null;
        // 获取token失败
        log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
      }
    }
    return token;
  }
  /**
   * URL编码(utf-8)
   * 
   * @param source
   * @return
   */
  public static String urlEncodeUTF8(String source) {
    String result = source;
    try {
      result = java.net.URLEncoder.encode(source, "utf-8");
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    }
    return result;
  }
  /**
   * 根据内容类型判断文件扩展名
   * 
   * @param contentType 内容类型
   * @return
   */
  public static String getFileExt(String contentType) {
    String fileExt = "";
    if ("image/jpeg".equals(contentType))
      fileExt = ".jpg";
    else if ("audio/mpeg".equals(contentType))
      fileExt = ".mp3";
    else if ("audio/amr".equals(contentType))
      fileExt = ".amr";
    else if ("video/mp4".equals(contentType))
      fileExt = ".mp4";
    else if ("video/mpeg4".equals(contentType))
      fileExt = ".mp4";
    return fileExt;
  }
}

获取用户基本信息的方法:

/**
   * 获取用户信息
   * 
   * @param accessToken 接口访问凭证
   * @param openId 用户标识
   * @return WeixinUserInfo
   */
  public static WeixinUserInfo getUserInfo(String accessToken, String openId) {
    WeixinUserInfo weixinUserInfo = null;
    // 拼接请求地址
    String requestUrl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID";
    requestUrl = requestUrl.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openId);
    // 获取用户信息
    JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET", null);
    if (null != jsonObject) {
      try {
        weixinUserInfo = new WeixinUserInfo();
        // 用户的标识
        weixinUserInfo.setOpenId(jsonObject.getString("openid"));
        // 关注状态(1是关注,0是未关注),未关注时获取不到其余信息
        weixinUserInfo.setSubscribe(jsonObject.getInt("subscribe"));
        // 用户关注时间
        weixinUserInfo.setSubscribeTime(jsonObject.getString("subscribe_time"));
        // 昵称
        weixinUserInfo.setNickname(jsonObject.getString("nickname"));
        // 用户的性别(1是男性,2是女性,0是未知)
        weixinUserInfo.setSex(jsonObject.getInt("sex"));
        // 用户所在国家
        weixinUserInfo.setCountry(jsonObject.getString("country"));
        // 用户所在省份
        weixinUserInfo.setProvince(jsonObject.getString("province"));
        // 用户所在城市
        weixinUserInfo.setCity(jsonObject.getString("city"));
        // 用户的语言,简体中文为zh_CN
        weixinUserInfo.setLanguage(jsonObject.getString("language"));
        // 用户头像
        weixinUserInfo.setHeadImgUrl(jsonObject.getString("headimgurl"));
      } catch (Exception e) {
        if (0 == weixinUserInfo.getSubscribe()) {
          log.error("用户{}已取消关注", weixinUserInfo.getOpenId());
        } else {
          int errorCode = jsonObject.getInt("errcode");
          String errorMsg = jsonObject.getString("errmsg");
          log.error("获取用户信息失败 errcode:{} errmsg:{}", errorCode, errorMsg);
        }
      }
    }
    return weixinUserInfo;
  }

测试的方法:注意将以下替换为自己的appid和秘钥。

public static void main(String args[]) {
    // 获取接口访问凭证
    String accessToken = CommonUtil.getToken("xxxx", "xxxx").getAccessToken();
    /**
     * 获取用户信息
     */
    WeixinUserInfo user = getUserInfo(accessToken, "ooK-yuJvd9gEegH6nRIen-gnLrVw");
    System.out.println("OpenID:" + user.getOpenId());
    System.out.println("关注状态:" + user.getSubscribe());
    System.out.println("关注时间:" + user.getSubscribeTime());
    System.out.println("昵称:" + user.getNickname());
    System.out.println("性别:" + user.getSex());
    System.out.println("国家:" + user.getCountry());
    System.out.println("省份:" + user.getProvince());
    System.out.println("城市:" + user.getCity());
    System.out.println("语言:" + user.getLanguage());
    System.out.println("头像:" + user.getHeadImgUrl());
  }

效果如下:

OpenID:ooK-yuJvd9gEegH6nRIen-gnLrVw
关注状态:1
关注时间:1449021142
昵称:风少
性别:1
国家:中国
省份:广东
城市:广州
语言:zh_CN
头像:http://wx.qlogo.cn/mmopen/lOZIEvyfCa7aZQ7CkiamdpQicUDnGDEC0nzb7ZALjdl3TzFVFEHWM1AFqEXnicNIDeh0IQYTt0NrIP06ibg4W5WflASfFfX9qqib0/0

以上是微信公眾平台開發之獲得ACCESSTOKEN .Net詳解及實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器