JAVA获取OppenId

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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值