第三方对接指南
一页看懂,5 步完成 UserMatrix 对接。附带可运行的完整 demo。
流程一览
你的应用 UserMatrix 用户
│ │ │
│── 1. 构造登录链接 ─────────→│ │
│ │── 2. 跳转授权页 ───────→│
│ │←── 3. 用户扫码/授权 ────│
│←── 4. 带 code 回调 ────────│ │
│── 5. code 换用户信息 ─────→│ │
│←── 返回 openid+token ──────│ │
│ │ │
└─ 登录完成,后续用 token 调 API
全程只需调 2 个接口:act=login(生成链接)和 act=callback(换用户信息)。其余是自动跳转。
准备材料
在 um.yunjii.cn/console/apps 创建应用,获得:
| 材料 | 说明 | 示例 |
|---|---|---|
appid | 应用 ID | 1001 |
appkey | 应用密钥(切勿泄露) | a3f8b2c9d1e7... |
| 回调域名 | 你的回调地址域名 | yourapp.com |
5 步对接
接口:GET https://um.yunjii.cn/php/connect.php?act=login
参数:
| 参数 | 必填 | 说明 |
|---|---|---|
appid | ✅ | 应用 ID |
type | ✅ | wx / alipay / qq / douyin / self |
redirect_uri | ✅ | 回调地址(域名需与后台一致) |
state | ✅ | 防 CSRF,随机字符串,原样返回 |
timestamp | ✅ | 当前时间戳(秒) |
sign | ✅ | MD5 签名(见下方算法) |
响应:
{
"code": 1,
"data": { "url": "https://open.weixin.qq.com/connect/qrconnect?..." }
}
拿到 url 后,引导用户跳转到该地址(302 或前端 window.location)。
用户在第三方平台(微信/支付宝等)完成扫码或授权。
这一步你不需要做任何事,UM 会自动处理。
用户授权后,UM 会带 code 参数跳转回你的 redirect_uri:
https://yourapp.com/callback?code=CODE_xxx&state=你传的state
你需要:
- 验证
state与第一步生成的是否一致(防 CSRF) - 取出
code,进入下一步
code 5 分钟内只能用一次,过期或重复消费返回 40163。
接口:GET https://um.yunjii.cn/php/connect.php?act=callback
参数:
| 参数 | 必填 | 说明 |
|---|---|---|
appid | ✅ | 应用 ID |
code | ✅ | 上一步拿到的 code |
timestamp | ✅ | 时间戳 |
sign | ✅ | 签名 |
响应:
{
"code": 1,
"data": {
"openid": "oXabc123...",
"nickname": "张三",
"avatar": "https://thirdwx.qlogo.cn/...",
"social_uid": "um_a1b2c3d4e5f6",
"login_type": "wx",
"token": "um_token_xxx..."
}
}
字段说明:
| 字段 | 说明 |
|---|---|
openid | 应用内用户唯一 ID(同应用不变) |
social_uid | UMID,跨应用唯一(同一用户在不同应用 UMID 相同) |
token | 后续 API 调用凭证(7 天有效) |
nickname / avatar | 用户资料 |
后续业务请求中,用 token 验证用户身份:
接口:GET https://um.yunjii.cn/php/check_token.php
参数:token + appid
响应:
{
"code": 1,
"data": {
"user_id": 12345,
"openid": "um_a1b2c3...",
"scope": "app",
"expire_at": "2026-07-13 12:00:00"
}
}
code=1 表示 token 有效,可放行请求。
签名算法
不用 SDK 时需要手动计算签名,3 行逻辑:
// 1. 收集所有 GET 参数(除 sign 外),按 key 字典序排列
ksort($params);
// 2. 拼接成字符串,末尾加 appkey
$signStr = '';
foreach ($params as $k => $v) $signStr .= "$k=$v&";
$signStr .= "appkey=$appkey";
// 3. MD5
$sign = md5($signStr);
timestamp 必须在当前时间 ±5 分钟内,否则返回 errcode=105。
完整 PHP Demo
复制以下代码,填入你的 appid 和 appkey,保存为 login.php 即可运行:
<?php
// ====== 配置 ======
$appid = '你的_appid';
$appkey = '你的_appkey';
$redirect_uri = 'https://yourapp.com/login.php';
// ====== 签名函数 ======
function makeSign($params, $appkey) {
ksort($params);
$str = '';
foreach ($params as $k => $v) $str .= "$k=$v&";
$str .= "appkey=$appkey";
return md5($str);
}
// ====== 主逻辑 ======
$act = $_GET['act'] ?? 'login';
if ($act === 'login') {
// 第一步:构造登录链接
$params = [
'act' => 'login',
'appid' => $appid,
'type' => 'wx', // 改成你要的平台
'redirect_uri' => $redirect_uri,
'state' => bin2hex(random_bytes(16)),
'timestamp' => time(),
];
$params['sign'] = makeSign($params, $appkey);
$resp = json_decode(file_get_contents(
'https://um.yunjii.cn/php/connect.php?' . http_build_query($params)
), true);
if ($resp['code'] === 1) {
header('Location: ' . $resp['data']['url']);
exit;
}
die('登录链接生成失败: ' . $resp['msg']);
}
if ($act === 'callback') {
// 第四步:code 换取用户信息
$params = [
'act' => 'callback',
'appid' => $appid,
'code' => $_GET['code'],
'timestamp' => time(),
];
$params['sign'] = makeSign($params, $appkey);
$resp = json_decode(file_get_contents(
'https://um.yunjii.cn/php/connect.php?' . http_build_query($params)
), true);
if ($resp['code'] === 1) {
$user = $resp['data'];
echo "登录成功!<br>";
echo "昵称: {$user['nickname']}<br>";
echo "头像: <img src='{$user['avatar']}' width=64><br>";
echo "UMID: {$user['social_uid']}<br>";
echo "Token: {$user['token']}<br>";
// TODO: 在这里创建会话,跳回首页
} else {
die('换取用户信息失败: ' . $resp['msg']);
}
}
使用方式:
- 修改
$appid和$appkey - 在 UM 控制台配置回调域名为你的域名
- 浏览器访问
https://yourapp.com/login.php?act=login - 用户扫码授权后会自动回调
?act=callback&code=xxx
用 SDK(更简单)
如果你用 PHP / JS / Python / 小程序,装 SDK 后签名自动生成:
$um = new UM($appid, $appkey, $callback, 'https://um.yunjii.cn/php');
$url = $um->login('wx', $state); // 一步生成登录链接
$user = $um->callback($_GET['code']); // 一步换取用户信息
详见 SDK 文档。
常见问题
| 问题 | 原因 | 解决 |
|---|---|---|
errcode=102 | appid 不存在或应用未审核 | 检查 appid,确认应用状态为"运行中" |
errcode=103 | 回调域名未授权 | 在控制台添加你的回调域名 |
errcode=105 | timestamp 过期 | 保证服务器时间正确,5 分钟内有效 |
errcode=106 | 签名验证失败 | 检查 appkey、参数排序、拼接格式 |
errcode=40163 | code 重复消费 | code 只能用一次,5 分钟过期 |