提交 b8e0a3c5 编写于 作者: D DCloud_LXH

feat: 修改根目录链接

上级 8451d29c
......@@ -204,7 +204,7 @@ uni云端一体生态的内容太多,让我们抽丝剥茧、归纳分类,
- uni-captcha:云端一体图形验证码组件。[详见](https://ext.dcloud.net.cn/plugin?id=4048)
- uni-sec-check:免费的内容安全审查,防止用户提交违法的文字或图片。[详见](uni-sec-check.md)
- uni-upgrade-center:App升级中心。支持整包升级、wgt热更新;支持直接下载安装包或跳转应用商店。[详见](upgrade-center.md)
- uni-push2:云端一体的推送,大幅简化推送开发。[详见](/unipush-v2.md)
- uni-push2:云端一体的推送,大幅简化推送开发。[详见](https://uniapp.dcloud.net.cn/unipush-v2.html)
- uni-im:开源、多端IM。[详见](uni-im.md)
- uni-cms:开源、多端内容管理。[详见](uni-cms.md)
- uni-ai:聚合ai能力。[详见](uni-ai.md)
......@@ -276,14 +276,14 @@ uni-app提供了`<unicloud-db>`组件(代码块触发键是udb),在前端
比如uniCloud的云数据库有个user表,里面有字段id、name,查询id=1的用户数据,把名字显示在界面上,写法如下:
```html
<template>
<view>
<unicloud-db v-slot:default="{data, loading, error, options}" collection="user" field="name" :getone="true" where="id=='1'">
<view>
{{ data.name}}
</view>
</unicloud-db>
</view>
<template>
<view>
<unicloud-db v-slot:default="{data, loading, error, options}" collection="user" field="name" :getone="true" where="id=='1'">
<view>
{{ data.name}}
</view>
</unicloud-db>
</view>
</template>
```
......@@ -335,7 +335,7 @@ async function addTodo () {
const res = await todo.add('title demo', 'content demo') //导入云对象后就可以直接调用该对象的方法了,注意使用异步await
console.log("add成功")
} catch (e) {
// 符合uniCloud响应体规范 https://uniapp.dcloud.net.cn/uniCloud/cf-functions?id=resformat,自动抛出此错误
// 符合uniCloud响应体规范 https://uniapp.dcloud.net.cn/uniCloud/cf-functions?id=resformat,自动抛出此错误
console.log(e.errMsg)
}
}
......
......@@ -78,7 +78,7 @@
* [业务文档](https://uniapp.dcloud.net.cn/unipush-v2.html)
* 开发文档
* [服务端api](uni-cloud-push/api.md)
* [uni-app客户端api](https://uniapp.dcloud.net.cn/api/plugins/push.md)
* [uni-app客户端api](https://uniapp.dcloud.net.cn/api/plugins/push.html)
* [uni-app x客户端api](https://uniapp.dcloud.net.cn/uni-app-x/api/push.html)
* [uni-push、uni-id、uni统计的协作](uni-cloud-push/mate.md)
* [扩展参数](uni-cloud-push/options.md)
......
......@@ -61,7 +61,7 @@ DCloud始终是为开发者提供更高性价比方案的产品服务公司,DC
- 正式版固定IP代理出口IP和公测版不同,如有在三方平台配置域名白名单请自行修改,参考:[阿里云固定IP](cf-functions.md#aliyun-eip)
- 迁移到正式版后公测版服务空间的数据库备份不会被迁移过来
- 迁移到正式版后开发者下次在HBuilderX打包发行时会使用正式版服务空间ID。请注意这时候需要修改小程序request域名白名单,将`api.next.bspapp.com`添加到request域名白名单内
- 迁移到正式版后公测版服务空间前端网页托管默认域名将在公测结束后自动回收
- 迁移到正式版后公测版服务空间前端网页托管默认域名将在公测结束后自动回收
- 迁移到正式版后不可删除公测版服务空间,需等待公测结束后自动回收
## 迁移开始
......@@ -110,7 +110,7 @@ url化访问时不管是默认域名还是自定义域名均和上述转发逻
- 云存储在迁移开始后,上传文件的功能不可用,访问不受影响
- 原云存储链接仍可正常访问,流量费用会计到正式版空间,正式版空间如果是包年包月则从资源用量中扣除,如果是按量计费则会出账并从余额中扣除,出账时间为T+2
- 使用HBuilderX 3.6.10-Alpha或3.6.5-正式版之前的版本发布的应用,迁移后上传文件会报错(错误信息为:`文件上传失败`,web端上传请求会返回403错误码),需要使用更新的HBuilderX版本重新发布应用(不管是app、小程序、web均需要重新发布,app端可使用wgt更新)。cli创建的项目需要更新项目依赖,参考:[修改依赖为指定版本](../quickstart-cli.md#cliversion)
- 使用HBuilderX 3.6.10-Alpha或3.6.5-正式版之前的版本发布的应用,迁移后上传文件会报错(错误信息为:`文件上传失败`,web端上传请求会返回403错误码),需要使用更新的HBuilderX版本重新发布应用(不管是app、小程序、web均需要重新发布,app端可使用wgt更新)。cli创建的项目需要更新项目依赖,参考:[修改依赖为指定版本https://uniapp.dcloud.net.cn/quickstart-cli.md#cliversion)
- 正式版新上传的视频文件,视频截帧只支持H.264编码格式,不支持H.265编码格式,原公测版上传的视频不受影响
迁移期间是否可正常服务:<font color=#f3a73f>可正常访问,不可上传</font>
......
......@@ -61,11 +61,11 @@ Referer防盗链,是基于HTTP请求头中Referer字段来设置访问控制
|平台 |Referer |
|:-: |:-: |
|微信 | https://servicewechat.com |
|支付宝 | https://你的支付宝小程序appid.hybrid.alipay-eco.com |
|百度 | https://smartapps.cn |
|头条抖音 | https://tmaservice.developer.toutiao.com |
|QQ | https://appservice.qq.com |
|微信 | https://servicewechat.com |
|支付宝 | https://你的支付宝小程序appid.hybrid.alipay-eco.com |
|百度 | https://smartapps.cn |
|头条抖音 | https://tmaservice.developer.toutiao.com |
|QQ | https://appservice.qq.com |
注意:如果您启用了白名单,又没有填写上述网址,那么这些小程序将无法访问您的cdn。
......@@ -102,7 +102,7 @@ User-Agent是HTTP请求头的一部分,包含用户访问时所使用的操作
uni-app的app端,有默认UA,也可以自定义UA。
如需指定某个特殊UA才能访问cdn,需在manifest.json中配置。详见[App的默认UA和自定义UA教程](/tutorial/app-useragent.md)
如需指定某个特殊UA才能访问cdn,需在manifest.json中配置。详见[App的默认UA和自定义UA教程](https://uniapp.dcloud.net.cn/tutorial/app-useragent.html)
**补充**
......
......@@ -137,11 +137,11 @@ context对象的属性清单如下:
除了上述属性,如果是uni-app客户端通过callfunction访问云函数,那么context还会追加一批客户端信息。
- HBuilderX 3.4.9前,context 添加了一批大写属性,如APPID、OS。
- HBuilderX 3.4.9起,context 的属性包括前端API `uni.getSystemInfo` 的所有属性。比如appId、osName,均以驼峰方式命名。这些属性较多,且可能跟随前端API更新而变化,具体详见 [uni.getSystemInfo](/api/system/info.html#getsysteminfo)
- HBuilderX 3.4.9起,context 的属性包括前端API `uni.getSystemInfo` 的所有属性。比如appId、osName,均以驼峰方式命名。这些属性较多,且可能跟随前端API更新而变化,具体详见 [uni.getSystemInfo](https://uniapp.dcloud.net.cn/api/system/info.html#getsysteminfo)
为了保持向下兼容,新版并没有去掉老版那些大写属性的客户端信息,但文档标注为以废弃。对于新版HBuilderX用户而言,请使用 `uni.getSystemInfo` 返回的驼峰属性。
HBuilderX 3.4.9起,context 的属性还可以打印出`channel``scene`,即App的渠道包标记和小程序场景值。但这个功能属于未完成功能,开发者暂不使用这2个属性,后续会升级完善。目前如开发者需要这2个属性,请自行在客户端使用[uni.getLaunchOptionsSync](/api/getLaunchOptionsSync.html#getlaunchoptionssync)上传。
HBuilderX 3.4.9起,context 的属性还可以打印出`channel``scene`,即App的渠道包标记和小程序场景值。但这个功能属于未完成功能,开发者暂不使用这2个属性,后续会升级完善。目前如开发者需要这2个属性,请自行在客户端使用[uni.getLaunchOptionsSync](https://uniapp.dcloud.net.cn/api/getLaunchOptionsSync.html#getlaunchoptionssync)上传。
示例:
......
......@@ -83,7 +83,7 @@ db.collection('list').get()
.then((res)=>{
// res 为数据库查询结果
}).catch((err)=>{
console.log(err);
console.log(err);
})
```
......@@ -214,7 +214,7 @@ uniCloud服务器给客户端返回的数据格式一般是json,但json的格
#### HBuilderX 3.6.10及之后版本的错误规范
错误规范继承自[uni错误规范](/tutorial/err-spec.md)
错误规范继承自[uni错误规范](https://uniapp.dcloud.net.cn/tutorial/err-spec.html)
#### HBuilderX 3.6.10之前版本的错误规范
......@@ -259,7 +259,7 @@ errMsg用于存放具体错误信息,包括展示给开发者、终端用户
}
```
HBuilderX内使用代码块`returnu`可以快速输入以下代码(`HBuilderX 3.4.0`及以上版本):
HBuilderX内使用代码块`returnu`可以快速输入以下代码(`HBuilderX 3.4.0`及以上版本):
```js
return {
......@@ -279,7 +279,7 @@ return {
|-- |-- |
|uniCloud.database() |云数据库对象 [详情](uniCloud/cf-database.md) |
|uniCloud.databaseJQL() |云函数中使用JQL语法操作数据库 [详见](uniCloud/jql-cloud.md),需添加扩展库 |
|uniCloud.redis() |使用redis [详见](uniCloud/redis.md),需添加扩展库
|uniCloud.redis() |使用redis [详见](uniCloud/redis.md),需添加扩展库
|uniCloud.uploadFile() |云函数上传文件到云存储 [详情](uniCloud/storage?id=clouduploadfile) |
|uniCloud.downloadFile() |云函数下载云存储的文件到云函数运行环境 [详情](uniCloud/storage?id=clouddownloadfile) |
|uniCloud.deleteFile() |云函数删除云存储的文件 [详情](uniCloud/storage?id=clouddeletefile) |
......@@ -657,7 +657,7 @@ uniCloud.getRequestList()
同理,考虑到单实例多并发,`uniCloud.getClientInfos()`获取客户端信息也是一个数组。
```js
const clientInfos = uniCloud.getClientInfos()
const clientInfos = uniCloud.getClientInfos()
```
返回值
......@@ -673,7 +673,7 @@ clientInfos = [{
**返回值**
getClientInfos返回的信息,是在客户端的[uni.getSystemInfo](/api/system/info.md#getsysteminfo)的基础之上,增加了一些额外的信息。
getClientInfos返回的信息,是在客户端的[uni.getSystemInfo](https://uniapp.dcloud.net.cn/api/system/info.md#getsysteminfo)的基础之上,增加了一些额外的信息。
除了`getSystemInfo`返回字段外,还包含以下信息
......@@ -683,7 +683,7 @@ getClientInfos返回的信息,是在客户端的[uni.getSystemInfo](/api/syste
|clientIP |string |客户端ip |
|userAgent|string |客户端ua,注意非本地运行环境下客户端getSystemInfoSync也会获取ua参数并上传给云对象,但是云对象会从http请求头里面获取ua而不是clientInfo里面的ua|
|source |string |调用来源,返回值见下。 |
|scene |string |场景值。客户端[uni.getLaunchOptionsSync](/api/getLaunchOptionsSync.md#getlaunchoptionssync)返回的scene参数, |
|scene |string |场景值。客户端[uni.getLaunchOptionsSync](https://uniapp.dcloud.net.cn/api/getLaunchOptionsSync.md#getlaunchoptionssync)返回的scene参数, |
云函数调用来源source,它的值域为:
......@@ -712,7 +712,7 @@ getClientInfos返回的信息,是在客户端的[uni.getSystemInfo](/api/syste
**示例**
```js
const cloudInfos = uniCloud.getCloudInfos()
const cloudInfos = uniCloud.getCloudInfos()
cloudInfos = [{
provider: 'aliyun',
spaceId: 'xxxxx',
......@@ -866,7 +866,7 @@ exports.main = async (event, context) => {
}).then(e=>{
console.log(e.result);
})
// 等待500毫秒,给一个请求发出去的时间
return await new Promise((resolve, reject) => {
setTimeout(() => {
......@@ -885,7 +885,7 @@ exports.main = async (event, context) => {
//高性能分页查询,以上一次查询的最后一条数据的id被起始id
where._id = dbCmd.gt(before_id)
}
let res = await userTable.where(where)
.limit(50)
.orderBy("_id", "asc")
......@@ -959,7 +959,7 @@ serverless是动态分配计算资源的,由此会引发的出一批特有概
3. 启动 node
4. 执行云函数代码
函数被调用时,执行这些完整步骤的过程称作`冷启动`, 冷启动的耗时一般在一秒左右。
函数被调用时,执行这些完整步骤的过程称作`冷启动`, 冷启动的耗时一般在一秒左右。
一个云函数实例冷启动后,serverless调度中心会保留这个实例一定时间。在实例保留期间,客户端再次请求云函数,不会触发冷启动,速度会更快。实例的详细定义[见下](#instance)
......@@ -1064,7 +1064,7 @@ exports.main = async (event, context) => {
uniCloud.getRequestList()
// 返回值:['3228166e-3c17-4d58-9707-xxxxxxxx']
```
- 如果未配置阿里云的单实例多并发,getRequestList()返回的数组里面只有一项,即只能拿到当前的请求id。
- 如果配置了阿里云的单实例多并发,当并发发生时,这个列表就会返回多项,当前并发的每个requestId都在里面。
......@@ -1083,7 +1083,7 @@ uniCloud.getRequestList()
- 如果未配置阿里云的单实例多并发,getRequestList()返回的数组里面只有一项,即只能拿到当前的请求id。
- 如果配置了阿里云的单实例多并发,当并发发生时,这个列表就会返回多项,当前并发的每个requestId都在里面。
3.
3.
如果是uniCloud私有云,
如果想获取与请求相关的信息,比如这次请求的客户端UA,或云函数环境信息,无法直接在uniCloud全局对象中获取。
......@@ -1114,7 +1114,7 @@ uniCloud.getRequestList()
**效果**
- 有效减少并发请求时云函数冷启动次数
**使用注意**
- 虽然支付宝小程序云与阿里云云函数支持配置多并发,但在高并发下异步请求排队效果未必好于新开一个实例。尤其是并发操作数据库性能不佳。**一般情况下不要设置过大的并发度,可以自己针对业务代码测试比较下是否启用并发或并发数配成多少**
......@@ -1340,7 +1340,7 @@ uniCloud.httpProxyForEip.get(url: String, params?: Object)
await uniCloud.httpProxyForEip.get(
'https://api.weixin.qq.com/cgi-bin/token',
{
grant_type: 'client_credential',
grant_type: 'client_credential',
appid: 'xxxx',
secret: 'xxxx'
}
......@@ -1360,7 +1360,7 @@ uniCloud.httpProxyForEip.postForm(url: String, data?: Object, headers?: Object)
**示例**
```js
uniCloud.httpProxyForEip.postForm(
uniCloud.httpProxyForEip.postForm(
'https://www.example.com/search',
{
q: 'nodejs',
......@@ -1382,7 +1382,7 @@ uniCloud.httpProxyForEip.postJson(url: String, json?: Object, headers?: Object)
**示例**
```js
uniCloud.httpProxyForEip.postJson(
uniCloud.httpProxyForEip.postJson(
'https://www.example.com/search',
{
q: 'nodejs',
......@@ -1402,7 +1402,7 @@ uniCloud.httpProxyForEip.post(url: String, text?: String, headers?: Object)
**示例**
```js
uniCloud.httpProxyForEip.post(
uniCloud.httpProxyForEip.post(
'https://www.example.com/search',
'abcdefg',
{
......@@ -1451,7 +1451,7 @@ package.json是一个标准json文件,不可带注释。下面是一个package
"config": "0 0 2 1 * * *"
}],
"path": "",
"runtime": "Nodejs8"
"runtime": "Nodejs8"
}
}
```
......@@ -1528,7 +1528,7 @@ exports.main = async function(event, context) {
```js
exports.main = async function(event, context) {
uniCloud.callFunction({
uniCloud.callFunction({
name: 'test',
data: {}
})
......@@ -1592,7 +1592,7 @@ package.json是一个标准json文件,不可带注释。下面是一个package
"description": "新增文章",
"main": "index.js",
"dependencies": {
},
"cloudfunction-config": {
"memorySize": 256,
......
......@@ -48,7 +48,7 @@ async function addTodo () {
title: '创建成功'
})
} catch (e) {
// 符合uniCloud响应体规范 https://uniapp.dcloud.net.cn/uniCloud/cf-functions?id=resformat,自动抛出此错误
// 符合uniCloud响应体规范 https://uniapp.dcloud.net.cn/uniCloud/cf-functions?id=resformat,自动抛出此错误
uni.showModal({
title: '创建失败',
content: e.errMsg,
......@@ -103,7 +103,7 @@ exports.main = async (event, context) => {
async function addToDo () {
try {
const res = await uniCloud.callFunction({
name: 'todo',
name: 'todo',
data: {
method: 'add',
params: {
......@@ -162,7 +162,7 @@ _注:以上例子仅用于方便初学者理解。实际开发中对于简单
```js
// cloudfunctions/todo/index.obj.js
module.exports = {
}
```
......@@ -306,7 +306,7 @@ getClientInfo返回的信息,是在客户端的[uni.getSystemInfo](https://uni
|userAgent|string|客户端ua,注意非本地运行环境下客户端getSystemInfoSync也会获取ua参数并上传给云对象,但是云对象会从http请求头里面获取ua而不是clientInfo里面的ua |
|source |string |调用来源,返回值见下。`HBuilderX 3.5.1+` |
|requestId|string |请求id。`HBuilderX 3.5.1+` |
|scene |string |场景值。客户端[uni.getLaunchOptionsSync](/api/getLaunchOptionsSync.html#getlaunchoptionssync)返回的scene参数,新增于`HBuilderX 3.5.1` |
|scene |string |场景值。客户端[uni.getLaunchOptionsSync](https://uniapp.dcloud.net.cn/api/getLaunchOptionsSync.html#getlaunchoptionssync)返回的scene参数,新增于`HBuilderX 3.5.1` |
getClientInfo().source,返回云函数调用来源,它的值域为:
......@@ -623,7 +623,7 @@ uni-app框架在拿到云对象的响应结果后,会识别其中是否包含`
```js
// 云对象代码 todo/index.obj.js
module.exports = {
add: async function(title = '', content = '') {
add: async function(title = '', content = '') {
title = title.trim()
content = content.trim()
if(!title || !content) {
......
......@@ -53,7 +53,7 @@ sequenceDiagram
uni-app x的客户端API文档[另见](https://uniapp.dcloud.net.cn/uni-app-x/api/facial-recognition-verify.html)
#### 获取实人认证设备信息@get-meta-info
调用刷脸前通过客户端先获取设备信息,调用[uni.getFacialRecognitionMetaInfo](https://uniapp.dcloud.net.cn/api/plugins/facialRecognitionVerify.html)
调用刷脸前通过客户端先获取设备信息,调用[uni.getFacialRecognitionMetaInfo](https://uniapp.dcloud.net.cn/api/plugins/facialRecognitionVerify.html)
`const metaInfo = uni.getFacialRecognitionMetaInfo();`
......@@ -70,7 +70,7 @@ uni-app x的客户端API文档[另见](https://uniapp.dcloud.net.cn/uni-app-x/ap
`uni.startFacialRecognitionVerify(OBJECT)`
**参数说明**
**参数说明**
| 参数 | 类型 | 是否必传 | 支持平台 | 描述 |
| --- | --- | --- | --- | --- |
......@@ -81,7 +81,7 @@ uni-app x的客户端API文档[另见](https://uniapp.dcloud.net.cn/uni-app-x/ap
| fail | Function | 否 | App | 失败回调 |
| complete | Function | 否 | App | 完成回调 |
注: 颜色字符串格式为“#RRGGBB”,RRGGBB为十六进制字符串,如红色("#FF0000")
注: 颜色字符串格式为“#RRGGBB”,RRGGBB为十六进制字符串,如红色("#FF0000")
**返回值**
......@@ -92,7 +92,7 @@ uni-app x的客户端API文档[另见](https://uniapp.dcloud.net.cn/uni-app-x/ap
| errMsg | String | 错误信息,详情见:[错误码](#err-code)|
| cause | Object| SDK返回的原始数据 (certifyId不为空时返回)|
**cause**
**cause**
| 字段名 | 类型 | 描述 |
| --- | --- | --- |
......@@ -118,7 +118,7 @@ uni.startFacialRecognitionVerify({
})
```
#### iOS平台自定义UI
#### iOS平台自定义UI
iOS平台不支持通过参数的方式修改刷脸页的提示文案,但可以通过自定义bundle文件的方式修改提示内容以及国际化信息
[APBToygerFacade.bundle文件下载](https://native-res.dcloud.net.cn/uni-app/file/APBToygerFacade.zip)
......@@ -133,9 +133,9 @@ iOS平台不支持通过参数的方式修改刷脸页的提示文案,但可
"APBToygerFacade:网络不给力"="网络异常";
```
此处文案修改后需要完整测试回归 UI 以及文案变化影响,以免影响用户体验。修改后的bundle文件配到项目根目录的 nativeResources -> ios -> Resources 路径下后打包即可,详情参照[iOS原生应用配置文件和资源](https://uniapp.dcloud.net.cn/tutorial/app-nativeresource-ios.html)
此处文案修改后需要完整测试回归 UI 以及文案变化影响,以免影响用户体验。修改后的bundle文件配到项目根目录的 nativeResources -> ios -> Resources 路径下后打包即可,详情参照[iOS原生应用配置文件和资源](https://uniapp.dcloud.net.cn/tutorial/app-nativeresource-ios.html)
**Android平台暂不支持自定义UI**
**Android平台暂不支持自定义UI**
### 云函数接口
......@@ -321,7 +321,7 @@ module.exports = {
#### 错误处理
可以通过try catch捕获接口抛出的错误,接口抛出的错误为标准的[uni错误对象](../../tutorial/err-spec.md)
可以通过try catch捕获接口抛出的错误,接口抛出的错误为标准的[uni错误对象](https://uniapp.dcloud.net.cn/tutorial/err-spec.md)
具体错误码规范见:[错误码](#err-code)
......@@ -387,9 +387,9 @@ module.exports = {
|10020 |设备设置时间异常 |设备设置时间异常,仅iOS返回 |
### 注意事项
### 注意事项
- 为对抗攻击,实人认证SDK返回的错误原因比较模糊。
- 为对抗攻击,实人认证SDK返回的错误原因比较模糊。
- HBuilderX3.7.4+新增支持,标准基座可直接真机运行,打包或自定义基座需在“App模块配置”中勾选“FacialRecognitionVerify(实人认证)”(注意不是faceId)参考[详情](https://uniapp.dcloud.net.cn/tutorial/app-facialRecognitionVerify.html)
- App-Android平台要求**Android5**(API Leavel 21)及以上系统,App-iOS平台要求**iOS9**及以上系统
- App端使用实人认证SDK,需在隐私政策的三方SDK中添加实人认证功能描述,参考[详情](https://ask.dcloud.net.cn/article/39484#FacialRecognitionVerify)
......@@ -398,7 +398,7 @@ module.exports = {
### 非 uniCloud 业务使用@uni-frv-external
> HBuilderX 版本需大于3.7.6
>
>
> 非uniCloud的传统服务器,可通过本插件方便调用uni实人认证
如果您的业务没有部署在 uniCloud 上,可以通过 uni-frv-external 来实现实人认证功能。
......@@ -434,8 +434,8 @@ sequenceDiagram
#### 项目文件说明
```text
├── uni_modules 存放[uni_module](/uni_modules)规范的插件。
│ ├── uni-frv-external
├── uni_modules 存放[uni_module](https://uniapp.dcloud.net.cn/uni_modules)规范的插件。
│ ├── uni-frv-external
│ │ ├── changelog.md
│ │ ├── common 页面公共逻辑
│ │ │ ├── check-id-card.js 校验身份证号合法性
......@@ -443,9 +443,9 @@ sequenceDiagram
│ │ ├── components 公共组件
│ │ │ └── uni-frv-external-realname 实名认证组件
│ │ │ ├── face-verify-icon.svg 实名认证错误提示Icon
│ │ │ └── uni-frv-external-realname.vue
│ │ │ └── uni-frv-external-realname.vue
│ │ ├── package.json 包管理文件
│ │ ├── pages
│ │ ├── pages
│ │ │ └── common
│ │ │ └── webview 用于实现应用内浏览或打开《用户协议和隐私协议》URL链接页面
│ │ │ └── webview.vue
......
......@@ -14,7 +14,7 @@ uniCloud的定价、套餐内容、服务SLA,是由云厂商直接公布的。
## 阿里云@aliyun-business
> 阿里云正式版版需要使用HBuilderX 3.6.5+(正式版)或3.6.10+(Alpha版)或与此版本对应的uni-app cli项目才可正常使用。如果是cli创建的项目,可以参考:[更新依赖到指定版本](/quickstart-cli.html#cliversion)
> 阿里云正式版版需要使用HBuilderX 3.6.5+(正式版)或3.6.10+(Alpha版)或与此版本对应的uni-app cli项目才可正常使用。如果是cli创建的项目,可以参考:[更新依赖到指定版本](https://uniapp.dcloud.net.cn/quickstart-cli.html#cliversion)
阿里云提供1个免费空间,付费空间提供包月、按量计费两种计费方式,具体说明如下:
......@@ -307,7 +307,7 @@ uniCloud的定价、套餐内容、服务SLA,是由云厂商直接公布的。
## 支付宝小程序云@alipay
> 支付宝小程序云需要使用3.97+或与此版本对应的uni-app cli项目才可正常使用。如果是cli创建的项目,可以参考:[更新依赖到指定版本](/quickstart-cli.html#cliversion)
> 支付宝小程序云需要使用3.97+或与此版本对应的uni-app cli项目才可正常使用。如果是cli创建的项目,可以参考:[更新依赖到指定版本](https://uniapp.dcloud.net.cn/quickstart-cli.html#cliversion)
支付宝小程序云采用**基础套餐+按量计费**的模式,开发者可先购买带有一定配额的基础套餐(免费版也可以),超出套餐配额部分按使用量付费。
......
......@@ -30,7 +30,7 @@ HBuilderX有多种发行方式
- 如果需要用uni.request请求云存储内的文件,需要将云存储域名(即上表中的download合法域名)配置到request合法域名内
- 阿里云迁移正式版后未重新发布的项目仍会请求公测版地址(api.bspapp.com)
- 如果项目使用了uni-push,还需要将uni-push的socket域名添加到白名单[详情查看](/unipush-v2.md#useinmp)
- 如果项目使用了uni-push,还需要将uni-push的socket域名添加到白名单[详情查看](https://uniapp.dcloud.net.cn/unipush-v2.md#useinmp)
- 支付宝小程序云的域名是动态的,需要在小程序管理后台配置`{spaceId}.api-hz.cloudbasefunction.cn`,其中`{spaceId}`是服务空间的id,可以在uniCloud web控制台的服务空间总览页面查看
**阿里云查看上传、下载安全域名**
......
......@@ -349,7 +349,7 @@ login('name-demo', 'password-demo') // 调用login方法传入参数'name-demo'
uni-app前端也支持debug调试,注意不要混淆。
在调试面板上方有断点step按钮,鼠标悬浮上去可看到快捷键。可以单步调试。调试面板的使用教程同客户端调试,[详见](/tutorial/debug/h5-debug.md)
在调试面板上方有断点step按钮,鼠标悬浮上去可看到快捷键。可以单步调试。调试面板的使用教程同客户端调试,[详见](https://uniapp.dcloud.net.cn/tutorial/debug/h5-debug.html)
## 云端日志@uniCloudlogger
......
......@@ -46,7 +46,7 @@
- 如果应用的权限系统比较复杂,使用clientDB不如使用云对象方便,也应该编写好除了权限部分以外的其他的schema。这样联表查询、tree查询、默认值、值域校验等其他功能仍然可以方便使用。
具体来说,如自己在云函数中编写权限控制代码,则需要把`DB Schema`的权限都设为false,在云函数中将操作角色设为admin(通过setuser API),以跳过schema的权限验证。
当然,云函数中代码控制的权限和`DB Schema`中的权限也可以混合使用,简单权限交由`DB Schema`处理,负责权限再编写代码处理。
所以建议开发者编写好schema,无论云端还是前端操作数据库。最多是云函数处理权限时忽略schema中的权限部分。
......@@ -94,9 +94,9 @@ HBuilderX中运行前端项目,在控制台选择连接本地云函数,或
"bsonType": "object", // 固定节点
"description": "表的描述",
"required": [], // 必填字段
"permission": {
"permission": {
"read": false, // 前端非admin的读取记录权限控制。默认值是false,即可以不写。可以简单的true/false,也可以写表达式
"create": false, // 前端非admin的新增记录权限控制。默认值是false,即可以不写。可以简单的true/false,也可以写表达式
"create": false, // 前端非admin的新增记录权限控制。默认值是false,即可以不写。可以简单的true/false,也可以写表达式
"update": false, // 前端非admin的更新记录权限控制。默认值是false,即可以不写。可以简单的true/false,也可以写表达式
"delete": false, // 前端非admin的删除记录权限控制。默认值是false,即可以不写。可以简单的true/false,也可以写表达式
"count": false // 前端非admin的求数权限控制。默认值是true,即可以不写。可以简单的true/false,也可以写表达式
......@@ -291,7 +291,7 @@ schema保存后,可以通过代码测试。注意在uniCloud web控制台修
官方推出了`openDB`开源数据库规范,包括用户表、文章表、商品表等很多模板表,这些模板表均已经内置`DB Schema`,可学习参考。[详见](opendb.md)
schema 国际化方案 [详见](/tutorial/i18n?id=schema)
schema 国际化方案 [详见](https://uniapp.dcloud.net.cn/tutorial/i18n?id=schema)
### 字段类型bsonType@bsontype
......@@ -658,7 +658,7 @@ JQL没有像SQL那样提供了join、leftjoin、innerjoin这些语法,只需
联表查询内容较多,[详见](jql.md#lookup)
<!--
<!--
以简历和招聘系统为例,一个完整系统至少需要如下表:
- 应聘者注册信息表(uni-id-users),包括`_id`、用户名、密码、注册时间
- 应聘者简历表(resume),包括`_id`、应聘者uid和简历中各种信息
......@@ -1123,7 +1123,7 @@ rule表达式里支持:
}
}
```
上述示例中,`create_date`为必填项,只需限制`end_date`存在时大于`create_date`即可
**注意**
......@@ -1412,7 +1412,7 @@ HBuilderX 3.1.0起还新增了count权限,即是否有权对该表进行统计
}
}
```
**关于count权限的说明**
- 在HBuilderX 3.1.0之前,count操作都会使用表级的read权限进行验证。HBuilderX 3.1.0及之后的版本,如果配置了count权限则会使用表级的read+count权限进行校验,两条均满足才可以通过校验
......@@ -1586,7 +1586,7 @@ permission的字段级控制,包括读写两种权限,分别称为:read、
"bsonType": "string",
"title": "名称",
"permission": {
"read": true,
"read": true,
"write": "doc._id == auth.uid" // 允许登录的用户修改自己的name字段
}
},
......
......@@ -50,20 +50,20 @@ App和微信两个平台细化说明如下:
2.[uniCloud控制台](https://unicloud.dcloud.net.cn/)关联允许发送安全网络请求的应用
![关联应用到服务空间安全网络](https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/secure-network-unicloud-relate.jpg)
本质上安全网络绑定的是应用的appid、包名、证书等信息。只不过这些信息统一配置在dev中,在uniCloud的web控制台来选择。所以务必注意dev配置的正式版、测试版的包名、签名是否正确。
3. 在项目根目录manifest.json文件内为app平台开启安全网络模块
![App云端一体安全网络模块](https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/secure-network-app-manifest.jpg)
**注意:**打包后生效。测试时需打包[自定义基座](../tutorial/run/run-app.md#customplayground)
**注意:**打包后生效。测试时需打包[自定义基座https://uniapp.dcloud.net.cn/tutorial/run/run-app.md#customplayground)。
4. 在服务空间创建数据表[opendb-app-client-key](https://gitee.com/dcloud/opendb/tree/master/collection/opendb-app-client-key)用于保存发放给客户端的密钥对。
- 如果在[uniCloud控制台](https://unicloud.dcloud.net.cn/),新建表界面在opendb表的其他分类中
- 如果在HBuilderX的database目录点右键新建,可直接搜索`opendb-app-client-key`。新建后记得上传到uniCloud服务空间。
参考文档:[创建一个表](https://uniapp.dcloud.net.cn/uniCloud/hellodb.html#create-collection)
- 切勿删除或修改此集合内容,否则会导致部分客户端不能发送安全网络请求(重新安装客户端或清除客户端数据后才能正常使用)
......@@ -85,7 +85,7 @@ App和微信两个平台细化说明如下:
1.[开发者中心](https://dev.dcloud.net.cn/)`应用详情 --> 【名称待定】`内填写微信小程序的appId。一个应用只能有一个发行配置,但是可以有多个开发配置
![微信小程序AppId绑定](https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/secure-network-dev-wx-appid.jpg)
2. 在uniCloud控制台关联允许发送安全网络请求的应用
![关联应用到服务空间安全网络](https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/secure-network-unicloud-relate.jpg)
......@@ -167,9 +167,9 @@ App和微信两个平台细化说明如下:
```
注意:此方法内部会调用一次微信小程序的login,然后使用返回的code调用`uni-id-co``secureNetworkHandshakeByWeixin`方法(新增于uni-id-pages 1.0.27)
7. 在项目根目录manifest.json文件内为微信小程序平台开启`云端一体安全网络模块`
![微信小程序云端一体安全网络模块](https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/secure-network-wx-manifest.jpg)
#### 不使用uni-id-pages时如何使用微信小程序安全网络@mp-weixin-without-uni-id-pages
......@@ -429,7 +429,7 @@ module.exports = {
## 错误码@err-code
自HBuilderX 3.6.9起安全网络使用以下错误规范,此前错误码未统一不建议使用。安全网络使用的错误规范参考:[错误规范](../tutorial/err-spec.md)
自HBuilderX 3.6.9起安全网络使用以下错误规范,此前错误码未统一不建议使用。安全网络使用的错误规范参考:[错误规范](https://uniapp.dcloud.net.cn/tutorial/err-spec.html)
### 客户端错误
......
......@@ -6,12 +6,12 @@
在常规web开发时可以使用server sent event将结果分段返回,客户端自行组装最终结果。但是小程序端并不支持server sent event,因此我们基于uni-push实现了这个替代方案。
使用此功能前需要先开通uni-push 2.0,参考文档:[uni-push 2.0](/unipush-v2.md)
使用此功能前需要先开通uni-push 2.0,参考文档:[uni-push 2.0](https://uniapp.dcloud.net.cn/unipush-v2.html)
## 客户端API@client-api
:::warning 注意
云函数向客户端发送消息时会使用push发送如下格式数据,如果项目中有监听push消息请勿错误的处理此类消息。相关文档请参考:[客户端监听推送消息](../unipush-v2.md#listener)
云函数向客户端发送消息时会使用push发送如下格式数据,如果项目中有监听push消息请勿错误的处理此类消息。相关文档请参考:[客户端监听推送消息https://uniapp.dcloud.net.cn/unipush-v2.md#listener)
```js
{
......
......@@ -110,7 +110,7 @@ uniCloud腾讯云版支持云存储的文件权限。当上传的文件不希望
#### 示例代码
<!--
<!--
cloudPath: 'test-admin.jpeg',
filePath: filePath,
onUploadProgress: function(progressEvent) {
......@@ -675,7 +675,7 @@ let result = await uniCloud.deleteFile({
如需下载到客户端请参考:
- [uni.downloadFile()](../api/request/network-file.md#downloadfile)
- [uni.downloadFile()https://uniapp.dcloud.net.cn/api/request/network-file.md#downloadfile)
**平台兼容性**
......
......@@ -320,7 +320,7 @@ uniCloud的云函数,基于uni-push2提供了sse通道,即[云函数请求
**注意:**
1. 需提前为应用开通[uni-push2](/unipush-v2.md)
1. 需提前为应用开通[uni-push2](https://uniapp.dcloud.net.cn/unipush-v2.html)
2. 不同provider的流式支持度不同,有的message事件是按字输出、有的是按句输出。
3. 开启流式响应后`chatCompletion`接口将返回流对象,而不会返回具体结果。开发者需要使用流获取AI响应的内容。
4. `chatCompletion`接口传`sseChannel`参数时,`chatCompletion`接口不会返回流对象,只会返回`{errCode: 0}`
......@@ -397,7 +397,7 @@ exports.main = async (event, context) => {
})
streamRes.on('end', async () => {
console.log('---end----') // 响应结束
await sseChannel.end({
await sseChannel.end({
errCode: 0,
errMsg: ''
})
......@@ -407,7 +407,7 @@ exports.main = async (event, context) => {
})
})
streamRes.on('error', (err) => {
await sseChannel.end({
await sseChannel.end({
errCode: err.errCode || err.code,
errMsg: err.errMsg || err.message,
})
......@@ -586,9 +586,9 @@ try {
- 错误码:60000,错误信息:"A network error occurred while requesting xxx"
请求服务商接口时遇到网络错误,如果是请求openai接口请注意需要使用代理,如果使用了代理仍遇到此错误,请检查代理连通性是否有问题
- 错误信息:"certificate has expired"
请参考文档:[云函数通过https访问其他服务器时出现“certificate has expired”](faq.md#lets-encrypt-cert)
......@@ -607,9 +607,9 @@ try {
2. 在uni-app项目点右键创建uniCloud环境,关联之前创建的服务空间。
3. 创建uniCloud云函数
3. 创建uniCloud云函数
在项目下uniCloud目录右键,新建云函数
在项目下uniCloud目录右键,新建云函数
<img width="300px" src="https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/uni-ai/20230418213815.jpg"></img>
- 填写云函数名称,比如`ai-demo`。此云函数需要调用`uni-cloud-ai`扩展库,所以需点击`添加公共模块或扩展库依赖`按钮。
......
......@@ -25,7 +25,7 @@ GitCode 仓库:[https://gitee.com/dcloud/uni-captcha](https://gitee.com/dcloud
## 目录结构@catalogue
<pre v-pre="" data-lang="">
<code class="lang-" style="padding:0">
├─uni_modules 存放[uni_module](/uni_modules)规范的插件。
├─uni_modules 存放[uni_module](https://uniapp.dcloud.net.cn/uni_modules)规范的插件。
│ └─uni-captcha
│ ├─uniCloud
│ │ ├─cloudfunctions 云函数目录
......@@ -36,9 +36,9 @@ GitCode 仓库:[https://gitee.com/dcloud/uni-captcha](https://gitee.com/dcloud
│ │ ├─opendb-verify-codes.schema.json 验证码数据表
│ │ └─db_init.json 初始化数据库文件
│ └─components 组件目录
│ ├─uni-captcha
│ ├─uni-captcha
│ │ └─uni-captcha.vue 普通验证码组件
│ └─uni-popup-captcha
│ └─uni-popup-captcha
│ └─uni-popup-captcha.vue 弹出式验证码组件
</code>
</pre>
......
......@@ -28,7 +28,7 @@
`uni-push`有服务器API和客户端API。
## 客户端API [详情参考](/api/plugins/push)
## 客户端API [详情参考](https://uniapp.dcloud.net.cn/api/plugins/push)
## 服务端API @uni-cloud-push
......@@ -49,7 +49,7 @@
**注意**`user_id``user_tag``device_id``push_clientid``getui_custom_tag``getui_big_data_tag``getui_alias`不可多选。全为空表示向所有启动过应用的设备推送。
如果用户处于未登录状态,你可以基于`device_id`向用户推送消息,但是推送服务器底层只识别`push_clientid`,需要通过查数据库获得`push_clientid`。而`device_id``push_clientid`的映射关系不由`uni-push`提供,而是由[uni统计](https://uniapp.dcloud.io/uni-stat-v2.html)模块内置的功能实现。如果你不使用uni统计,则需要在应用启动时调用[getPushClientId](/api/plugins/push)获取`push_clientid`,获取成功后(应用未在manifest中启用uni-push2.0则会获取失败)调用服务端云对象的某个方法(参数:`push_clientid`)执行向`opendb-device`表写入或更新(存在时):[设备信息](https://uniapp.dcloud.io/uniCloud/cloud-obj.html#get-client-info)`push_clientid`
如果用户处于未登录状态,你可以基于`device_id`向用户推送消息,但是推送服务器底层只识别`push_clientid`,需要通过查数据库获得`push_clientid`。而`device_id``push_clientid`的映射关系不由`uni-push`提供,而是由[uni统计](https://uniapp.dcloud.io/uni-stat-v2.html)模块内置的功能实现。如果你不使用uni统计,则需要在应用启动时调用[getPushClientId](https://uniapp.dcloud.net.cn/api/plugins/push)获取`push_clientid`,获取成功后(应用未在manifest中启用uni-push2.0则会获取失败)调用服务端云对象的某个方法(参数:`push_clientid`)执行向`opendb-device`表写入或更新(存在时):[设备信息](https://uniapp.dcloud.io/uniCloud/cloud-obj.html#get-client-info)`push_clientid`
同理基于`user_id`向用户推送消息,需要`user_id``push_clientid`的映射关系,可以直接使用[uni-id-pages](https://ext.dcloud.net.cn/plugin?id=8577)插件内置的功能实现。如果你不使用`uni-id-pages`需要在`App.vue`调用[uniCloud.onRefreshToken](https://uniapp.dcloud.io/uniCloud/client-sdk.html#on-refresh-token) 监听token发生变化(即:用户登录和token续期时),调用服务端云对象的某个方法(参数:`push_clientid`)操作`uni-id-device`表,记录`device_id``user_id`(防客户端伪造,需校验`token`)的映射关系;完整字段包含`user_id``device_id``token_expired``push_clientid``appid`。同时再向`opendb-device`表写入或更新(存在时):[设备信息](https://uniapp.dcloud.io/uniCloud/cloud-obj.html#get-client-info)`push_clientid`
......@@ -60,10 +60,10 @@
#### 接口形式
可以向设定的(单个、群组、全体)设备,即时或定时推送消息。支持设置:通知栏消息内容、控制响铃,震动,浮动,闪灯;手机桌面应用右上角的角标等。
```js
```js
await uniPush.sendMessage(OBJECT)
```
#### 入参说明
#### 入参说明
|名称|类型|必填|默认值|描述|平台特性|
|--|--|--|--|--|--|
|user_id|String、Array|否|无|基于uni-id的_id,指定接收消息的用户id。</br>支持多个以数组的形式指定多个用户id,如["user_id-1","user_id-2"],数组长度不大于500| |
......@@ -108,7 +108,7 @@ await uniPush.sendMessage(OBJECT)
- 不同key之间是交集,同一个key之间是根据`opt_type`操作
- eg. 需要发送给城市在A,B,C里面,没有设置tagtest标签,手机型号为android的设备,用条件交并补功能可以实现,city(A|B|C) && !tag(tagtest) && phonetype(android)
##### platform 说明
##### platform 说明
|值|解释|
|:-|:-|
|app-ios|iOS App|
......@@ -241,7 +241,7 @@ await uniPush.sendMessage(OBJECT)
#### 停止任务
对正处于推送状态,或者未接收的消息停止下发(只支持批量推和群推任务)
##### 接口形式
```js
```js
await uniPush.stopTaskByTaskid(taskId)
```
##### 入参说明
......@@ -252,7 +252,7 @@ await uniPush.stopTaskByTaskid(taskId)
##### 响应体说明
```js
{
"errCode":0,
"errCode":0,
"errMsg":"success"
}
```
......@@ -262,7 +262,7 @@ await uniPush.stopTaskByTaskid(taskId)
#### 查询定时任务
该接口支持在推送完定时任务之后,查看定时任务状态,定时任务是否发送成功。
##### 接口形式
```js
```js
await uniPush.getTaskScheduleByTaskid(taskId)
```
##### 入参说明
......@@ -301,7 +301,7 @@ await uniPush.getTaskScheduleByTaskid(taskId)
#### 删除定时任务
用来删除还未下发的任务,删除后定时任务不再触发(距离下发还有一分钟的任务,将无法删除,后续可以调用停止任务接口。)
##### 接口形式
```js
```js
await uniPush.deleteTaskScheduleByTaskid(taskId)
```
##### 入参说明
......@@ -325,13 +325,13 @@ await uniPush.deleteTaskScheduleByTaskid(taskId)
调用此接口可以查询某任务下某cid的具体实时推送路径情况
>使用该接口需要申请权限,若有需要,请点击右侧“技术咨询”了解详情
##### 接口形式
```js
```js
await uniPush.getTaskDetail(OBJECT)
```
##### 入参说明
| 名称 | 类型 |是否必须 | 默认值|说明 |
| 名称 | 类型 |是否必须 | 默认值|说明 |
| ------------ | ----------- |-----------|---|--------|
|taskId |string | true | 无|任务id |
|taskId |string | true | 无|任务id |
|cid |string | true | 无|cid |
##### 响应体说明
......@@ -374,7 +374,7 @@ await uniPush.getTaskDetail(OBJECT)
#### 绑定别名
一个cid只能绑定一个别名,若已绑定过别名的cid再次绑定新别名,则前一个别名会自动解绑,并绑定新别名。
##### 接口形式
```js
```js
await uniPush.cidBindAlias(OBJECT)
```
##### 入参说明
......@@ -416,7 +416,7 @@ await uniPush.cidBindAlias(OBJECT)
#### 根据cid查询别名
通过传入的cid查询对应的别名信息
##### 接口形式
```js
```js
await uniPush.getAliasByCid(cid)
```
##### 入参说明
......@@ -449,7 +449,7 @@ await uniPush.getAliasByCid(cid)
#### 根据别名查询cid
通过传入的别名查询对应的cid信息
##### 接口形式
```js
```js
await uniPush.getCidByAlias(alias)
```
##### 入参说明
......@@ -480,7 +480,7 @@ await uniPush.getCidByAlias(alias)
#### 批量解绑别名
批量解除别名与cid的关系
##### 接口形式
```js
```js
await uniPush.unboundAlias(Array)
```
##### 入参说明
......@@ -522,7 +522,7 @@ await uniPush.unboundAlias(Array)
#### 解绑所有别名
解绑所有与该别名绑定的cid
##### 接口形式
```js
```js
await uniPush.unboundAllAlias(alias)
```
##### 入参说明
......@@ -551,7 +551,7 @@ await uniPush.unboundAllAlias(alias)
一个设备绑定一批标签,此操作为覆盖操作,会删除历史绑定的标签;
> 此接口对单个cid有频控限制,每天只能修改一次,最多设置100个标签;单个标签长度最大为32字符,标签总长度最大为512个字符,申请修改请点击右侧“技术咨询”了解详情 。
##### 接口形式
```js
```js
await uniPush.cidBindCustomTags(OBJECT)
```
##### 入参说明
......@@ -592,7 +592,7 @@ await uniPush.cidBindCustomTags(OBJECT)
一批设备绑定一个标签,此接口为增量
> 此接口有频次控制(每分钟最多100次,每天最多10000次),申请修改请点击右侧“技术咨询”了解详情
##### 接口形式
```js
```js
await uniPush.cidsBindCustomTag(OBJECT)
```
......@@ -629,7 +629,7 @@ await uniPush.cidsBindCustomTag(OBJECT)
解绑设备的某个标签属性,不影响其它标签
>此接口有频次控制(每分钟最多100次,每天最多10000次),申请修改请点击右侧“技术咨询”了解详情
##### 接口形式
```js
```js
await uniPush.cidsUnboundCustomTag(OBJECT)
```
##### 入参说明
......@@ -665,7 +665,7 @@ await uniPush.cidsUnboundCustomTag(OBJECT)
根据cid查询客户端标签列表
>此接口有频次控制(每分钟最多100次,每天最多10000次),申请修改请点击右侧“技术咨询”了解详情
##### 接口形式
```js
```js
await uniPush.searchCustomTagByCid(cid)
```
##### 入参说明
......@@ -704,7 +704,7 @@ await uniPush.searchCustomTagByCid(cid)
将单个或多个设备加入黑名单,对于黑名单设备在推送过程中会被过滤掉。
##### 接口形式
```js
```js
await uniPush.addCidToBlacklist(push_clientid)
```
##### 入参说明
......@@ -728,7 +728,7 @@ await uniPush.addCidToBlacklist(push_clientid)
#### 移除黑名单设备
将单个push_clientid或多个push_clientid设备移出黑名单,对于黑名单设备在推送过程中会被过滤掉的,不会给黑名单设备推送消息
##### 接口形式
```js
```js
await uniPush.removeCidInBlacklist(push_clientid)
```
##### 入参说明
......@@ -756,7 +756,7 @@ await uniPush.removeCidInBlacklist(push_clientid)
注意:该状态为:`offline`离线时,消息可通过:同设备下其他集成个推SDK的在线应用通道完成推送(iOS不支持,Android受限于手机rom的节点设置策略)
##### 接口形式
```js
```js
await uniPush.getClientStatusByCid(push_clientid)
```
##### 入参说明
......@@ -797,7 +797,7 @@ await uniPush.getClientStatusByCid(push_clientid)
2. 该接口返回设备不在线时,仅表示不存在集成了个推SDK的应用在线
3. 该接口需要开通权限,如需开通,请联系右侧技术咨询
##### 接口形式
```js
```js
await uniPush.getDeviceStatusByCid(cid)
```
##### 入参说明
......@@ -819,7 +819,7 @@ await uniPush.getDeviceStatusByCid(cid)
"data": {
"cid_status":"offline",
"device_status":"online"
}
}
}
}
}
......@@ -839,7 +839,7 @@ await uniPush.getDeviceStatusByCid(cid)
#### 设备详细信息
查询设备的信息
##### 接口形式
```js
```js
await uniPush.getClientDetailByCid(String|Array)
```
##### 入参说明
......@@ -902,7 +902,7 @@ await uniPush.getClientDetailByCid(String|Array)
#### 查询设备总量
通过指定查询条件来查询满足条件的设备数量
##### 接口形式
```js
```js
await uniPush.getClientCount(OBJECT)
```
##### 入参说明
......@@ -973,7 +973,7 @@ await uniPush.getClientCount(OBJECT)
#### 设置应用角标(仅支持IOS)
通过cid通知个推服务器当前iOS设备的角标情况。
##### 接口形式
```js
```js
await uniPush.setBadgeByCid(OBJECT)
```
##### 入参说明
......@@ -997,14 +997,14 @@ await uniPush.setBadgeByCid(OBJECT)
查询推送数据,可查询消息可下发数、下发数,接收数、展示数、点击数等结果。支持单个taskId查询和多个taskId查询。
>此接口调用,仅可以查询toList或toApp的推送结果数据;不能查询toSingle的推送结果数据。
##### 接口形式
```js
```js
await uniPush.getReport(OBJECT)
```
##### 入参说明
| 名称 | 类型 | 是否必须 | 默认值| 说明 |
| ------ | ------ | ------ | ------ | ------ |
| taskid | String | 是 | 无 | 任务id,推送时返回,多个taskId以英文逗号隔开,一次最多传200个|
| actionIdList | String | 否 | 无 |
| actionIdList | String | 否 | 无 |
##### 响应体说明
* content-type:`application/json;charset=utf-8`
......@@ -1042,7 +1042,7 @@ await uniPush.getReport(OBJECT)
* 返回参数`data`说明
| 名称 | 类型 | 描述 |
| 名称 | 类型 | 描述 |
| ------ | ---- | -------- |
|$taskid|Object|key: 任务编号,value: 统计数据|
|total|Object|总的统计数据|
......@@ -1060,7 +1060,7 @@ await uniPush.getReport(OBJECT)
根据任务组名查询推送结果,返回结果包括消息可下发数、下发数,接收数、展示数、点击数。
>此接口调用,仅可以查询toList或toApp的推送结果数据;不能查询toSingle的推送结果数据。
##### 接口形式
```js
```js
await uniPush.getReportByGroupName(group_name)
```
##### 入参说明
......@@ -1121,7 +1121,7 @@ await uniPush.getReportByGroupName(group_name)
获取推送实时结果,可查询消息下发数,接收数、展示数、点击数和消息折损详情等结果。支持单个taskId查询和多个taskId查询。
>注意:该接口需要开通权限,如需开通,请联系对应的商务同学开通
##### 接口形式
```js
```js
await uniPush.getReportDetailByTaskid(taskid)
```
##### 入参说明
......@@ -1193,7 +1193,7 @@ await uniPush.getReportDetailByTaskid(taskid)
* 返回参数`data`说明
| 名称 | 类型 | 描述 |
| 名称 | 类型 | 描述 |
| ------ | ---- | -------- |
|$taskid|Object|key: 任务编号,value: 统计数据|
|total|Object|总的统计数据|
......@@ -1214,7 +1214,7 @@ await uniPush.getReportDetailByTaskid(taskid)
**折损详情分类如下,`2-14`是折损大类说明,大类说明下面的`7001-8999`是细分的折损原因,total代表各细分原因总和**
| 名称 | 描述 |
| 名称 | 描述 |
| ------ | -------- |
|2|参数无效|
|3|app鉴权信息错误|
......@@ -1247,7 +1247,7 @@ await uniPush.getReportDetailByTaskid(taskid)
#### 获取单日推送数据
调用此接口可以获取某个应用单日的推送数据(推送数据包括:下发数,接收数、展示数、点击数)(目前只支持查询非当天的数据)
##### 接口形式
```js
```js
await uniPush.getReportByDate(date)
```
##### 入参说明
......@@ -1310,7 +1310,7 @@ await uniPush.getReportByDate(date)
2.vv返回的是请求量push_num,总限额total_num返回的总的到达量,所以会有请求量push_num超过总限额total_num的情况
3.该接口做了频控限制,请不要频繁调用
##### 接口形式
```js
```js
await uniPush.getTodayReport()
```
##### 入参说明
......@@ -1385,27 +1385,27 @@ await uniPush.getTodayReport()
| 名称 | 类型 |描述 |
| ------------ | -------------------|-------|
|**gt** | Object | 个推通道 |
|gt/app |Object | 个推群推接口推送限制|
|gt/list |Object | 个推创建消息接口限制 |
|gt/app\_with\_tag | Object |个推 根据条件筛选设备推送接口推送限制 |
|**xm** |Object | xm通道 |
|xm/general |Object | xm通道 普通消息限制,channel是普通级别消息时推送量限制 |
|**op** |Object | op通道 |
|op/general |Object | op通道 公信消息限制,不带channel或公信channel时推送量限制 |
|**vv** |Object | vv通道 |
|vv/special |Object | vv通道系统类消息限制,即classification=1时推送量限制 |
|vv/general |Object | vv通道运营类消息限制,即classification=0时推送量限制 |
|vv/grouppush |Object | vv群推消息体配置量 |
| total_num | long | 单日可推送总量 |
| remain_num | long| 单日可推送剩余量 |
| push_num | long| 单日可推送请求量,**仅vv返回该字段** |
| limit |boolean| 是否被限量,当日可推送总量使用完时,该字段更新true|
|gt/app |Object | 个推群推接口推送限制|
|gt/list |Object | 个推创建消息接口限制 |
|gt/app\_with\_tag | Object |个推 根据条件筛选设备推送接口推送限制 |
|**xm** |Object | xm通道 |
|xm/general |Object | xm通道 普通消息限制,channel是普通级别消息时推送量限制 |
|**op** |Object | op通道 |
|op/general |Object | op通道 公信消息限制,不带channel或公信channel时推送量限制 |
|**vv** |Object | vv通道 |
|vv/special |Object | vv通道系统类消息限制,即classification=1时推送量限制 |
|vv/general |Object | vv通道运营类消息限制,即classification=0时推送量限制 |
|vv/grouppush |Object | vv群推消息体配置量 |
| total_num | long | 单日可推送总量 |
| remain_num | long| 单日可推送剩余量 |
| push_num | long| 单日可推送请求量,**仅vv返回该字段** |
| limit |boolean| 是否被限量,当日可推送总量使用完时,该字段更新true|
#### 获取单日设备数据接口
调用此接口可以获取某个应用单日的设备数据(设备数据包括:新增设备数,累计注册设备总数,在线峰值,日联网设备数)(目前只支持查询非当天的数据)
##### 接口形式
```js
```js
await uniPush.getClientReportByDate(date)
```
##### 入参说明
......
......@@ -63,7 +63,7 @@ const uniIdCo = uniCloud.importObject('uni-id-co')
|字段|说明|
|--|--|
|clientInfo|客户端信息; [uni.getSystemInfo](/api/system/info.md#getsysteminfo)返回的字段|
|clientInfo|客户端信息; [uni.getSystemInfo](https://uniapp.dcloud.net.cn/api/system/info.md#getsysteminfo)返回的字段|
|uniIdToken|用户Token; 用户登录后必填|
|params|API接口参数字段|
......@@ -71,9 +71,9 @@ const uniIdCo = uniCloud.importObject('uni-id-co')
| 字段 | 说明 |
|-------------|------------------------------------------------------------------|
| uniPlatform | 应用运行平台,与条件编译平台相同。[详见](/api/system/info.md#uniplatform) |
| uniPlatform | 应用运行平台,与条件编译平台相同。[详见](https://uniapp.dcloud.net.cn/api/system/info.md#uniplatform) |
| appId | manifest 中应用appid,即DCloud appid。如没有请手动指定一个,需确保唯一性。 |
| deviceId | 设备 id;通过[uni.getSystemInfo](/api/system/info.md#getsysteminfo)获取 |
| deviceId | 设备 id;通过[uni.getSystemInfo](https://uniapp.dcloud.net.cn/api/system/info.md#getsysteminfo)获取 |
假设已在uniCloud 控制台已设置URL化域名PATH,以PATH为`/http/uni-id-co`为例,演示登录示例:
......@@ -1963,10 +1963,10 @@ uni-id-pages已全面支持:app、小程序、web(uni-id-pages 版本号1.0.
#### 回调域名的配置@redirect_uri
- 手机微信扫码登录
- 手机微信扫码登录
微信开放平台 -> 管理中心 -> 网站应用 -> 选择对应的应用名称,点击查看 -> 开发信息,点击修改 -> 填写授权回调域
- 基于微信公众号auth登录
- 基于微信公众号auth登录
登录微信公众号 -> 设置与开发 -> 公众号设置 -> 设置网页授权域名
#### 本地调试
......@@ -1979,8 +1979,8 @@ uni-id-pages已全面支持:app、小程序、web(uni-id-pages 版本号1.0.
> 如果没有启动80端口而是81等,说明你的端口被占用了。你有两个办法1.关闭可疑程序,或直接重启电脑 2.命令行关闭占用的端口[详情查看](https://www.baidu.com/s?&wd=%E5%91%BD%E4%BB%A4%E8%A1%8C%20%E8%A7%A3%E5%86%B3%E7%AB%AF%E5%8F%A3%E8%A2%AB%E5%8D%A0%E7%94%A8)
2. 实现访问域名直接指向你的本地web Server
可以通过内网穿透实现,但比较麻烦且可能会影响线上用户。这里推荐直接修改hosts,hosts是一个没有扩展名的系统文件,其基本作用就是将一些常用的网址域名与其对应的 IP 地址建立一个关联“ 数据库 ”。当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从hosts文件中寻找对应的 IP 地址,一旦找到,系统就会立即打开对应网页,如果没有找到,系统才会将网址提交 DNS 域名解析服务器进行 IP 地址的解析。
host文件路径: Windows系统一般为:`C:\Windows\System32\drivers\etc`。mac系统:`/etc/`
可以通过内网穿透实现,但比较麻烦且可能会影响线上用户。这里推荐直接修改hosts,hosts是一个没有扩展名的系统文件,其基本作用就是将一些常用的网址域名与其对应的 IP 地址建立一个关联“ 数据库 ”。当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从hosts文件中寻找对应的 IP 地址,一旦找到,系统就会立即打开对应网页,如果没有找到,系统才会将网址提交 DNS 域名解析服务器进行 IP 地址的解析。
host文件路径: Windows系统一般为:`C:\Windows\System32\drivers\etc`。mac系统:`/etc/`
用HBuilderX打开hosts文件,在末尾添加一行 `127.0.0.1 你的域名`保存即可。
此时访问域名,如果就能看到和你的项目运行到浏览器一样的效果,说明已经成功了。
......@@ -2055,7 +2055,7 @@ exports.main = async (event, context) => {
## URL化请求鉴权签名@http-reqeust-auth
> `uni-id-co@1.1.10`及以上版本支持使用`uni-cloud-s2s`进行请求签名验证,`uni-cloud-s2s`使用方式[详见](../uni-cloud-s2s.md)
>
>
> `uni-id-co`请求鉴权签名与`uni-cloud-s2s`不能同时存在,如果存在`uni-cloud-s2s`,则会优先使用`uni-cloud-s2s`进行请求签名验证
uni-id-co 在URL化请求时,会对以下 API 进行调用鉴权验证,
......@@ -2162,7 +2162,7 @@ class Sign {
return strtoupper($signature);
}
private function getParamsString ($params) {
ksort($params);
......@@ -2174,7 +2174,7 @@ class Sign {
array_push($paramsStr, $key . '=' . $value);
}
return join('&', $paramsStr);
}
}
......@@ -2212,19 +2212,19 @@ class Sign:
def get_signature (self, params, nonce, timestamp):
params_str = self.get_params_string(params)
signature = hmac.new(bytes("%s%s" % (self.requestAuthSecret, nonce), 'utf-8'), bytes("%s%s" % (timestamp, params_str), 'utf-8'), digestmod = hashlib.sha256).hexdigest().upper()
return signature
def get_params_string(self, params):
params_str = []
for k in sorted(params):
if isinstance(params[k], (list, dict)):
continue
continue
params_str.append("%s=%s" % (k, params[k]))
return "&".join(params_str)
if __name__ == "__main__":
if __name__ == "__main__":
requestAuthSecret = "testSecret"
nonce = "xxxxxxx"
timestamp = int(round(time.time() * 1000))
......@@ -2357,13 +2357,13 @@ public class Sign {
try {
hmacSha256 = Mac.getInstance(algorithm);
String key = new StringBuilder().append(requestAuthSecret).append(nonce).toString();
String message = new StringBuilder().append(Long.toString(timestamp)).append(paramsStr).toString();
byte[] keyBytes = key.getBytes("utf-8");
byte[] messageBytes = message.getBytes("utf-8");
hmacSha256.init(new SecretKeySpec(keyBytes, 0, keyBytes.length, algorithm));
byte[] digestBytes = hmacSha256.doFinal(messageBytes);
......@@ -2388,7 +2388,7 @@ public class Sign {
if (i != 0) {
sb.append("&");
}
sb.append(key).append("=").append(params.get(key));
}
......
此文档已拆分为:
- uni-id-pages(适用于uni-app的uni-id客户端)[详情查看](./app.md)
- uni-id-pages-x(适用于[uni-app x](/uni-app-x/README.md)的uni-id客户端)[详情查看](./app-x.md)
- uni-id-pages-x(适用于[uni-app x](https://uniapp.dcloud.net.cn/uni-app-x/README.md)的uni-id客户端)[详情查看](./app-x.md)
- uni-id-co(uni-id 的云对象)[详情查看](./cloud-object.md)
\ No newline at end of file
......@@ -103,8 +103,8 @@ uni-app框架内置了uni-id的token管理。
uni-app与uniCloud搭配且使用uni-id,登录后自动下发token、网络传输层自动传输token(uni-app 2.7.13+版本)、token临近过期会自动续期(uni-app 3.4.13 +版本),也就是说开发者无需自己管理token了。
uni-app客户端还有一批uni-id相关的内置API:
- uniIDHasRole:判断当前用户是否拥有某角色。[详情](/api/global.md#uniidhasrole)
- uniIDHasPermission:判断当前用户是否拥有某权限。[详情](/api/global.md#uniidhaspermission)
- uniIDHasRole:判断当前用户是否拥有某角色。[详情](https://uniapp.dcloud.net.cn/api/global.md#uniidhasrole)
- uniIDHasPermission:判断当前用户是否拥有某权限。[详情](https://uniapp.dcloud.net.cn/api/global.md#uniidhaspermission)
- uniCloud.getCurrentUserInfo():客户端获取当前用户信息。[详情](../client-sdk.md#client-getcurrentuserinfo)
5. 云端一体页面模板 [uni-id-pages](redirect.md)(含uni-id-co)
......@@ -382,7 +382,7 @@ uni-id云端会在login方法成功后自动返回token,uni-app前端框架会
为什么需要角色权限管理?
- 企业管理系统,比如[uni-admin](../admin.md),除了超级管理员,不同账号通常需根据职位、责任设定不同的系统权限。比如部门管理员、Hr。
- [clientDB](../clientdb.md)允许前端直接操作数据库,但部分字段应该是系统计算或管理员设置的,比如文章的阅读数、收藏数及是否加精置顶,这些字段不允许普通用户在前端通过clientDB直接修改,此时也需要通过权限控制来保证系统的安全稳定。
- [clientDB](../clientdb.md)允许前端直接操作数据库,但部分字段应该是系统计算或管理员设置的,比如文章的阅读数、收藏数及是否加精置顶,这些字段不允许普通用户在前端通过clientDB直接修改,此时也需要通过权限控制来保证系统的安全稳定。
`uni-id`基于经典的RBAC模型实现了角色权限系统。
......@@ -419,7 +419,7 @@ RBAC:Role-Based Access Control,基于角色的访问控制。
"NOTICE_ADMIN"
],
"created_date":1602495783272
}
}
}
```
......@@ -467,7 +467,7 @@ RBAC:Role-Based Access Control,基于角色的访问控制。
"NOTICE_DEL"
],
"created_date":1602495784372
}
}
}
```
......@@ -478,7 +478,7 @@ RBAC:Role-Based Access Control,基于角色的访问控制。
{
"permission": {
"update":"doc._id == auth.uid || 'USER_ADMIN' in auth.role" //用户自己或人事管理员可执行用户表的.update操作
}
}
}
```
......@@ -515,7 +515,7 @@ RBAC:Role-Based Access Control,基于角色的访问控制。
"permission_id":"USER_DEL",
"permission_name":"删除用户",
"created_date":1602495784372
}
}
}
```
......@@ -684,7 +684,7 @@ function hasPermission(token, permission) {
### 验证码表
表名:`opendb-verify-codes`
表名:`opendb-verify-codes`
该表的前缀不是uni-id,意味着该表的设计用途是通用的,不管是uni-id的手机号验证码,或者支付等关键业务需要验证码,都使用此表。
......@@ -1164,14 +1164,14 @@ uni-id-common支持在token内缓存用户的角色权限。但是某些情况
`uni-config-center`模块内的uni-id插件内创建`custom-token.js`内容如下:
```js
module.exports = async (tokenObj) => {
module.exports = async (tokenObj) => {
// tokenObj为原始token信息结构如下
// {
// uid: 'abc', // 用户id
// role: [], // 用户角色列表
// permission: [] // 用户权限列表,admin角色的用户权限列表为空数组
// }
tokenObj.customField = 'hello custom token' // 自定义token字段
return tokenObj // 注意务必返回修改后的token对象
}
......@@ -1268,7 +1268,7 @@ const openid = wxOpenid[wxPlatform + '_' + appId] || wxOpenid[wxPlatform]
> 新增于 uni-id-pages 1.0.8
uni-id-co是一个完整的云对象,里面注册登录等流程都已完全实现,开发者不方便进行修改。例如要实现注册时为某端用户统一添加一个角色的功能,只能去修改uni-id-co的代码。因此uni-id-co提供了通过钩子干涉内置逻辑的功能
uni-id钩子函数需要在uni-config-center内配置。在`uni-config-center/uni-id`下创建hooks目录并在其内创建`index.js`内容如下
```js
......@@ -1487,9 +1487,9 @@ module.exports = {
#### 2. 导出用户数据
> 导出文件大小最大不超过 50MB,超过 50MB 请导出多个json文件
>
>
> 如果存在表A关联表B的字段的场景需要保证关联字段在A、B内是一致的(特别需要注意的是各种与_id关联的字段)
>
>
> [参考从文件中导入数据](https://uniapp.dcloud.net.cn/uniCloud/hellodb.html#import)
请将用户数据导出为json格式文件,注意json文件不是标准的json文件,请按照以下格式每行是一个json格式的用户记录导出:
......@@ -1499,7 +1499,7 @@ module.exports = {
```
#### 3. 处理用户数据
> 在 uni-id 中 userId 是系统自动创建的 _id,如果想保留之前用户的userId,可以将用户的 userId 映射为 _id,如果不保留 userId 建议删除 userId 字段,在数据导入中会创建 _id。
>
>
> 注意`password_secret_version`字段,字段值需要修改为自定义密码类型的 `version`
导入到 uni-id 之前,需要处理用户数据与 uni-id 字段的映射关系,见下方 uni-id 字段及说明:
......
......@@ -32,7 +32,7 @@ keyword: 手机号
## 客户端@client
客户端如何使用一键登录请参考此文档:[univerify 使用指南](/univerify)
客户端如何使用一键登录请参考此文档:[univerify 使用指南](https://uniapp.dcloud.net.cn/univerify)
## 云函数@cloud
......@@ -41,16 +41,16 @@ keyword: 手机号
客户端调用一键登录接口会获取如下结果
```js
{
"target": {
"id": "univerify",
"description": "一键登录",
"authResult": {
"openid": "xxx",
"access_token": "xxx"
}
}
}
{
"target": {
"id": "univerify",
"description": "一键登录",
"authResult": {
"openid": "xxx",
"access_token": "xxx"
}
}
}
```
使用上面结果中的`openid``access_token`即可在`云函数`内调用接口获取手机号
......@@ -140,7 +140,7 @@ xhr.send(JSON.stringify({
access_token: 'xxx', // 客户端一键登录接口返回的access_token
openid: 'xxx' // 客户端一键登录接口返回的openid
}));
// 云函数,下面仅展示客户端使用post方式发送content-type为application/json请求的场景
exports.main = async function(event){
let body = event.body
......@@ -198,23 +198,23 @@ const sign = hmac.digest('hex')
// 云函数验证签名,此示例中以接受GET请求为例作演示
const crypto = require('crypto')
exports.main = async function (event){
const secret = 'your-secret-string' // 自己的密钥不要直接使用示例值,且注意不要泄露
const hmac = crypto.createHmac('sha256', secret);
let params = event.queryStringParameters
const sign = params.sign
delete params.sign
const signStr = Object.keys(params).sort().map(key => {
return `${key}=${params[key]}`
}).join('&')
hmac.update(signStr);
if(sign!==hmac.digest('hex')){
throw new Error('非法访问')
}
const {
access_token,
openid
......
......@@ -40,13 +40,13 @@
- 云对象([uni-pay-co](#uni-pay-co)
+ 微信支付
+ 微信APP支付
+ 微信APP支付
+ 微信小程序支付
+ 微信公众号支付
+ 微信手机外部浏览器H5支付
+ 微信PC扫码支付
+ 支付宝支付
+ 支付宝APP支付
+ 支付宝APP支付
+ 支付宝小程序支付
+ 支付宝手机外部浏览器H5支付(支持在微信APP的H5页面中使用支付宝支付)
+ 支付宝PC扫码支付
......@@ -70,10 +70,10 @@
uni-pay云端一体模板,包含前端页面、云对象、云端公共模块、uni-config-center配置、opendb数据表等内容。以及内置于uni-admin的支付统计报表。
### uni-pay的uni_modules
uni-pay的[uni_modules](../plugin/uni_modules.md)中包含了前端页面、云对象和公共模块,目录结构如下:
uni-pay的[uni_modules](https://uniapp.dcloud.net.cn/plugin/uni_modules.html)中包含了前端页面、云对象和公共模块,目录结构如下:
```
├─uni_modules 存放[uni_module](/uni_modules)规范的插件。
├─uni_modules 存放[uni_module](https://uniapp.dcloud.net.cn/uni_modules)规范的插件。
│ ├─其他module
│ └─uni-pay
│ ├─uniCloud
......@@ -99,7 +99,7 @@ uni-pay的[uni_modules](../plugin/uni_modules.md)中包含了前端页面、云
│ │ └─uni-pay uni-pay收银台弹窗组件
│ │ └─uni-pay.vue
│ ├─js_sdk js sdk目录
│ │ └─js_sdk.js
│ │ └─js_sdk.js
│ ├─pages 页面目录
│ │ └─success
│ │ └─success.js 支付成功结果页
......@@ -838,9 +838,9 @@ module.exports = async (obj) => {
} = data; // uni-pay-orders 表内的数据均可获取到
// 此处写你自己的支付成功逻辑开始-----------------------------------------------------------
// 因为金额total_fee是前端传的,因此有被用户篡改的风险,因此需要判断下total_fee的值是否和你业务订单中的金额一致,如果不一致,直接返回 return false;
// 有三种方式
// 方式一:直接写数据库操作
// 方式二:使用 await uniCloud.callFunction 调用其他云函数
......@@ -959,7 +959,7 @@ module.exports = async (obj) => {
let encrypted = payCrypto.aes.encrypt({
data: data, // 待加密的原文
});
await uniCloud.callFunction({
name: "你的云函数名称",
data: {
......@@ -980,7 +980,7 @@ module.exports = async (obj) => {
},
});
*/
// 此处写你自己的支付成功逻辑结束-----------------------------------------------------------
// user_order_success = true 代表你自己的逻辑处理成功 返回 false 代表你自己的处理逻辑失败。
return user_order_success;
......@@ -1015,19 +1015,19 @@ module.exports = async (obj) => {
});
const cloudObject = uniCloud.importObject('你的云对象名称');
await cloudObject.rechargeBalance(encrypted); // 传输加密数据(通过payCrypto.aes.decrypt解密)
// 解密示例
// let decrypted = payCrypto.aes.decrypt({
// data: encrypted, // 待解密的原文
// });
/*
// 方式二安全模式二(只传一个订单号 out_trade_no,你自己的回调里查数据库表 uni-pay-orders 判断 status是否等于1来判断是否真的支付了)
const cloudObject = uniCloud.importObject('你的云对象名称');
await cloudObject.rechargeBalance(out_trade_no);
*/
// 此处写你自己的支付成功逻辑结束-----------------------------------------------------------
// user_order_success = true 代表你自己的逻辑处理成功 返回 false 代表你自己的处理逻辑失败。
return user_order_success;
......@@ -1066,7 +1066,7 @@ module.exports = async (obj) => {
// 此处写你自己的支付成功逻辑开始-----------------------------------------------------------
// 有三种方式
// 方式三:使用 await uniCloud.httpclient.request 调用http接口地址
// 方式三安全模式一(加密)uni-pay的版本需 >= 2.1.0
let encrypted = payCrypto.aes.encrypt({
mode: "aes-256-ecb",
......@@ -1078,7 +1078,7 @@ module.exports = async (obj) => {
encrypted, // 传输加密数据(服务端你再自己解密)
},
});
/*
// 方式三安全模式二(只传一个订单号 out_trade_no,你自己的回调里执行url请求来请求 uni-pay-co 云对象的 getOrder 接口来判断订单是否真的支付了)
await uniCloud.httpclient.request("你的服务器接口请求地址", {
......@@ -1177,17 +1177,17 @@ public class CryptoUtil {
| adpid | uni-ad的广告位ID,若填写,则会在支付成功结果页展示广告(可以增加开发者广告收益) | string | - | - |
| returnUrl | 支付成功后,用户点击【查看订单】按钮时跳转的页面地址,如果不填写此属性,则没有【查看订单】按钮 | string | - | - |
| mainColor | 支付结果页主色调,默认支付宝小程序为#108ee9,其他端均为#01be6e | string | #01be6e | 见下 |
| mode | 收银台模式,插件会自动识别,也可手动传参,mobile 手机模式 pc 电脑模式 | string | 自动识别 | mobile、pc |
| mode | 收银台模式,插件会自动识别,也可手动传参,mobile 手机模式 pc 电脑模式 | string | 自动识别 | mobile、pc |
| logo | 当mode为PC时,展示的logo | string | /static/logo.png | - |
| height | 收银台高度 | string | 70vh | - |
**mainColor值参考:**
- 绿色系 #01be6e
- 蓝色系 #108ee9
- 咖啡色 #816a4e
- 粉红 #fe4070
- 橙黄 #ffac0c
- 绿色系 #01be6e
- 蓝色系 #108ee9
- 咖啡色 #816a4e
- 粉红 #fe4070
- 橙黄 #ffac0c
- 橘黄 #ff7100
- 其他 可自定义
......@@ -1195,22 +1195,22 @@ public class CryptoUtil {
| 事件名 | 说明 | 参数 |
|-------------|---------------------|--------|
| success | 支付成功的回调 | res |
| success | 支付成功的回调 | res |
| cancel | 支付取消的回调 | res |
| fail | 支付失败的回调 | res |
| create | 创建支付订单时的回调(此时用户还未支付) | res |
| fail | 支付失败的回调 | res |
| create | 创建支付订单时的回调(此时用户还未支付) | res |
#### 组件方法
通过 `let res = await this.$refs.pay.xxx();` 方式调用,详情调用方式参考下方的【前端完整示例代码】
| 方法名 | 说明 |
| 方法名 | 说明 |
|---------------------------|---------------------|
| open | 发起支付 - 打开支付收银台弹窗 [查看详情](#create-order) |
| createOrder | 直接发起支付(无收银台) [查看详情](#create-order) |
| getOrder | 查询订单 [查看详情](#get-order) |
| refund | 发起退款(此接口需要权限才可以访问) [查看详情](#refund) |
| getRefund | 查询退款 [查看详情](#get-refund) |
| getRefund | 查询退款 [查看详情](#get-refund) |
| closeOrder | 关闭订单 [查看详情](#close-order) |
| getPayProviderFromCloud | 获取支持的支付供应商 [查看详情](#get-pay-provider-from-cloud) |
| getProviderAppId | 获取支付配置内的appid(主要用于获取微信公众号的appid,用以获取code) [查看详情](#get-provider-appid) |
......@@ -1237,10 +1237,10 @@ public class CryptoUtil {
<!-- #ifdef MP-ALIPAY || H5 || APP -->
<button @click="createOrder('alipay')">直接发起支付宝支付</button>
<!-- #endif -->
<button @click="createQRcode('wxpay')">生成独立支付二维码</button>
<view class="tips">用于把生成的二维码放到自己写的页面中(组件不会弹窗,请从日志中查看二维码base64值)</view>
<button @click="getOrder">查询支付状态</button>
<!--
<button @click="refund">发起退款</button>
......@@ -1414,7 +1414,7 @@ public class CryptoUtil {
let url = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appid}&redirect_uri=${redirect_uri}&response_type=code&scope=${scope}&state=STATE#wechat_redirect`;
window.location.href = url;
}
},
// 获取公众号openid
async getOpenid(data) {
......@@ -1437,13 +1437,13 @@ public class CryptoUtil {
console.log('success: ', res);
if (res.user_order_success) {
// 代表用户已付款,且你自己写的回调成功并正确执行了
} else {
// 代表用户已付款,但你自己写的回调执行成功(通常是因为你的回调代码有问题)
}
}
},
},
computed: {
h5Env(){
// #ifdef H5
......@@ -1482,17 +1482,17 @@ public class CryptoUtil {
button {
margin-top: 20rpx;
}
.label{
margin: 10rpx 0;
}
.tips{
margin-top: 20rpx;
font-size: 24rpx;
color: #565656;
}
</style>
```
......@@ -1537,15 +1537,15 @@ uni-pay前端组件和uni-pay-co云对象的方法是一样的。通常情况下
以下是介绍这些api。
| API | 说明 |
| API | 说明 |
|-----------------|---------------------|
| uniPayCo.createOrder | 创建支付 [查看详情](#create-order) |
| uniPayCo.getOrder | 查询订单 [查看详情](#get-order) |
| uniPayCo.refund | 发起退款(此接口需要权限才可以访问) [查看详情](#refund) |
| uniPayCo.getRefund | 查询退款 [查看详情](#get-refund)|
| uniPayCo.closeOrder | 关闭订单 [查看详情](#close-order) |
| uniPayCo.getPayProviderFromCloud | 获取支持的支付供应商 [查看详情](#get-pay-provider-from-cloud) |
| uniPayCo.getProviderAppId | 获取支付配置内的appid(主要用于获取微信公众号的appid,用以获取code) [查看详情](#get-provider-appid) |
| uniPayCo.refund | 发起退款(此接口需要权限才可以访问) [查看详情](#refund) |
| uniPayCo.getRefund | 查询退款 [查看详情](#get-refund)|
| uniPayCo.closeOrder | 关闭订单 [查看详情](#close-order) |
| uniPayCo.getPayProviderFromCloud | 获取支持的支付供应商 [查看详情](#get-pay-provider-from-cloud) |
| uniPayCo.getProviderAppId | 获取支付配置内的appid(主要用于获取微信公众号的appid,用以获取code) [查看详情](#get-provider-appid) |
| uniPayCo.getOpenid | 根据code获取openid (主要用于微信公众号code换取openid) [查看详情](#get-openid) |
### 创建支付@create-order
......@@ -1630,19 +1630,19 @@ await uniPayCo.createOrder({
```
**参数说明**
| 参数名 | 类型 | 必填 | 说明 |
|-----------------|---------|------|---------------------------|
| provider | string | 是 | 支付供应商 如 wxpay alipay |
| total_fee | int | 是 | 订单总金额,单位为分,100等于1元 |
| type | string | 是 | 订单类型 goods:订单付款 recharge:余额充值付款 vip:vip充值付款 等等,可自定义,主要用于判断走哪个回调逻辑(如商品付款和余额充值的回调逻辑肯定是不一样的) |
| type | string | 是 | 订单类型 goods:订单付款 recharge:余额充值付款 vip:vip充值付款 等等,可自定义,主要用于判断走哪个回调逻辑(如商品付款和余额充值的回调逻辑肯定是不一样的) |
| order_no | string | 是 | 业务系统订单号 建议控制在20-28位(不可以是24位,24位在阿里云空间可能会有问题)(可重复,代表1个业务订单会有多次付款的情况) |
| out_trade_no | string | 否 | 支付插件订单号(需控制唯一,不传则由插件自动生成) |
| description | string | 否 | 支付描述,如:uniCloud个人版包月套餐 |
| qr_code | boolean | 否 | 若设置为 true 则强制开启二维码支付模式 |
| openid | string | 否 | 发起支付的用户openid(微信公众号支付必填,小程序支付等插件会自动获取,无需填写 |
| custom | object | 否 | 自定义参数(不会发送给第三方支付服务器) |
| other | object | 否 | 其他请求参数(会发送给第三方支付服务器) |
| out_trade_no | string | 否 | 支付插件订单号(需控制唯一,不传则由插件自动生成) |
| description | string | 否 | 支付描述,如:uniCloud个人版包月套餐 |
| qr_code | boolean | 否 | 若设置为 true 则强制开启二维码支付模式 |
| openid | string | 否 | 发起支付的用户openid(微信公众号支付必填,小程序支付等插件会自动获取,无需填写 |
| custom | object | 否 | 自定义参数(不会发送给第三方支付服务器) |
| other | object | 否 | 其他请求参数(会发送给第三方支付服务器) |
**返回值**
......@@ -1703,12 +1703,12 @@ await uniPayCo.getOrder({
```
**参数说明**
| 参数名 | 类型 | 必填 | 说明 |
|-----------------|---------|------|---------------------------|
| out_trade_no | string | out_trade_no、transaction_id 二选一 | 插件订单号 |
| transaction_id | string | out_trade_no、transaction_id 二选一 | 第三方支付交易单号 |
| await_notify | boolean | 否 | 默认为false,是否需要等待异步通知执行完成,若为了响应速度,可以设置为false,若需要等待异步回调执行完成,则设置为true |
| await_notify | boolean | 否 | 默认为false,是否需要等待异步通知执行完成,若为了响应速度,可以设置为false,若需要等待异步回调执行完成,则设置为true |
**await_notify = true 适合什么场景?**
......@@ -1754,13 +1754,13 @@ await uniPayCo.refund({
```
**参数说明**
| 参数名 | 类型 | 必填 | 说明 |
|-----------------|---------|------|---------------------------|
| out_trade_no | string | out_trade_no、out_refund_no 二选一 | 插件订单号 |
| out_refund_no | string | out_trade_no、out_refund_no 二选一 | 插件退款订单号 |
| refund_desc | string | 否 | 退款描述 |
| refund_fee | int | 否 | 退款金,单位分 100 = 1元 |
| refund_desc | string | 否 | 退款描述 |
| refund_fee | int | 否 | 退款金,单位分 100 = 1元 |
**返回值**
......@@ -1787,19 +1787,19 @@ await uniPayCo.getRefund({
```
**参数说明**
| 参数名 | 类型 | 必填 | 说明 |
|-----------------|---------|------|---------------------------|
| out_trade_no | string | 是 | 插件订单号 |
**参数说明**
| 参数名 | 类型 | 必填 | 说明 |
|-----------------|---------|------|---------------------------|
| out_trade_no | string | out_trade_no、out_refund_no 二选一 | 插件订单号 |
| out_refund_no | string | out_trade_no、out_refund_no 二选一 | 插件退款订单号 |
| refund_desc | string | 否 | 退款描述 |
| refund_fee | int | 否 | 退款金,单位分 100 = 1元 |
| refund_desc | string | 否 | 退款描述 |
| refund_fee | int | 否 | 退款金,单位分 100 = 1元 |
**返回值**
......@@ -1834,7 +1834,7 @@ await uniPayCo.closeOrder({
```
**参数说明**
| 参数名 | 类型 | 必填 | 说明 |
|-----------------|---------|------|---------------------------|
| out_trade_no | string | 是 | 插件订单号 |
......@@ -1891,7 +1891,7 @@ await uniPayCo.getProviderAppId({
```
**参数说明**
| 参数名 | 类型 | 必填 | 说明 |
|-----------------|---------|------|---------------------------|
| provider | string | 是 | 支付供应商 如 wxpay alipay |
......@@ -1928,7 +1928,7 @@ await uniPayCo.getOpenid({
```
**参数说明**
| 参数名 | 类型 | 必填 | 说明 |
|-----------------|---------|------|---------------------------|
| provider | string | 是 | 支付供应商 如 wxpay alipay |
......@@ -1967,7 +1967,7 @@ this.$refs.pay.createOrder({
custom: {}
});
```
[点击查看ios内购注意事项](#tips-appleiap)
完整ios内购支付示例代码
......@@ -1986,7 +1986,7 @@ this.$refs.pay.createOrder({
<view class="uni-padding-wrap">
<button class="btn-pay" @click="createOrder" :loading="loading" :disabled="disabled">立即支付</button>
</view>
<!-- 统一支付组件,注意:vue3下ref不可以等于组件名,因此这里ref="pay" 而不能是 ref="uniPay" -->
<uni-pay ref="pay" :debug="true" :adpid="adpid" return-url="/pages/order-detail/order-detail" @mounted="onMounted" @success="onSuccess"></uni-pay>
</view>
......@@ -1999,7 +1999,7 @@ this.$refs.pay.createOrder({
order_no: "", // 业务系统订单号(即你自己业务系统的订单表的订单号)
out_trade_no: "", // 插件支付单号
adpid: "1000000001", // uni-ad的广告位id
loading: false, // 支付按钮是否在loading中
disabled: true, // 支付按钮是否禁用
productid: "", // 用户选择的商品id
......@@ -2021,7 +2021,7 @@ this.$refs.pay.createOrder({
}
},
onLoad: function() {
},
onShow() {
if (this.$refs.pay && this.$refs.pay.appleiapRestore) {
......@@ -2068,13 +2068,13 @@ this.$refs.pay.createOrder({
console.log('success: ', res);
if (res.user_order_success) {
// 代表用户已付款,且你自己写的回调成功并正确执行了
} else {
// 代表用户已付款,但你自己写的回调执行失败(通常是因为你的回调代码有问题)
}
},
// 监听-多选框选中的值改变
applePriceChange(e) {
this.productid = e.detail.value;
......@@ -2285,7 +2285,7 @@ APP支付除了配置uni-pay的支付配置外,还需要打包时添加支付
6. 目前hbx版本热刷新会导致ios支付无法正常调用,因此每次修改完代码保存后,需要先关闭手机App,然后hbx重启项目,再打开手机app。(后面HBX会修复此问题)
## 全局错误码@errorcode
| 错误模块 | 错误码 | 说明 |
|---------|-------------|---------------------------|
| uni-pay | 50403 | 当前登录用户的角色权限不足 |
......
......@@ -10,7 +10,7 @@
unicloud的MongoDB数据库,对地理位置查询,提供了比传统数据库更方便的GEO查询方案,比如可以直接查询附近的POI信息。(Point of Interest,地图上的兴趣点)
DCloud之前已推出各种云端一体组件,基于[datacom规范](/component/datacom.md),组件在客户端可以直接连数据库。
DCloud之前已推出各种云端一体组件,基于[datacom规范](https://uniapp.dcloud.net.cn/component/datacom.html),组件在客户端可以直接连数据库。
现在进一步封装了地图的datacom组件,将前端地图组件和云端数据库连起来,只需写一个`<unicloud-map>`组件,就可以直接从数据库里拉出附近的POI信息,并显示在地图上。
......@@ -37,7 +37,7 @@ unicloud-map云端一体组件,主要用于显示数据库里的自定义POI
```vue
<template>
<view>
<unicloud-map
ref="map"
:where="where"
......@@ -48,7 +48,7 @@ unicloud-map云端一体组件,主要用于显示数据库里的自定义POI
:default-icon="defaultIcon"
:custom-icons="customIcons"
></unicloud-map>
</view>
</template>
......@@ -58,7 +58,7 @@ export default {
return {
// 查询条件
where:{
},
// 你的经纬度,可通过uni.getLocation获取,注意type需传gcj02,同时在电脑端运行时获取到的经纬度是不准的
latitude: 39.908823,
......@@ -90,21 +90,21 @@ export default {
```vue
<template>
<view class="page">
<unicloud-map
ref="map"
:debug="false"
<unicloud-map
ref="map"
:debug="false"
loadtime="auto"
collection="opendb-poi"
:where="where"
:width="750"
:height="heightCom"
:latitude="latitude"
:longitude="longitude"
collection="opendb-poi"
:where="where"
:width="750"
:height="heightCom"
:latitude="latitude"
:longitude="longitude"
:scale="13"
:poi-maximum="100"
:default-icon="defaultIcon"
:custom-icons="customIcons"
:poi-maximum="100"
:default-icon="defaultIcon"
:custom-icons="customIcons"
:enable-scroll="true"
:enable-zoom="true"
:show-compass="true"
......@@ -119,7 +119,7 @@ export default {
<button @click="show2" size="mini" class="btn">只显示总部</button>
<button @click="show3" size="mini" class="btn">显示总部+门店</button>
</view>
</view>
</template>
......@@ -261,41 +261,41 @@ export default {
<template>
<view class="page">
<unicloud-map
<unicloud-map
ref="map"
:debug="false"
:debug="false"
loadtime="auto"
collection="opendb-poi"
:where="where"
:width="750"
:height="heightCom"
:latitude="latitude"
:longitude="longitude"
:scale="13"
collection="opendb-poi"
:where="where"
:width="750"
:height="heightCom"
:latitude="latitude"
:longitude="longitude"
:scale="13"
:poi-maximum="100"
:default-icon="defaultIcon"
:custom-icons="customIcons"
:enable-scroll="true"
:enable-zoom="true"
:show-compass="true"
:show-location="true"
:custom-icons="customIcons"
:enable-scroll="true"
:enable-zoom="true"
:show-compass="true"
:show-location="true"
></unicloud-map>
<view class="btn-box first">
<button @click="initData" size="mini" class="btn">初始化配送点</button>
<button @click="virtuallyTest" size="mini" class="btn">模拟配送(上报位置)</button>
</view>
<view class="btn-box">
<button @click="start" size="mini" class="btn" v-if="!isStart">开启监听</button>
<button @click="stop" size="mini" class="btn" v-else>暂停监听</button>
<button @click="stop" size="mini" class="btn" v-else>暂停监听</button>
</view>
</view>
</template>
<script>
var timer;
const uniMapCo = uniCloud.importObject('uni-map-co', {
customUI: true
});
......@@ -323,7 +323,7 @@ export default {
}
},
onLoad() {
},
onUnload() {
this.stop();
......@@ -362,7 +362,7 @@ export default {
await this.$refs.map.refresh({
needIncludePoints: true
});
let res = await uniMapCo.getPolyline();
if (res.end) {
await this.$refs.map.refresh({
......@@ -516,10 +516,10 @@ export default {
使用这些方法前,需要在组件先声明 `ref="map"`
```vue
<unicloud-map
<unicloud-map
ref="map"
...其他属性
</unicloud-map>
</unicloud-map>
```
**refresh**
......@@ -555,7 +555,7 @@ this.$refs.map.setMarkers(markers);
**getPolyline**
获取组件内的polyline
获取组件内的polyline
示例
......@@ -576,7 +576,7 @@ this.$refs.map.setPolyline(polyline);
**getCircles**
获取组件内的circles
获取组件内的circles
示例
......@@ -624,6 +624,6 @@ unicloud-map需要创建以下表后才能正常运行,可以右键插件datab
- 地图POI表 [opendb-poi](https://gitee.com/dcloud/opendb/blob/master/collection/opendb-poi/collection.json)
### 三方定位和地图服务收费说明@fee
### 三方定位和地图服务收费说明@fee
unicloud-map是免费的,但高德、腾讯、百度等地图的使用需向地图厂商采购商业授权。DCloud与地图厂商达成合作,可更优惠的给开发者提供地图服务。[详见](https://uniapp.dcloud.net.cn/component/map.html#%E4%B8%89%E6%96%B9%E5%AE%9A%E4%BD%8D%E5%92%8C%E5%9C%B0%E5%9B%BE%E6%9C%8D%E5%8A%A1%E6%94%B6%E8%B4%B9%E8%AF%B4%E6%98%8E)
......@@ -32,7 +32,7 @@ keyword: 手机号
## 客户端@client
客户端如何使用一键登录请参考此文档:[univerify 使用指南](/univerify)
客户端如何使用一键登录请参考此文档:[univerify 使用指南](https://uniapp.dcloud.net.cn/univerify)
## 云函数@cloud
......@@ -41,16 +41,16 @@ keyword: 手机号
客户端调用一键登录接口会获取如下结果
```js
{
"target": {
"id": "univerify",
"description": "一键登录",
"authResult": {
"openid": "xxx",
"access_token": "xxx"
}
}
}
{
"target": {
"id": "univerify",
"description": "一键登录",
"authResult": {
"openid": "xxx",
"access_token": "xxx"
}
}
}
```
使用上面结果中的`openid``access_token`即可在`云函数`内调用接口获取手机号
......@@ -142,7 +142,7 @@ xhr.send(JSON.stringify({
access_token: 'xxx', // 客户端一键登录接口返回的access_token
openid: 'xxx' // 客户端一键登录接口返回的openid
}));
// 云函数,下面仅展示客户端使用post方式发送content-type为application/json请求的场景
exports.main = async function(event){
let body = event.body
......@@ -202,23 +202,23 @@ const sign = hmac.digest('hex')
// 云函数验证签名,此示例中以接受GET请求为例作演示
const crypto = require('crypto')
exports.main = async function (event){
const secret = 'your-secret-string' // 自己的密钥不要直接使用示例值,且注意不要泄露
const hmac = crypto.createHmac('sha256', secret);
let params = event.queryStringParameters
const sign = params.sign
delete params.sign
const signStr = Object.keys(params).sort().map(key => {
return `${key}=${params[key]}`
}).join('&')
hmac.update(signStr);
if(sign!==hmac.digest('hex')){
throw new Error('非法访问')
}
const {
access_token,
openid
......@@ -267,7 +267,7 @@ exports.main = async function (event){
```
云函数费用(天) = 资源使用量 * 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.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(元)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册