【Java】—— 后端实现微信小程序登录
调用wx.login()获取临时code将code发送到向微信接口请求和openid创建自定义登录态(如Token)并返回给小程序后续请求携带Token进行身份验证。
·
整体流程
-
小程序端调用
wx.login()获取临时code -
小程序端将
code发送到Java后端 -
Java后端向微信接口请求
session_key和openid -
Java后端创建自定义登录态(如Token)并返回给小程序
-
小程序端后续请求携带Token进行身份验证


获取openid:
//获取openid的访问路径地址
private static final String URL="https://api.weixin.qq.com/sns/jscode2session";
@Value("${wechat.appid}")
private String appid;
@Value("${wechat.secret}")
private String secret;
/**
* 获取openid
* @param code 登录凭证
* @return 唯一标识
* @throws IOException IO异常
*/
@Override
public JSONObject getOpenid(String code) throws IOException {
// 封装请求参数
// 创建一个Map对象用于存储请求参数
Map<String, Object> params = new HashMap<>();
// 设置小程序的AppID
params.put("appid", appid);
// 设置小程序的AppSecret
params.put("secret", secret);
// 设置从前端接收到的临时登录凭证code
params.put("js_code", code);
// 设置授权类型,固定值为"authorization_code"
params.put("grant_type", "authorization_code");
// 发送HTTP GET请求到微信服务器
// 使用HttpRequest工具类构造GET请求,并将封装好的参数以表单形式发送
HttpResponse response = HttpRequest.get(URL).form(params).execute();
// 解析微信服务器返回的结果
if (response.isOk()) { // 检查响应是否成功(状态码200)
String body = response.body(); // 获取响应体内容
JSONObject jsonObject = JSONUtil.parseObj(body); // 将响应体解析为JSON对象
// 检查返回结果中是否包含错误码字段
// 如果存在errcode字段,说明调用失败,抛出自定义异常
if (jsonObject.containsKey("errcode")) {
throw new SLWebException(jsonObject.toString());
}
// 如果没有错误码,直接返回解析后的JSON对象,其中包含openid、session_key等信息
return jsonObject;
}
// 如果响应状态不是200,构造错误信息并抛出异常
String errMsg = StrUtil.format("调用微信登录接口出错! code = {}", code);
throw new SLWebException(errMsg);
}
获取token:
//获取token的接口地址
private static final String ACCESS_TOKEN_URL="https://api.weixin.qq.com/cgi-bin/token";
//获取token值
private String accessToken(){
Map<String,Object> params=new HashMap<>();
params.put("grant_type","client_credential");
params.put("appid",appid);
params.put("secret",secret);
//获取token
HttpResponse response = HttpRequest.get(ACCESS_TOKEN_URL)
.form(params)
.execute();
//解析数据
if(response.isOk()){
String body = response.body();
JSONObject jsonObject = JSONUtil.parseObj(body);
return jsonObject.getStr("access_token");
}
String errMsg = StrUtil.format("调用获取接口调用凭据接口出错!");
throw new SLWebException(errMsg);
}
获取手机号:
//获取手机号的接口地址
private static final String PHONE_URL="https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=";
/**
* 获取手机号
* @param code 手机号凭证
* @return 唯一标识
* @throws IOException IO异常
*/
@Override
public String getPhone(String code) throws IOException {
//封装数据
Map<String,Object> params=new HashMap<>();
params.put("code",code);
String paramBody = JSONUtil.toJsonStr(params);
//获取手机号
HttpResponse response = HttpRequest.post(PHONE_URL + this.accessToken())
.body(paramBody)
.execute();
//解析结果
if(response.isOk()){
String body = response.body();
JSONObject jsonObject = JSONUtil.parseObj(body);
String phone = jsonObject.getByPath("phone_info.phoneNumber", String.class);
return phone;
}
String errMsg = StrUtil.format("调用获取手机号接口出错!");
throw new SLWebException(errMsg);
}
返回结果:
- 成功时返回:
{
"openid": "用户唯一标识",
"session_key": "会话密钥",
"unionid": "用户在开放平台的唯一标识(仅在满足条件时返回)"
}
- 失败时返回错误码和错误信息:
{ "errcode": 40029, "errmsg": "invalid code" }
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)