Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
程序yang
unidocs-zh
提交
074e264e
U
unidocs-zh
项目概览
程序yang
/
unidocs-zh
与 Fork 源项目一致
Fork自
DCloud / unidocs-zh
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
U
unidocs-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
074e264e
编写于
1月 03, 2023
作者:
杜庆泉
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' of gitcode.net:dcloud/unidocs-zh into master
上级
9f6bb4cb
919c328d
变更
8
展开全部
隐藏空白更改
内联
并排
Showing
8 changed file
with
554 addition
and
487 deletion
+554
-487
docs/tutorial/build/publish-mp-weixin-cli.md
docs/tutorial/build/publish-mp-weixin-cli.md
+3
-2
docs/uniCloud/aliyun-migrate-business.md
docs/uniCloud/aliyun-migrate-business.md
+41
-0
docs/uniCloud/cf-database-aggregate-operator.md
docs/uniCloud/cf-database-aggregate-operator.md
+22
-13
docs/uniCloud/cf-database-dbcmd.md
docs/uniCloud/cf-database-dbcmd.md
+2
-2
docs/uniCloud/price.md
docs/uniCloud/price.md
+1
-1
docs/uniCloud/redis.md
docs/uniCloud/redis.md
+1
-1
docs/uniCloud/send-sms.md
docs/uniCloud/send-sms.md
+242
-231
docs/uniCloud/univerify.md
docs/uniCloud/univerify.md
+242
-237
未找到文件。
docs/tutorial/build/publish-mp-weixin-cli.md
浏览文件 @
074e264e
...
@@ -2,7 +2,7 @@
...
@@ -2,7 +2,7 @@
> HBuilderX 3.3.7+, uni-app 发行到微信小程序,支持自动上传代码到微信平台,无需再打开微信开发者工具上传发行
> HBuilderX 3.3.7+, uni-app 发行到微信小程序,支持自动上传代码到微信平台,无需再打开微信开发者工具上传发行

<img
src=
"https://f184e7c3-1912-41b2-b81f-435d1b37c7b4.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/f6a5835a-1fcc-4241-a995-11f50240ece8.jpg"
style=
"zoom: 50%;"
/>
通过微信小程序CI,使用上传密钥上传代码,无需打开微信开发者工具,一键完成微信小程序代码的上传、预览等操作。
通过微信小程序CI,使用上传密钥上传代码,无需打开微信开发者工具,一键完成微信小程序代码的上传、预览等操作。
...
@@ -10,4 +10,5 @@
...
@@ -10,4 +10,5 @@
-
自动上传到微信平台,依赖CI插件,如弹窗提示要求安装CI插件,请点击确认安装;
-
自动上传到微信平台,依赖CI插件,如弹窗提示要求安装CI插件,请点击确认安装;
-
自动上传到微信平台,需要配置
`上传密钥`
,并正确填写
`微信小程序appid`
和
`privatekey`
;
-
自动上传到微信平台,需要配置
`上传密钥`
,并正确填写
`微信小程序appid`
和
`privatekey`
;
-
自动上传到微信平台,如果开启了
`IP白名单`
,请确保微信平台已正确配置
`IP白名单`
。
-
自动上传到微信平台,如果开启了
`IP白名单`
,请确保微信平台已正确配置
`IP白名单`
。
\ No newline at end of file
-
关于微信ci机器人编号,仅支持HBuilderX 3.6.16+
\ No newline at end of file
docs/uniCloud/aliyun-migrate-business.md
浏览文件 @
074e264e
...
@@ -156,3 +156,44 @@ url化访问时不管是默认域名还是自定义域名均和上述转发逻
...
@@ -156,3 +156,44 @@ url化访问时不管是默认域名还是自定义域名均和上述转发逻


需要开发者在
[
uniCloud控制台
](
https://unicloud.dcloud.net.cn
)
将自定义域名删除后重新绑定,通过该操作获取到新的CNAME后,将域名解析更换到新的CNAME以完成域名迁移。 这个期间前端网页托管自定义域名访问会中断,建议在访问量较低的时候处理。
需要开发者在
[
uniCloud控制台
](
https://unicloud.dcloud.net.cn
)
将自定义域名删除后重新绑定,通过该操作获取到新的CNAME后,将域名解析更换到新的CNAME以完成域名迁移。 这个期间前端网页托管自定义域名访问会中断,建议在访问量较低的时候处理。
## 迁移后uniCloud相关业务消耗资源费用变更情况
### 短信及一键登录资源消耗评估@sms-unilogin-fee
`短信`
和
`一键登录`
业务涉及费用的部分主要是云函数/云对象的使用量、调用次数、和出网流量(如:使用
`uni-id-co`
或自定义的云函数/云对象来发送短信)。
接下来,我们对不同资源,分别进行费用评估。
我们按照
[
uniCloud官网
](
https://uniapp.dcloud.net.cn/uniCloud/price.html#aliyun-postpay
)
列出的按量计费规则,计算一下云函数的资源消耗。

我们可以简单得出如下公式:
`云函数/云对象费用 = 资源使用量 * 0.000110592 + 调用次数 * 0.0133 / 10000 + 出网流量 * 0.8`
其中:
-
资源使用量 = 云函数内存(单位为G)
* 云函数平均单次执行时长(单位为秒) *
调用次数
-
调用次数 = 发送短信条数(一般情况下发送条数 = 调用次数,特殊情况除外)+ 一键登录调用次数(如果只使用其中某一项业务,则可设另一项业务调用次数为0)
我们假设如下数据模型:
-
云函数内存:512M,即0.5G (云函数内存默认为512M,用户可以自定义设置,最低可设置为128M)
-
云函数平均单次执行时长:200毫秒,即0.2秒
-
短信和一键登录业务平均每日调用次数:10000次
-
出网流量:单次请求 2 KB
按照如上公式,其
`短信`
业务云函数每天的费用为:
```
云函数费用(天) = 资源使用量 * 0.000110592 + 调用次数 * 0.0133 / 10000 + 出网流量 * 0.8
= 云函数内存(单位为G) * 云函数平均单次执行时长(单位为秒) * 调用次数 + 调用次数 * 0.0133 / 10000 + 出网流量 * 0.8
= 0.5G * 0.2S * 10000 * 0.000110592 + 10000 * 0.0133/10000 + 10000 * 2 * 0.8 / 1024 * 1024
= 0.110592 + 0.0133 + 0.0152587890625
= 0.1391507890625(元)
≈ 0.139(元)
```
即:如果你的
`短信`
和
`一键登录`
业务平均每天发送条数为10000条,使用阿里云正式版云服务空间后,对应云函数每天大概消耗0.139元,对比之前的短信和一键登录费用,平均每次调用多花0.0000139元,几乎可忽略不计。
\ No newline at end of file
docs/uniCloud/cf-database-aggregate-operator.md
浏览文件 @
074e264e
...
@@ -315,32 +315,41 @@ let res = await db.collection('sales').aggregate()
...
@@ -315,32 +315,41 @@ let res = await db.collection('sales').aggregate()
#### API 说明
#### API 说明
语法如下:
语法如下:
```
js
```
js
db
.
command
.
aggregate
.
ln
(
<
number
>
)
db
.
command
.
aggregate
.
ln
(
<
number
>
)
```
```
`<number>`
可以是任意解析为非负数字的表达式。
`<number>`
可以是任意解析为非负数字的表达式。
`ln`
等价于
`log([<number>, Math.E])`
,其中
`Math.E`
是
`JavaScript`
获取
`e`
的值的方法。
`ln`
等价于
`log([<number>, Math.E])`
,其中
`Math.E`
是
`JavaScript`
获取
`e`
的值的方法。
#### 示例代码
#### 示例代码
#### db.command.aggregate.ln
计算给定数字在自然对数值。
语法如下:
假设集合 curve 有如下记录:
```
js
```
js
db
.
command
.
aggregate
.
ln
(
<
number
>
)
{
_id
:
1
,
x
:
1
}
{
_id
:
2
,
x
:
2
}
{
_id
:
3
,
x
:
3
}
```
计算 ln(x) 的值:
```
js
const
$
=
db
.
command
.
aggregate
let
res
=
await
db
.
collection
(
'
curve
'
).
aggregate
()
.
project
({
log
:
$
.
ln
(
'
$x
'
)
})
.
end
()
```
返回结果如下:
```
js
{
_id
:
1
,
ln
:
0
}
{
_id
:
2
,
ln
:
0.6931471805599453
}
{
_id
:
3
,
ln
:
1.0986122886681098
}
```
```
`<number>`
可以是任意解析为非负数字的表达式。
`ln`
等价于
`log([<number>, Math.E])`
,其中
`Math.E`
是
`JavaScript`
获取
`e`
的值的方法。
### log
### log
...
...
docs/uniCloud/cf-database-dbcmd.md
浏览文件 @
074e264e
...
@@ -98,8 +98,8 @@ function and(...expressions: Expression[]): Command
...
@@ -98,8 +98,8 @@ function and(...expressions: Expression[]): Command
```
js
```
js
let
res
=
await
const
dbCmd
=
db
.
command
const
dbCmd
=
db
.
command
db
.
collection
(
'
todo
'
).
where
({
let
res
=
await
db
.
collection
(
'
todo
'
).
where
({
progress
:
dbCmd
.
gt
(
80
).
or
(
dbCmd
.
lt
(
20
))
progress
:
dbCmd
.
gt
(
80
).
or
(
dbCmd
.
lt
(
20
))
}).
get
()
}).
get
()
```
```
...
...
docs/uniCloud/price.md
浏览文件 @
074e264e
...
@@ -40,7 +40,7 @@ uniCloud提供包月、按量计费两种计费方式,具体说明如下:
...
@@ -40,7 +40,7 @@ uniCloud提供包月、按量计费两种计费方式,具体说明如下:
**免费额度注意事项:**
**免费额度注意事项:**
-
单个账号只能创建一个阿里云免费服务空间
-
单个账号只能创建一个阿里云免费服务空间
-
阿里云免费服务空间有效期默认一个月,到期时需主动续费(续费时依旧免费),否则将会被停服释放
-
阿里云免费服务空间有效期默认一个月,到期时需主动续费(
到期前15天可续费,
续费时依旧免费),否则将会被停服释放
-
免费版如需升配,只能针对剩余有效期进行操作,无法自定义升配时间
-
免费版如需升配,只能针对剩余有效期进行操作,无法自定义升配时间
-
免费版可以转换为按量计费
-
免费版可以转换为按量计费
-
免费版升配或转为按量计费后,免费额度会释放,此时仍可再创建一个免费版
-
免费版升配或转为按量计费后,免费额度会释放,此时仍可再创建一个免费版
...
...
docs/uniCloud/redis.md
浏览文件 @
074e264e
...
@@ -2166,7 +2166,7 @@ member 移除成功返回 1,member 不是 source 集合成员,并且没有
...
@@ -2166,7 +2166,7 @@ member 移除成功返回 1,member 不是 source 集合成员,并且没有
**示例**
**示例**
```
js
```
js
await
redis
.
sadd
(
'
key
'
,
'
a
'
,
'
b
'
,
'
c
'
)
await
redis
.
sadd
(
'
source
'
,
'
a
'
,
'
b
'
,
'
c
'
)
await
redis
.
smove
(
'
source
'
,
'
destination
'
,
'
a
'
)
// 返回 1
await
redis
.
smove
(
'
source
'
,
'
destination
'
,
'
a
'
)
// 返回 1
```
```
...
...
docs/uniCloud/send-sms.md
浏览文件 @
074e264e
此差异已折叠。
点击以展开。
docs/uniCloud/univerify.md
浏览文件 @
074e264e
## 一键登录@univerify
## 一键登录@univerify
<!--
<!--
/// meta
/// meta
keyword: 手机号
keyword: 手机号
-->
-->
`univerify`
是DCloud 推出的一键登录产品,通过与运营商深度合作,实现APP用户无需输入帐号密码,即可使用本机手机号码自动登录的能力。
`univerify`
是DCloud 推出的一键登录产品,通过与运营商深度合作,实现APP用户无需输入帐号密码,即可使用本机手机号码自动登录的能力。
`univerify`
是替代短信验证登录的下一代登录验证方式,能消除现有短信验证模式等待时间长、操作繁琐和容易泄露的痛点。
`univerify`
是替代短信验证登录的下一代登录验证方式,能消除现有短信验证模式等待时间长、操作繁琐和容易泄露的痛点。
> 注意:一键登录必须是手机使用流量的前提下才能获取到手机号码,用Wi-Fi联网时无法获取到手机号码,同时如果是双卡手机,获取到的手机号码是默认移动数据的那个手机卡的号码。
> 注意:一键登录必须是手机使用流量的前提下才能获取到手机号码,用Wi-Fi联网时无法获取到手机号码,同时如果是双卡手机,获取到的手机号码是默认移动数据的那个手机卡的号码。
## 重要调整
## 重要调整
### 云函数使用一键登录扩展库@extension
### 云函数使用一键登录扩展库@extension
自
`HBuilderX 3.4.0`
起,一键登录相关功能移至扩展库
`uni-cloud-verify`
内。在一段时间内无论开发者是否使用扩展库云函数都可以正常使用
`uniCloud.getPhoneNumber`
。HBuilderX 3.4.0及之后的版本上传云函数时如果没有指定使用
`uni-cloud-verify`
扩展库的云函数将无法调用uniCloud.getPhoneNumber接口。
自
`HBuilderX 3.4.0`
起,一键登录相关功能移至扩展库
`uni-cloud-verify`
内。在一段时间内无论开发者是否使用扩展库云函数都可以正常使用
`uniCloud.getPhoneNumber`
。HBuilderX 3.4.0及之后的版本上传云函数时如果没有指定使用
`uni-cloud-verify`
扩展库的云函数将无法调用uniCloud.getPhoneNumber接口。
关于扩展库的说明见:
[
云函数扩展库
](
uniCloud/cf-functions.md?id=extension
)
关于扩展库的说明见:
[
云函数扩展库
](
uniCloud/cf-functions.md?id=extension
)
在云函数的package.json内添加
`uni-cloud-verify`
的引用即可为云函数启用此扩展,无需做其他调整,完整的package.json示例如下:
在云函数的package.json内添加
`uni-cloud-verify`
的引用即可为云函数启用此扩展,无需做其他调整,完整的package.json示例如下:
```
js
```
js
{
{
"
name
"
:
"
univerify
"
,
"
name
"
:
"
univerify
"
,
"
extensions
"
:
{
"
extensions
"
:
{
"
uni-cloud-verify
"
:
{}
// 启用一键登录扩展,值为空对象即可
"
uni-cloud-verify
"
:
{}
// 启用一键登录扩展,值为空对象即可
}
}
}
}
```
```
## 客户端@client
## 客户端@client
客户端如何使用一键登录请参考此文档:
[
univerify 使用指南
](
/univerify
)
客户端如何使用一键登录请参考此文档:
[
univerify 使用指南
](
/univerify
)
## 云函数@cloud
## 云函数@cloud
> 自`HBuilderX 3.4.0`起云函数需启用uni-cloud-verify之后才可以调用getPhoneNumber接口,详细说明见:[云函数使用一键登录扩展库](#extension)
> 自`HBuilderX 3.4.0`起云函数需启用uni-cloud-verify之后才可以调用getPhoneNumber接口,详细说明见:[云函数使用一键登录扩展库](#extension)
客户端调用一键登录接口会获取如下结果
客户端调用一键登录接口会获取如下结果
```
js
```
js
{
{
"
target
"
:
{
"
target
"
:
{
"
id
"
:
"
univerify
"
,
"
id
"
:
"
univerify
"
,
"
description
"
:
"
一键登录
"
,
"
description
"
:
"
一键登录
"
,
"
authResult
"
:
{
"
authResult
"
:
{
"
openid
"
:
"
xxx
"
,
"
openid
"
:
"
xxx
"
,
"
access_token
"
:
"
xxx
"
"
access_token
"
:
"
xxx
"
}
}
}
}
}
}
```
```
使用上面结果中的
`openid`
和
`access_token`
即可在
`云函数`
内调用接口获取手机号
使用上面结果中的
`openid`
和
`access_token`
即可在
`云函数`
内调用接口获取手机号
云函数内接口调用形式如下
云函数内接口调用形式如下
```
js
```
js
exports
.
main
=
async
function
(
event
,
context
){
exports
.
main
=
async
function
(
event
,
context
){
const
res
=
await
uniCloud
.
getPhoneNumber
({
const
res
=
await
uniCloud
.
getPhoneNumber
({
provider
:
'
univerify
'
,
provider
:
'
univerify
'
,
appid
:
context
.
APPID
,
// 客户端callFunction时携带的AppId信息
appid
:
context
.
APPID
,
// 客户端callFunction时携带的AppId信息
apiKey
:
'
xxx
'
,
// 在开发者中心开通服务并获取apiKey
apiKey
:
'
xxx
'
,
// 在开发者中心开通服务并获取apiKey
apiSecret
:
'
xxx
'
,
// 在开发者中心开通服务并获取apiSecret
apiSecret
:
'
xxx
'
,
// 在开发者中心开通服务并获取apiSecret
access_token
:
event
.
access_token
,
access_token
:
event
.
access_token
,
openid
:
event
.
openid
openid
:
event
.
openid
})
})
// res形式如下
// res形式如下
// {
// {
// code: 0,
// code: 0,
// message: '',
// message: '',
// phoneNumber: '138xxxxxxxx'
// phoneNumber: '138xxxxxxxx'
// }
// }
}
}
```
```
**相关文档**
**相关文档**
-
[
uniCloud快速上手
](
https://uniapp.dcloud.net.cn/uniCloud/quickstart
)
-
[
uniCloud快速上手
](
https://uniapp.dcloud.net.cn/uniCloud/quickstart
)
-
[
云函数URL化
](
https://uniapp.dcloud.net.cn/uniCloud/http
)
-
[
云函数URL化
](
https://uniapp.dcloud.net.cn/uniCloud/http
)
### uni-app项目
### uni-app项目
如果开发uni-app项目可以使用callFunction的方式调用云函数
如果开发uni-app项目可以使用callFunction的方式调用云函数
```
js
```
js
// 客户端
// 客户端
uniCloud
.
callFunction
({
uniCloud
.
callFunction
({
name
:
'
xxx
'
,
// 你的云函数名称
name
:
'
xxx
'
,
// 你的云函数名称
data
:
{
data
:
{
access_token
:
'
xxx
'
,
// 客户端一键登录接口返回的access_token
access_token
:
'
xxx
'
,
// 客户端一键登录接口返回的access_token
openid
:
'
xxx
'
// 客户端一键登录接口返回的openid
openid
:
'
xxx
'
// 客户端一键登录接口返回的openid
}
}
}).
then
(
res
=>
{
}).
then
(
res
=>
{
// res.result = {
// res.result = {
// code: '',
// code: '',
// message: ''
// message: ''
// }
// }
}).
catch
(
err
=>
{
}).
catch
(
err
=>
{
// 处理错误
// 处理错误
})
})
// 云函数
// 云函数
exports
.
main
=
async
function
(
event
,
context
){
exports
.
main
=
async
function
(
event
,
context
){
const
res
=
await
uniCloud
.
getPhoneNumber
({
const
res
=
await
uniCloud
.
getPhoneNumber
({
appid
:
context
.
APPID
,
// 客户端callFunction时携带的AppId信息
appid
:
context
.
APPID
,
// 客户端callFunction时携带的AppId信息
provider
:
'
univerify
'
,
provider
:
'
univerify
'
,
apiKey
:
'
xxx
'
,
// 在开发者中心开通服务并获取apiKey
apiKey
:
'
xxx
'
,
// 在开发者中心开通服务并获取apiKey
apiSecret
:
'
xxx
'
,
// 在开发者中心开通服务并获取apiSecret
apiSecret
:
'
xxx
'
,
// 在开发者中心开通服务并获取apiSecret
access_token
:
event
.
access_token
,
access_token
:
event
.
access_token
,
openid
:
event
.
openid
openid
:
event
.
openid
})
})
// 执行入库等操作,正常情况下不要把完整手机号返回给前端
// 执行入库等操作,正常情况下不要把完整手机号返回给前端
return
{
return
{
code
:
0
,
code
:
0
,
message
:
'
获取手机号成功
'
message
:
'
获取手机号成功
'
}
}
}
}
```
```
**注意**
**注意**
-
开发期间如果重新获取过appid需要重新编译uni-app项目
-
开发期间如果重新获取过appid需要重新编译uni-app项目
### 5+项目
### 5+项目
5+项目不可使用callFunction请求云函数,这时候可以使用云函数URL化让5+项目通过http请求的方式访问云函数
5+项目不可使用callFunction请求云函数,这时候可以使用云函数URL化让5+项目通过http请求的方式访问云函数
```
js
```
js
// 客户端
// 客户端
const
xhr
=
new
plus
.
net
.
XMLHttpRequest
();
const
xhr
=
new
plus
.
net
.
XMLHttpRequest
();
xhr
.
onload
=
function
(
e
)
{
xhr
.
onload
=
function
(
e
)
{
const
{
const
{
code
,
code
,
message
message
}
=
JSON
.
parse
(
xhr
.
responseText
)
}
=
JSON
.
parse
(
xhr
.
responseText
)
}
}
xhr
.
open
(
"
POST
"
,
"
https://xxx
"
);
// url应为云函数Url化之后的地址,可以在uniCloud web控制台云函数详情页面看到
xhr
.
open
(
"
POST
"
,
"
https://xxx
"
);
// url应为云函数Url化之后的地址,可以在uniCloud web控制台云函数详情页面看到
xhr
.
setRequestHeader
(
'
Content-Type
'
,
'
application/json
'
);
xhr
.
setRequestHeader
(
'
Content-Type
'
,
'
application/json
'
);
xhr
.
send
(
JSON
.
stringify
({
xhr
.
send
(
JSON
.
stringify
({
access_token
:
'
xxx
'
,
// 客户端一键登录接口返回的access_token
access_token
:
'
xxx
'
,
// 客户端一键登录接口返回的access_token
openid
:
'
xxx
'
// 客户端一键登录接口返回的openid
openid
:
'
xxx
'
// 客户端一键登录接口返回的openid
}));
}));
// 云函数,下面仅展示客户端使用post方式发送content-type为application/json请求的场景
// 云函数,下面仅展示客户端使用post方式发送content-type为application/json请求的场景
exports
.
main
=
async
function
(
event
){
exports
.
main
=
async
function
(
event
){
let
body
=
event
.
body
let
body
=
event
.
body
if
(
event
.
isBase64Encoded
)
{
if
(
event
.
isBase64Encoded
)
{
body
=
Buffer
.
from
(
body
,
'
base64
'
)
body
=
Buffer
.
from
(
body
,
'
base64
'
)
}
}
const
{
const
{
access_token
,
access_token
,
openid
openid
}
=
JSON
.
parse
(
body
)
}
=
JSON
.
parse
(
body
)
const
res
=
await
uniCloud
.
getPhoneNumber
({
const
res
=
await
uniCloud
.
getPhoneNumber
({
provider
:
'
univerify
'
,
provider
:
'
univerify
'
,
appid
:
'
xxx
'
,
// DCloud appid
appid
:
'
xxx
'
,
// DCloud appid
apiKey
:
'
xxx
'
,
// 在开发者中心开通服务并获取apiKey
apiKey
:
'
xxx
'
,
// 在开发者中心开通服务并获取apiKey
apiSecret
:
'
xxx
'
,
// 在开发者中心开通服务并获取apiSecret
apiSecret
:
'
xxx
'
,
// 在开发者中心开通服务并获取apiSecret
access_token
:
access_token
,
access_token
:
access_token
,
openid
:
openid
openid
:
openid
})
})
// 执行入库等操作,正常情况下不要把完整手机号返回给前端
// 执行入库等操作,正常情况下不要把完整手机号返回给前端
return
{
return
{
code
:
0
,
code
:
0
,
message
:
'
获取手机号成功
'
message
:
'
获取手机号成功
'
}
}
}
}
```
```
### 自有服务器调用
### 自有服务器调用
写法类似上面5+项目的云函数url化的方式,但是不同的是需要云函数返回手机号给自己服务器,这样就需要确保数据安全。
写法类似上面5+项目的云函数url化的方式,但是不同的是需要云函数返回手机号给自己服务器,这样就需要确保数据安全。
下面以一个简单的例子演示如何使用签名验证请求是否合法
下面以一个简单的例子演示如何使用签名验证请求是否合法
```
js
```
js
// 以nodejs为例
// 以nodejs为例
const
crypto
=
require
(
'
crypto
'
)
const
crypto
=
require
(
'
crypto
'
)
const
secret
=
'
your-secret-string
'
// 自己的密钥不要直接使用示例值,且注意不要泄露
const
secret
=
'
your-secret-string
'
// 自己的密钥不要直接使用示例值,且注意不要泄露
const
hmac
=
crypto
.
createHmac
(
'
sha256
'
,
secret
);
const
hmac
=
crypto
.
createHmac
(
'
sha256
'
,
secret
);
// 自有服务器生成签名,并以GET方式发送请求
// 自有服务器生成签名,并以GET方式发送请求
const
params
=
{
const
params
=
{
access_token
:
'
xxx
'
,
// 客户端传到自己服务器的参数
access_token
:
'
xxx
'
,
// 客户端传到自己服务器的参数
openid
:
'
xxx
'
openid
:
'
xxx
'
}
}
// 字母顺序排序后拼接签名串
// 字母顺序排序后拼接签名串
const
signStr
=
Object
.
keys
(
params
).
sort
().
map
(
key
=>
{
const
signStr
=
Object
.
keys
(
params
).
sort
().
map
(
key
=>
{
return
`
${
key
}
=
${
params
[
key
]}
`
return
`
${
key
}
=
${
params
[
key
]}
`
}).
join
(
'
&
'
)
}).
join
(
'
&
'
)
hmac
.
update
(
signStr
);
hmac
.
update
(
signStr
);
const
sign
=
hmac
.
digest
(
'
hex
'
)
const
sign
=
hmac
.
digest
(
'
hex
'
)
// 最终请求如下链接,其中https://xxxx/xxx为云函数Url化地址
// 最终请求如下链接,其中https://xxxx/xxx为云函数Url化地址
// https://xxxx/xxx?access_token=xxx&openid=xxx&sign=${sign} 其中${sign}为上一步得到的sign值
// https://xxxx/xxx?access_token=xxx&openid=xxx&sign=${sign} 其中${sign}为上一步得到的sign值
```
```
```
js
```
js
// 云函数验证签名,此示例中以接受GET请求为例作演示
// 云函数验证签名,此示例中以接受GET请求为例作演示
const
crypto
=
require
(
'
crypto
'
)
const
crypto
=
require
(
'
crypto
'
)
exports
.
main
=
async
function
(
event
){
exports
.
main
=
async
function
(
event
){
const
secret
=
'
your-secret-string
'
// 自己的密钥不要直接使用示例值,且注意不要泄露
const
secret
=
'
your-secret-string
'
// 自己的密钥不要直接使用示例值,且注意不要泄露
const
hmac
=
crypto
.
createHmac
(
'
sha256
'
,
secret
);
const
hmac
=
crypto
.
createHmac
(
'
sha256
'
,
secret
);
let
params
=
event
.
queryStringParameters
let
params
=
event
.
queryStringParameters
const
sign
=
params
.
sign
const
sign
=
params
.
sign
delete
params
.
sign
delete
params
.
sign
const
signStr
=
Object
.
keys
(
params
).
sort
().
map
(
key
=>
{
const
signStr
=
Object
.
keys
(
params
).
sort
().
map
(
key
=>
{
return
`
${
key
}
=
${
params
[
key
]}
`
return
`
${
key
}
=
${
params
[
key
]}
`
}).
join
(
'
&
'
)
}).
join
(
'
&
'
)
hmac
.
update
(
signStr
);
hmac
.
update
(
signStr
);
if
(
sign
!==
hmac
.
digest
(
'
hex
'
)){
if
(
sign
!==
hmac
.
digest
(
'
hex
'
)){
throw
new
Error
(
'
非法访问
'
)
throw
new
Error
(
'
非法访问
'
)
}
}
const
{
const
{
access_token
,
access_token
,
openid
openid
}
=
params
}
=
params
const
res
=
await
uniCloud
.
getPhoneNumber
({
const
res
=
await
uniCloud
.
getPhoneNumber
({
provider
:
'
univerify
'
,
provider
:
'
univerify
'
,
appid
:
'
xxx
'
,
// DCloud appid
appid
:
'
xxx
'
,
// DCloud appid
apiKey
:
'
xxx
'
,
// 在开发者中心开通服务并获取apiKey
apiKey
:
'
xxx
'
,
// 在开发者中心开通服务并获取apiKey
apiSecret
:
'
xxx
'
,
// 在开发者中心开通服务并获取apiSecret
apiSecret
:
'
xxx
'
,
// 在开发者中心开通服务并获取apiSecret
access_token
:
access_token
,
access_token
:
access_token
,
openid
:
openid
openid
:
openid
})
})
// 返回手机号给自己服务器
// 返回手机号给自己服务器
return
res
return
res
}
}
```
```
### 一键登录费用说明@unilogin-fee
-
0.02元/次,失败不计费,但在实际使用中需要依赖
`uniCloud`
云服务,在使用阿里云正式版后,每条大约需要多花0.0000139元,几乎可以忽略不计,费用计算详见
[
短信及一键登录资源消耗评估
](
uniCloud/aliyun-migrate-business.md#sms-unilogin-fee
)
。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录