JAVA获取OppenId

来源:互联网 发布:淘宝内衣模特偷拍网盘 编辑:程序博客网 时间:2024/06/05 18:28

就是Java获取OpenId,所谓难了不会,当初写的时候费了牛劲了,我会把所有的源码放上去,只要做过微信开发,读一读,肯定能获取到。开发前可以先看看官方文档
我是用测试号来写的 。
第一步 :配置测试号,网页授权获取用户基本信息。上图
这里写图片描述

图片有点大了。。。
该授权回掉页面域名为ngrok 映射的域名,我的映射地址是127.0.0.1:8080。
第二步:
修改xml 我没有用框架,

<servlet>
<servlet-name>oauthServlet</servlet-name>
<servlet-class>com.wtk.wx.util.OAuthServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>oauthServlet</servlet-name>
<url-pattern>/oauthServlet</url-pattern>
</servlet-mapping>

第三步:编写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 </br>* 描述: 授权后的回调请求处理 </br>* 开发人员: souvc </br>* 创建时间:  2015-11-27 </br>* 发布版本:V1.0  </br> */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 </br>* 描述:  网页授权信息  </br>* 开发人员: souvc </br>* 创建时间:  2015-11-27 </br>* 发布版本:V1.0  </br> */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.*"%>
<html>
<head>
<title>OAuth2.0网页授权</title>
<meta name="viewport" content="width=device-width,user-scalable=0">
<style type="text/css">
*{margin:0; padding:0}
table{border:1px dashed #B9B9DD;font-size:12pt}
td{border:1px dashed #B9B9DD;word-break:break-all; word-wrap:break-word;}
</style>
</head>
<body>
<%
// 获取由OAuthServlet中传入的参数
SNSUserInfo user = (SNSUserInfo)request.getAttribute("snsUserInfo");
String state=request.getAttribute("state").toString();
if(null != user) {
%>
<table width="100%" cellspacing="0" cellpadding="0">
<tr><td width="20%">属性</td><td width="80%">值</td></tr>
<tr><td>OpenID</td><td><%=user.getOpenId()%></td></tr>
<tr><td>昵称</td><td><%=user.getNickname()%></td></tr>
<tr><td>性别</td><td><%=user.getSex()%></td></tr>
<tr><td>国家</td><td><%=user.getCountry()%></td></tr>
<tr><td>省份</td><td><%=user.getProvince()%></td></tr>
<tr><td>城市</td><td><%=user.getCity()%></td></tr>
<tr><td>头像</td><td><%=user.getHeadImgUrl()%></td></tr>
<tr><td>特权</td><td><%=user.getPrivilegeList()%></td></tr>
<tr><td>state:</td><td><%=state%></td></tr>
</table>
<%
}
else
out.print("用户不同意授权,未获取到用户信息!");
%>
</body>
</html>

因为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
把里面的参数换成自己的。

原创粉丝点击