第一步(设置域名)
去这个网站设置
https://mp.weixin.qq.com/?token=&lang=zh_CN
第二步
去这个页面
https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
1、用户同意授权,获取code
根据链接信息,拼接一个链接出来
使用 urlEncode 对redirect_uri进行处理(redirect_uri 是重定向的地址)
package Utils;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
public class URLEncoderExample {
public static void main(String[] args) {
String originalUrl = "www.baidu.com";
try {
String encodedUrl = URLEncoder.encode(originalUrl, "UTF-8");
System.out.println("Encoded URL: " + encodedUrl);
} catch (UnsupportedEncodingException e) {
System.out.println("Unsupported Encoding: " + e.getMessage());
e.printStackTrace();
}
}
}
2、通过code换取网页授权access_token
完成了这一步可以获取到,用户和公众号唯一的OpenID,通过这个OpenID可以验证用户的身份,在加上一个随机的验证吗,用来区分注册的用户和未注册用户。
3、刷新access_token(如果需要,可以跳过)
4、拉取用户信息(需scope为 snsapi_userinfo)(不需要的话也可以跳过)
返回说明
正确时返回的JSON数据包如下:
{
"openid": "OPENID",
"nickname": NICKNAME,
"sex": 1,
"province":"PROVINCE",
"city":"CITY",
"country":"COUNTRY",
"headimgurl":"https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
"privilege":[ "PRIVILEGE1" "PRIVILEGE2" ],
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
5、代码展示
要用到的jar包
最后一个weixin-java-mp是必须用到的
详细代码展示
package servlet;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Objects;
@WebServlet(urlPatterns = "/servlet/WxGetOpenid", description = "得到Openid")
public class WxGetOpenid extends HttpServlet {
public WxGetOpenid() {
super();
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 第一步:用户同意授权,获取code。这一步通过微信公众号登录链接已经拼接好了。
// 获取从前端传递的参数 code
String code = (String) req.getParameter("code");
// 设置响应的内容类型和字符集
resp.setHeader("Content-type", "text/html;charset=UTF-8");
// 获取 PrintWriter 对象,用于向前端输出响应内容
PrintWriter out = resp.getWriter();
// 输出收到的参数 code
out.print("{\"code\":" + code + "\"}");
// 微信公众号的 AppID 和 Secret
String appId = "微信开发平台获取";
String secret = "微信开发平台获取";
// 第二步:通过code换取网页授权access_token
// 构建请求微信接口的URL
String url = "https://api.weixin.qq.com/sns/oauth2/access_token" +
"?appid=" + appId +
"&secret=" + secret +
"&code=" + code +
"&grant_type=authorization_code";
// appid 是 公众号的唯一标识
// secret 是 公众号的appsecret
// code 是 填写第一步获取的code参数
// grant_type 是 填写为authorization_code
String accessToken = null;
String openid = null;
try {
// 创建URL对象
URL requestUrl = new URL(url);
// 打开连接
HttpURLConnection connection = (HttpURLConnection) requestUrl.openConnection();
// 设置请求方法为GET
connection.setRequestMethod("GET");
// 获取响应码
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
// 读取响应数据
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
StringBuilder jsonResponse = new StringBuilder();
while ((line = reader.readLine()) != null) {
jsonResponse.append(line);
}
reader.close();
// jsonResponse 包含了从URL获取的JSON响应
String json = jsonResponse.toString();
resp.getWriter().write("--"+"json: " + json+ "--");
// 解析 JSON
JSONObject jsonObject = JSON.parseObject(json);
// 提取每一项的值
accessToken = jsonObject.getString("access_token");
int expiresIn = jsonObject.getIntValue("expires_in");
String refreshToken = jsonObject.getString("refresh_token");
openid = jsonObject.getString("openid");
String scope = jsonObject.getString("scope");
// 打印结果
resp.getWriter().write("Access Token: " + accessToken+ "--");
resp.getWriter().write("Expires In: " + expiresIn+ "--");
resp.getWriter().write("Refresh Token: " + refreshToken+ "--");
resp.getWriter().write("OpenID: " + openid+ "--");
resp.getWriter().write("Scope: " + scope+ "--");
// access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
// expires_in access_token接口调用凭证超时时间,单位(秒)
// refresh_token 用户刷新access_token
// openid 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID
// scope 用户授权的作用域,使用逗号(,)分隔
// is_snapshotuser 是否为快照页模式虚拟账号,只有当用户是快照页模式虚拟账号时返回,值为1
// unionid 用户统一标识(针对一个微信开放平台账号下的应用,同一用户的 unionid 是唯一的),只有当scope为"snsapi_userinfo"时返回
// 错误时微信会返回JSON数据包如下(示例为Code无效错误): {"errcode":40029,"errmsg":"invalid code"}
} else {
// 处理HTTP请求失败的情况
resp.getWriter().write("HTTP Request Failed with Response Code: " + responseCode);
}
// 关闭连接
connection.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
// 第四步:拉取用户信息(需scope为 snsapi_userinfo)
// access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
// openid 用户的唯一标识
// lang 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语
String lang = "zh_CN";
String urlUserinfo = "https://api.weixin.qq.com/sns/userinfo" +
"?access_token=" + accessToken +
"&openid=" + openid +
"&lang=" + lang;
resp.getWriter().println("urlUserinfo: " + urlUserinfo);
// https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
try {
// 创建URL对象
URL requestUrl = new URL(urlUserinfo);
// 打开连接
HttpURLConnection connection = (HttpURLConnection) requestUrl.openConnection();
// 设置请求方法为GET
connection.setRequestMethod("GET");
// 获取响应码
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
// 读取响应数据
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
StringBuilder jsonResponse = new StringBuilder();
while ((line = reader.readLine()) != null) {
jsonResponse.append(line);
}
reader.close();
// jsonResponse 包含了从URL获取的JSON响应
String jsonUserinfo = jsonResponse.toString();
//打印jsonUserinfo
resp.getWriter().write("jsonUserinfo: " + jsonUserinfo+ "--");
} else {
// 处理HTTP请求失败的情况
resp.getWriter().write("HTTP Request Failed with Response Code: " + responseCode);
}
// 关闭连接
connection.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
// 微信登录功能的验证
// 模拟数据库查询openid和随机验证码
String MYopenid = "openid";
// 判断openid是否相等
boolean isEqual1 = Objects.equals(openid, MYopenid);
if (isEqual1) {
resp.sendRedirect("/index11.html");//登录成功去的页面
// resp.sendRedirect("http://www.baidu.com");//登录成功去的页面
} else {
resp.sendRedirect("/login.html");//登录失败去的页面
// resp.sendRedirect("https://www.csdn.net/");//登录失败去的页面
}
}
}
第三步,设置公众号网页的跳转链接
将拼接好的第一步链接放到微信公众号的网页跳转那里去
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx807d86fb6b3d4fd2&redirect_uri=http%3A%2F%2Fdevelopers.weixin.qq.com&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
redirect_uri 跳转的链接写服务器的servlet,用于获取返回值。