# 获取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
验证签名:
根据页面提交的token,获取开发者服务器存储的session_key,计算出签名:
signature2 = StrUtil.shaEncode(rawData + sessionKey)对比页面提交的
signature,两者一致即验证了数据完整性数据解密
页面提交的
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的过程
# 微服务最佳实践
以获取完整用户信息为例:
