# 获取loginCode

up.getLoginCode

页面通过jssdk从U聊客户端获取loginCode

/**
 * 获取登录Code
 * @param url, 微服务绑定的url
 */
const getLoginCode = (url) => {
  return new Promise((resolve, reject) => {
    const _success = (res) => {
      console.log('getLoginCode', res);
      if (res.status == '0') {
        resolve(res.code);
      } else {
        reject(res);
      }
    };

    const _fail = (fail) => {
      alert('fail: ' + JSON.stringify(fail));
      reject(fail);
    }
    up.getLoginCode(_success, _fail, {url});
  });
}

# 获取sessionKey

页面成功获取loginCode后(一次性有效),提交给开发者服务器。开发者服务器通过提交loginCode,secret和appid给微服务后台,获取sessionKey(有效期3天)。

建议开发者服务器将sessionKey存储,并且对sessionKey标记一个token,此token用来和页面交互使用(不直接暴露sessionKey),建议有效期也是三天,和sessionKey生存周期保持一致。

POST https://upchat.95516.net/upchat-public-gateway/api/app/code2session
Content-Type: application/x-www-form-urlencoded;charset=UTF-8

{
	"appid": 	微服务id
	"secret": 微服务账号密钥
	"code":   页面获取的loginCode
}

### Response
{ 
	"openid": 			用户openid
  "session_key": 	微服务sessionKey,有效时间3天
  "status": 			响应状态码,
  "msg": 					响应信息
}

# 获取用户信息

up.getUserInfo

  • jssdk获取脱敏信息

    jssdk提供getUserInfo接口供页面获取用户脱敏信息,和获取完整信息的加密字段。

    /**
     * 获取用户加密的个人信息
     */
    const getUserData = () => {
      return new Promise((resolve, reject) => {
        const _success = (res) => {
          console.log('userData', res);
          if (res.status == '0') {
            const userData = {
              encryptedData: res.encryptedData,
              rawData: res.rawdata,
              signature: res.signature,
            }
            resolve(userData);
          } else {
            reject(res);
          }
        };
    
        const _fail = (fail) => {
          alert('fail: ' + JSON.stringify(fail));
          reject(fail);
        }
        up.getUserInfo(_success, _fail);
      });
    }
    
    {
    	"rawdata": 非敏感用户信息,empname:姓名;gender:性别;avatarUrl:头像
    	"signature": 通过rawData和session_key算的hash字符串
    	"encrytedData": 加密的完整用户信息
    }
    
  • 获取完整用户信息

    页面将sessionKey和getUserInfo两个接口获取的值,提交给开发者服务器。开发者服务器验证签名后进行解密。 开发者具体验签和解密可参考demo: upchat-mp-demo.rar

    1. 验证签名:

      根据页面提交的token,获取开发者服务器存储的session_key,计算出签名:

      signature2 = StrUtil.shaEncode(rawData + sessionKey)

      对比页面提交的signature,两者一致即验证了数据完整性

    2. 数据解密

      页面提交的encryptedData为加密的用户信息,先Base64解密得到字符串,再通过session_key对其使用UPAES解密

      String s1 = new String(CipherUtil.base64Decode(encryptedData));
      userStr = CipherUtil.decryptUPAES(sessionKey, s1);
      userJson = JSONObject.parseObject(userStr);
      

      解密得到的用户信息包括:

      属性 说明
      jid 用户jid
      empcode 工号
      mobile 手机号
      officetel 办公电话
      inemail 内网邮箱
      exemail 外网邮箱
      fax 传真

# 查询登录状态

up.checkSession

因session_key有一定的有效期(一般3天左右),开发者不用每次进入页面都去获取loginCode

/**
* 查看用户登录态是否失效
*/
const checkSession = () => {
  return new Promise((resolve, reject) => {
    const _success = function (result) {
      console.log('checkSession', result);
      resolve(result);
    };

    const _fail = function (fail) {
      console.log('fail: ' + JSON.stringify(fail));
      resolve({});
    };
    up.checkSession(_success, _fail);
  })
};

接口返回的session.status值为'0',表示当前session_key扔有效,直接用之前页面缓存的token去请求开发者服务器即可。否则,重新走一遍登录和获取sessionKey的过程

# 微服务最佳实践

以获取完整用户信息为例:

U聊微服务获取用户信息

上次更新: 7/29/2021, 4:14:35 PM