찾다
위챗 애플릿위챗 개발WeChat 공개 플랫폼 개발을 위한 ACCESSTOKEN .Net 획득에 대한 자세한 설명 및 예

이 글은 사용자 기본 정보를 얻기 위한 WeChat의 실용적인 Java 버전 WeChat 공개 플랫폼 개발에 대한 관련 정보를 주로 소개합니다. 필요한 친구가 이를 참조할 수 있습니다.

팔로워가 공개 계정과 상호 작용하여 메시지를 생성한 후, the public 계정은 팔로어의 OpenID를 얻을 수 있습니다(암호화된 WeChat ID, 각 공식 계정에 대한 각 사용자의 OpenID는 고유합니다. 다른 공식 계정의 경우 동일한 사용자의 openID가 다릅니다).

공식 계정은 인터페이스를 통해 OpenID 기반의 기본 사용자 정보를 얻을 수 있습니다. 닉네임, 아바타, 성별, 도시, 언어 및 시간을 포함합니다.

개발자는 OpenID를 통해 기본 사용자 정보를 얻을 수 있습니다. 문서: 기본 사용자 정보 가져오기. 인터페이스 호출 요청 설명

http 요청 방법: GET

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

매개변수 설명

반환 설명

参数 是否必须 说明
access_token 调用接口凭证
openid 普通用户的标识,对当前公众号唯一
lang 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语

정상적인 상황에서 WeChat은 다음 JSON 데이터 패킷을 반환합니다. 공개 계정:

 {
  "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
}

매개변수 설명

사용자의 도시그룹 ID / tr>
매개변수 설명
subscribe 사용자가 공용 계정을 구독하는지 여부입니다. 0이면 사용자가 공개 계정을 팔로우하지 않으며 다른 정보를 얻을 수 없음을 의미합니다.
openid 현재 공식 계정에 고유한 사용자 식별입니다. 계정
닉네임 사용자 닉네임
성별 사용자 성별 , 값이 1이면 남성, 값이 2이면 여성, 값이 0이면 알 수 없음
도시
국가 사용자의 국가
지방 사용자가 위치한 지역
언어 사용자의 언어, 중국어 간체는 zh_CN
headimgurl 사용자 아바타, 마지막 값은 정사각형 아바타 크기를 나타냅니다(0, 46, 64, 96, 132 값을 사용할 수 있으며 0은 640*640 정사각형 아바타를 나타냄). 사용자에게 아바타가 없으면 비어 있습니다. 사용자가 아바타를 변경하면 원래 아바타 URL은 유효하지 않게 됩니다.
subscribe_time 사용자가 주의를 기울이는 시간은 타임스탬프

. 사용자가 여러 번 팔로우한 경우 마지막 팔로우 시간이 사용됩니다.

unionid 사용자가 공식 계정을 WeChat 오픈 플랫폼에 바인딩한 후에만 사용됩니다. 계정, 이 필드가 나타납니다. 자세한 내용은 다음을 참조하세요: 사용자 개인 정보 획득(UnionID 메커니즘)
비고 공용 계정 운영자가 팬에게 보내는 메모는 이를 공개할 수 있습니다. WeChat 플랫폼사용자 관리팬에게 메모를 추가하는 인터페이스
그룹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

위 내용은 WeChat 공개 플랫폼 개발을 위한 ACCESSTOKEN .Net 획득에 대한 자세한 설명 및 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)