zoukankan      html  css  js  c++  java
  • 微信小程序:如何获取openid?

    官方解释:https://developers.weixin.qq.com/community/develop/article/doc/000c80906b4210625f3bde3775bc13

    我们看看不使用云开发的情况:

    第一步、调用wx.login获取code,再携带code像后台发起请求

    首先需要在微信小程序调用登录开放接口 wx.login() 获取用户登陆凭证code。然后,向自己的服务器发送请求,并将code一起发送过去。

    从wx.login(Object object)官方的API文档:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.html 可知,

    调用接口获取登录凭证(code)。通过凭证进而换取用户登录态信息,包括用户在当前小程序的唯一标识(openid)、微信开放平台帐号下的唯一标识(unionid,若当前小程序已绑定到微信开放平台帐号)及本次登录的会话密钥(session_key)等。

    接口的参数:object

    注意:这里的success虽然是接口调用成功的回调函数,但是它只是参数。

    success回调函数也有参数res,res的属性为code

    在App.js的onLaunch生命周期函数中调用wx.login接口

    onLaunch: function () {// 登录
        wx.login({
            success: res => {
                // 发送 res.code 到后台换取 openId 验证平台账号是否登录绑定过
                var that = this;
                wx.request({
                    method: 'GET',
                    url: this.globalData.serverApi + "/mobileApi/user/checkBind?code="+res.code,
                    header: {
                        'content-type': 'application/json'
                    },
                    success (res) {
                        if(res.data.code == 301){
                            //未登录
                            var openId = res.data.openId;
                            wx.reLaunch({
                              url: '/pages/login/login?openId='+openId
                            })
                        }else if(res.data.code == 1){
                            //已登录
                            that.globalData.userInfo = res.data.userInfo;
                            that.globalData.token = res.data.token;
                        }else if(res.data.code == 0){
                            //获取openId失败
                            wx.showToast({
                              title: res.data.msg,
                              icon: 'none',
                              duration: 2000
                            })
                        }
    
                        // 由于 checkBind 是网络请求,可能会在 Page.onLoad 之后才返回
                        // 所以此处加入 callback 以防止这种情况
                        if (that.checkBindCallback) {
                          that.checkBindCallback(res)
                        }
                    }
                })
          }
        })
      },

    二、在自己的服务端调用auth.code2Session接口

    官方文档:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html

    登录凭证校验。通过 wx.login 接口获得临时登录凭证 code 后传到开发者服务器调用此接口完成登录流程。

    请求地址:

    GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

    后台代码

    /**
         * 根据code获取openId去检查是否绑定平台用户
         * @param code
         * @return JSONObject
         */
        @GetMapping("/checkBind")
        public JSONObject checkBind(@RequestParam String code){
            JSONObject object = new JSONObject();
            String getOpenIdUrl = getOpenIdURL.replace("APPID",appId).replace("SECRET",appSecret).replace("JSCODE",code);
            try {
                //获取openId信息
                String resultStr = httpUtil.doGet(getOpenIdUrl,null,null);
                JSONObject resultObj = JSON.parseObject(resultStr);
                if(StringUtils.isNotEmpty(resultObj.getString("openid"))){
                    //根据openId判断是否和平台用户绑定
                    String openId = resultObj.getString("openid");
                    Result result = appletUserService.appletUserQuery(openId);
                    if(result.isSuccess()){
                        //已绑定
                        AppletUser appletUser = (AppletUser)result.getData();
                        String token = appletUser.getToken();
                        //获取用户信息
                        User userInfo = (User)redisUtilService.get(pre + "TOKEN" + token);
                        //根据登录token获取后台的权限菜单
                ...
                        object.put("token",token);
                        object.put("userInfo",userInfo);
                        object.put("code",ResultCode.SUCCESS);
                        object.put("msg","已经登录");
                    }else{
                        //未绑定
                        object.put("openId",openId);
                        object.put("code",ResultCode.NO_LOGIN);
                        object.put("msg","未登录");
                    }
                }else{
                    object.put("code",ResultCode.FAILURE);
                    object.put("msg",resultObj.getString("errmsg"));
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return object;
        }

    其中getOpenIdURL为:https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

  • 相关阅读:
    Redis持久化(八)
    Redis通用命令(七)
    Redis数据结构(六)
    Redis数据结构(五)
    Redis数据结构(四)
    Redis数据结构(三)
    nodename nor servname provided, or not known
    edis.clients.jedis.exceptions.JedisDataException: MISCONF Redis is configured to save RDB snapshots,
    Redis与Java的链接Jedis(二)
    高并发Redis(Mac)环境配置(一)
  • 原文地址:https://www.cnblogs.com/zwh0910/p/15631977.html
Copyright © 2011-2022 走看看