首先,我们需要了解一下微信小程序的认证流程和openid的概念。
在用户使用微信小程序时,小程序会向微信服务器发送登录请求,微信服务器会返回给小程序一个特有的code参数。小程序前端拿到这个code参数后,需要发送一个HTTP请求到我们的后台服务器,我们的后台服务器再使用这个code参数向微信服务器发送请求,获取用户的openid。
openid是微信中用于区别不同用户的唯一标识,通过openid我们可以获取到用户的基本信息。
下面是获取openid的完整攻略:
1.小程序前端向后台服务器发送code参数
用户在小程序前端登录成功后,前端可以使用wx.login()方法获取到一个code参数,然后将这个参数发送到后台服务器。示例代码如下:
wx.login({
success: function (res) {
if (res.code) {
wx.request({
url: 'https://example.com/login',
data: {
code: res.code
}
})
} else {
console.log('获取用户登录态失败!' + res.errMsg)
}
}
});
2.后台服务器向微信服务器发送请求,获取openid
后台服务器收到小程序前端发送的code参数后,需要将这个参数使用POST方法请求微信服务器的接口,获取用户的openid。示例如下:
@RestController
public class LoginController {
@RequestMapping("/login")
public String login(String code){
String url = "https://api.weixin.qq.com/sns/jscode2session?appid=<appid>&secret=<secret>&js_code="+code+"&grant_type=authorization_code";
String response = null;
try {
response = HttpClientUtil.doGet(url); //使用httpclient发送http请求
} catch (IOException e) {
e.printStackTrace();
}
return response;
}
}
其中,appid和secret是我们在微信公众平台创建小程序时生成的唯一标识。
3.解析微信服务器返回的JSON数据,获取openid
微信服务器返回的JSON数据中包含用户的openid,我们可以通过JSON解析获取到这个值。示例代码如下:
@RequestMapping("/login")
public String login(String code){
String url = "https://api.weixin.qq.com/sns/jscode2session?appid=<appid>&secret=<secret>&js_code="+code+"&grant_type=authorization_code";
String response = null;
try {
response = HttpClientUtil.doGet(url); //使用httpclient发送http请求
} catch (IOException e) {
e.printStackTrace();
}
JSONObject jsonObject = JSONObject.parseObject(response);
String openid = jsonObject.getString("openid");
return openid;
}
上述代码中,我们使用了一个名为HttpClientUtil的工具类,用于发送http请求。使用这种方法可以避免我们手动对http请求进行封装,让我们的代码更简洁易懂。
另外需要注意的是,微信服务器返回的JSON数据中还有session_key等字段,这些字段也是非常重要的,我们需要将这些信息存储在本地,用于之后的登录验证等操作。
4.示例说明
以上是获取openid的完整攻略,下面我们来看两个示例说明。
示例1:
小程序前端页面中,用户点击“登录”按钮,触发wx.login()方法,将code参数发送到后端服务器。
wx.login({
success: function (res) {
if (res.code) {
wx.request({
url: 'https://example.com/login',
data: {
code: res.code
},
success: function(res){
//处理成功返回的数据
},
fail: function(res){
//处理失败返回的数据
}
})
} else {
console.log('获取用户登录态失败!' + res.errMsg)
}
}
});
后端服务器使用HttpClient发送POST请求到微信服务器,获取JSON数据,从JSON数据中解析出openid并返回给小程序前端。
@RestController
public class LoginController {
@RequestMapping("/login")
public String login(String code){
String url = "https://api.weixin.qq.com/sns/jscode2session?appid=<appid>&secret=<secret>&js_code="+code+"&grant_type=authorization_code";
String response = null;
try {
response = HttpClientUtil.doGet(url); //使用httpclient发送http请求
} catch (IOException e) {
e.printStackTrace();
}
JSONObject jsonObject = JSONObject.parseObject(response);
String openid = jsonObject.getString("openid");
return openid;
}
}
示例2:
有些时候,我们的微信小程序需要在用户登录之后才能进入某些页面或执行某些操作。在这种情况下,通常会在小程序前端请求某个验证用户登录的接口。我们可以使用如下代码来完成这个操作:
wx.request({
url: 'https://example.com/checkLogin',
success: function (res) {
if (res.data == 'ok') {
//用户已登录,执行某个操作
} else {
//用户未登录,跳转到登录页面
wx.navigateTo({
url: '/pages/login/login'
})
}
}
})
后台服务器的接口代码如下:
@RestController
public class CheckLoginController {
@RequestMapping("/checkLogin")
public String checkLogin(HttpServletRequest request){
HttpSession session = request.getSession();
String openid = (String) session.getAttribute("openid");
if(openid!=null && !openid.equals("")){
return "ok";
}else{
return "error";
}
}
}
上述代码中,我们通过request.getSession()方法获取到了用户的session信息,从中获取到了用户的openid。
需要注意的是,在用户登录成功之后,我们需要将用户的openid和session_key等信息存储在session中,以便之后的操作可以使用。我们可以使用如下代码实现:
@RequestMapping("/login")
public String login(String code, HttpServletRequest request){
String url = "https://api.weixin.qq.com/sns/jscode2session?appid=<appid>&secret=<secret>&js_code="+code+"&grant_type=authorization_code";
String response = null;
try {
response = HttpClientUtil.doGet(url); //使用httpclient发送http请求
} catch (IOException e) {
e.printStackTrace();
}
JSONObject jsonObject = JSONObject.parseObject(response);
String openid = jsonObject.getString("openid");
String session_key = jsonObject.getString("session_key");
HttpSession session = request.getSession();
session.setAttribute("openid", openid);
session.setAttribute("session_key", session_key);
return openid;
}
通过以上示例,我们完成了微信小程序后端获取openid的攻略并且通过具体实例进行了讲解。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:微信小程序 springboot后台如何获取用户的openid - Python技术站