小程序登陆授权详解

这段时间在写购物网站的小程序,对小程序登陆授权的一些理解记录下来,便于日后巩固,也希望对他人有所帮助。

相关api链接小程序官方文档

wx.authorize(object){}  //授权方法

wx.getUserInfo(object){}  //从微信拉取用户相关信息,如微信名称,头像等

但是wx.getUserInfo()这个方法是要经过wx.authorize()调用授权成功后,微信才能返回给你相关数据,这是微信做的规定。

登录流程时序

wx.login(object){}

  1. 小程序调用wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。

  2. 开发者服务器以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;
    }
}

猜你喜欢

转载自blog.csdn.net/xdkprosperous/article/details/80921438