1***@qq.com
1***@qq.com
  • 发布:2026-01-13 16:22
  • 更新:2026-01-13 16:22
  • 阅读:20

关于uni-id-co云对象URL化,短信登录无法发送的问题。官方uni-id-pages模板自带的uni-id-co的bug修复

分类:插件市场

uni-id-pages功能全面,所以思考将自己的应用系统直接使用这个用户体系。
由于uni-id-co目前官方不支持在云对象中直接调用,但官方推荐了HTTP的调用方式,就是云对象URL化。
由于uni-id-co的功能接口太多权限太大,如果直接url化给客户端,肯定很多安全问题 。所以我们可以在自己云对象中,去调用url化的uni-id-co。

根据官方文档需要这3个关键参数: uniPlatform、appId、deviceId
其中deviceId 肯定是从客户端提起过来。这是客户端唯一标识。
uniPlatform直接设为‘web’,
最后一个是appId,就是uni官方的应用Id,但这个简单的appId参数,在短信发送这个功能上折磨了我好久。为避免其他同学也遇到这个需求和问题。所以写下本文。

因为我们在小程序端短信功能一切正常,所以显然容易想到直接让从云对象登录的统一模拟成小程序,也就是把appId设置成小程序的appId,这样跟小程序的用户体系就统一了,这也是需求,因为我们应用系统的用户同时也是小程序的用户。
这是ClientInfo的模拟:
this.customClientInfo = {
uniPlatform: 'web',
appId: 'UNIXXXXXXX',
deviceId: dvid,
locale: 'zh-Hans'
}
这样子的模拟,在云对象中许多其他功能都跑通了,包括账户密码登录等等,但是短信登录确一直报参数错误:appid
下面的传参方式是严格按官方文档要求来的,http请求的Post数据:
const requestData = {
clientInfo: this.customClientInfo,
params: {
mobile: params.mobile,
captcha: params.captcha,
scene: 'login-by-sms',
}
};

通过扒uni-id-co的源码,最终定位了问题出在【 uni-id-co/lib/utils/sms.js 】这个文件里的第61行左右。官方模版原本是这样写的。
await uniCloud.sendSms({
smsKey: smsConfig.smsKey,
smsSecret: smsConfig.smsSecret,
phone: mobile,
templateId,
data: {
name: smsConfig.name,
code,
action,
expMinute: '' + Math.round(codeExpiresIn / 60)
}
})

在小程序端可以发送成功,但是http端却报参数错误:appid
说明uniCloud.sendSms这个函数里面内置了从小程序端获取appid的方式。
然而来自于http端的appid即使你按官方文档要求传了,在这里依然丢失了。
所以得自己传进去,也就是在sendSms的参数里加一行appId: clientInfo.appId

到这里算是比较容易想到的,但当你这样 appId: clientInfo.appId传进去,发现问题依然在,肯定就跑去找其他原因了。
但, uniCloud.sendSms这个源码看不到,找遍了其他地方又找不到原因,花了大量时间后,不得不回到这里来重新思考,
最后是这把 appId: clientInfo.appId 改为 appid: clientInfo.appId ,发现终于成功了,是该喜还是什么别的表情?
一个大写I改成小写i,花了整整一天!

【问题最终解决方式】
const clientInfo = this.getUniversalClientInfo()
await uniCloud.sendSms({
appid: clientInfo.appId, //注意 sendSms的参数名 appid 必须小写 !就是这个小写折腾了我整整1天!!
smsKey: smsConfig.smsKey,
smsSecret: smsConfig.smsSecret,
phone: mobile,
templateId,
data: {
name: smsConfig.name,
code,
action,
expMinute: '' + Math.round(codeExpiresIn / 60)
}
})

0 关注 分享

要回复文章请先登录注册