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
把里面的参数换成自己的。
- JAVA获取OppenId
- Java-----Java获取路径
- java获取时间、获取日期
- 获取Java文件路径
- java获取时间类型
- JAVA获取随机数
- JAVA中获取年月日
- java 获取表结构
- java获取系统路径
- JAVA获取随机数
- java获取百分比
- Java获取随机字符串
- Java获取随机字符串
- JAVA 获取时间
- java获取对象类型
- java获取操作系统路径
- java 获取网页内容
- java获取系统时间
- The system is running in low-graphics mode
- golang+walk根据数据库表生成java,proto和模板
- 爬取Ajax界面
- 部署Nginx反向代理三个web服务并调度算法使用加权轮询
- Spring事务的传播行为
- JAVA获取OppenId
- matlab三维绘图
- 讲给Android程序员看的前端教程(39)——Web Woker
- 读入——getline()函数和cin
- 计算鸡和兔子的数量
- Wannafly挑战赛3-C-位数差(二分)
- Xmanager5用Xstart连接CentOS7
- HDU-2025(查找最大元素)
- hibernate