准备
- 开通uniCloud云空间
- 开通uni-push2.0
插件部署
https://ext.dcloud.net.cn/plugin?name=uni-im
1、登录uniapp开发账号,访问插件地址,点击“下载插件并导入HBuilderX”

2、选择之前准备的云空间,注意查看云空间是“阿里云”还是“腾讯云”

3、合并pages,点击“注册”

4、等待插件安装,成功后会有日志打印

5、部署到uniCloud,云服务空间初始化

对项目根目录uniCloud点右键,选择“云服务空间初始化向导” 按提示部署项目(注意:选择绑定的服务空间,须在uni-push2.0的web控制台 关联)
代码开发
1、打开项目根目录的App.vue文件,初始化uni-id-pages和uniIm模块
<script>
//1. 导入统一身份信息管理模块
import uniIdPagesInit from '@/uni_modules/uni-id-pages/init.js';
//2. 导入uniIm的Utils工具类
import uniImUtils from '@/uni_modules/uni-im/common/utils.js';
export default {
onLaunch: async function() {
console.log('App Launch');
//3. 初始化uni身份信息管理模块
uniIdPagesInit();
//4. 初始化uniIm
uniImUtils.init();
},
onShow: function() {
console.log('App Show');
},
onHide: function() {
console.log('App Hide');
}
};
</script>
2、登录uni-im
标准化登录
uni-im的服务端代码托管在uniCloud下,账户体系是uni-id 4.0+ 的; uni-app生态下绝大部分项目的架构与uni-im相同,所以不需要考虑账号打通问题,用户登录项目后,不需要额外登录uni-im。
外部系统联登
目前系统已有一套账号体系,通过uni-id的外部系统联登,同步账号数据到uni-im用户体系并获得uni-id的token,客户端再调用uniImUtils的login方法登录uni-im。
uni-id外部系统联登
1、接口URL化
登录uniCloud空间,打开“云函数/云对象”->“函数/对象列表”,选择“uni-id-co”最右侧“详情”,点进去

找到“云函数URL化”,点击编辑,添加path(如:/uni-id-co)


2、api 注册用户
接口地址
POST /your-uni-id-co-path/externalRegister
Request Body 说明
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| externalUid | string | 是 | 自身系统的用户id,必须保证唯一性。 |
| nickname | string | 否 | 用户昵称 |
| avatar | string | 否 | 用户头像 |
| gender | number | 否 | 用户性别;0 未知 1 男性 2 女性 |
Response Body 说明
| 参数名 | 类型 | 说明 |
|---|---|---|
| errCode | string|number | 错误码 |
| errMsg | string | 错误信息 |
| newToken | object | token信息 |
| |- token | string | token |
| |- tokenExpired | string | token过期时间 |
| externalUid | string | 自身系统的用户id |
| uid | string | uni-id体系的用户Id |
| nickname | string | 用户昵称 |
| avatar | string | 用户头像 |
| gender | string | 用户性别;0 未知 1 男性 2 女性 |
php端代码:仅部分参考,响应 https://www.example.com/login
var $uniid_url = 'https://xxx.next.bspapp.com/uni-id-co';
$$externalUid = '网站上生成的,注意不能为纯数字';
$requestAuthSecret = "testSecret";
$nonce = sprintf("%d", rand());
$timestamp = time() * 1000;
$params = [
'externalUid' => $externalUid,
];
$sign = new \addons\ymmUni\classes\Sign($requestAuthSecret);
$signature = $sign->getSignature($params, $nonce, $timestamp);
$url = $this->uniid_url . '/externalLogin';
// 构建请求头
$headers = [
'uni-id-nonce:'. $nonce,
'uni-id-timestamp:'. $timestamp,
'uni-id-signature:'. $signature,
'Content-Type: application/json',
'Cache-Control: no-cache',
];
$clientInfo = htmlspecialchars_decode($clientInfo);
$clientInfo = json_decode($clientInfo, true);
$post = [
'clientInfo' => $clientInfo,
'uniIdToken' => 0,
'params' => $params,
];
$post = json_encode($post);
$result = $sign->httpPost($url, $post, $headers);
$result = json_decode($result, true);
这里需要将$result 里的内容返回给uniapp
uniapp端代码:
import uniImUtils from '@/uni_modules/uni-im/common/utils.js';
uni.request({
url: 'https://www.example.com/login',
data: {
username: 'test',
password: '123456'
},
success:async (res) => {
console.log(res.data);
// 得到你自己项目的token和uni-id的token
let {token,uniIdToken} = res.data
// 平台需要的令牌
uni.setStorageSync('token',token)
// 【请注意】这里的`uniIdToken` 是一个`对象`:包含:`token`和`tokenExpired`
await uniImUtils.login(uniIdToken)
}
});
end.