JAVA获取OppenId

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

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


oauthServlet
com.wtk.wx.util.OAuthServlet


oauthServlet
/oauthServlet


第三步:编写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.*"%>


OAuth2.0网页授权




<%
// 获取由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
把里面的参数换成自己的。

你可能感兴趣的:(微信开发,java,微信,openid)