这段时间在写购物网站的小程序,对小程序登陆授权的一些理解记录下来,便于日后巩固,也希望对他人有所帮助。
wx.authorize(object){} //授权方法
wx.getUserInfo(object){} //从微信拉取用户相关信息,如微信名称,头像等
但是wx.getUserInfo()这个方法是要经过wx.authorize()调用授权成功后,微信才能返回给你相关数据,这是微信做的规定。
登录流程时序
wx.login(object){}
-
小程序调用wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
-
开发者服务器以code换取 用户唯一标识openid 和 会话密钥session_key。
之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份
总结:像以往我们写一个系统都是有输入用户名和密码的登陆操作,但是微信小程序由于在微信登陆了所以可以跳过这个过程,但是咱们写的小程序服务器怎么区分用户呢,总得有一个标识吧,所以微信提供一个wx.login()方法返回给我们一个code标识,然后传到我们的服务器,再从服务器请求访问微信接口,接口如下:
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
请求参数
参数 | 必填 | 说明 |
---|---|---|
appid | 是 | 小程序唯一标识 |
secret | 是 | 小程序的 app secret |
js_code | 是 | 登录时获取的 code |
grant_type | 是 | 填写为 authorization_code |
在不满足UnionID下发条件的情况下,返回参数
参数 | 说明 |
---|---|
openid | 用户唯一标识 |
session_key | 会话密钥 |
其中openid就是我们需要的用户标识id。那有人会问,为什么要从服务器访问,不直接从前端利用ajax访问。我想说这是可以的,只是那样不安全,因为别人会通过抓包,获取你的appid以及secret。那样你的小程序也就任别人宰割了。
后台服务器请求代码:
public class HttpUtils {
private static Logger log = Logger.getLogger(HttpUtils.class);
/**
* 向指定 URL 发送POST方法的请求
*
* @param url 发送请求的 URL
* @param param 请求参数
* @return 所代表远程资源的响应结果
*/
public static ResultInfo sendPost(String url, Map<String, ?> paramMap) {
ResultInfo resultInfo = new ResultInfo();
PrintWriter out = null;
BufferedReader in = null;
String result = "";
String param = "";
Iterator<String> it = paramMap.keySet().iterator();
while(it.hasNext()) {
String key = it.next();
param += key + "=" + paramMap.get(key) + "&";
}
try {
URL realUrl = new URL(url);
// 打开和URL之间的连接
URLConnection conn = realUrl.openConnection();
// 设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("Accept-Charset", "utf-8");
conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
// 获取URLConnection对象对应的输出流
out = new PrintWriter(conn.getOutputStream());
// 发送请求参数
out.print(param);
// flush输出流的缓冲
out.flush();
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
resultInfo.code = -1;
resultInfo.msg = e.getMessage();
log.error(e.getMessage(), e);
return resultInfo;
}
//使用finally块来关闭输出流、输入流
finally{
try{
if(out!=null){
out.close();
}
if(in!=null){
in.close();
}
}
catch(IOException ex){
ex.printStackTrace();
}
}
resultInfo.code = 1;
resultInfo.msg = "获取数据成功";
resultInfo.obj = result;
return resultInfo;
}
}