就是Java获取OpenId,所谓难了不会,当初写的时候费了牛劲了,我会把所有的源码放上去,只要做过微信开发,读一读,肯定能获取到。开发前可以先看看官方文档
我是用测试号来写的 。
第一步 :配置测试号,网页授权获取用户基本信息。上图
图片有点大了。。。
该授权回掉页面域名为ngrok 映射的域名,我的映射地址是127.0.0.1:8080。
第二步:
修改xml 我没有用框架,
第三步:编写oauthServlet
package com.wtk.wx.util;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 类名: OAuthServlet
* 描述: 授权后的回调请求处理
* 开发人员: souvc
* 创建时间: 2015-11-27
* 发布版本:V1.0
*/
public class OAuthServlet extends HttpServlet {
private static final long serialVersionUID = -1847238807216447030L;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
// 用户同意授权后,能获取到code
String code = request.getParameter("code");
String state = request.getParameter("state");
// 用户同意授权
if (!"authdeny".equals(code)) {
// 获取网页授权access_token
WeixinOauth2Token weixinOauth2Token = AdvancedUtil.getOauth2AccessToken("wx8*******9a4a3", "c775301********4f1b9bf8af12", code);
// 网页授权接口访问凭证
String accessToken = weixinOauth2Token.getAccessToken();
// 用户标识
String openId = weixinOauth2Token.getOpenId();
System.out.println(openId);
// 获取用户信息
SNSUserInfo snsUserInfo = AdvancedUtil.getSNSUserInfo(accessToken, openId);
// 设置要传递的参数
request.setAttribute("snsUserInfo", snsUserInfo);
request.setAttribute("state", state);
}
// 跳转到index.jsp
//request.getRequestDispatcher("file.jsp").forward(request, response);
}
}
package com.wtk.wx.util;
import java.util.List;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
public class AdvancedUtil {
/**
* 获取网页授权凭证
*
* @param appId 公众账号的唯一标识
* @param appSecret 公众账号的密钥
* @param code
* @return WeixinAouth2Token
*/
public static WeixinOauth2Token getOauth2AccessToken(String appId, String appSecret, String code) {
WeixinOauth2Token wat = null;
// 拼接请求地址
String requestUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
requestUrl = requestUrl.replace("APPID", appId);
requestUrl = requestUrl.replace("SECRET", appSecret);
requestUrl = requestUrl.replace("CODE", code);
// 获取网页授权凭证
JSONObject jsonObject = WeixinUtil.httpRequest(requestUrl, "GET", null);
if (null != jsonObject) {
try {
wat = new WeixinOauth2Token();
wat.setAccessToken(jsonObject.getString("access_token"));
wat.setExpiresIn(jsonObject.getInt("expires_in"));
wat.setRefreshToken(jsonObject.getString("refresh_token"));
wat.setOpenId(jsonObject.getString("openid"));
wat.setScope(jsonObject.getString("scope"));
} catch (Exception e) {
wat = null;
int errorCode = jsonObject.getInt("errcode");
String errorMsg = jsonObject.getString("errmsg");
//log.error("获取网页授权凭证失败 errcode:{} errmsg:{}", errorCode, errorMsg);
}
}
return wat;
}
/**
* 通过网页授权获取用户信息
*
* @param accessToken 网页授权接口调用凭证
* @param openId 用户标识
* @return SNSUserInfo
*/
@SuppressWarnings( { "deprecation", "unchecked" })
public static SNSUserInfo getSNSUserInfo(String accessToken, String openId) {
SNSUserInfo snsUserInfo = null;
// 拼接请求地址
String requestUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID";
requestUrl = requestUrl.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openId);
// 通过网页授权获取用户信息
JSONObject jsonObject = WeixinUtil.httpRequest(requestUrl, "GET", null);
if (null != jsonObject) {
try {
snsUserInfo = new SNSUserInfo();
// 用户的标识
snsUserInfo.setOpenId(jsonObject.getString("openid"));
// 昵称
snsUserInfo.setNickname(jsonObject.getString("nickname"));
// 性别(1是男性,2是女性,0是未知)
snsUserInfo.setSex(jsonObject.getInt("sex"));
// 用户所在国家
snsUserInfo.setCountry(jsonObject.getString("country"));
// 用户所在省份
snsUserInfo.setProvince(jsonObject.getString("province"));
// 用户所在城市
snsUserInfo.setCity(jsonObject.getString("city"));
// 用户头像
snsUserInfo.setHeadImgUrl(jsonObject.getString("headimgurl"));
// 用户特权信息
snsUserInfo.setPrivilegeList(JSONArray.toList(jsonObject.getJSONArray("privilege"), List.class));
} catch (Exception e) {
snsUserInfo = null;
int errorCode = jsonObject.getInt("errcode");
String errorMsg = jsonObject.getString("errmsg");
//log.error("获取用户信息失败 errcode:{} errmsg:{}", errorCode, errorMsg);
}
}
return snsUserInfo;
}
public static void main(String[] args) {
String source="http://panpanda.free.ngrok.cc/wxtest/oauthServlet";
System.out.println(WeixinUtil.urlEncodeUTF8(source));
//获取请求路径的UTF-8编码后的字符串,我把方法放到下面了,调用的时候自己改一下
}
/**
* 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;
}
}
package com.wtk.wx.util;
/**
* 类名: WeixinOauth2Token
* 描述: 网页授权信息
* 开发人员: souvc
* 创建时间: 2015-11-27
* 发布版本:V1.0
*/
public class WeixinOauth2Token {
// 网页授权接口调用凭证
private String accessToken;
// 凭证有效时长
private int expiresIn;
// 用于刷新凭证
private String refreshToken;
// 用户标识
private String openId;
// 用户授权作用域
private String scope;
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;
}
public String getRefreshToken() {
return refreshToken;
}
public void setRefreshToken(String refreshToken) {
this.refreshToken = refreshToken;
}
public String getOpenId() {
return openId;
}
public void setOpenId(String openId) {
this.openId = openId;
}
public String getScope() {
return scope;
}
public void setScope(String scope) {
this.scope = scope;
}
}
显示获取的信息。
<%@ page language="java" pageEncoding="utf-8"%>
<%@ page import="com.wtk.wx.util.SNSUserInfo,java.lang.*"%>
<%
// 获取由OAuthServlet中传入的参数
SNSUserInfo user = (SNSUserInfo)request.getAttribute("snsUserInfo");
String state=request.getAttribute("state").toString();
if(null != user) {
%>
属性 值
OpenID <%=user.getOpenId()%>
昵称 <%=user.getNickname()%>
性别 <%=user.getSex()%>
国家 <%=user.getCountry()%>
省份 <%=user.getProvince()%>
城市 <%=user.getCity()%>
头像 <%=user.getHeadImgUrl()%>
特权 <%=user.getPrivilegeList()%>
state: <%=state%>
<%
}
else
out.print("用户不同意授权,未获取到用户信息!");
%>
因为ngrok 这段时间不能用,也没办法演示最后的结果。
用文字描述一下最后会展示的数据为
属性值
OpenID<%=user.getOpenId()%>
昵称<%=user.getNickname()%>
性别<%=user.getSex()%>
国家<%=user.getCountry()%>
省份<%=user.getProvince()%>
城市<%=user.getCity()%>
头像<%=user.getHeadImgUrl()%>
特权<%=user.getPrivilegeList()%>
state:<%=state%>
这个样子的。
最后访问要在微信客户端打开
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=redirect_uri&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
把里面的参数换成自己的。