1 小程序
1.1 [0]环境:app
01.常用信息1
a.官方:JS基础模版
a.生成package.json文件
npm init -y
b.安装依赖
npm install @vant/weapp dayjs decimal.js lodash qs ramda validator weapp-qrcode --save
b.官方:TS基础模版
a.生成package.json文件
npm init -y
b.安装依赖
npm install @vant/weapp dayjs decimal.js lodash-es qs ramda validator weapp-qrcode --save
02.常用信息2
a.mini
a.默认,只能npm编译
微信开发者工具 -> 工具 -> 构建npm
-------------------------------------------------------------------------------------------------
默认生成 miniprogram_npm 文件夹
b.ts编译,则需要开启预处理
报错:
VM1238:1 /bin/sh: npm: command not found
-------------------------------------------------------------------------------------------------
解决:
详情 => 本地设置 => 编译/预览/上传前,预处理
source $HOME/.bash_profile;npm run tsc
source $HOME/.bashrc;npm run tsc
source $HOME/.zshrc;npm run tsc
b.http请求
a.方案
方案 可行性 说明
使用官方 wx.request 可行 小程序原生 API,稳定、无需额外依赖
封装 wx.request 可行 统一请求、错误处理,可实现拦截器等功能
引入适配版 axios 可行 如 axios-for-mpweixin、axios-miniprogram-adapter,保留语法习惯
直接用 axios@0.26.1 不可行 缺少浏览器环境,无法运行
b.最终选型
封装 wx.request
03.常用信息3
a.分包:subpack
a.限制
1.主包:包含小程序的启动页、TabBar 页面以及所有分包都需要用到的公共资源和代码 单个分包(或主包)大小不得超过 2MB
2.分包:根据功能模块拆分出来的代码包,每个分包可以包含多个页面和相关资源 所有分包及主包的总大小不能超过 20MB(限制随微信调整)
b.分包的加载机制
主包会在小程序启动时加载
分包在用户访问到分包内的页面时才会被下载
同一个分包内的页面共享该分包的资源
c.独立分包
可以独立于主包运行的分包
不需要下载主包即可运行
适合作为小程序的入口页面,进一步提升启动速度
b.默认,相对路径
a.说明
在微信小程序中,默认不支持直接使用绝对路径引入文件,
但可以通过配置 app.json 中的 usingComponents 和 resolveAlias(小程序基础库 2.24.0 及以上支持)来实现类似绝对路径的引入效果。
b.最终效果:app.json
"resolveAlias": {
"@assets/*": "/assets/*",
"@components/*": "/components/*",
"@modules/*": "/modules/*",
"@system/*": "/system/*",
"@utils/*": "/utils/*",
"@/*": "/*"
}
04.常用信息4
a.常见选项
a.方法1: 开发者工具设置(推荐)
打开微信开发者工具
点击右上角 "详情" 按钮
在左侧选择 "本地设置"
勾选以下两个选项:
"不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书"
"不校验请求域名、TLS 版本以及 HTTPS 证书"
b.方法2: 配置完成后测试
重新打开页面,现在应该会看到:
控制台显示开发环境配置提示
不再出现域名白名单错误
自动登录功能正常工作
c.设置代理
打开微信开发者工具的 设置 -> 代理。
检查你是否配置了“手动设置代理”。如果是,请确认代理设置是否正确。
b.构建app.json
a.说明
自动分包扫描系统:系统会自动扫描 pages/ 目录下的所有子目录(除了 app 主包)
页面有效性检查:每个页面必须包含三个必需文件:index.js、index.wxml、index.json
分包自动命名:使用 {目录名}-apps 格式命名分包
问题是:我们需要重新构建 app.json 才能让新页面生效!
b.根据文档,修改后需要运行构建命令
# 重新构建 app.json
npm run build:app-json
# 或直接运行构建脚本
node system/app.js --build
c.校验规则
a.规则
ESLint - 代码质量检查
Prettier - 代码格式化
TypeScript - 类型检查
Stylelint - CSS/SCSS 代码规范
b.重载
现在请重新加载 VSCode 窗口(Cmd+Shift+P -> "Reload Window")让所有设置生效。
1.2 [1]引擎:skyline
00.汇总
底层就是flutter
01.发展
a.说明1
随着微信小程序的不断发展,用户对小程序的性能和体验要求也越来越高。
为了满足这些需求,官方推出了 Skyline 渲染引擎,为小程序带来了更流畅的渲染效果、更高的性能表现和更好的开发者体验。
b.说明2
Skyline 具体支持版本如下
正式稳定版:微信小程序基础库 3.0.0+(2023年7月)
c.说明3
最低适配要求
微信安卓:8.0.33+(对应基础库为 2.30.4+)
微信 iOS:8.0.34+(对应基础库为 2.31.1+)
开发者工具:Stable 1.06.2307260+(建议使用 Nightly 最新版)
02.Skyline渲染引擎
a.什么是 Skyline 渲染引擎
微信小程序 Skyline 渲染引擎是微信团队推出的新一代渲染架构,旨在解决传统 WebView 渲染模式下的性能瓶颈。
与传统的 WebView 渲染引擎相比,Skyline 渲染引擎在渲染速度、内存占用和动画效果等方面都有显著的提升。
b.为什么要推出 Skyline 渲染引擎
小程序运行环境分成渲染层和逻辑层,由2个线程管理:
渲染层的界面使用了WebView线程进行渲染,其中 WXML 模板和 WXSS 样式工作在渲染层;
逻辑层采用JSCore线程运行JS脚本;
-----------------------------------------------------------------------------------------------------
一个小程序存在多个界面,所以渲染层存在多个WebView线程,这两个线程的通信会经由微信客户端做中转,逻辑层发送网络请求也经由Native转发。
c.当小程序基于 WebView 环境下时存在问题
WebView 的 JS 逻辑、DOM 树创建、CSS 解析、样式计算、Layout、Paint (Composite) 都发生在同一线程,在 WebView 上执行过多的 JS 逻辑可能阻塞渲染,导致界面卡顿;
每个页面都需要实例化一个 JS 引擎(WebView),导致内存占用多,影响应用性能,因此小程序对打开的页面数量有限制(页面栈最多10个);
页面之间共享资源,需要使用Native进行通信,就会消耗更多性能;
03.Skyline 渲染引擎架构
a.说明
在 Skyline 环境下,Skyline 创建了一条渲染线程来负责 Layout、 Composite 和 Paint 等渲染任务,
并在 AppService 中划出一个独立的上下文,来运行之前 WebView 承担的 JS 逻辑、DOM 树创建等逻辑。
b.核心线程职责
AppService 线程:负责逻辑层与视图层的“协调中枢”,确定需更新内容及更新方式
渲染线程:负责将业务逻辑转化为界面更新,提升渲染性能
Raster 线程:负责“最终像素生成”,通过分块、缓存和 GPU 加速,提升页面渲染速度和流畅度
c.整个过程三个线程是怎么协作的?
举个真实开发场景:用户点击按钮,触发setData修改文字颜色,页面更新。
用户点击按钮 → 渲染线程捕获触摸事件 → 包装成事件数据(“点击了 id=btn 的按钮”) → 传给 AppService 线程。
AppService 线程执行onTap回调 → 调用setData({ color: 'red' }) → 修改虚拟节点树的样式属性 → 通知渲染线程 “有样式变更”。
渲染线程收到通知 → 重新计算受影响节点的样式(文字颜色变红) → 重新布局(尺寸不变) → 生成新的绘制指令(“文字层颜色改为红色”) → 传给 Raster 线程。
Raster 线程光栅化新的文字层 → 返回位图 → 渲染线程合成新画面 → 屏幕显示更新后的文字。
04.新特性
a.自定义路由
小程序采用多 WebView 架构,页面间跳转形式十分单一,仅能从右到左进行动画。
而原生 App 的动画形式则多种多样,如从底部弹起,页面下沉,半屏等。
-----------------------------------------------------------------------------------------------------
Skyline 渲染引擎下,页面有两种渲染模式: WebView 和 Skyline,它们通过页面配置中的 renderer 字段进行区分。
在连续的 Skyline 页面间跳转时,可实现自定义路由效果。
-----------------------------------------------------------------------------------------------------
仅需在路由跳转时,指定对应的 routeType
// 基础库预设了一批常见的路由动画效果:
wx://bottom-sheet 半屏弹窗
wx://upwards 向上进入
wx://zoom 放大进入
wx.navigateTo({
url: 'xxx',
routeType: 'wx://modal'
})
b.截图组件 snapshot
支持将其子节点的渲染结果导出成图片,如分享海报功能
多数小程序用 canvas 做自定义分享图,不仅需手动写绘图指令,布局复杂或做长图时还受尺寸限制,成本很高。
而 Skyline 凭借渲染可控性,可直接对 WXML 子树截图,官方提供的截图组件能复用 WXSS 能力,大幅降低开发成本。
c.长列表按需渲染 scroll-view
长列表是一个常用的但又经常遇到性能瓶颈的场景,WebView 下的 scroll-view 组件,
在快速滑动时容易出现白屏和渲染卡顿。对于长列表的优化,通常离不开按需渲染,即理想状态下仅渲染在屏可视区域节点,超出可视区域的节点及时进行回收。
d.瀑布流组件 grid-view
瀑布流是一种常用的列表布局方式,得益于 Skyline 在布局过程中的可控性,官方直接在底层实现并提供出来,渲染性能要比 WebView 更优。
05.总结
a.核心优势
多线程架构:渲染与逻辑线程分离,解决传统 WebView 单线程卡顿问题
性能提升:多页面共享引擎节省内存(无页面栈限制),减少数据通信开销,setData 延迟更低,内存占用减少约 30%
原生交互体验:支持复杂手势、吸顶布局、自定义路由动画等类原生效果,优化 scroll-view、瀑布流等高频场景渲染效率
渐进式适配:现有代码可通过简单配置启用,无需重写逻辑
b.使用建议
若项目侧重动画、交互或复杂布局,追求高性能且面向高版本用户,优先用 Skyline
需兼容老版本、快速上线或页面结构复杂时,可继续用 WebView 或混合适配
Skyline 性能优势明显,生态也随着持续迭代不断成熟,建议按需评估场景,关注官方最新进展以更好地发挥其能力
1.3 [1]分包:subpack
01.设计说明
a.说明
在微信小程序中,subpackages(分包加载)是一种优化小程序加载性能的机制。
它允许你将小程序的代码和资源拆分成多个包,实现按需加载,从而减小主包体积,提升小程序的启动速度。
b.核心概念
1.主包:包含小程序的启动页、TabBar 页面以及所有分包都需要用到的公共资源和代码 单个分包(或主包)大小不得超过 2MB
2.分包:根据功能模块拆分出来的代码包,每个分包可以包含多个页面和相关资源 所有分包及主包的总大小不能超过 20MB(限制随微信调整)
c.为什么使用分包
小程序有体积限制(主包大小不超过 2MB,整体所有包不超过 20MB)
减少初始加载时间,提升用户体验
按功能模块隔离代码,便于团队协作和维护
将代码和资源分成多个包,每个包被独立管理和打包,访问时再按需下载对应包资源
d.优势体现
提高首次启动速度
降低整体加载流量消耗
减少运行时内存占用,提高性能
02.如何配置分包
a.分包的目录结构
├── app.js
├── app.json
├── app.wxss
├── pages // 主包页面
│ ├── index
│ └── logs
├── packageA // 分包A
│ └── pages
│ ├── cat
│ └── dog
└── packageB // 分包B
└── pages
└── apple
b.app.json配置subpackages
{
"pages": [
"pages/index/index", // 主包页面
"pages/logs/logs" // 主包页面
],
"subpackages": [
{
"root": "packageA", // 分包根目录
"name": "packA", // 分包别名(可选)
"pages": [
"pages/cat/cat", // 分包页面路径,相对于 root
"pages/dog/dog"
],
"independent": false // 是否为独立分包(可选,默认false)
},
{
"root": "packageB",
"pages": [
"pages/apple/apple"
]
}
]
}
c.分包的加载机制
主包会在小程序启动时加载
分包在用户访问到分包内的页面时才会被下载
同一个分包内的页面共享该分包的资源
d.独立分包
可以独立于主包运行的分包
不需要下载主包即可运行
适合作为小程序的入口页面,进一步提升启动速度
1.4 [1]编译:typescript
01.常用信息1
a.原生支持TypeScript
a.说明1
小程序代码包要求代码文件为 wxml / wxss / js / json / wxs。
如果我们希望使用 TypeScript 或 less 去开发小程序,
就需要将 ts 文件或 less 文件编译成对应的 js 文件 或 wxss 文件,这个编译过程以前是需要开发者在工具外自行配置。
从开发者工具 1.05.2109101 以上开始,我们优化工具内置的编译模块,支持以编译插件的形式,扩展编译功能。
b.说明2
使用这种方式有两个好处:
项目内只需要创建 ts 文件即可,无需再生成同名的 js 文件。less 文件同理。
编译流程由开发者工具控制,按需编译,开发体验更好。
c.说明3
详情 => 本地设置 => 编译/预览/上传前,预处理
npm run tsc --win10
source $HOME/.bash_profile;npm run tsc --bash_profile
source $HOME/.bashrc;npm run tsc --bashrc
source $HOME/.zshrc;npm run tsc --zshrc
b.开始使用
a.旧项目
在 project.config.json 文件中,修改 setting 下的 useCompilerPlugins 字段为 ["typescript"],即可开启工具内置的 typescript 编译插件。
如需同时开启 less 编译插件,可将该字段修改为 ["typescript", "less"],目前支持三个编译插件:typescript、less、sass
b.新建项目
可在创建小程序项目时,选择对应的语言模板。 目前支持的语言模板有
TypeScript
TypeScript + Less
TypeScript + Sass
c.TS声明文件更新
从 开发者工具 1.05.2203032 以上开始,如果是从上述的模板创建的TS项目,遇到小程序相关类型声明过时的情况,可以手动更新。
具体步骤是在编辑器目录树上,找到 typings/types/wx 目录,右键,点击「更新声明文件」即可
02.常用信息2
a.问题
a.描述
状态:你删除 pages/index/index.js 后,运行时缺少可执行 JS。
当前微信开发者工具未把 .ts 自动编译成 .js,所以页面报错。util.js 的 @deprecated 只是提示,不影响运行。
b.修复1:让 tsc 产出 .js 到源目录,保证任何环境都能跑
a.修改 libra-wx/tsconfig.json(仅关键项)
"outDir": "./"
"include": [".//.ts"]
"exclude": ["node_modules","miniprogram_npm"]
可再加:"declaration": false, "sourceMap": false
b.在 libra-wx/package.json 增加脚本
"build": "tsc --pretty false -p tsconfig.json"
"watch": "tsc -w -p tsconfig.json"
c.执行构建
cd /Volumes/Samsung/software_xare/libra-boot-test/libra-wx
npm run build
结果:自动生成 pages/index/index.js、app.js 等,页面恢复正常。
c.修复2:使用微信开发者工具内置 TS 编译(不产出 .js 文件)
a.打开微信开发者工具 → 详情 → 本地设置:
勾选:使用 npm 模块、增强编译
开启 TypeScript/编译 TypeScript
b.保留 .ts 文件
删除多余的同名 .js(你已删除 index.js 即可)
c.工具 → 构建 npm(Vant 组件后续再开)
d.补充检查
a.app.ts 是否已编译为 app.js
方案 A 自动生成;方案 B 由开发者工具编译
b.pages/index/index.json 仍然有效
且未引用不存在的全局组件
c.check-status.js 显示 npm 包需构建
再在工具中“构建 npm”
b.微信小程序:内置TS编译
a.开启 TypeScript 编译支持
右上角 -> 详情 -> 勾选以下选项:使用 npm 模块、增强编译、启用 TypeScript 编译(这是关键)
b.项目配置调整 project.config.json
{
"setting": {
"es6": true,
"enhance": true,
"nodeModules": true,
// ... 其他设置
}
}
c.重要:重新编译项目
开启 TypeScript 编译后:在微信开发者工具中按 Ctrl+Shift+R(或 Cmd+Shift+R)强制刷新
或者关闭项目重新打开
d.验证编译是否生效
编译成功后,你会看到:控制台没有 "找不到 index.js" 的错误
页面能正常显示,TypeScript 代码能正常运行
e.如果仍然报错
如果上述步骤后仍然报错,可能需要:
暂时创建一个空的 pages/index/index.js 文件(内容为空即可)
等工具识别到 TypeScript 编译后,再删除这个空文件
f.关键点说明:
不需要修改 tsconfig.json 的 outDir
不需要手动运行 tsc 命令
工具会在内存中编译 TS,不产出实际 .js 文件
确保 TypeScript 编译选项已正确开启
c.手动编译生成 .js 文件
a.tsconfig.json
{
"compilerOptions": {
"outDir": "./", // 修改1
"include": [
"./**/*.ts" // 修改2
],
"exclude": [
"node_modules",
"miniprogram_npm" // 修改3
]
}
b.现在的工作流程
开发时:编辑 .ts 文件
编译时:运行 npm run build 生成 .js 文件
调试时:在微信开发者工具中预览
c.推荐的开发模式:
方式一:手动编译,npm run build # 编译一次
方式二:监听模式(推荐),npm run dev # 自动监听 .ts 文件变化并编译
c.功能说明
a.说明
目前的 ts 代码转换成 js 代码的逻辑,是由 @babel/plugin-transform-typescript 插件进行处理的,
因此在编译过程中,仅仅是移除了ts代码中类型声明等信息。类型错误这类信息,在编译过程是没有提示的,只在编辑器中给予提示的。
启用 typescript 编译插件后,js 文件也是支持的,如果存在同名的 ts 和 js 文件,则优先使用 ts 文件。
除了普通小程序,小程序插件开发也是支持的。
miniprogram-ci 从 1.6.1 版本开始,也支持此功能。
b.less 使用全局变量
从开发者工具 1.06.2403132 以上开始,支持 less 直接引用 app.less 中声明的变量和方法,编译器会默认为所有的非 app.less 文件增加引用
-------------------------------------------------------------------------------------------------
@import (optional, reference) '/app.less';
-------------------------------------------------------------------------------------------------
// app.less
@redcolor: red;
.blue {
color: blue;
}
-------------------------------------------------------------------------------------------------
// 页面.less
.red {
color: @redcolor; // 直接使用 app.less 中定义的变量
}
c.sass 使用全局变量
从开发者工具 1.06.2403132 以上开始,支持 sass 直接引用全局变量和方法,和 less 不同,
我们需要新增一个 global.scss 文件放置在 app.scss 同级,将公共的变量和方法写在 global.scss 中,
编译器会默认为所有的非 global.scss 文件增加引用。
-------------------------------------------------------------------------------------------------
@use '/global.scss';
-------------------------------------------------------------------------------------------------
// global.scss
$red: red;
-------------------------------------------------------------------------------------------------
// 其他.scss
.red {
color: global.$red; // 使用 global 中的变量
}
d.20250917,微信小程序TS不编译的问题
a.描述
看了一眼js文件,才发现是TS并没有编译成JS
新建项目的时候用的就是TS的模板,所以相关的依赖都是全的,如果你的不是,那这里并不能解决你的疑惑。
b.解决方案
TS(typescript)的是需要走自定义编译流程,才能编译成JS
具体的操作是:详情 -> 本地设置 -> 项目设置 ->往下滑,直到"启用自定义处理命令" -> 打钩 -> 并在编译/预览/上传前预处理,填入 npm run tsc
然后清理编译缓存,再点一下编译
c.package.json
{
"name": "miniprogram-ts-quickstart",
"version": "1.0.0",
"description": "",
"scripts": {
"compile": "./node_modules/typescript/bin/tsc",
"tsc": "node ./node_modules/typescript/lib/tsc.js"
},
"keywords": [],
"author": "",
"license": "",
"dependencies": {},
"devDependencies": {
"miniprogram-api-typings": "^2.8.3-1",
"typescript": "^3.3.3333"
}
}
d.tsconfig.json
{
"compilerOptions": {
"strictNullChecks": true,
"noImplicitAny": true,
"module": "CommonJS",
"target": "ES5",
"allowJs": false,
"experimentalDecorators": true,
"noImplicitThis": true,
"noImplicitReturns": true,
"alwaysStrict": true,
"inlineSourceMap": true,
"inlineSources": true,
"noFallthroughCasesInSwitch": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"strict": true,
"removeComments": true,
"pretty": true,
"strictPropertyInitialization": true,
"lib": ["es5"],
"typeRoots": [
"./typings"
]
},
"include": [
"./**/*.ts"
],
"exclude": [
"node_modules"
]
}
e.project.config.json(appid已经隐藏)
{
"description": "项目配置文件",
"packOptions": {
"ignore": []
},
"miniprogramRoot": "miniprogram/",
"compileType": "miniprogram",
"libVersion": "2.8.2",
"projectname": "wechat-hello",
"scripts": {
"beforeCompile": "npm run tsc",
"beforePreview": "npm run tsc",
"beforeUpload": "npm run tsc"
},
"setting": {
"urlCheck": true,
"es6": true,
"enhance": false,
"postcss": true,
"preloadBackgroundData": false,
"minified": true,
"newFeature": false,
"coverView": true,
"nodeModules": false,
"autoAudits": false,
"showShadowRootInWxmlPanel": true,
"scopeDataCheck": false,
"uglifyFileName": false,
"checkInvalidKey": true,
"checkSiteMap": true,
"uploadWithSourceMap": true,
"compileHotReLoad": false,
"useMultiFrameRuntime": true,
"useApiHook": true,
"useApiHostProcess": false,
"babelSetting": {
"ignore": [],
"disablePlugins": [],
"outputPath": ""
},
"enableEngineNative": false,
"bundle": false,
"useIsolateContext": true,
"useCompilerModule": true,
"userConfirmedUseCompilerModuleSwitch": false,
"userConfirmedBundleSwitch": false,
"packNpmManually": false,
"packNpmRelationList": [],
"minifyWXSS": true
},
"simulatorType": "wechat",
"simulatorPluginLibVersion": {},
"appid": "******",
"condition": {}
}
03.常用信息3
a.问题
a.描述
mac使用zsh的nvm插件安装的node,node npm在命令行都执行正确,但是在开发者工具提示找不到
b.报错
VM1238:1 /bin/sh: npm: command not found
b.方案1
a.描述
npm 和 node 都需要软链到 /usr/local/bin/ 目录下,即该目录下需要 node 和 npm
/usr/local/bin/npm
/usr/local/bin/node
b.解决
# 打开命令行终端,输入:
which npm
# 应该会显示
Users/xxxx/.nvm/versions/node/v10.15.3/bin/npm
# 做一个替身到/usr/local/bin下
sudo ln -s /Users/xxx/.nvm/versions/node/v10.15.3/bin/npm /usr/local/bin/npm
c.方案2
a.描述
貌似用nvm安装的 都有这个问题,还是你这个叼,完美解决了问题,
b.解决
详情 => 本地设置 => 编译/预览/上传前,预处理
source $HOME/.bash_profile;npm run tsc
source $HOME/.bashrc;npm run tsc
source $HOME/.zshrc;npm run tsc
1.5 [1]配置:app.json
00.汇总
a.区别
维度 全局配置(app.json) 页面配置(page.json)
作用范围 整个小程序所有页面 仅当前页面
配置权限 可配置 pages、tabBar、window 等 仅可覆盖 window 及配置页面独有属性
优先级 低(页面配置会覆盖同名 window 配置) 高(同名配置优先生效)
使用场景 统一小程序基础样式、路由、权限 定制单个页面的特殊样式或行为
b.为什么配置了 tabBar,页面却不显示标签栏?
需确保页面路由在 tabBar.list.pagePath 中,且 pages 数组中存在该路由。
c.为什么页面无法滚动?
检查是否在页面配置中设置了 disableScroll: true,或页面内容被 scroll-view 包裹且未设置滚动属性。
d.自定义组件在页面中不生效?
需在页面配置的 usingComponents 中正确声明组件路径,路径需从根目录开始(如 /components/xxx/xxx)
01.全局配置(app.json)
a.说明
全局配置通过根目录下的 app.json 文件定义,作用于整个小程序的所有页面,
决定小程序的基础框架、窗口默认样式、页面路由等核心属性。
开发者无需手动引入,微信开发者工具会自动识别并加载。
b.核心配置项与说明
配置项 类型 作用与取值说明
pages Array<string> 必填,定义小程序的所有页面路由,数组第一个元素为「首页」。<br>格式:["pages/index/index", "pages/logs/logs"](每个路径对应页面的文件夹路径)。
window Object 配置小程序默认窗口样式(如导航栏、背景色等),页面配置可覆盖此部分。
tabBar Object 配置小程序的「底部/顶部标签栏」(如首页、我的),仅当页面在 tabBar.list 中时才显示标签栏。
networkTimeout Object 配置网络请求的超时时间(如 request 超时、downloadFile 超时),单位:毫秒。
permission Object 配置小程序需要获取的系统权限(如地理位置、相机、麦克风),需提前在微信公众平台申请。
requiredBackgroundModes Array<string> 配置小程序「后台运行能力」(如音乐播放、定位),需在公众平台申请,取值:["audio", "location"]。
c.window配置项:控制窗口默认样式
子配置项 类型 作用示例
navigationBarTitleText string 导航栏标题文字(如“首页”)
navigationBarBackgroundColor string 导航栏背景色(需用十六进制,如 `#ffffff`)
navigationBarTextStyle string 导航栏标题颜色,仅支持 `black` / `white`
backgroundColor string 页面背景色(下拉刷新时显示的背景)
enablePullDownRefresh boolean 是否全局开启下拉刷新(默认 `false`),页面可单独关闭
d.tabBar配置项:控制标签栏
子配置项 类型 作用示例
position string 标签栏位置,支持 `bottom`(默认,底部)/ `top`(顶部,不显示图标)
color string 未选中标签的文字颜色(十六进制)
selectedColor string 选中标签的文字颜色(十六进制)
backgroundColor string 标签栏背景色(十六进制)
list Array<Object> 必填,标签列表(至少2个,最多5个),每个标签包含:
pagePath:页面路由(必须在 `pages` 中定义)
text:标签文字
iconPath:未选中时的图标路径
selectedIconPath:选中时的图标路径
02.页面配置(page.json)
a.说明
页面配置通过单个页面文件夹下的 `page.json` 文件(如 `pages/index/index.json`)定义,
仅作用于当前页面,用于覆盖全局配置中与页面相关的属性(如窗口样式),或配置当前页面独有的特性(如是否禁用下拉刷新)。
注意:页面配置仅能覆盖全局配置的 `window` 部分,无法覆盖 `pages`、`tabBar` 等全局属性。
b.核心配置项与说明
配置项 类型 作用与示例
navigationBarTitleText string 覆盖全局导航栏标题(如“首页详情”)
navigationBarBackgroundColor string 覆盖全局导航栏背景色
enablePullDownRefresh boolean 覆盖全局下拉刷新配置(如全局开启,当前页面设为 `false` 禁用)
onReachBottomDistance number 页面滚动到底部时触发 `onReachBottom` 事件的距离(默认50px,可调整)
disableScroll boolean 是否禁止页面滚动(默认 `false`,设为 `true` 后页面无法上下滚动,仅适用于非 scroll-view 页面)
usingComponents Object 声明当前页面使用的自定义组件(如 `{"my-component": "/components/my-component/my-component"}`)
03.配置示例
a.全局配置示例(app.json)
{
"pages": [
"pages/index/index", // 首页(第一个为默认首页)
"pages/user/user", // 我的页面
"pages/logs/logs" // 日志页面
],
"window": {
"navigationBarTitleText": "我的小程序", // 全局默认导航栏标题
"navigationBarBackgroundColor": "#2f4050", // 导航栏背景色(深灰)
"navigationBarTextStyle": "white", // 导航栏文字白色
"enablePullDownRefresh": true, // 全局开启下拉刷新
"backgroundColor": "#f5f5f5" // 页面背景色(浅灰)
},
"tabBar": {
"position": "bottom", // 标签栏在底部
"color": "#666666", // 未选中文字灰色
"selectedColor": "#2f4050", // 选中文字深灰
"backgroundColor": "#ffffff", // 标签栏背景白色
"list": [
{
"pagePath": "pages/index/index",
"text": "首页",
"iconPath": "images/home.png",
"selectedIconPath": "images/home-active.png"
},
{
"pagePath": "pages/user/user",
"text": "我的",
"iconPath": "images/user.png",
"selectedIconPath": "images/user-active.png"
}
]
},
"networkTimeout": {
"request": 5000, // 网络请求超时5秒
"downloadFile": 10000 // 文件下载超时10秒
},
"permission": {
"scope.userLocation": {
"desc": "需要获取您的地理位置,用于展示附近的服务" // 申请地理位置权限的说明
}
}
}
b.页面配置示例(pages/index/index.json)
假设全局配置开启了下拉刷新,但“首页”需要禁用,同时自定义导航栏标题:
{
"navigationBarTitleText": "首页", // 覆盖全局标题,当前页面显示“首页”
"enablePullDownRefresh": false, // 禁用当前页面的下拉刷新(全局为true)
"onReachBottomDistance": 100, // 滚动到底部100px时触发加载更多
"usingComponents": {
"goods-card": "/components/goods-card/goods-card" // 引入“商品卡片”自定义组件
}
}
1.6 [1]配置:绝对路径
01.设计说明
a.说明
在微信小程序中,默认不支持直接使用绝对路径引入文件,
但可以通过配置 app.json 中的 usingComponents 和 resolveAlias(小程序基础库 2.24.0 及以上支持)来实现类似绝对路径的引入效果。
b.兼容性
需要基础库版本 2.20.1+
需要开发者工具版本 1.05.2110080+
c.使用限制
仅支持 ES6 import 语法,不支持 require()
需要在所有引用的地方保持一致性
02.方法1:使用 resolveAlias 配置路径别名(推荐)
a.说明
微信小程序在基础库 2.24.0 及以上版本支持 resolveAlias 配置,可在 app.json 中定义路径别名,实现类似绝对路径的引入方式。
b.在 app.json 中添加 resolveAlias 配置
{
"resolveAlias": {
"@/components": "/components",
"@/utils": "/utils",
"@/pages": "/pages"
},
// 其他配置...
"pages": [
"pages/index/index"
]
}
c.在代码中使用别名引入
// 引入工具函数
import utils from '@/utils/common.js'
// 引入组件(在页面的json中)
{
"usingComponents": {
"my-component": "@/components/my-component/index"
}
}
// WXML中使用组件
<my-component />
03.方法2:通过 usingComponents 配置全局组件路径
a.配置
对于组件,可在 app.json 的 usingComponents 中配置全局组件,避免重复写相对路径
-----------------------------------------------------------------------------------------------------
{
"usingComponents": {
"global-component": "/components/global-component/index"
}
}
-----------------------------------------------------------------------------------------------------
配置后,在任何页面的 WXML 中都可以直接使用 `<global-component />`,无需再次在页面 json 中引入
b.注意事项:
1.resolveAlias 需要小程序基础库 2.24.0 及以上版本,低版本不支持
2.路径别名必须以 / 开头,表示项目根目录
3.对于图片等资源文件,仍需使用相对路径或绝对路径(如 /images/icon.png)
4.如果使用第三方构建工具(如 gulp、webpack),可以通过工具配置实现更灵活的路径解析
1.7 [2]框架:小程序
00.汇总
01.App(Object object)
02.AppObject getApp(Object object)
01.App(Object object)
a.功能说明
注册小程序。接受一个 Object 参数,其指定小程序的生命周期回调等。
App() 必须在 app.js 中调用,必须调用且只能调用一次。不然会出现无法预期的后果。
b.参数说明
a.onLaunch
类型:function
默认值:无
必填:否
说明:生命周期回调——监听小程序初始化。
b.onShow
类型:function
默认值:无
必填:否
说明:生命周期回调——监听小程序启动或切前台。
c.onHide
类型:function
默认值:无
必填:否
说明:生命周期回调——监听小程序切后台。
d.onError
类型:function
默认值:无
必填:否
说明:错误监听函数。
e.onPageNotFound
类型:function
默认值:无
必填:否
说明:页面不存在监听函数。
最低版本:1.9.90
f.onUnhandledRejection
类型:function
默认值:无
必填:否
说明:未处理的 Promise 拒绝事件监听函数。
最低版本:2.10.0
g.onThemeChange
类型:function
默认值:无
必填:否
说明:监听系统主题变化。
最低版本:2.11.0
h.其他
类型:any
默认值:无
必填:否
说明:开发者可以添加任意的函数或数据变量到 Object 参数中,用 this 可以访问。
c.生命周期回调
a.onLaunch(Object object)
说明:小程序初始化完成时触发,全局只触发一次。
参数:与 wx.getLaunchOptionsSync 一致。
b.onShow(Object object)
说明:小程序启动,或从后台进入前台显示时触发。
参数:与 wx.onAppShow 一致。
c.onHide()
说明:小程序从前台进入后台时触发。
参数:与 wx.onAppHide 一致。
d.onError(String error)
说明:小程序发生脚本错误或 API 调用报错时触发。
参数:与 wx.onError 一致。
e.onPageNotFound(Object object)
说明:小程序要打开的页面不存在时触发。
最低版本:1.9.90
参数:与 wx.onPageNotFound 一致。
注意事项:低版本需做兼容处理。
示例代码:
App({
onPageNotFound(res) {
wx.redirectTo({
url: 'pages/...'
}) // 如果是 tabbar 页面,请使用 wx.switchTab
}
})
f.onUnhandledRejection(Object object)
说明:小程序有未处理的 Promise 拒绝时触发。
最低版本:2.10.0
参数:与 wx.onUnhandledRejection 一致。
注意事项:低版本需做兼容处理。
g.onThemeChange(Object object)
说明:系统切换主题时触发。
最低版本:2.11.0
参数:与 wx.onThemeChange 一致。
d.示例代码
App({
onLaunch (options) {
// Do something initial when launch.
},
onShow (options) {
// Do something when show.
},
onHide (options) {
// Do something when hide.
},
onError (msg) {
console.log(msg)
},
globalData: 'I am global data'
})
02.AppObject getApp(Object object)
a.功能说明
获取到小程序全局唯一的 App 实例。
b.参数说明
a.allowDefault
类型:boolean
默认值:false
必填:否
说明:在 App 未定义时返回默认实现。当 App 被调用时,默认实现中定义的属性会被覆盖合并到 App 中。一般用于独立分包。
最低版本:2.2.4
c.示例代码
// other.js
var appInstance = getApp()
console.log(appInstance.globalData) // I am global data
d.注意事项
a.不要在定义于 App() 内的函数中,或调用 App 前调用 getApp(),使用 this 就可以拿到 app 实例。
b.通过 getApp() 获取实例之后,不要私自调用生命周期函数。
1.8 [2]框架:页面
00.汇总
01.Page(Object object)
02.PageObject[] getCurrentPages()
03.Router
01.Page(Object object)
a.功能说明
注册小程序中的一个页面。接受一个 Object 类型参数,其指定页面的初始数据、生命周期回调、事件处理函数等。
b.参数说明
a.data
类型:Object
默认值:无
必填:否
说明:页面的初始数据。
b.options
类型:Object
默认值:无
必填:否
说明:页面的组件选项,同 Component 构造器中的 options。
最低版本:2.10.1
c.behaviors
类型:String Array
默认值:无
必填:否
说明:类似于 mixins 和 traits 的组件间代码复用机制。
最低版本:2.9.2
d.onLoad
类型:function
默认值:无
必填:否
说明:生命周期回调—监听页面加载。
e.onShow
类型:function
默认值:无
必填:否
说明:生命周期回调—监听页面显示。
f.onReady
类型:function
默认值:无
必填:否
说明:生命周期回调—监听页面初次渲染完成。
g.onHide
类型:function
默认值:无
必填:否
说明:生命周期回调—监听页面隐藏。
h.onUnload
类型:function
默认值:无
必填:否
说明:生命周期回调—监听页面卸载。
i.onRouteDone
类型:function
默认值:无
必填:否
说明:生命周期回调—监听路由动画完成。
j.onPullDownRefresh
类型:function
默认值:无
必填:否
说明:监听用户下拉动作。
k.onReachBottom
类型:function
默认值:无
必填:否
说明:页面上拉触底事件的处理函数。
l.onShareAppMessage
类型:function
默认值:无
必填:否
说明:用户点击右上角转发。
m.onShareTimeline
类型:function
默认值:无
必填:否
说明:用户点击右上角转发到朋友圈。
n.onAddToFavorites
类型:function
默认值:无
必填:否
说明:用户点击右上角收藏。
o.onPageScroll
类型:function
默认值:无
必填:否
说明:页面滚动触发事件的处理函数。
p.onResize
类型:function
默认值:无
必填:否
说明:页面尺寸改变时触发。
q.onTabItemTap
类型:function
默认值:无
必填:否
说明:当前是 tab 页时,点击 tab 时触发。
r.onSaveExitState
类型:function
默认值:无
必填:否
说明:页面销毁前保留状态回调。
s.其他
类型:any
默认值:无
必填:否
说明:开发者可以添加任意的函数或数据到 Object 参数中,在页面的函数中用 this 可以访问。这部分属性会在页面实例创建时进行一次深拷贝。
c.示例代码
//index.js
Page({
data: {
text: "This is page data."
},
onLoad: function(options) {
// Do some initialize when page load.
},
onShow: function() {
// Do something when page show.
},
onReady: function() {
// Do something when page ready.
},
onHide: function() {
// Do something when page hide.
},
onUnload: function() {
// Do something when page close.
},
onPullDownRefresh: function() {
// Do something when pull down.
},
onReachBottom: function() {
// Do something when page reach bottom.
},
onShareAppMessage: function () {
// return custom share data when user share.
},
onPageScroll: function() {
// Do something when page scroll
},
onResize: function() {
// Do something when page resize
},
onTabItemTap(item) {
console.log(item.index)
console.log(item.pagePath)
console.log(item.text)
},
// Event handler.
viewTap: function() {
this.setData({
text: 'Set some data for updating view.'
}, function() {
// this is setData callback
})
},
customData: {
hi: 'MINA'
}
})
d.data属性说明
a.功能
data 是页面第一次渲染使用的初始数据。
b.注意事项
页面加载时,data 将会以 JSON 字符串的形式由逻辑层传至渲染层,
因此 data 中的数据必须是可以转成 JSON 的类型:字符串,数字,布尔值,对象,数组。
c.示例代码
<view>{{text}}</view>
<view>{{array[0].msg}}</view>
Page({
data: {
text: 'init data',
array: [{msg: '1'}, {msg: '2'}]
}
})
e.生命周期回调函数
a.onLoad(Object query)
页面加载时触发。一个页面只会调用一次,可以在 onLoad 的参数中获取打开当前页面路径中的参数。
参数:
query:打开当前页面路径中的参数。
b.onShow()
页面显示/切入前台时触发。
c.onReady()
页面初次渲染完成时触发。一个页面只会调用一次,代表页面已经准备妥当,可以和视图层进行交互。
注意:对界面内容进行设置的 API 如 wx.setNavigationBarTitle,请在 onReady 之后进行。
d.onHide()
页面隐藏/切入后台时触发。如 wx.navigateTo 或底部 tab 切换到其他页面,小程序切入后台等。
e.onUnload()
页面卸载时触发。如 wx.redirectTo 或 wx.navigateBack 到其他页面时。
f.onRouteDone()
路由动画完成时触发。如 wx.navigateTo 页面完全推入后 或 wx.navigateBack 页面完全恢复时。
f.页面事件处理函数
a.onPullDownRefresh()
监听用户下拉刷新事件。
-------------------------------------------------------------------------------------------------
注意:
需要在 app.json 的 window 选项中或页面配置中开启 enablePullDownRefresh。
可以通过 wx.startPullDownRefresh 触发下拉刷新,调用后触发下拉刷新动画,效果与用户手动下拉刷新一致。
当处理完数据刷新后,wx.stopPullDownRefresh 可以停止当前页面的下拉刷新。
b.onReachBottom()
监听用户上拉触底事件。
-------------------------------------------------------------------------------------------------
注意:
可以在 app.json 的 window 选项中或页面配置中设置触发距离 onReachBottomDistance。
在触发距离内滑动期间,本事件只会被触发一次。
c.onPageScroll(Object object)
监听用户滑动页面事件。
-------------------------------------------------------------------------------------------------
参数:
scrollTop:页面在垂直方向已滚动的距离(单位px)。
-------------------------------------------------------------------------------------------------
注意:
请只在需要的时候才在 page 中定义此方法,不要定义空方法。
请避免在 onPageScroll 中过于频繁的执行 setData 等引起逻辑层-渲染层通信的操作。
d.onAddToFavorites(Object object)
监听用户点击右上角菜单“收藏”按钮的行为,并自定义收藏内容。
-------------------------------------------------------------------------------------------------
参数:
webViewUrl:页面中包含 web-view 组件时,返回当前 web-view 的 url。
-------------------------------------------------------------------------------------------------
返回内容:
title:自定义标题。
imageUrl:自定义图片,显示图片长宽比为 1:1。
query:自定义 query 字段。
-------------------------------------------------------------------------------------------------
示例代码:
Page({
onAddToFavorites(res) {
console.log('webViewUrl: ', res.webViewUrl)
return {
title: '自定义标题',
imageUrl: 'http://demo.png',
query: 'name=xxx&age=xxx',
}
}
})
e.onShareAppMessage(Object object)
监听用户点击页面内转发按钮或右上角菜单“转发”按钮的行为,并自定义转发内容。
-------------------------------------------------------------------------------------------------
参数:
from:转发事件来源。
target:如果 from 值是 button,则 target 是触发这次转发事件的 button,否则为 undefined。
webViewUrl:页面中包含 web-view 组件时,返回当前 web-view 的 url。
-------------------------------------------------------------------------------------------------
返回内容:
title:转发标题。
path:转发路径。
imageUrl:自定义图片路径。
promise:用于异步返回转发内容。
-------------------------------------------------------------------------------------------------
示例代码:
Page({
onShareAppMessage() {
const promise = new Promise(resolve => {
setTimeout(() => {
resolve({
title: '自定义转发标题'
})
}, 2000)
})
return {
title: '自定义转发标题',
path: '/page/user?id=123',
promise
}
}
})
f.onShareTimeline()
监听右上角菜单“分享到朋友圈”按钮的行为,并自定义分享内容。
-------------------------------------------------------------------------------------------------
返回内容:
title:自定义标题。
query:自定义页面路径中携带的参数。
imageUrl:自定义图片路径。
g.onResize(Object object)
页面尺寸改变时触发。
h.onTabItemTap(Object object)
点击 tab 时触发。
-------------------------------------------------------------------------------------------------
参数:
index:被点击 tabItem 的序号。
pagePath:被点击 tabItem 的页面路径。
text:被点击 tabItem 的按钮文字。
-------------------------------------------------------------------------------------------------
示例代码
Page({
onTabItemTap(item) {
console.log(item.index)
console.log(item.pagePath)
console.log(item.text)
}
})
i.onSaveExitState()
每当小程序可能被销毁之前,页面回调函数 onSaveExitState 会被调用,可以进行退出状态的保存。
g.组件事件处理函数
a.说明
Page 中还可以定义组件事件处理函数。在渲染层的组件中加入事件绑定,当事件被触发时,就会执行 Page 中定义的事件处理函数。
-------------------------------------------------------------------------------------------------
<view bindtap="viewTap"> click me </view>
Page({
viewTap: function() {
console.log('view tap')
}
})
b.Page.route
基础库 1.2.0 开始支持,低版本需做兼容处理。
到当前页面的路径,类型为String。
-------------------------------------------------------------------------------------------------
Page({
onShow: function() {
console.log(this.route)
}
})
c.Page.prototype.setData(Object data, Function callback)
功能:
setData 函数用于将数据从逻辑层发送到视图层(异步),同时改变对应的 this.data 的值(同步)。
-------------------------------------------------------------------------------------------------
参数:
data:这次要改变的数据。
callback:setData 引起的界面更新渲染完毕后的回调函数。
-------------------------------------------------------------------------------------------------
注意:
直接修改 this.data 而不调用 this.setData 是无法改变页面的状态的。
单次设置的数据不能超过 1024kB。
-------------------------------------------------------------------------------------------------
示例代码:
<!--index.wxml-->
<view>{{text}}</view>
<button bindtap="changeText"> Change normal data </button>
<view>{{num}}</view>
<button bindtap="changeNum"> Change normal num </button>
<view>{{array[0].text}}</view>
<button bindtap="changeItemInArray"> Change Array data </button>
<view>{{object.text}}</view>
<button bindtap="changeItemInObject"> Change Object data </button>
<view>{{newField.text}}</view>
<button bindtap="addNewField"> Add new data </button>
-------------------------------------------------------------------------------------------------
示例代码:
Page({
data: {
text: 'init data',
num: 0,
array: [{text: 'init data'}],
object: {
text: 'init data'
}
},
changeText: function() {
this.setData({
text: 'changed data'
})
},
changeNum: function() {
this.data.num = 1
this.setData({
num: this.data.num
})
},
changeItemInArray: function() {
this.setData({
'array[0].text':'changed data'
})
},
changeItemInObject: function(){
this.setData({
'object.text': 'changed data'
});
},
addNewField: function() {
this.setData({
'newField.text': 'new data'
})
}
})
h.页面间通信
a.功能
如果一个页面由另一个页面通过 wx.navigateTo 打开,这两个页面间将建立一条数据通道。
b.方法
被打开的页面可以通过 this.getOpenerEventChannel() 方法来获得一个 EventChannel 对象。
wx.navigateTo 的 success 回调中也包含一个 EventChannel 对象。
02.PageObject[] getCurrentPages()
a.说明
获取当前页面栈。数组中第一个元素为首页,最后一个元素为当前页面。
b.注意事项
不要尝试修改页面栈,会导致路由以及页面状态错误。
不要在 App.onLaunch 的时候调用 getCurrentPages(),此时 page 还没有生成。
03.Router
a.说明
基础库 2.16.1 开始支持,低版本需做兼容处理。
页面路由器对象。可以通过 this.pageRouter 或 this.router 获得当前页面或自定义组件的路由器对象。
b.路由的相对路径
a.说明
页面路由器有 switchTab reLaunch redirectTo navigateTo navigateBack 五个方法,
与 wx 对象向同名的五个方法 switchTab reLaunch redirectTo navigateTo navigateBack 功能相同;
唯一的区别是,页面路由器中的方法调用时,相对路径永远相对于 this 指代的页面或自定义组件。
b.示例代码
// index/index.js
Page({
wxNavAction: function () {
wx.navigateTo({
url: './new-page'
})
},
routerNavAction: function () {
this.pageRouter.navigateTo({
url: './new-page'
})
}
})
c.说明
页面 index/index 的 js 代码如上所示。如果此时已经跳转到了一个新页面 pack/index ,
然后才调用到上面的 wxNavAction 方法,跳转的新页面路径将是 pack/new-page ;
而如果调用的是 routerNavAction 方法,跳转的新页面路径仍然是 index/new-page 。
-------------------------------------------------------------------------------------------------
换而言之, this.pageRouter 获得的路由器对象具有更好的基路径稳定性。
通常情况下,使用 this.pageRouter.navigateTo 代替 wx.navigateTo 是更优的。
c.相对于自定义组件路径的路由
this.pageRouter 和 this.router 在页面中将获得同样的页面路由器对象。
但如果在自定义组件中调用, this.pageRouter 将相对于自定义组件所在的页面来进行路由跳转,而 this.router 相对于自定义组件自身的路径。
1.9 [2]框架:自定义组件
00.汇总
01.Component(Object object)
02.Behavior(Object object)
01.Component(Object object)
a.功能说明
创建自定义组件,接受一个 Object 类型的参数。
b.参数说明
a.properties
类型:Object Map
是否必填:否
描述:组件的对外属性,是属性名到属性设置的映射表。
b.data
类型:Object
是否必填:否
描述:组件的内部数据,和 properties 一同用于组件的模板渲染。
c.observers
类型:Object
是否必填:否
描述:组件数据字段监听器,用于监听 properties 和 data 的变化。
最低版本:2.6.1
d.methods
类型:Object
是否必填:否
描述:组件的方法,包括事件响应函数和任意的自定义方法。
e.behaviors
类型:String Array
是否必填:否
描述:类似于 mixins 和 traits 的组件间代码复用机制。
f.created
类型:Function
是否必填:否
描述:组件生命周期函数-在组件实例刚刚被创建时执行,注意此时不能调用 setData。
g.attached
类型:Function
是否必填:否
描述:组件生命周期函数-在组件实例进入页面节点树时执行。
h.ready
类型:Function
是否必填:否
描述:组件生命周期函数-在组件布局完成后执行。
i.moved
类型:Function
是否必填:否
描述:组件生命周期函数-在组件实例被移动到节点树另一个位置时执行。
j.detached
类型:Function
是否必填:否
描述:组件生命周期函数-在组件实例被从页面节点树移除时执行。
k.relations
类型:Object
是否必填:否
描述:组件间关系定义。
l.externalClasses
类型:String Array
是否必填:否
描述:组件接受的外部样式类。
m.options
类型:Object Map
是否必填:否
描述:一些选项。
n.lifetimes
类型:Object
是否必填:否
描述:组件生命周期声明对象。
最低版本:2.2.3
o.pageLifetimes
类型:Object
是否必填:否
描述:组件所在页面的生命周期声明对象。
最低版本:2.2.3
c.组件实例属性
a.is
类型:String
描述:组件的文件路径。
b.id
类型:String
描述:节点id。
c.dataset
类型:String
描述:节点dataset。
d.data
类型:Object
描述:组件数据,包括内部数据和属性值。
e.properties
类型:Object
描述:组件数据,包括内部数据和属性值(与 data 一致)。
f.router
类型:Object
描述:相对于当前自定义组件的 Router 对象。
g.pageRouter
类型:Object
描述:相对于当前自定义组件所在页面的 Router 对象。
h.renderer
类型:String
描述:渲染当前组件的渲染后端。
d.组件实例方法
a.setData
参数:Object newData
描述:设置 data 并执行视图层渲染。
b.hasBehavior
参数:Object behavior
描述:检查组件是否具有 behavior。
c.triggerEvent
参数:String name, Object detail, Object options
描述:触发事件。
d.createSelectorQuery
描述:创建一个 SelectorQuery 对象,选择器选取范围为这个组件实例内。
e.createIntersectionObserver
描述:创建一个 IntersectionObserver 对象,选择器选取范围为这个组件实例内。
f.createMediaQueryObserver
描述:创建一个 MediaQueryObserver 对象。
最低版本:2.11.1
g.selectComponent
参数:String selector
描述:使用选择器选择组件实例节点,返回匹配到的第一个组件实例对象。
h.selectAllComponents
参数:String selector
描述:使用选择器选择组件实例节点,返回匹配到的全部组件实例对象组成的数组。
i.selectOwnerComponent
描述:选取当前组件节点所在的组件实例(即组件的引用者),返回它的组件实例对象。
最低版本:2.8.2
j.getRelationNodes
参数:String relationKey
描述:获取这个关系所对应的所有关联节点。
k.groupSetData
参数:Function callback
描述:立刻执行 callback,其中的多个 setData 之间不会触发界面绘制。
最低版本:2.4.0
l.getTabBar
描述:返回当前页面的 custom-tab-bar 的组件实例。
最低版本:2.6.2
m.getPageId
描述:返回页面标识符(一个字符串),可以用来判断几个自定义组件实例是不是在同一个页面内。
最低版本:2.7.1
n.animate
参数:String selector, Array keyframes, Number duration, Function callback
描述:执行关键帧动画。
最低版本:2.9.0
o.clearAnimation
参数:String selector, Object options, Function callback
描述:清除关键帧动画。
最低版本:2.9.0
p.applyAnimatedStyle
参数:String selector, Function updater, Object config, Function callback
描述:绑定由 worklet 驱动的样式到相应的节点。
最低版本:2.29.0
q.clearAnimatedStyle
参数:String selector, Array styleIds, Function callback
描述:清除节点上 worklet 驱动样式的绑定关系。
最低版本:2.30.1
r.setUpdatePerformanceListener
参数:Object options, Function listener
描述:设置更新性能统计信息接收函数。
最低版本:2.12.0
e.示例代码
Component({
behaviors: [],
properties: {
myProperty: {
type: String,
value: ''
},
myProperty2: String
},
data: {},
lifetimes: {
attached: function () { },
moved: function () { },
detached: function () { },
},
attached: function () { },
ready: function() { },
pageLifetimes: {
show: function () { },
hide: function () { },
resize: function () { },
},
methods: {
onMyButtonTap: function(){
this.setData({
// 更新属性和数据的方法与更新页面数据的方法类似
})
},
_myPrivateMethod: function(){
this.setData({
'A[0].B': 'myPrivateData'
})
},
_propertyChange: function(newVal, oldVal) {
}
}
})
f.properties定义
a.type
描述:属性的类型。
是否必填:是
b.optionalTypes
描述:属性的类型(可以指定多个)。
是否必填:否
最低版本:2.6.5
c.value
描述:属性的初始值。
是否必填:否
d.observer
描述:属性值变化时的回调函数。
是否必填:否
e.示例代码
Component({
properties: {
min: {
type: Number,
value: 0
},
max: {
type: Number,
value: 0,
observer: function(newVal, oldVal) {
// 属性值变化时执行
}
},
lastLeaf: {
type: Number,
optionalTypes: [String, Object],
value: 0
}
}
})
g.Bug & Tip
使用 this.data 可以获取内部数据和属性值;但直接修改它不会将变更应用到界面上,应使用 setData 修改。
生命周期函数无法在组件方法中通过 this 访问到。
属性名应避免以 data 开头,即不要命名成 dataXyz 这样的形式,因为在 WXML 中, data-xyz="" 会被作为节点 dataset 来处理,而不是组件属性。
在一个组件的定义和使用时,组件的属性名和 data 字段相互间都不能冲突(尽管它们位于不同的定义段中)。
从基础库 2.0.9 开始,对象类型的属性和 data 字段中可以包含函数类型的子字段,即可以通过对象类型的属性字段来传递函数。低于这一版本的基础库不支持这一特性。
bug: 位于 slot 中的自定义组件没有触发 pageLifetimes 中声明的页面生命周期,此问题在 2.5.2 中修复。
bug: 对于 type 为 Object 或 Array 的属性,如果通过该组件自身的 this.setData 来改变属性值的一个子字段,则依旧会触发属性 observer ,且 observer 接收到的 newVal 是变化的那个子字段的值, oldVal 为空, changedPath 包含子字段的字段名相关信息;目前推荐使用 observers 定义段代替。
02.Behavior(Object object)
a.功能说明
注册一个 behavior,接受一个 Object 类型的参数。
b.参数说明
a.properties
类型:Object Map
是否必填:否
描述:组件的对外属性,是属性名到属性设置的映射表。
b.data
类型:Object
是否必填:否
描述:组件的内部数据,和 properties 一同用于组件的模板渲染。
c.observers
类型:Object
是否必填:否
描述:组件数据字段监听器,用于监听 properties 和 data 的变化。
最低版本:2.6.1
d.methods
类型:Object
是否必填:否
描述:组件的方法,包括事件响应函数和任意的自定义方法。
e.behaviors
类型:String Array
是否必填:否
描述:类似于 mixins 和 traits 的组件间代码复用机制。
f.created
类型:Function
是否必填:否
描述:组件生命周期函数-在组件实例刚刚被创建时执行,注意此时不能调用 setData。
g.attached
类型:Function
是否必填:否
描述:组件生命周期函数-在组件实例进入页面节点树时执行。
h.ready
类型:Function
是否必填:否
描述:组件生命周期函数-在组件布局完成后执行。
i.moved
类型:Function
是否必填:否
描述:组件生命周期函数-在组件实例被移动到节点树另一个位置时执行。
j.detached
类型:Function
是否必填:否
描述:组件生命周期函数-在组件实例被从页面节点树移除时执行。
k.relations
类型:Object
是否必填:否
描述:组件间关系定义。
l.lifetimes
类型:Object
是否必填:否
描述:组件生命周期声明对象。
最低版本:2.2.3
m.pageLifetimes
类型:Object
是否必填:否
描述:组件所在页面的生命周期声明对象。
最低版本:2.2.3
n.definitionFilter
类型:Function
是否必填:否
描述:定义段过滤器,用于自定义组件扩展。
最低版本:2.2.3
c.示例代码
// my-behavior.js
module.exports = Behavior({
behaviors: [],
properties: {
myBehaviorProperty: {
type: String
}
},
data: {
myBehaviorData: {}
},
attached: function(){},
methods: {
myBehaviorMethod: function(){}
}
})
1.10 [2]框架:模块化
00.汇总
01.require
02.Object module
03.Object exports
04.any requirePlugin(string path)
05.any requireMiniProgram()
01.require
a.功能说明
引入模块。返回模块通过 module.exports 或 exports 暴露的接口。
支持同步调用和异步调用。
b.参数说明
a.path
类型:string
是否必填:是
描述:需要引入模块文件相对于当前文件的相对路径,或 npm 模块名,或 npm 模块路径。
注意:默认不支持绝对路径,可通过配置 resolveAlias 自定义路径映射。
b.callback
类型:function
是否必填:否
描述:异步加载成功回调函数,该回调函数参数为成功加载的模块。
c.error
类型:function
是否必填:否
描述:异步加载失败回调函数,该回调函数参数为错误信息和模块名。
c.require.async 链式调用
a.功能
可以通过链式调用的方式使用异步加载模块。
b.示例代码
require
.async('path/to/mod')
.then((mod) => {
console.log(mod)
})
.catch(({ errMsg, mod }) => {
console.error(`path: ${mod}, ${errMsg}`)
})
d.示例代码
a.同一包内调用
// common.js
function sayHello(name) {
console.log(`Hello ${name} !`)
}
function sayGoodbye(name) {
console.log(`Goodbye ${name} !`)
}
module.exports.sayHello = sayHello
exports.sayGoodbye = sayGoodbye
var common = require('common.js')
Page({
helloMINA: function() {
common.sayHello('MINA')
},
goodbyeMINA: function() {
common.sayGoodbye('MINA')
}
})
b.跨分包异步调用
// subpackage/common.js 分包 common 文件
export const sayHello = () => console.log("hello")
// pages/index.js 主包页面
let common;
require('../../subpackage/common.js', (mod) => {
common = mod
}, ({ errMsg, mod }) => {
console.error(`path: ${mod}, ${errMsg}`)
})
Page({
sayHello() {
common && common.sayHello()
}
})
02.Object module
a.功能说明
当前模块对象,用于描述当前模块的相关信息。
b.属性说明
a.exports
类型:Object
描述:模块向外暴露的对象,使用 require 引用该模块时可以获取。
c.示例代码
// common.js
function sayHello(name) {
console.log(`Hello ${name} !`)
}
function sayGoodbye(name) {
console.log(`Goodbye ${name} !`)
}
module.exports.sayHello = sayHello
exports.sayGoodbye = sayGoodbye
03.Object exports
a.功能说明
module.exports 的引用,用于向外暴露模块的接口。
b.示例代码
// common.js
function sayHello(name) {
console.log(`Hello ${name} !`)
}
function sayGoodbye(name) {
console.log(`Goodbye ${name} !`)
}
module.exports.sayHello = sayHello
exports.sayGoodbye = sayGoodbye
04.any requirePlugin(string path)
a.功能说明
引入插件。返回插件通过 main 暴露的接口。
b.参数说明
a.module
类型:string
描述:需要引入的插件的 alias。
注意:基础库 2.14.0 起,也可以是插件的 AppID。
c.示例代码
var myPluginInterface = requirePlugin('myPlugin');
myPluginInterface.hello();
var myWorld = myPluginInterface.world;
var myPluginInterface = requirePlugin('wxIDxxxxxxxxxx'); // 2.14.0 起
05.any requireMiniProgram()
a.功能说明
插件引入当前使用者小程序。返回使用者小程序通过插件配置中 export 暴露的接口。
注意:该接口仅在插件中存在。
b.参数说明
该接口不需要参数。
c.示例代码
// in plugin
var mp = requireMiniProgram()
console.log(mp.whoami) // 'Wechat MiniProgram'
1.11 [2]框架:基础功能
00.汇总
01.控制台:console
02.定时器:number setTimeout(function callback, number delay, any rest)
03.Object WXWebAssembly
01.控制台:console
a.功能说明
向调试面板中打印日志。console 是一个全局对象,可以直接访问。
在微信客户端中,向 vConsole 中输出日志。
b.方法说明
a.console.debug()
描述:向调试面板中打印 debug 日志。
b.console.log()
描述:向调试面板中打印 log 日志。
c.console.info()
描述:向调试面板中打印 info 日志。
d.console.warn()
描述:向调试面板中打印 warn 日志。
e.console.error()
描述:向调试面板中打印 error 日志。
f.console.group(string label)
描述:在调试面板中创建一个新的分组。随后输出的内容都会被添加一个缩进,表示该内容属于当前分组。
g.console.groupEnd()
描述:结束由 console.group 创建的分组。
c.注意事项
a.由于 vConsole 功能有限
以及不同客户端对 console 方法的支持情况有差异,建议开发者在小程序中只使用本文档中提供的方法。
b.部分内容展示的限制请参见调试。
02.定时器:number setTimeout(function callback, number delay, any rest)
a.功能说明
设定一个定时器。在定时到期以后执行注册的回调函数。
注意:以 Promise 风格调用不支持;小程序插件支持。
b.参数说明
a.function callback
描述:回调函数。
b.number delay
描述:延迟的时间,函数的调用会在该延迟之后发生,单位 ms。
c.any rest
描述:param1, param2, ..., paramN 等附加参数,它们会作为参数传递给回调函数。
c.返回值
类型:number
描述:定时器的编号。这个值可以传递给 clearTimeout 来取消该定时。
03.Object WXWebAssembly
a.功能说明
WXWebAssembly 类似于 Web 标准里的 WebAssembly,能够在一定程度上提高小程序的性能。
b.参考
具体请参考 WXWebAssembly。
1.12 [2]框架:WXS
00.汇总
01.模块
02.变量
02.变量
04.运算符
05.语句
06.数据类型
07.基础类库
01.模块
a.介绍
a.功能说明
WXS(WeiXin Script)代码可以编写在 WXML 文件中的 <wxs> 标签内,或以 .wxs 为后缀名的文件内。
每个 .wxs 文件和 <wxs> 标签都是一个独立的模块,具有独立的作用域。
模块中的变量与函数默认为私有,需通过 module.exports 对外暴露。
b.注意事项
<wxs> 模块只能在定义模块的 WXML 文件中被访问到。
使用 <include> 或 <import> 时,<wxs> 模块不会被引入到对应的 WXML 文件中。
<template> 标签中,只能使用定义该 <template> 的 WXML 文件中定义的 <wxs> 模块。
b.wxs文件
a.wxs文件
a.说明
在微信开发者工具中,右键可以直接创建 .wxs 文件
b.示例代码
// /pages/comm.wxs
var foo = "'hello world' from comm.wxs";
var bar = function(d) {
return d;
}
module.exports = {
foo: foo,
bar: bar
};
b.module 对象
a.说明
每个 wxs 模块均有一个内置的 module 对象。
b.属性
exports:用于对外共享模块的私有变量与函数。
c.示例代码
// /pages/tools.wxs
var foo = "'hello world' from tools.wxs";
var bar = function (d) {
return d;
}
module.exports = {
FOO: foo,
bar: bar,
};
module.exports.msg = "some msg";
<!-page/index/index.wxml -->
<wxs src="./../tools.wxs" module="tools" />
<view> {{tools.msg}} </view>
<view> {{tools.bar(tools.FOO)}} </view>
d.页面输出
some msg
'hello world' from tools.wxs
c.require 函数
a.功能
在 .wxs 模块中引用其他 wxs 文件模块。
b.注意事项
只能引用 .wxs 文件模块,且必须使用相对路径。
wxs 模块均为单例,wxs 模块在第一次被引用时,会自动初始化为单例对象。多个页面,多个地方,多次引用,使用的都是同一个 wxs 模块对象。
如果一个 wxs 模块在定义之后,一直没有被引用,则该模块不会被解析与运行。
c.示例代码
// /pages/tools.wxs
var foo = "'hello world' from tools.wxs";
var bar = function (d) {
return d;
}
module.exports = {
FOO: foo,
bar: bar,
};
module.exports.msg = "some msg";
// /pages/logic.wxs
var tools = require("./tools.wxs");
console.log(tools.FOO);
console.log(tools.bar("logic.wxs"));
console.log(tools.msg);
<!-/page/index/index.wxml -->
<wxs src="./../logic.wxs" module="logic" />
d.控制台输出
'hello world' from tools.wxs
logic.wxs
some msg
c.<wxs>标签
a.属性
module:当前 <wxs> 标签的模块名,必填。
src:引用 .wxs 文件的相对路径,仅当标签为空或为单闭合标签时有效。
b.module 属性
a.说明
模块名建议在单个 WXML 文件内唯一。
b.命名规则
首字符:字母(a-zA-Z),下划线(_)。
剩余字符:字母(a-zA-Z),下划线(_),数字(0-9)。
c.示例代码
<!--wxml-->
<wxs module="foo">
var some_msg = "hello world";
module.exports = {
msg : some_msg,
}
</wxs>
<view> {{foo.msg}} </view>
d.页面输出
hello world
c.src 属性
a.说明
用于引用其他 wxs 文件模块。
b.注意事项
只能引用 .wxs 文件模块,且必须使用相对路径。
wxs 模块为单例,首次引用时初始化为单例对象。
c.示例代码
// /pages/index/index.js
Page({
data: {
msg: "'hello wrold' from js",
}
})
<!-/pages/index/index.wxml -->
<wxs src="./../comm.wxs" module="some_comms"></wxs>
<!-也可以直接使用单标签闭合的写法 -->
<!-<wxs src="./../comm.wxs" module="some_comms" /> -->
<!-调用 some_comms 模块里面的 bar 函数,且参数为 some_comms 模块里面的 foo -->
<view> {{some_comms.bar(some_comms.foo)}} </view>
<!-调用 some_comms 模块里面的 bar 函数,且参数为 page/index/index.js 里面的 msg -->
<view> {{some_comms.bar(msg)}} </view>
d.页面输出
'hello world' from comm.wxs
'hello wrold' from js
02.变量
a.概念
WXS 中的变量均为值的引用。
没有声明的变量直接赋值使用,会被定义为全局变量。
如果只声明变量而不赋值,则默认值为 undefined。
var表现与javascript一致,会有变量提升。
-----------------------------------------------------------------------------------------------------
var foo = 1;
var bar = "hello world";
var i; // i === undefined
上面代码,分别声明了 foo、 bar、 i 三个变量。然后,foo 赋值为数值 1 ,bar 赋值为字符串 "hello world"。
b.变量名
首字符必须是:字母(a-zA-Z),下划线(_)
剩余字符可以是:字母(a-zA-Z),下划线(_), 数字(0-9)
c.保留标识符,以下标识符不能作为变量名
delete
void
typeof
-----------------------------------------------------------------------------------------------------
null
undefined
NaN
Infinity
var
-----------------------------------------------------------------------------------------------------
if
else
-----------------------------------------------------------------------------------------------------
true
false
-----------------------------------------------------------------------------------------------------
require
-----------------------------------------------------------------------------------------------------
this
function
arguments
return
-----------------------------------------------------------------------------------------------------
for
while
do
break
continue
switch
case
default
03.注释
a.注释方法
单行注释://
多行注释:/* ... */
结尾注释:/* 后的所有代码均被注释
b.示例
<wxs module="sample">
// 方法一:单行注释
-----------------------------------------------------------------------------------------------------
/*
方法二:多行注释
*/
-----------------------------------------------------------------------------------------------------
/*
方法三:结尾注释。即从 /* 开始往后的所有 WXS 代码均被注释,方法三 和 方法二 的唯一区别是,没有 */ 结束符
var a = 1;
var b = 2;
var c = "fake";
</wxs>
04.运算符
a.基本运算符
加法(+)、减法(-)、乘法(*)、除法(/)、取余(%)。
b.一元运算符
自增(++)、自减(--)、正值(+)、负值(-)、否运算(~)、取反运算(!)。
c.位运算符
左移(<<)、右移(>>)、无符号右移(>>>)、与(&)、异或(^)、或(|)。
d.比较运算符
小于(<)、大于(>)、小于等于(<=)、大于等于(>=)。
e.等值运算符
等号(==)、非等号(!=)、全等号(===)、非全等号(!==)。
f.赋值运算符
=, +=, -=, *=, /=, %=, <<=, >>=, >>>=, &=, ^=, |=。
g.二元逻辑运算符
逻辑与(&&)、逻辑或(||)。
h.其他运算符
条件运算符(?:)、逗号运算符(,)。
i.运算符优先级
优先级从高到低,括号最高,逗号最低。
05.语句
a.if 语句
a.功能说明
在 WXS 中,if 语句用于根据表达式的值(truthy 或 falsy)来决定是否执行某段代码。
b.语法格式
a.if 语句
if (表达式) 语句;
if (表达式)
语句;
if (表达式) {
代码块;
}
b.if...else 语句
if (表达式) 语句;
else 语句;
if (表达式)
语句;
else
语句;
if (表达式) {
代码块;
} else {
代码块;
}
c.if...else if...else 语句
if (表达式) {
代码块;
} else if (表达式) {
代码块;
} else if (表达式) {
代码块;
} else {
代码块;
}
c.示例代码
var value = 10;
if (value > 10) {
console.log("Value is greater than 10");
} else if (value === 10) {
console.log("Value is equal to 10");
} else {
console.log("Value is less than 10");
}
d.输出
Value is equal to 10
b.switch 语句
a.功能说明
switch 语句用于根据表达式的值匹配 case 分支,并执行对应的代码块。
b.语法格式
switch (表达式) {
case 变量:
语句;
case 数字:
语句;
break;
case 字符串:
语句;
default:
语句;
}
-------------------------------------------------------------------------------------------------
default 分支可以省略。
case 关键词后面只能使用变量、数字或字符串。
c.示例代码
var exp = 10;
switch (exp) {
case "10":
console.log("string 10");
break;
case 10:
console.log("number 10");
break;
case exp:
console.log("var exp");
break;
default:
console.log("default");
}
d.输出
number 10
c.for 语句
a.功能说明
for 语句用于循环执行代码块,直到条件表达式为 false。
b.语法格式
for (初始化; 条件; 迭代) 语句;
for (初始化; 条件; 迭代) {
代码块;
}
-------------------------------------------------------------------------------------------------
支持使用 break 和 continue 关键词。
c.示例代码
for (var i = 0; i < 3; ++i) {
console.log(i);
if (i >= 1) break;
}
d.输出
0
1
d.while 语句
a.功能说明
while 语句用于在表达式为 true 时,循环执行代码块。
b.语法格式
while (表达式)
语句;
while (表达式) {
代码块;
}
do {
代码块;
} while (表达式);
-------------------------------------------------------------------------------------------------
支持使用 break 和 continue 关键词。
c.示例代码
var i = 0;
while (i < 3) {
console.log(i);
i++;
}
do {
console.log(i);
i--;
} while (i > 0);
d.输出
0
1
2
3
2
1
06.数据类型
a.汇总
a.数据类型
number:数值。
string:字符串。
boolean:布尔值。
object:对象。
function:函数。
array:数组。
date:日期。
regexp:正则。
b.数据类型判断
使用 constructor 属性或 typeof 关键字。
b.number
a.语法,包括两种数值:整数和小数
var a = 10;
var PI = 3.141592653589793;
b.属性
constructor:返回字符串 "Number"。
c.方法
toString
toLocaleString
valueOf
toFixed
toExponential
toPrecision
c.string
a.语法,有两种写法
'hello world';
"hello world";
b.属性
constructor:返回字符串 "String"。
length:字符串长度。
c.方法
toString
valueOf
charAt
charCodeAt
concat
indexOf
lastIndexOf
localeCompare
match
replace
search
slice
split
substring
toLowerCase
toLocaleLowerCase
toUpperCase
toLocaleUpperCase
trim
d.boolean
a.语法
布尔值只有两个特定的值:true 和 false。
b.属性
constructor:返回字符串 "Boolean"。
c.方法
toString
valueOf
e.object
a.语法
object 是一种无序的键值对。
-------------------------------------------------------------------------------------------------
var o = {}; //生成一个新的空对象
o = {
'string': 1, //key 可以是字符串
const_var: 2, //key 可以是标识符
func: {}, //value 可以是任何类型
};
console.log(1 === o['string']);
console.log(2 === o.const_var);
b.属性
constructor:返回字符串 "Object"。
c.方法
toString:返回字符串 "[object Object]"
f.function
a.语法
方法 1:
function a(x) {
return x;
}
-------------------------------------------------------------------------------------------------
方法 2:
var b = function(x) {
return x;
}
-------------------------------------------------------------------------------------------------
支持匿名函数和闭包:
var a = function(x) {
return function() { return x; }
}
var b = a(100);
console.log(100 === b());
b.arguments
length:传递给函数的参数个数。
[index]:通过 index 下标遍历参数。
-------------------------------------------------------------------------------------------------
var a = function() {
console.log(3 === arguments.length);
console.log(100 === arguments[0]);
console.log(200 === arguments[1]);
console.log(300 === arguments[2]);
};
a(100, 200, 300);
c.属性
constructor:返回字符串 "Function"。
length:返回函数的形参个数。
d.方法
toString:返回字符串 "[function Function]"
g.array
a.语法
支持以下定义方式:
var a = []; //生成一个新的空数组
var a = [1, "2", {}, function(){}]; //生成一个新的非空数组
b.属性
constructor:返回字符串 "Array"。
length:数组长度。
c.方法
toString
concat
join
pop
push
reverse
shift
slice
sort
splice
unshift
indexOf
lastIndexOf
every
some
forEach
map
filter
reduce
reduceRight
h.date
a.语法
使用 getDate 函数生成 date 对象。
-------------------------------------------------------------------------------------------------
var date = getDate(); //返回当前时间对象
date = getDate(1500000000000);
date = getDate('2017-7-14');
date = getDate(2017, 6, 14, 10, 40, 0, 0);
b.属性
constructor:返回字符串 "Date"。
c.方法
toString
toDateString
toTimeString
toLocaleString
toLocaleDateString
toLocaleTimeString
valueOf
getTime
getFullYear
getUTCFullYear
getMonth
getUTCMonth
getDate
getUTCDate
getDay
getUTCDay
getHours
getUTCHours
getMinutes
getUTCMinutes
getSeconds
getUTCSeconds
getMilliseconds
getUTCMilliseconds
getTimezoneOffset
setTime
setMilliseconds
setUTCMilliseconds
setSeconds
setUTCSeconds
setMinutes
setUTCMinutes
setHours
setUTCHours
setDate
setUTCDate
setMonth
setUTCMonth
setFullYear
setUTCFullYear
toUTCString
toISOString
toJSON
i.regexp
a.语法
使用 getRegExp 函数生成 regexp 对象。
-------------------------------------------------------------------------------------------------
var a = getRegExp("x", "img");
console.log("x" === a.source);
console.log(true === a.global);
console.log(true === a.ignoreCase);
console.log(true === a.multiline);
b.属性
constructor:返回字符串 "RegExp"。
source
global
ignoreCase
multiline
lastIndex
c.方法
exec
test
toString
j.数据类型判断
a.constructor 属性
使用 constructor 属性判断数据类型
-------------------------------------------------------------------------------------------------
var number = 10;
console.log("Number" === number.constructor);
var string = "str";
console.log("String" === string.constructor);
var boolean = true;
console.log("Boolean" === boolean.constructor);
var object = {};
console.log("Object" === object.constructor);
var func = function(){};
console.log("Function" === func.constructor);
var array = [];
console.log("Array" === array.constructor);
var date = getDate();
console.log("Date" === date.constructor);
var regexp = getRegExp();
console.log("RegExp" === regexp.constructor);
b.typeof
使用 typeof 区分部分数据类型
-------------------------------------------------------------------------------------------------
var number = 10;
var boolean = true;
var object = {};
var func = function(){};
var array = [];
var date = getDate();
var regexp = getRegExp();
console.log('number' === typeof number);
console.log('boolean' === typeof boolean);
console.log('object' === typeof object);
console.log('function' === typeof func);
console.log('object' === typeof array);
console.log('object' === typeof date);
console.log('object' === typeof regexp);
console.log('undefined' === typeof undefined);
console.log('object' === typeof null);
07.基础类库
a.console
console.log 方法用于在 console 窗口输出信息。它可以接受多个参数,将它们的结果连接起来输出
b.Math
属性:E, LN10, LN2, LOG2E, LOG10E, PI, SQRT1_2, SQRT2
方法:abs, acos, asin, atan, atan2, ceil, cos, exp, floor, log, max, min, pow, random, round, sin, sqrt, tan
-----------------------------------------------------------------------------------------------------
以上属性的具体使用请参考 ES5 标准
c.JSON
方法:stringify(object): 将 object 对象转换为 JSON 字符串,并返回该字符串
方法:parse(string): 将 JSON 字符串转化成对象,并返回该对象
-----------------------------------------------------------------------------------------------------
console.log(undefined === JSON.stringify());
console.log(undefined === JSON.stringify(undefined));
console.log("null"===JSON.stringify(null));
console.log("111"===JSON.stringify(111));
console.log('"111"'===JSON.stringify("111"));
console.log("true"===JSON.stringify(true));
console.log(undefined===JSON.stringify(function(){}));
console.log(undefined===JSON.parse(JSON.stringify()));
console.log(undefined===JSON.parse(JSON.stringify(undefined)));
console.log(null===JSON.parse(JSON.stringify(null)));
console.log(111===JSON.parse(JSON.stringify(111)));
console.log("111"===JSON.parse(JSON.stringify("111")));
console.log(true===JSON.parse(JSON.stringify(true)));
console.log(undefined===JSON.parse(JSON.stringify(function(){})));
-----------------------------------------------------------------------------------------------------
以上属性的具体使用请参考 ES5 标准
d.Number
属性:MAX_VALUE, MIN_VALUE, NEGATIVE_INFINITY, POSITIVE_INFINITY
-----------------------------------------------------------------------------------------------------
以上属性的具体使用请参考 ES5 标准
e.Date
属性:parse, UTC, now
-----------------------------------------------------------------------------------------------------
以上属性的具体使用请参考 ES5 标准
f.Global
属性:NaN, Infinity, undefined
方法:parseInt, parseFloat, isNaN, isFinite, decodeURI, decodeURIComponent, encodeURI, encodeURIComponent。
-----------------------------------------------------------------------------------------------------
以上属性的具体使用请参考 ES5 标准
1.13 [2]框架:WXML
00.汇总
01.介绍
02.数据绑定
03.列表渲染
04.条件渲染
05.模板
06.引用
01.介绍
a.功能说明
WXML(WeiXin Markup Language)是框架设计的一套标签语言,结合基础组件、事件系统,可以构建出页面的结构。
b.示例功能
a.数据绑定
<!--wxml-->
<view> {{message}} </view>
// page.js
Page({
data: {
message: 'Hello MINA!'
}
})
b.列表渲染
<!--wxml-->
<view wx:for="{{array}}"> {{item}} </view>
// page.js
Page({
data: {
array: [1, 2, 3, 4, 5]
}
})
c.条件渲染
<!--wxml-->
<view wx:if="{{view == 'WEBVIEW'}}"> WEBVIEW </view>
<view wx:elif="{{view == 'APP'}}"> APP </view>
<view wx:else="{{view == 'MINA'}}"> MINA </view>
// page.js
Page({
data: {
view: 'MINA'
}
})
d.模板
<!--wxml-->
<template name="staffName">
<view>
FirstName: {{firstName}}, LastName: {{lastName}}
</view>
</template>
<template is="staffName" data="{{...staffA}}"></template>
<template is="staffName" data="{{...staffB}}"></template>
<template is="staffName" data="{{...staffC}}"></template>
// page.js
Page({
data: {
staffA: {firstName: 'Hulk', lastName: 'Hu'},
staffB: {firstName: 'Shang', lastName: 'You'},
staffC: {firstName: 'Gideon', lastName: 'Lin'}
}
})
c.具体能力
数据绑定、列表渲染、条件渲染、模板、引用。
02.数据绑定
a.功能说明
WXML 中的动态数据均来自对应 Page 的 data。
b.简单绑定
a.内容
<view> {{ message }} </view>
Page({
data: {
message: 'Hello MINA!'
}
})
b.组件属性
<view id="item-{{id}}"> </view>
Page({
data: {
id: 0
}
})
c.控制属性
<view wx:if="{{condition}}"> </view>
Page({
data: {
condition: true
}
})
d.关键字
true:boolean 类型的 true,代表真值。
false:boolean 类型的 false,代表假值。
<checkbox checked="{{false}}"> </checkbox>
c.运算
a.三元运算
<view hidden="{{flag ? true : false}}"> Hidden </view>
b.算数运算
<view> {{a + b}} + {{c}} + d </view>
Page({
data: {
a: 1,
b: 2,
c: 3
}
})
c.逻辑判断
<view wx:if="{{length > 5}}"> </view>
d.字符串运算
<view>{{"hello" + name}}</view>
Page({
data:{
name: 'MINA'
}
})
e.数据路径运算
<view>{{object.key}} {{array[0]}}</view>
Page({
data: {
object: {
key: 'Hello '
},
array: ['MINA']
}
})
d.组合
a.数组
<view wx:for="{{[zero, 1, 2, 3, 4]}}"> {{item}} </view>
Page({
data: {
zero: 0
}
})
b.对象
<template is="objectCombine" data="{{foo: a, bar: b}}"></template>
Page({
data: {
a: 1,
b: 2
}
})
c.扩展运算符
<template is="objectCombine" data="{{...obj1, ...obj2, e: 5}}"></template>
Page({
data: {
obj1: {
a: 1,
b: 2
},
obj2: {
c: 3,
d: 4
}
}
})
d.间接表达
<template is="objectCombine" data="{{foo, bar}}"></template>
Page({
data: {
foo: 'my-foo',
bar: 'my-bar'
}
})
e.覆盖规则
<template is="objectCombine" data="{{...obj1, ...obj2, a, c: 6}}"></template>
Page({
data: {
obj1: {
a: 1,
b: 2
},
obj2: {
b: 3,
c: 4
},
a: 5
}
})
f.注意事项
花括号和引号之间如果有空格,将最终被解析成为字符串。
03.列表渲染
a.wx:for
a.功能
在组件上使用 wx:for 控制属性绑定一个数组,即可使用数组中各项的数据重复渲染该组件。
b.示例代码
<view wx:for="{{array}}">
{{index}}: {{item.message}}
</view>
Page({
data: {
array: [{
message: 'foo',
}, {
message: 'bar'
}]
}
})
c.嵌套示例
<view wx:for="{{[1, 2, 3, 4, 5, 6, 7, 8, 9]}}" wx:for-item="i">
<view wx:for="{{[1, 2, 3, 4, 5, 6, 7, 8, 9]}}" wx:for-item="j">
<view wx:if="{{i <= j}}">
{{i}} * {{j}} = {{i * j}}
</view>
</view>
</view>
b.block wx:for
a.功能
将 wx:for 用在 <block/> 标签上,以渲染一个包含多节点的结构块。
b.示例代码
<block wx:for="{{[1, 2, 3]}}">
<view> {{index}}: </view>
<view> {{item}} </view>
</block>
c.wx:key
a.功能
指定列表中项目的唯一标识符。
b.示例代码
<switch wx:for="{{objectArray}}" wx:key="unique" style="display: block;"> {{item.id}} </switch>
<button bindtap="switch"> Switch </button>
<button bindtap="addToFront"> Add to the front </button>
c.注意事项
当 wx:for 的值为字符串时,会将字符串解析成字符串数组。
04.条件渲染
a.wx:if
a.功能
使用 wx:if="" 来判断是否需要渲染该代码块。
b.示例代码
<view wx:if="{{condition}}"> True </view>
c.使用 wx:elif 和 wx:else
<view wx:if="{{length > 5}}"> 1 </view>
<view wx:elif="{{length > 2}}"> 2 </view>
<view wx:else> 3 </view>
b.block wx:if
a.功能
使用 <block/> 标签将多个组件包装起来,并在上边使用 wx:if 控制属性。
b.示例代码
<block wx:if="{{true}}">
<view> view1 </view>
<view> view2 </view>
</block>
c.wx:if vs hidden
a.比较
wx:if 有更高的切换消耗而 hidden 有更高的初始渲染消耗。
如果需要频繁切换的情景下,用 hidden 更好;如果在运行时条件不大可能改变则 wx:if 较好。
05.模板
a.定义模板
a.说明
使用 name 属性,作为模板的名字。
b.示例代码
<template name="msgItem">
<view>
<text> {{index}}: {{msg}} </text>
<text> Time: {{time}} </text>
</view>
</template>
b.使用模板
a.说明
使用 is 属性,声明需要的使用的模板。
b.示例代码
<template is="msgItem" data="{{...item}}"/>
Page({
data: {
item: {
index: 0,
msg: 'this is a template',
time: '2016-09-15'
}
}
})
c.动态渲染模板
<template name="odd">
<view> odd </view>
</template>
<template name="even">
<view> even </view>
</template>
<block wx:for="{{[1, 2, 3, 4, 5]}}">
<template is="{{item % 2 == 0 ? 'even' : 'odd'}}"/>
</block>
c.模板的作用域
模板拥有自己的作用域,只能使用 data 传入的数据以及模板定义文件中定义的 <wxs /> 模块。
06.引用
a.import
a.功能
import可以在该文件中使用目标文件定义的template
b.在 item.wxml 中定义了一个叫item的template
<!-- item.wxml -->
<template name="item">
<text>{{text}}</text>
</template>
c.在 index.wxml 中引用了 item.wxml,就可以使用item模板
<import src="item.wxml"/>
<template is="item" data="{{text: 'forbar'}}"/>
b.import 的作用域
a.说明
import 有作用域的概念,即只会 import 目标文件中定义的 template,而不会 import 目标文件 import 的 template。
b.示例
C import B,B import A,在C中可以使用B定义的template,在B中可以使用A定义的template,但是C不能使用A定义的template。
-------------------------------------------------------------------------------------------------
<!-- A.wxml -->
<template name="A">
<text> A template </text>
</template>
-------------------------------------------------------------------------------------------------
<!-- B.wxml -->
<import src="a.wxml"/>
<template name="B">
<text> B template </text>
</template>
-------------------------------------------------------------------------------------------------
<!-- C.wxml -->
<import src="b.wxml"/>
<template is="A"/> <!-- Error! Can not use tempalte when not import A. -->
<template is="B"/>
c.include
a.功能
将目标文件除了 <template/> <wxs/> 外的整个代码引入。
b.示例代码
include 可以将目标文件除了 <template/> <wxs/> 外的整个代码引入,相当于是拷贝到 include 位置,
-------------------------------------------------------------------------------------------------
<!-- index.wxml -->
<include src="header.wxml"/>
<view> body </view>
<include src="footer.wxml"/>
-------------------------------------------------------------------------------------------------
<!-- header.wxml -->
<view> header </view>
-------------------------------------------------------------------------------------------------
<!-- footer.wxml -->
<view> footer </view>
1.14 [2]框架:travel模块
00.汇总
01.四大组件
02.组件示例
01.四大组件
a.汇总
四者的关系可以用“房子”来类比四者的协同:
index.wxml = 房子的“框架结构”(墙、窗、门的位置)
index.wxss = 房子的“装修风格”(墙的颜色、地板材质、家具样式)
index.js = 房子的“控制系统”(灯光开关、空调调节、门锁响应)
index.json = 房子的“基础设置”(门牌号、窗户大小、是否装防盗网)
b.index.wxml:页面的“结构视图”文件(相当于网页的 HTML)
a.说明
wxml 是微信小程序的模板语言文件,负责定义页面的“骨架”——即用户能看到的所有元素(如文字、按钮、图片、列表等),
类似网页开发中的 HTML,但语法和标签更贴合小程序特性。
b.核心作用
搭建页面布局:通过小程序专属标签(如 <view>、<text>、<button>)组织页面结构;
数据绑定:通过 {{ 数据名 }} 语法将 index.js 中定义的“数据”渲染到页面上;
事件绑定:通过 bindtap、bindinput 等属性,将页面操作(如点击按钮、输入文字)与 index.js 中的“事件函数”关联;
条件渲染/列表渲染:通过 wx:if(条件显示)、wx:for(循环生成列表)等指令实现动态页面效果。
c.简单示例
<!-- index.wxml -->
<!-- 1. 数据绑定:渲染 js 中的 "pageTitle" 数据 -->
<view class="title">{{ pageTitle }}</view>
<!-- 2. 事件绑定:点击按钮触发 js 中的 "handleClick" 函数 -->
<button bindtap="handleClick">点击我</button>
<!-- 3. 列表渲染:循环渲染 js 中的 "list" 数组 -->
<view class="list">
<view wx:for="{{ list }}" wx:key="index">
第{{ index+1 }}项:{{ item }}
</view>
</view>
c.index.wxss:页面的“样式美化”文件(相当于网页的 CSS)
a.说明
wxss 是微信小程序的样式表文件,负责定义 index.wxml 中元素的外观(如颜色、大小、间距、布局方式等),
类似网页开发中的 CSS,但增加了小程序专属特性(如 rpx 自适应单位)。
b.核心作用
美化页面元素:设置字体大小、颜色、背景色、边框等基础样式;
控制布局:通过 flex、position 等属性调整元素在页面中的位置;
自适应适配:使用小程序专属单位 rpx(自动适配不同屏幕宽度,1rpx ≈ 屏幕宽度/750),无需手动适配不同手机;
样式作用域:index.wxss 的样式 仅对当前 index 页面生效,不会影响其他页面(避免样式冲突)。
c.简单示例
/* index.wxss */
/* 给 "title" 类的元素设置样式 */
.title {
font-size: 32rpx; /* 自适应字体大小 */
color: #333; /* 文字颜色 */
margin: 20rpx 0; /* 上下间距 */
text-align: center; /* 文字居中 */
}
/* 给按钮设置样式 */
button {
background-color: #07c160; /* 微信绿 */
color: white;
padding: 15rpx 30rpx;
border-radius: 50rpx; /* 圆角 */
}
d.index.js:页面的“逻辑控制”文件(相当于网页的 JavaScript)
a.说明
index.js 是页面的逻辑处理核心,负责管理页面的“数据”、“事件响应”、“生命周期”等,
是页面实现交互功能的关键(如点击按钮后更新内容、加载数据、跳转页面等)。
b.核心作用
管理页面数据:通过 Page({ data: { ... } }) 定义页面需要渲染的数据(如 pageTitle、list),数据变化时通过 this.setData({ ... }) 更新(更新后会自动同步到 index.wxml);
处理用户交互:定义 handleClick、handleInput 等事件函数,响应 index.wxml 中绑定的点击、输入等操作;
控制页面生命周期:小程序页面有一套固定的“生命周期钩子”(如页面加载、显示、隐藏时触发的函数),可在 index.js 中定义这些钩子,实现初始化数据、清理资源等逻辑;
调用小程序 API:通过 wx.xxx 调用微信提供的原生 API(如跳转页面 wx.navigateTo、获取用户信息 wx.getUserProfile、发起网络请求 wx.request 等)。
c.简单示例
// index.js
// 页面逻辑入口:通过 Page() 函数注册页面
Page({
// 1. 页面初始数据(会渲染到 wxml 中)
data: {
pageTitle: "我的首页",
list: ["苹果", "香蕉", "橙子"] // 用于 wxml 循环渲染
},
// 2. 事件函数:响应按钮点击(与 wxml 中的 bindtap 绑定)
handleClick() {
// 更新数据:修改 pageTitle,并同步到 wxml
this.setData({
pageTitle: "点击后的首页"
});
// 调用小程序 API:弹出提示框
wx.showToast({
title: "按钮被点击啦!",
icon: "none"
});
},
// 3. 生命周期钩子:页面加载时触发(仅触发一次)
onLoad(options) {
console.log("页面加载完成,可在这里初始化数据");
// 示例:发起网络请求,获取数据后更新 list
// wx.request({
// url: "https://xxx.com/api/list",
// success: (res) => {
// this.setData({ list: res.data });
// }
// });
},
// 生命周期钩子:页面显示时触发(每次进入页面都会触发)
onShow() {
console.log("页面显示了");
}
});
e.index.json:页面的“配置”文件(控制页面基础属性)
a.说明
index.json 是页面的配置文件,用于设置当前页面的“窗口样式”、“导航栏标题”、“是否允许下拉刷新”等基础属性,
配置项会覆盖全局配置(app.json)中对应的项。
b.核心作用
配置导航栏:设置导航栏标题文字(navigationBarTitleText)、背景色(navigationBarBackgroundColor)、文字颜色(navigationBarTextStyle);
控制页面窗口:设置是否允许下拉刷新(enablePullDownRefresh)、页面背景色(backgroundColor)、下拉刷新时的 loading 样式(backgroundTextStyle);
配置页面路由:若页面需要接收其他页面跳转时传递的参数,可在此配置路由相关规则(较少用,通常在 app.json 的 pages 中配置页面路径);
页面单独配置:每个页面的 json 配置仅对当前页面生效,可实现“不同页面不同导航栏样式”(如首页导航栏是红色,详情页是蓝色)。
c.简单示例
{
"navigationBarTitleText": "首页", // 导航栏标题
"navigationBarBackgroundColor": "#07c160", // 导航栏背景色(微信绿)
"navigationBarTextStyle": "white", // 导航栏文字颜色(仅支持 black/white)
"enablePullDownRefresh": true, // 允许下拉刷新
"backgroundColor": "#f5f5f5", // 页面背景色
"backgroundTextStyle": "dark" // 下拉刷新 loading 颜色(仅支持 dark/light)
}
02.组件示例
a.index.js
// 出差申请页面 - 功能开发中
Page({
data: {
pageTitle: '出差申请'
},
onLoad() {
// 页面加载
},
// 返回工作台
goBack() {
wx.navigateBack({
fail: () => {
// 如果无法返回,跳转到工作台
wx.switchTab({
url: '/pages/app/work/index'
})
}
})
}
})
b.index.json
{
"navigationBarTitleText": "出差申请",
"usingComponents": {
"van-icon": "@vant/weapp/icon/index",
"van-button": "@vant/weapp/button/index"
}
}
c.index.wxml
<!--出差申请页面-->
<view class="dev-page-container">
<!-- 开发中提示 -->
<view class="dev-content">
<view class="dev-icon">
<van-icon name="location-o" size="120rpx" color="#cccccc" />
</view>
<view class="dev-title">出差申请</view>
<view class="dev-subtitle">功能开发中</view>
<view class="dev-description">该功能正在紧张开发中,敬请期待...</view>
<!-- 返回按钮 -->
<view class="dev-actions">
<van-button type="primary" size="large" bind:tap="goBack">返回工作台</van-button>
</view>
</view>
</view>
d.index.wxss
/* 功能开发中页面样式 */
.dev-page-container {
min-height: 100vh;
background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
display: flex;
align-items: center;
justify-content: center;
padding: 40rpx;
}
.dev-content {
background: white;
border-radius: 24rpx;
padding: 80rpx 60rpx;
text-align: center;
box-shadow: 0 8rpx 32rpx rgba(0, 0, 0, 0.1);
max-width: 600rpx;
width: 100%;
}
.dev-icon {
margin-bottom: 40rpx;
}
.dev-title {
font-size: 48rpx;
font-weight: bold;
color: #333333;
margin-bottom: 16rpx;
}
.dev-subtitle {
font-size: 32rpx;
color: #999999;
margin-bottom: 24rpx;
}
.dev-description {
font-size: 28rpx;
color: #666666;
line-height: 1.6;
margin-bottom: 60rpx;
}
.dev-actions {
width: 100%;
}
1.15 [3]API:服务端
00.汇总
a.开发前必读
安全鉴权模式介绍
服务端api签名指南
b.接口调用凭证
获取接口调用凭据
获取稳定版接口调用凭据
c.openApi管理
重置API调用次数
查询API调用额度
查询rid信息
使用AppSecret重置 API 调用次数
d.小程序登录
小程序登录
检验登录态
重置登录态
e.用户信息
a.用户信息
获取插件用户openpid
检查加密信息
支付后获取Unionid
b.网络
获取用户encryptKey
c.手机号
手机号快速验证
01.开发前必读
a.安全鉴权模式介绍
a.签名与验签
a.介绍
在请求API的过程中,为了保护数据的安全,开发者在应用中使用自己的私钥生成请求的签名(签名算法支持RSA及SM2),
平台会在收到请求后使用应用的公钥进行签名的验证,开发者则使用平台证书中的公钥验证回调的签名,来保证互相请求的真实性和数据的完整性。
b.应用公钥
公钥是指应用公钥,开发者通过平台工具生成公钥信息,并保存在API安全配置中,用于平台进行接口调用时的验签。
c.应用私钥
私钥是指应用私钥,开发者可以通过平台工具生成私钥信息,用于生成请求的签名,请妥善保管好私钥文件,务必自行保障其安全性。
d.平台证书
平台证书是指包含微信开放平台公钥信息的证书,用于开发者验证API回包的平台签名。开发者可在配置应用公钥后在API安全模块下载。
b.接口内容加密介绍
a.说明
平台支持对接口的请求内容和响应内容进行 AES256/SM4 加密(资源上传类API暂不支持加密),
加密后,在网络上传输的接口报文内容将会由明文内容变为密文内容,可以大幅提升接口内容传输的安全性。
接口数据加密与签名,可以在接口数据泄露的情况下,确保接口内容保密且不被篡改。 开发者应先加密请求数据,然后对密文签名。
c.生成并配置密钥
a.进入配置页
开发者登录小程序管理后台,可在“开发 - 开发管理 - 开发设置 - API安全”进行API密钥的配置。
点击“开始配置”后,需使用管理员微信扫码验证身份,通过后进入配置页面。
b.配置接口内容加密密钥
可在API对称密钥处进行配置,点击“随机生成密钥”后,再点击“下载密钥”进行密钥下载(如开发者已准备好密钥,可直接将已准备好的密钥填充进输入框),
验证无误后点击“确认”,即可完成对称密钥的配置。
c.配置应用私钥和公钥
可在API非对称密钥处进行配置,点击“随机生成密钥对”后,再点击“下载私钥”进行私钥下载,
请妥善进行保管(如开发者已准备好密钥对,可直接将已准备好的应用公钥填充进输入框),验证无误后点击“确认”,即可完成应用公钥的上传。
d.获取平台证书
开发者配置完应用公钥后,需下载开放平台证书,用于后续接口回调时的验签操作。在此页面,也可查看对应的API密钥及密钥编号。
b.服务端api签名指南
a.说明
a.分类1
在小程序管理后台开启api加密后,开发者需要对原API的请求内容加密与签名,同时API的回包内容需要开发者验签与解密。支持的api可参考接口调用。
b.分类2
目前支持以下几种算法,可在MP管理页配置。
加密算法:AES256_GCM、SM4_GCM
签名算法:RSAwithSHA256、SM2withSM3
b.API请求处理
a.加密
a.请求参数
参数 类型 默认值 必填 备注
iv string 是 初始向量,为16字节base64字符串(解码后为12字节随机字符串)
data string 是 加密后的密文,使用base64编码
authtag string 是 GCM模式输出的认证信息,使用base64编码
b.GCM使用的认证数据
GCM分组模式需要设置额外认证数据(AAD)对密文进行认证。平台统一使用 urlpath|appid|timestamp|sn 格式,字段之间使用竖线符号|分隔。
参数 说明
urlpath 当前请求API的URL路径,包含URL协议信息,不包括URL参数(URL Query)
appid 当前小程序的Appid
timestamp 加密时的时间戳,需要与HTTP请求头Wechatmp-TimeStamp的时间戳一致
sn 使用的对称密钥编号,需要在MP平台密钥管理页面获取
c.data明文格式
参数 类型 默认值 必填 备注
data 原字段类型 是 原请求字段,包含URL参数、POST参数,不包含AccessToken
_n string 是 随机字符串,推荐使用16-32字节非固定长度随机base64字符串
_appid string 是 当前小程序的Appid
_timestamp number 是 加密时的时间戳,需要与HTTP请求头Wechatmp-TimeStamp的时间戳一致
b.签名
a.说明
开发者需要对API的POST数据签名,由HTTP请求头传递。
b.请求参数
HEADER名 默认值 必填 备注
Wechatmp-Appid 是 当前小程序的Appid
Wechatmp-TimeStamp 是 签名时时间戳
Wechatmp-Signature 是 签名数据,使用base64编码
c.签名字段格式
开发者需先拼接待签名串,使用 urlpath\n appid\n timestamp\n postdata 格式,字段之间使用换行符\n做分隔符。
参数 说明
urlpath 当前请求API的URL,不包括URL参数(URL Query),需要带HTTP协议头
appid 当前小程序的Appid
timestamp 签名时的时间戳,即请求头Wechatmp-TimeStamp的值
postdata 当前请求的POST数据
c.API响应处理
a.说明
API响应数据需要验签与解密。
响应内的签名算法为RSAwithSHA256,验签需要使用MP平台证书验证,可在MP管理页下载最新平台证书。
响应内的加密算法、密钥与请求时一致。
b.验签
a.说明
由于平台证书存在有效期,平台证书可能过期。在平台证书更换周期内,平台会同时带上最新证书与即将过期证书的签名结果。
开发者需要根据已下载的平台证书编号找到对应的签名来验证。
b.请求参数
HEADER名 默认值 必填 备注
Wechatmp-Appid 是 当前小程序的Appid
Wechatmp-TimeStamp 是 签名时时间戳
Wechatmp-Serial 是 平台证书编号,在MP管理页面获取,非证书内序列号
Wechatmp-Signature 是 平台证书签名数据,使用base64编码
Wechatmp-Serial-Deprecated 否 即将失效的平台证书编号,非证书内序列号,仅在证书更换周期内出现
Wechatmp-Signature-Deprecated 否 即将失效的平台证书签名数据,仅在证书更换周期内出现,使用base64编码
c.签名字段格式
开发者需先拼接待签名串,使用 urlpath\n appid\n timestamp\n respdata 格式,字段之间使用换行符\n做分隔符。
参数 说明
urlpath 当前请求API的URL,不包括URL参数(URL Query),需要带HTTP协议头
appid 当前小程序的Appid
timestamp 签名时的时间戳,即响应头Wechatmp-TimeStamp的值
respdata 当前响应的数据
c.解密
响应数据的加密算法、格式与请求时一致,可参考请求加密。
02.接口调用凭证
a.获取接口调用凭据
a.接口说明
a.接口英文名
getAccessToken
b.功能描述
获取小程序全局唯一后台接口调用凭据,token有效期为7200s,开发者需要进行妥善保存。
如使用云开发,可通过云调用免维护 access_token 调用。
如使用云托管,也可以通过微信令牌/开放接口服务免维护 access_token 调用。
c.注意事项
a.AppSecret 安全提醒
AppSecret是账号使用后台API接口的小程序密钥,请开发者妥善保管,避免因泄露造成账号被其它人冒用等风险。如长期无AppSecret的使用需求,开发者可以使用管理员账号登录小程序平台,在“开发-开发管理”中对AppSeceret进行冻结,提高账号的安全性。AppSecret冻结后,开发者无法使用AppSecret获取Access token(接口返回错误码40243),不影响账号基本功能的正常使用,不影响通过第三方授权调用后台接口,不影响云开发调用后台接口。开发者可以随时使用管理员账号登录小程序平台,在“开发-开发管理”中对AppSecret进行解冻。
b.调用方式
a.HTTPS 调用
GET https://api.weixin.qq.com/cgi-bin/token
c.请求参数
a.grant_type
类型: string
必填: 是
说明: 填写 client_credential
b.appid
类型: string
必填: 是
说明: 小程序唯一凭证,即 AppID,可在「微信公众平台 - 设置 - 开发设置」页中获得。(需要已经成为开发者,且帐号没有异常状态)
c.secret
类型: string
必填: 是
说明: 小程序唯一凭证密钥,即 AppSecret,获取方式同 appid
d.返回参数
a.access_token
类型: string
说明: 获取到的凭证
b.expires_in
类型: number
说明: 凭证有效时间,单位:秒。目前是7200秒之内的值。
e.其他说明
a.access_token 的存储与更新
access_token 的存储至少要保留 512 个字符空间;
access_token 的有效期目前为 2 个小时,需定时刷新,重复获取将导致上次获取的 access_token 失效;
建议开发者使用中控服务器统一获取和刷新 access_token,其他业务逻辑服务器所使用的 access_token 均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致 access_token 覆盖而影响业务;
access_token 的有效期通过返回的 expires_in 来传达,目前是7200秒之内的值,中控服务器需要根据这个有效时间提前去刷新。在刷新过程中,中控服务器可对外继续输出的老 access_token,此时公众平台后台会保证在5分钟内,新老 access_token 都可用,这保证了第三方业务的平滑过渡;
access_token 的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新 access_token 的接口,这样便于业务服务器在API调用获知 access_token 已超时的情况下,可以触发 access_token 的刷新流程。
详情可参考微信公众平台文档 《获取access_token》
b.免维护 access_token 的场景
如果使用了云托管或云开发,可以免维护 access_token,免鉴权直接调用服务端接口。
a.云托管:
通过微信令牌免维护 access_token 发起服务端调用,在调用微信服务端接口时,将 URL 上的 access_token 参数改成 cloudbase_access_token,值通过微信令牌取得。
调用微信支付也可以免维护鉴权和支付证书信息,避免证书泄漏风险。
b.云开发:
通过云开发云调用免维护 access_token 调用。
调用微信支付也可以免维护鉴权和支付证书信息,避免证书泄漏风险。
f.在线调试
开发者可以使用网页调试工具调试该接口
g.调用示例
a.示例说明: HTTPS调用示例
b.请求数据示例
GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
c.返回数据示例
---
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200
}
---
b.获取稳定版接口调用凭据
a.接口说明
a.接口英文名
getStableAccessToken
b.功能描述
获取小程序全局后台接口调用凭据,有效期最长为7200s,开发者需要进行妥善保存;
有两种调用模式: 1. 普通模式,access_token 有效期内重复调用该接口不会更新 access_token,绝大部分场景下使用该模式;2. 强制刷新模式,会导致上次获取的 access_token 失效,并返回新的 access_token;
该接口调用频率限制为 1万次 每分钟,每天限制调用 50万 次;
与getAccessToken获取的调用凭证完全隔离,互不影响。该接口仅支持 POST JSON 形式的调用;
如使用云开发,可通过云调用免维护 access_token 调用;
如使用云托管,也可以通过微信令牌/开放接口服务免维护 access_token 调用;
c.调用方式
a.HTTPS 调用
POST https://api.weixin.qq.com/cgi-bin/stable_token
d.请求参数
a.grant_type
类型: string
必填: 是
说明: 填写 client_credential
b.appid
类型: string
必填: 是
说明: 账号唯一凭证,即 AppID,可在「微信公众平台 - 设置 - 开发设置」页中获得。(需要已经成为开发者,且账号没有异常状态)
c.secret
类型: string
必填: 是
说明: 账号唯一凭证密钥,即 AppSecret,获取方式同 appid
d.force_refresh
类型: boolean
必填: 否
说明: 默认使用 false。1. force_refresh = false 时为普通调用模式,access_token 有效期内重复调用该接口不会更新 access_token;2. 当force_refresh = true 时为强制刷新模式,会导致上次获取的 access_token 失效,并返回新的 access_token
e.返回参数
a.access_token
类型: string
说明: 获取到的凭证
b.expires_in
类型: number
说明: 凭证有效时间,单位:秒。目前是7200秒之内的值。
f.其他说明
a.access_token 的存储与更新
access_token 的存储空间至少要保留 512 个字符;
建议开发者仅在access_token 泄漏时使用强制刷新模式,该模式限制每天20次。考虑到数据安全,连续使用该模式时,请保证调用时间隔至少为30s,否则不会刷新;
在普通模式调用下,平台会提前5分钟更新access_token,即在有效期倒计时5分钟内发起调用会获取新的access_token。在新旧access_token交接之际,平台会保证在5分钟内,新旧access_token都可用,这保证了用户业务的平滑过渡; 根据此特性可知,任意时刻发起调用获取到的 access_token 有效期至少为 5 分钟,即expires_in >= 300;
b.最佳实践
在使用getAccessToken时,平台建议开发者使用中控服务来统一获取和刷新access_token。有此成熟方案的开发者依然可以复用方案并通过普通模式来调用本接口,另外请将发起接口调用的时机设置为上次获取到的access_token有效期倒计时5分钟之内即可;
根据以上特性,为减少其他开发者构建中控服务的开发成本,在普通调用模式下,平台建议开发者将每次获取的access_token 在本地建立中心化存储使用,无须考虑并行调用接口时导致意外情况发生,仅须保证至少每5分钟发起一次调用并覆盖本地存储。同时,该方案也支持各业务独立部署使用,即无须中心化存储也可以保证服务正常运行;
c.access_token 泄漏紧急处理
使用强制刷新模式以间隔30s发起两次调用可将已经泄漏的 access_token立即失效,同时正常的业务请求可能会返回错误码40001(access_token 过期),请妥善使用该策略。其次,需要立即排查泄漏原因,加以修正,必要时可以考虑重置 appsecret;
g.调用示例
a.示例说明: 普通模式,获取当前有效调用凭证
a.请求数据示例
POST https://api.weixin.qq.com/cgi-bin/stable_token
请求示例1(不传递force_refresh,默认值为false):
---
{
"grant_type": "client_credential",
"appid": "APPID",
"secret": "APPSECRET"
}
---
请求示例2(设置force_refresh为false):
---
{
"grant_type": "client_credential",
"appid": "APPID",
"secret": "APPSECRET",
"force_refresh": false
}
---
b.返回数据示例
返回示例1:
---
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200
}
---
返回示例2:
---
{
"access_token":"ACCESS_TOKEN",
"expires_in":345
}
---
b.示例说明: 强制刷新模式,慎用,连续使用需要至少间隔30s
a.请求数据示例
POST https://api.weixin.qq.com/cgi-bin/stable_token
---
{
"grant_type": "client_credential",
"appid": "APPID",
"secret": "APPSECRET",
"force_refresh": true
}
---
b.返回数据示例
---
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200
}
---
03.openApi管理
a.重置API调用次数
调试诊断
接口应在服务器端调用,详细说明参见服务端API。
a.接口说明
a.接口英文名
clearQuota
b.功能描述
本接口用于清空公众号/小程序/第三方平台等接口的每日调用接口次数
c.注意事项
1、如果要清空公众号的接口的quota,则需要用公众号的access_token;如果要清空小程序的接口的quota,则需要用小程序的access_token;如果要清空第三方平台的接口的quota,则需要用第三方平台的component_access_token
2、如果是第三方服务商代公众号或者小程序清除quota,则需要用authorizer_access_token
3、每个账号每月共10次清零操作机会,清零生效一次即用掉一次机会;第三方帮助公众号/小程序调用时,实际上是在消耗公众号/小程序自身的quota
4、由于指标计算方法或统计时间差异,实时调用量数据可能会出现误差,一般在1%以内
b.调用方式
a.HTTPS 调用
POST https://api.weixin.qq.com/cgi-bin/clear_quota?access_token=ACCESS_TOKEN
c.第三方调用
调用方式以及出入参和HTTPS相同,仅是调用的token不同
d.请求参数
a.access_token
类型: string
必填: 是
说明: 接口调用凭证,该参数为 URL 参数,非 Body 参数。使用access_token或者authorizer_access_token
b.appid
类型: string
必填: 是
说明: 要被清空的账号的appid
e.返回参数
a.errcode
类型: number
说明: 错误码
b.errmsg
类型: string
说明: 错误信息
f.调用示例
a.示例说明: 请求示例:
b.请求数据示例
---
{
"appid":"wx448f04719cd48f69"
}
---
c.返回数据示例
---
{
"errcode": 0,
"errmsg": "ok"
}
---
g.错误码
a.48006
错误码取值: forbid to clear quota because of reaching the limit
解决方案: api 禁止清零调用次数,因为清零次数达到上限
b.0
错误码取值: ok
解决方案: ok
c.40013
错误码取值: invalid appid
解决方案: 不合法的 AppID ,请开发者检查 AppID 的正确性,避免异常字符,注意大小写
b.查询API调用额度
调试诊断
接口应在服务器端调用,详细说明参见服务端API。
a.接口说明
a.接口英文名
getApiQuota
b.功能描述
本接口用于查询公众号/小程序/第三方平台等接口的每日调用接口的额度,调用次数,频率限制
c.注意事项
1、如果查询的api属于公众号的接口,则需要用公众号的access_token;如果查询的api属于小程序的接口,则需要用小程序的access_token;如果查询的接口属于第三方平台的接口,则需要用第三方平台的component_access_token;如果查询的接口属于第三方平台接口但用于公众号/小程序,则需要用第三方平台的authorizer_access_token
2、如果是第三方服务商代公众号或者小程序查询公众号或者小程序的api,则需要用authorizer_access_token
3、每个接口都有调用次数限制,请开发者合理调用接口
4、”/xxx/sns/xxx“这类接口不支持使用该接口,会出现76022报错。
5、如果业务api定义了业务上的quota,那么以业务api的quota为准
b.调用方式
a.HTTPS 调用
POST https://api.weixin.qq.com/cgi-bin/openapi/quota/get?access_token=ACCESS_TOKEN
c.第三方调用
调用方式以及出入参和HTTPS相同,仅是调用的token不同
d.请求参数
a.access_token
类型: string
必填: 是
说明: 接口调用凭证,该参数为 URL 参数,非 Body 参数。使用access_token或者authorizer_access_token
b.cgi_path
类型: string
必填: 是
说明: api的请求地址,例如"/cgi-bin/message/custom/send";不要前缀“https://api.weixin.qq.com” ,也不要漏了"/",否则都会76003的报错
e.返回参数
a.errcode
类型: number
说明: 返回码
b.errmsg
类型: string
说明: 错误信息
c.quota
类型: object
说明: quota详情
a.属性
a.daily_limit
类型: number
说明: 当天该账号可调用该接口的次数
b.used
类型: number
说明: 当天已经调用的次数
c.remain
类型: number
说明: 当天剩余调用次数
d.rate_limit
类型: object
说明: 普通调用频率限制
a.属性
a.call_count
类型: number
说明: 周期内可调用数量,单位 次
b.refresh_second
类型: number
说明: 更新周期,单位 秒
e.component_rate_limit
类型: object
说明: 代调用频率限制
a.属性
a.call_count
类型: number
说明: 周期内可调用数量,单位 次
b.refresh_second
类型: number
说明: 更新周期,单位 秒
f.调用示例
a.示例说明: 请求示例:
b.请求数据示例
---
{
"cgi_path":"/wxa/gettemplatedraftlist"
}
---
c.返回数据示例
---
{
"errcode": 0,
"errmsg": "ok",
"quota":{
"daily_limit": 0,
"used": 0,
"remain": 0
}
}
---
g.错误码
a.0
错误描述: ok
解决方案: ok
b.76021
错误描述: cgi_path not found, please check
解决方案: cgi_path填错了
c.76022
错误描述: could not use this cgi_path,no permission
解决方案: 当前调用接口使用的token与api所属账号不符,详情可看注意事项的说明
c.查询rid信息
调试诊断
接口应在服务器端调用,详细说明参见服务端API。
a.接口说明
a.接口英文名
getRidInfo
b.功能描述
本接口用于查询调用公众号/小程序/第三方平台等接口报错返回的rid详情信息,辅助开发者高效定位问题。
c.注意事项
1、由于查询rid信息属于开发者私密行为,因此仅支持同账号的查询。举个例子,rid=1111,是小程序账号A调用某接口出现的报错,那么则需要使用小程序账号A的access_token调用当前接口查询rid=1111的详情信息,如果使用小程序账号B的身份查询,则出现报错,错误码为xxx。公众号、第三方平台账号的接口同理。
2、如果是第三方服务商代公众号或者小程序查询公众号或者小程序的api返回的rid,则使用同一账号的authorizer_access_token调用即可
3、rid的有效期只有7天,即只可查询最近7天的rid,查询超过7天的rid会出现报错,错误码为76001
4、”/xxx/sns/xxx“这类接口不支持使用该接口,会出现76022报错。
b.调用方式
a.HTTPS 调用
POST https://api.weixin.qq.com/cgi-bin/openapi/rid/get?access_token=ACCESS_TOKEN
c.第三方调用
调用方式以及出入参和HTTPS相同,仅是调用的token不同
d.请求参数
a.access_token
类型: string
必填: 是
说明: 接口调用凭证,该参数为 URL 参数,非 Body 参数。使用access_token或者authorizer_access_token
b.rid
类型: string
必填: 是
说明: 调用接口报错返回的rid
e.返回参数
a.errcode
类型: number
说明: 返回码
b.errmsg
类型: string
说明: 错误信息
c.request
类型: object
说明: 该rid对应的请求详情
a.属性
a.invoke_time
类型: number
说明: 发起请求的时间戳
b.cost_in_ms
类型: number
说明: 请求毫秒级耗时
c.request_url
类型: string
说明: 请求的URL参数
d.request_body
类型: string
说明: post请求的请求参数
e.response_body
类型: string
说明: 接口请求返回参数
f.client_ip
类型: string
说明: 接口请求的客户端ip
f.调用示例
a.示例说明: HTTPS请求
b.请求数据示例
---
{
"rid":"61725984-6126f6f9-040f19c4"
}
---
c.返回数据示例
---
{"errcode":0,
"errmsg":"ok",
"request":{
"invoke_time":1635156704,
"cost_in_ms":30,
"request_url":"access_token=50_Im7xxxx",
"request_body":"",
"response_body":"{\"errcode\":45009,\"errmsg\":\"reach max api daily quota limit rid: 617682e0-09059ac5-34a8e2ea\"}",
"client_ip": "113.xx.70.51"
}
}
---
g.错误码
a.0
错误码取值: ok
解决方案: ok
b.76001
错误码取值: rid not found
解决方案: rid不存在
c.76002
错误码取值: rid is error
解决方案: rid为空或者格式错误
d.76003
错误码取值: could not query this rid,no permission
解决方案: 当前账号无权查询该rid,该rid属于其他账号调用所产生
e.76004
错误码取值: rid time is error
解决方案: rid过期,仅支持持续7天内的rid
d.使用AppSecret重置 API 调用次数
接口应在服务器端调用,详细说明参见服务端API。
a.接口说明
a.接口英文名
clearQuotaByAppSecret
b.功能描述
本接口用于清空公众号/小程序等接口的每日调用接口次数
c.注意事项
1、该接口通过appsecret调用,解决了accesss_token耗尽无法调用重置 API 调用次数 的情况
2、每个账号每月使用重置 API 调用次数 与本接口共10次清零操作机会,清零生效一次即用掉一次机会;
3、由于指标计算方法或统计时间差异,实时调用量数据可能会出现误差,一般在1%以内
4、该接口仅支持POST调用
5、如果要清除getComponentAccessToken调用次数或者以服务商身份代商家清除公众号或者小程序调用次数,则需要使用clearComponentQuotaByAppSecret
b.调用方式
a.HTTPS 调用
POST https://api.weixin.qq.com/cgi-bin/clear_quota/v2
c.请求参数
a.appid
类型: string
必填: 是
说明: 要被清空的账号的appid
b.appsecret
类型: string
必填: 是
说明: 唯一凭证密钥,即 AppSecret,获取方式同 appid
d.返回参数
a.errcode
类型: number
说明: 错误码
b.errmsg
类型: string
说明: 错误信息
e.调用示例
a.示例说明: post请求
b.请求数据示例
POST https://api.weixin.qq.com/cgi-bin/clear_quota/v2?appid=wx888888888888&appsecret=xxxxxxxxxxxxxxxxxxxxxxxx
c.返回数据示例
---
{
"errcode": 0,
"errmsg": "ok"
}
---
f.错误码
a.-1
错误码取值: system error
解决方案: 系统繁忙,此时请开发者稍候再试
b.40013
错误码取值: invalid appid
解决方案: 不合法的 AppID ,请开发者检查 AppID 的正确性,避免异常字符,注意大小写
c.41004
错误码取值: appsecret missing
解决方案: 缺少 secret 参数
d.41002
错误码取值: appid missing
解决方案: 缺少 appid 参数
e.48006
错误码取值: forbid to clear quota because of reaching the limit
解决方案: api 禁止清零调用次数,因为清零次数达到上限
04.小程序登录
a.小程序登录
调试诊断
接口应在服务器端调用,详细说明参见服务端API。
a.接口说明
a.接口英文名
code2Session
b.功能描述
登录凭证校验。通过 wx.login 接口获得临时登录凭证 code 后传到开发者服务器调用此接口完成登录流程。更多使用方法详见小程序登录。
b.调用方式
a.HTTPS 调用
GET https://api.weixin.qq.com/sns/jscode2session
c.请求参数
a.appid
类型: string
必填: 是
说明: 小程序 appId
b.secret
类型: string
必填: 是
说明: 小程序 appSecret
c.js_code
类型: string
必填: 是
说明: 登录时获取的 code,可通过wx.login获取
d.grant_type
类型: string
必填: 是
说明: 授权类型,此处只需填写 authorization_code
d.返回参数
a.session_key
类型: string
说明: 会话密钥
b.unionid
类型: string
说明: 用户在开放平台的唯一标识符,若当前小程序已绑定到微信开放平台帐号下会返回,详见 UnionID 机制说明。
c.errmsg
类型: string
说明: 错误信息,请求失败时返回
d.openid
类型: string
说明: 用户唯一标识
e.errcode
类型: int32
说明: 错误码,请求失败时返回
e.调用示例
a.示例说明: HTTPS请求
b.请求数据示例
GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
c.返回数据示例
---
{
"openid":"xxxxxx",
"session_key":"xxxxx",
"unionid":"xxxxx",
"errcode":0,
"errmsg":"xxxxx"
}
---
f.错误码
a.40029
错误描述: code 无效
解决方案: js_code无效
b.45011
错误描述: api minute-quota reach limit mustslower retry next minute
解决方案: API 调用太频繁,请稍候再试
c.40226
错误描述: code blocked
解决方案: 高风险等级用户,小程序登录拦截 。风险等级详见用户安全解方案
d.-1
错误描述: system error
解决方案: 系统繁忙,此时请开发者稍候再试
b.检验登录态
接口应在服务器端调用,详细说明参见服务端API。
a.接口说明
a.接口英文名
checkSessionKey
b.功能描述
校验服务器所保存的登录态 session_key 是否有效。为了保持 session_key 私密性,接口不明文传输 session_key,而是通过校验登录态签名完成。
session_key 具有唯一性,在使用小程序时,同一用户在同一时刻仅有一个有效的 session_key。 通过 code2Session 接口获得的用户 session_key 拥有一定的时效性。 除了过期失效外,触发获取临时登录凭证 code 的操作(小程序登录 和 数据预拉取)也可能会生成新的登录态 session_key,从而使旧的 session_key 被顶替而失效。
为了处理以上失效情况,可以通过本接口校验用户 session_key 的有效性。
b.调用方式
a.HTTPS 调用
GET https://api.weixin.qq.com/wxa/checksession?access_token=ACCESS_TOKEN&signature=SIGNATURE&openid=OPENID&sig_method=SIG_METHOD
c.第三方调用
调用方式以及出入参和HTTPS相同,仅是调用的token不同
该接口所属的权限集id为:18
服务商获得其中之一权限集授权后,可通过使用authorizer_access_token代商家进行调用
d.请求参数
a.access_token
类型: string
默认值:
必填: 是
说明: 接口调用凭证,该参数为 URL 参数,非 Body 参数。使用access_token或者authorizer_access_token
b.openid
类型: string
默认值:
必填: 是
说明: 用户唯一标识符
c.signature
类型: string
默认值:
必填: 是
说明: 用户登录态签名,用session_key对空字符串签名得到的结果。即 signature = hmac_sha256(session_key, "")
d.sig_method
类型: string
默认值:
必填: 是
说明: 用户登录态签名的哈希方法,目前只支持 hmac_sha256
e.返回值
返回的 JSON 数据包
a.errcode
类型: number
说明: 错误码
b.errmsg
类型: string
说明: 错误信息
f.调用示例
a.示例说明: checkSessionKey请求示例
b.请求数据示例
GET https://api.weixin.qq.com/wxa/checksession?access_token=OsAoOMw4niuuVbfSxxxxxxxxxxxxxxxxxxx&signature=fefce01bfba4670c85b228e6ca2b493c90971e7c442f54fc448662eb7cd72509&openid=oGZUI0egBJY1zhBYw2KhdUfwVJJE&sig_method=hmac_sha256
c.返回数据示例
---
{"errcode": 0, "errmsg": "ok"}
---
g.错误码
a.0
错误描述: ok
解决方案: ok
b.87009
错误描述: invalid signature
解决方案: 无效的签名
c.重置登录态
接口应在服务器端调用,详细说明参见服务端API。
a.接口说明
a.接口英文名
ResetUserSessionKey
b.功能描述
重置指定的登录态 session_key。为了保持 session_key 私密性,接口不明文传入 session_key,而是通过校验登录态签名完成。
b.调用方式
a.HTTPS 调用
GET https://api.weixin.qq.com/wxa/resetusersessionkey?access_token=ACCESS_TOKEN
c.第三方调用
调用方式以及出入参和HTTPS相同,仅是调用的token不同
该接口所属的权限集id为:18
服务商获得其中之一权限集授权后,可通过使用authorizer_access_token代商家进行调用
d.请求参数
a.access_token
类型: string
默认值:
必填: 是
说明: 接口调用凭证,该参数为 URL 参数,非 Body 参数。使用access_token或者authorizer_access_token
b.openid
类型: string
默认值:
必填: 是
说明: 用户唯一标识符
c.signature
类型: string
默认值:
必填: 是
说明: 用户登录态签名,用session_key对空字符串签名得到的结果。即 signature = hmac_sha256(session_key, "")
d.sig_method
类型: string
默认值:
必填: 是
说明: 用户登录态签名的哈希方法,目前只支持 hmac_sha256
e.返回值
返回的 JSON 数据包
a.errcode
类型: number
说明: 错误码
b.errmsg
类型: string
说明: 错误信息
c.openid
类型: string
说明: 用户唯一标识符
d.session_key
类型: string
说明: 重置后的用户登录态
f.其他说明
重置用户session_key后,原有的session_key会失效。请注意接口调用时机,以免影响用户在小程序中的体验。
重置后的session_key会继承原有的session_key的过期时间,重置操作不能为session_key续期。
单个小程序appid请求量频率限制为 60000 次 / 分钟。
不允许频繁重置同一个用户的登录态。
g.调用示例
a.示例说明: ResetUserSessionKey请求示例
b.请求数据示例
GET https://api.weixin.qq.com/wxa/resetusersessionkey?access_token=ACCESS_TOKEN&openid=OPENID&signature=SIGNATURE&sig_method=hmac_sha256
c.返回数据示例
---
{"errcode": 0, "errmsg": "ok", "openid": "xxxxxxx", "session_key": "xxxxxxxx" }
---
h.错误码
a.45011
错误描述: api minute-quota reach limit mustslower retry next minute
解决方案: API 调用太频繁,请稍候再试
b.87008
错误描述: invalid sig_method
解决方案:
c.87007
错误描述: session_key is not existd or expired
解决方案:
d.-1
错误描述: system error
解决方案: 系统繁忙,此时请开发者稍候再试
e.87009
错误描述: invalid signature
解决方案: 无效的签名
f.40097
错误描述: invalid args
解决方案: 参数错误
05.用户信息
a.获取插件用户openpid
调试诊断
接口应在服务器端调用,详细说明参见服务端API。
a.接口说明
a.接口英文名
getPluginOpenPId
b.功能描述
通过 wx.pluginLogin 接口获得插件用户标志凭证 code 后传到开发者服务器,开发者服务器调用此接口换取插件用户的唯一标识 openpid。
b.调用方式
a.HTTPS 调用
POST https://api.weixin.qq.com/wxa/getpluginopenpid?access_token=ACCESS_TOKEN
c.第三方调用
调用方式以及出入参和HTTPS相同,仅是调用的token不同
该接口所属的权限集id为:18
服务商获得其中之一权限集授权后,可通过使用authorizer_access_token代商家进行调用
d.请求参数
a.access_token
类型: string
必填: 是
说明: 接口调用凭证,该参数为 URL 参数,非 Body 参数。使用access_token或者authorizer_access_token
b.code
类型: string
必填: 是
说明: 通过 wx.pluginLogin 获得的插件用户标志凭证 code,有效时间为5分钟,一个 code 只能获取一次 openpid。
e.返回参数
a.errcode
类型: number
说明: 错误码
b.errmsg
类型: string
说明: 错误信息
c.openpid
类型: string
说明: 插件用户的唯一标识。
f.调用示例
a.示例说明: HTTPS请求示例
b.请求数据示例
---
{
"code": "0c2b206443ce0c23338f6cb4d1ec15a1af0b8bcddbff26510dda4b23a433c391"
}
---
c.返回数据示例
---
{
"errcode": 0,
"errmsg": "ok",
"openpid": "GACo74wkDIkDzEhkwRwgjGt1pqlk"
}
---
g.错误码
a.0
错误描述: ok
解决方案: ok
b.40016
错误描述: invalid button size
解决方案: 不合法的按钮个数
c.45009
错误描述: reach max api daily quota limit
解决方案: 天级别频率限制,2种解决途径2选1: 1.到小程序mp-开发管理-接口设置-调用额度重置;2.调用限频重置API
d.1000
错误描述: 系统错误
解决方案:
e.1022
错误描述: json数据解析错误
解决方案:
f.1001
错误描述: 请求参数非法
解决方案:
g.1003
错误描述: 请求频率过快
解决方案:
h.1005
错误描述: 插件 appid 与数据不匹配
解决方案:
i.1007
错误描述: openpid数据不存在
解决方案:
b.检查加密信息
调试诊断
接口应在服务器端调用,详细说明参见服务端API。
a.接口说明
a.接口英文名
checkEncryptedData
b.功能描述
检查加密信息是否由微信生成(当前只支持手机号加密数据),只能检测最近3天生成的加密数据。
b.调用方式
a.HTTPS 调用
POST https://api.weixin.qq.com/wxa/business/checkencryptedmsg?access_token=ACCESS_TOKEN
c.第三方调用
调用方式以及出入参和HTTPS相同,仅是调用的token不同
该接口所属的权限集id为:18
服务商获得其中之一权限集授权后,可通过使用authorizer_access_token代商家进行调用
d.请求参数
a.access_token
类型: string
必填: 是
说明: 接口调用凭证,该参数为 URL 参数,非 Body 参数。使用access_token或者authorizer_access_token
b.encrypted_msg_hash
类型: string
必填: 是
说明: 加密数据的sha256,通过Hex(Base16)编码后的字符串
e.返回参数
a.errcode
类型: number
说明: 错误码
b.errmsg
类型: string
说明: 错误提示信息
c.vaild
类型: boolean
说明: 是否是合法的数据
d.create_time
类型: number
说明: 加密数据生成的时间戳
f.调用示例
a.示例说明: HTTPS调用示例
b.请求数据示例
---
{
"encrypted_msg_hash": "657edd868c9715a9bebe42b833269a557a48498785397a796f1568c29a200b2c"
}
---
c.返回数据示例
---
{
"errcode": 0,
"errmsg": "ok",
"vaild": true,
"create_time" :1629121902
}
---
g.错误码
a.-1
错误码取值: system error
解决方案: 系统繁忙,此时请开发者稍候再试
b.1
错误码取值: data not exit
解决方案: 加密数据不存在,数据生成的时间超过保存的限制(3天)或者 key 不存在,或者数据和appid不匹配
c.40097
错误码取值: invalid args
解决方案: 参数错误
d.44002
错误码取值: empty post data
解决方案: POST 的数据包为空。post请求body参数不能为空。
e.47001
错误码取值: data format error
解决方案: 解析 JSON/XML 内容错误;post 数据中参数缺失;检查修正后重试。
c.支付后获取 Unionid
调试诊断
接口应在服务器端调用,详细说明参见服务端API。
本接口支持云调用。需开发者工具版本 >= 1.02.1904090(最新稳定版下载),wx-server-sdk >= 0.4.0
a.接口说明
a.接口英文名
getPaidUnionid
b.功能描述
该接口用于在用户支付完成后,获调用本接口前需要用户完成支付,用户支付完成后,取该用户的 UnionId,无需用户授权。本接口支付后的五分钟内有效。
c.注意事项
调用前需要用户完成支付,且在支付后的五分钟内有效。
使用微信支付订单号(transaction_id)和微信支付商户订单号和微信支付商户号(out_trade_no 及 mch_id),二选一
b.调用方式
a.HTTPS 调用
GET https://api.weixin.qq.com/wxa/getpaidunionid?access_token=ACCESS_TOKEN
b.云调用
出入参和HTTPS调用相同,调用方式可查看云调用说明文档
接口方法为: openapi.auth.getPaidUnionId
c.第三方调用
调用方式以及出入参和HTTPS相同,仅是调用的token不同
d.请求参数
a.access_token
类型: string
必填: 是
说明: 接口调用凭证,该参数为 URL 参数,非 Body 参数。使用access_token或者authorizer_access_token
b.openid
类型: string
必填: 是
说明: 支付用户唯一标识
c.transaction_id
类型: string
必填: 否
说明: 微信支付订单号
d.mch_id
类型: string
必填: 否
说明: 微信支付分配的商户号,和商户订单号配合使用
e.out_trade_no
类型: string
必填: 否
说明: 微信支付商户订单号,和商户号配合使用
e.返回参数
a.unionid
类型: string
说明: 用户唯一标识,调用成功后返回
b.errcode
类型: number
说明: 错误码
c.errmsg
类型: string
说明: 错误信息
f.调用示例
a.示例说明: 使用微信支付订单号
a.请求数据示例
GET https://api.weixin.qq.com/wxa/getpaidunionid?access_token=ACCESS_TOKEN&openid=OPENID&transaction_id=TRANSACTION_ID
b.返回数据示例
---
{
"unionid": "oTmHYjg-tElZ68xxxxxxxxhy1Rgk",
"errcode": 0,
"errmsg": "ok"
}
---
b.示例说明: 使用微信支付商户订单号和微信支付商户号(out_trade_no 及 mch_id)
a.请求数据示例
GET https://api.weixin.qq.com/wxa/getpaidunionid?access_token=ACCESS_TOKEN&openid=OPENID&mch_id=MCH_ID&out_trade_no=OUT_TRADE_NO
b.返回数据示例
---
{
"unionid": "oTmHYjg-tElZ68xxxxxxxxhy1Rgk",
"errcode": 0,
"errmsg": "ok"
}
---
c.示例说明: 云函数示例
a.请求数据示例
---
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV,
})
exports.main = async (event, context) => {
try {
const result = await cloud.openapi.auth.getPaidUnionId({
"openid": '',
"transactionId": '',
"mchId": '',
"outTradeNo": ''
})
return result
} catch (err) {
return err
}
}
---
b.返回数据示例
---
{
"unionid": "oTmHYjg-tElZ68xxxxxxxxhy1Rgk",
"errCode": 0,
"errMsg": "openapi.auth.getPaidUnionId:ok"
}
---
g.错误码
a.40001
错误码取值: invalid credential access_token isinvalid or not latest
解决方案: 获取 access_token 时 AppSecret 错误,或者 access_token 无效。请开发者认真比对 AppSecret 的正确性,或查看是否正在为恰当的公众号调用接口
b.0
错误码取值: ok
解决方案: ok
c.-1
错误码取值: system error
解决方案: 系统繁忙,此时请开发者稍候再试
d.40003
错误码取值: invalid openid
解决方案: 不合法的 OpenID ,请开发者确认 OpenID (该用户)是否已关注公众号,或是否是其他公众号的 OpenID
e.89002
错误码取值: open not exists
解决方案: open not exists,该公众号/小程序未绑定微信开放平台账号。
f.89300
错误码取值: invalid trade
解决方案: 订单无效
d.获取用户encryptKey
调试诊断
接口应在服务器端调用,详细说明参见服务端API。
a.接口说明
a.接口英文名
getUserEncryptKey
b.功能描述
该接口用于获取用户encryptKey。 会获取用户最近3次的key,每个key的存活时间为3600s。
b.调用方式
a.HTTPS 调用
GET https://api.weixin.qq.com/wxa/business/getuserencryptkey?access_token=ACCESS_TOKEN&signature=SIGNATURE&openid=OPENID&sig_method=SIG_METHOD
c.第三方调用
调用方式以及出入参和HTTPS相同,仅是调用的token不同
该接口所属的权限集id为:18
服务商获得其中之一权限集授权后,可通过使用authorizer_access_token代商家进行调用
d.请求参数
a.access_token
类型: string
必填: 是
说明: 接口调用凭证,该参数为 URL 参数,非 Body 参数。使用access_token或者authorizer_access_token
b.openid
类型: string
必填: 是
说明: 用户的openid
c.signature
类型: string
必填: 是
说明: 用sessionkey作为密钥对空字符串签名得到的结果。session_key可通过code2Session接口获得。
d.sig_method
类型: string
必填: 是
说明: 签名方法,只支持 hmac_sha256
e.返回参数
a.errcode
类型: number
说明: 错误码
b.errmsg
类型: string
说明: 错误信息
c.key_info_list
类型: array<object>
说明: 用户最近三次的加密key列表
a.属性
a.encrypt_key
类型: string
说明: 加密key
b.version
类型: number
说明: key的版本号
c.expire_in
类型: number
说明: 剩余有效时间
d.iv
类型: string
说明: 加密iv
e.create_time
类型: number
说明: 创建key的时间戳
f.调用示例
a.示例说明: HTTPS调用
b.请求数据示例
GET https://api.weixin.qq.com/wxa/business/getuserencryptkey?access_token=OsAoOMw4niuuVbfSxxxxxxxxxxxxxxxxxxx&signature=fefce01bfba4670c85b228e6ca2b493c90971e7c442f54fc448662eb7cd72509&openid=oGZUI0egBJY1zhBYw2KhdUfwVJJE&sig_method=hmac_sha256
c.返回数据示例
---
{
"errcode":0,
"errmsg":"ok",
"key_info_list":
[
{
"encrypt_key":"VI6BpyrK9XH4i4AIGe86tg==",
"version":10,
"expire_in":3597,
"iv":"6003f73ec441c386",
"create_time":1616572301
},
{
"encrypt_key":"aoUGAHltcliiL9f23oTKHA==",
"version":9,
"expire_in":0,
"iv":"7996656384218dbb",
"create_time":1616504886
},
{
"encrypt_key":"MlZNQNnRQz3zXHHcr6A3mA==",
"version":8,
"expire_in":0,
"iv":"58a1814f88883024",
"create_time":1616488061
}
]
}
---
g.错误码
a.40001
错误描述: invalid credential access_token isinvalid or not latest
解决方案: 获取 access_token 时 AppSecret 错误,或者 access_token 无效。请开发者认真比对 AppSecret 的正确性,或查看是否正在为恰当的公众号调用接口
e.获取手机号
调试诊断
接口应在服务器端调用,详细说明参见服务端API。
本接口支持云调用。需开发者工具版本 >= 1.02.1904090(最新稳定版下载),wx-server-sdk >= 0.4.0
a.接口说明
a.接口英文名
getPhoneNumber
b.功能描述
该接口用于将code换取用户手机号。 说明,每个code只能使用一次,code的有效期为5min。
b.调用方式
a.HTTPS 调用
POST https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=ACCESS_TOKEN
b.云调用
出入参和HTTPS调用相同,调用方式可查看云调用说明文档
接口方法为: openapi.phonenumber.getPhoneNumber
c.第三方调用
调用方式以及出入参和HTTPS相同,仅是调用的token不同
该接口所属的权限集id为:18
服务商获得其中之一权限集授权后,可通过使用authorizer_access_token代商家进行调用
d.请求参数
a.access_token
类型: string
必填: 是
说明: 接口调用凭证,该参数为 URL 参数,非 Body 参数。使用access_token或者authorizer_access_token
b.code
类型: string
必填: 是
说明: 手机号获取凭证
c.openid
类型: string
必填: 否
说明:
e.返回参数
a.errcode
类型: number
说明: 错误码
b.errmsg
类型: string
说明: 错误信息
c.phone_info
类型: object
说明: 用户手机号信息
a.属性
a.phoneNumber
类型: string
说明: 用户绑定的手机号(国外手机号会有区号)
b.purePhoneNumber
类型: string
说明: 没有区号的手机号
c.countryCode
类型: string
说明: 区号
d.watermark
类型: object
说明: 数据水印
a.属性
a.timestamp
类型: number
说明: 用户获取手机号操作的时间戳
b.appid
类型: string
说明: 小程序appid
f.调用示例
a.示例说明: HTTPS请求示例
b.请求数据示例
---
{
"code": "e31968a7f94cc5ee25fafc2aef2773f0bb8c3937b22520eb8ee345274d00c144"
}
---
c.返回数据示例
---
{
"errcode":0,
"errmsg":"ok",
"phone_info": {
"phoneNumber":"xxxxxx",
"purePhoneNumber": "xxxxxx",
"countryCode": 86,
"watermark": {
"timestamp": 1637744274,
"appid": "xxxx"
}
}
}
---
g.错误码
a.-1
错误描述: system error
解决方案: 系统繁忙,此时请开发者稍候再试
b.40029
错误描述: code 无效
解决方案: js_code无效
c.45011
错误描述: api minute-quota reach limit mustslower retry next minute
解决方案: API 调用太频繁,请稍候再试
d.40013
错误描述: invalid appid
解决方案: 请求appid身份与获取code的小程序appid不匹配
1.16 [3]API:提供接口1
00.汇总
a.登录
wx.pluginLogin(Object args) 可以此凭证换取用于识别用户的标识 openpid
wx.login(Object object) 调用接口获取登录凭证(code)
wx.checkSession(Object object) 检查登录态 session_key 是否过期
b.账号信息
Object wx.getAccountInfoSync() 获取当前账号信息
c.用户信息
wx.getUserProfile(Object object) 获取用户信息。页面产生点击事件(例如 button 上 bindtap 的回调中)后才可调用,每次请求都会弹出授权窗口,用户同意后返回 userInfo。该接口用于替换 wx.getUserInfo
wx.getUserInfo(Object object) 获取用户信息
UserInfo 用户昵称、用户头像图片的URL、用户性别、用户所在国家、用户所在省份、用户所在城市
d.授权
wx.authorizeForMiniProgram(Object object) 获取授权,仅小程序插件中能调用该接口,用法同 wx.authorize。目前仅支持三种 scope
wx.authorize(Object object) 获取授权,提前向用户发起授权请求。调用后会立刻弹窗询问用户是否同意授权小程序使用某项功能或获取用户的某些数据,但不会实际调用对应接口。
e.设置
wx.openSetting(Object object) 调起客户端小程序设置界面,返回用户设置的操作结果。设置界面只会出现小程序已经向用户请求过的权限。
wx.getSetting(Object object) 获取用户的当前设置。返回值中只会出现小程序已经向用户请求过的权限。
AuthSetting 用户授权设置信息,详情参考权限
SubscriptionsSetting 订阅消息设置
01.登录
a.wx.pluginLogin(Object args)
a.功能说明
该接口仅在小程序插件中可调用,调用接口获得插件用户标志凭证(code)。
插件可以此凭证换取用于识别用户的标识 openpid。
用户不同、宿主小程序不同或插件不同的情况下,该标识均不相同,即当且仅当同一个用户在同一个宿主小程序中使用同一个插件时,openpid 才会相同。
b.支持情况
基础库 2.20.1 开始支持,低版本需做兼容处理。
以 Promise 风格 调用:不支持
小程序插件:支持,需要小程序基础库版本不低于 2.20.1
微信 Windows 版:支持
微信 鸿蒙 OS 版:支持
c.参数说明
a.Object args
success:接口调用成功的回调函数。
fail:接口调用失败的回调函数。
complete:接口调用结束的回调函数(调用成功、失败都会执行)。
b.args.success 回调函数
参数:Object res
code:用于换取 openpid 的凭证(有效期五分钟)
d.示例代码
wx.pluginLogin({
success(res) {
console.log('Code:', res.code);
// 在开发者服务器后台调用 getPluginOpenPId 换取 openpid
},
fail(err) {
console.error('Plugin login failed:', err);
},
complete() {
console.log('Plugin login completed.');
}
});
b.wx.login(Object object)
a.功能说明
调用接口获取登录凭证(code)
通过凭证进而换取用户登录态信息,包括用户在当前小程序的唯一标识(openid)、微信开放平台账号下的唯一标识(unionid,若当前小程序已绑定到微信开放平台账号)及本次登录的会话密钥(session_key)等。
用户数据的加解密通讯需要依赖会话密钥完成。
b.支持情况
以 Promise 风格 调用:不支持
小程序插件:支持,需要小程序基础库版本不低于 2.3.1
在小程序插件中使用时,需要在用户信息功能页中获得用户授权或满足一定条件后调用。否则将返回 fail。详见 用户信息功能页
微信 Windows 版:支持
微信 Mac 版:支持
微信 鸿蒙 OS 版:支持
相关文档: 小程序登录、UnionID 机制说明、接口调用频率规范
c.参数说明
a.Object object
timeout:超时时间,单位 ms。
success:接口调用成功的回调函数。
fail:接口调用失败的回调函数。
complete:接口调用结束的回调函数(调用成功、失败都会执行)。
b.object.success 回调函数
参数:Object res
属性:code:用户登录凭证(有效期五分钟)。
c.object.fail 回调函数
参数:Object err
属性:errMsg:错误信息。
errno:错误码(基础库 2.24.0 起支持)。
d.示例代码
wx.login({
success(res) {
if (res.code) {
// 发起网络请求
wx.request({
url: 'https://example.com/onLogin',
data: {
code: res.code
}
});
} else {
console.log('登录失败!' + res.errMsg);
}
},
fail(err) {
console.error('Login failed:', err);
},
complete() {
console.log('Login completed.');
}
});
c.wx.checkSession(Object object)
a.功能说明
检查登录态 session_key 是否过期。
session_key 具有唯一性,在使用小程序时,同一用户在同一时刻仅有一个有效的 session_key。
通过 wx.login 接口获得的用户登录态拥有一定的时效性。用户越久未使用小程序,用户登录态越有可能过期。反之如果用户一直在使用小程序,则用户登录态一直保持有效。具体时效逻辑由微信维护,对开发者透明。除了过期失效外,触发获取临时登录凭证 code 的操作(小程序登录 和 数据预拉取)可能会生成新的登录态session_key,从而使旧的 session_key 被顶替而失效。
开发者可以调用 wx.checkSession 接口检测用户登录态是否过期。注意,wx.checkSession 的校验对象是最后一次获取 code 操作对应的登录态 session_key,调用成功说明该 session_key 未过期,调用失败说明 session_key 已过期。如果要校验指定的 session_key 是否有效,可以在开发者服务器后台调用 checkSessionKey。
登录态失效后开发者可以再调用 wx.login 获取新的用户登录态。
b.支持情况
以 Promise 风格 调用:支持
小程序插件:不支持
微信 Windows 版:支持
微信 Mac 版:支持
相关文档: 小程序登录、接口调用频率规范
c.参数说明
a.Object object
success:接口调用成功的回调函数。
fail:接口调用失败的回调函数。
complete:接口调用结束的回调函数(调用成功、失败都会执行)。
d.示例代码
wx.checkSession({
success() {
// session_key 未过期,并且在本生命周期一直有效
console.log('Session key is valid.');
},
fail() {
// session_key 已经失效,需要重新执行登录流程
console.log('Session key expired. Re-login required.');
wx.login(); // 重新登录
},
complete() {
console.log('Check session completed.');
}
});
02.账号信息
a.Object wx.getAccountInfoSync()
a.功能说明
获取当前账号信息。线上小程序版本号仅支持在正式版小程序中获取,开发版和体验版中无法获取。
b.支持情况
基础库 2.2.2 开始支持,低版本需做兼容处理。
小程序插件:支持,需要小程序基础库版本不低于 2.2.2
微信 Windows 版:支持
微信 Mac 版:支持
微信 鸿蒙 OS 版:支持
c.返回值
a.Object
账号信息
b.属性说明
a.miniProgram
类型:Object
描述:小程序账号信息
结构属性:appId:string,小程序 appId
envVersion:string,小程序版本(基础库 2.10.0 起支持)
version:string,线上小程序版本号(基础库 2.10.2 起支持)
b.plugin
类型:Object
描述:插件账号信息(仅在插件中调用时包含这一项)
结构属性:appId:string,插件 appId。
version:string,插件版本号(格式为 'a.b.c')
d.示例代码
const accountInfo = wx.getAccountInfoSync();
console.log(accountInfo.miniProgram.appId); // 小程序 appId
console.log(accountInfo.miniProgram.envVersion); // 小程序版本
console.log(accountInfo.miniProgram.version); // 线上小程序版本号
console.log(accountInfo.plugin.appId); // 插件 appId
console.log(accountInfo.plugin.version); // 插件版本号,'a.b.c' 这样的形式
03.用户信息
a.wx.getUserProfile(Object object)
a.功能说明
获取用户信息。
页面产生点击事件(例如 button 上 bindtap 的回调中)后才可调用。
每次请求都会弹出授权窗口,用户同意后返回 userInfo。
用于替换 wx.getUserInfo,详见用户信息接口调整说明。
b.支持情况
基础库:2.10.4 起支持
小程序插件:不支持
微信 Windows 版:支持
微信 鸿蒙 OS 版:支持
c.参数说明
a.Object object
lang:显示用户信息的语言,默认值为 "en"。
desc:声明获取用户个人信息后的用途,不超过30个字符,必填。
success:接口调用成功的回调函数。
fail:接口调用失败的回调函数。
complete:接口调用结束的回调函数(调用成功、失败都会执行)。
b.object.success 回调函数
参数:Object res
userInfo:用户信息对象(基础库 2.10.4 起支持)。
rawData:不包括敏感信息的原始数据字符串,用于计算签名。
signature:使用 sha1(rawData + sessionkey) 得到字符串,用于校验用户信息。
encryptedData:包括敏感数据在内的完整用户信息的加密数据。
iv:加密算法的初始向量。
cloudID:敏感数据对应的云 ID,仅开通云开发的小程序返回。
d.Bug & Tip
a.说明
tip:仅小程序中 wx.getUserInfo 接口进行调整,小游戏中不受影响。
tip:开发者工具中仅 2.10.4 及以上版本可访问 wx.getUserProfile 接口。
tip:wx.getUserProfile 返回的加密数据中不包含 openId 和 unionId 字段。
bug:开发者工具中 2.10.4~2.16.1 基础库版本通过 <button open-type="getUserInfo"> 会返回真实数据,真机上此区间会按照公告返回匿名数据。
b.代码示例
<view class="container">
<view class="userinfo">
<block wx:if="{{!hasUserInfo}}">
<button wx:if="{{canIUseGetUserProfile}}" bindtap="getUserProfile"> 获取头像昵称 </button>
<button wx:else open-type="getUserInfo" bindgetuserinfo="getUserInfo"> 获取头像昵称 </button>
</block>
<block wx:else>
<image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" mode="cover"></image>
<text class="userinfo-nickname">{{userInfo.nickName}}</text>
</block>
</view>
</view>
---------------------------------------------------------------------------------------------
Page({
data: {
userInfo: {},
hasUserInfo: false,
canIUseGetUserProfile: false,
},
onLoad() {
if (wx.getUserProfile) {
this.setData({
canIUseGetUserProfile: true
})
}
},
getUserProfile(e) {
// 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需用户确认
// 开发者妥善保管用户快速填写的头像昵称,避免重复弹窗
wx.getUserProfile({
desc: '用于完善会员资料', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
success: (res) => {
this.setData({
userInfo: res.userInfo,
hasUserInfo: true
})
}
})
},
getUserInfo(e) {
// 不推荐使用getUserInfo获取用户信息,预计自2021年4月13日起,getUserInfo将不再弹出弹窗,并直接返回匿名的用户个人信息
this.setData({
userInfo: e.detail.userInfo,
hasUserInfo: true
})
},
})
b.wx.getUserInfo(Object object)
a.功能说明
获取用户信息。
用户头像昵称获取规则已调整,详见用户信息接口调整说明。
必须在用户授权的情况下调用。
敏感数据(如 openId 和 unionId)需要通过加密数据解密算法或云调用直接获取开放数据。
b.支持情况
基础库:2.3.1 起支持。
用户授权:需要 scope.userInfo。
小程序插件:支持。
微信 Windows 版:支持。
微信 Mac 版:支持。
微信 鸿蒙 OS 版:支持。
c.参数说明
a.Object object
withCredentials:boolean,是否带上登录态信息。
true:要求此前调用过 wx.login 且登录态未过期,返回的数据包含 encryptedData 和 iv 等敏感信息。
false:不要求登录态,返回的数据不包含敏感信息。
lang:string,显示用户信息的语言,默认值为 "en"。
en:英文。
zh_CN:简体中文。
zh_TW:繁体中文。
success:接口调用成功的回调函数。
fail:接口调用失败的回调函数。
complete:接口调用结束的回调函数(调用成功、失败都会执行)。
b.object.success 回调函数
参数:Object res
属性:
userInfo:用户信息对象,不包含 openid 等敏感信息。
rawData:不包括敏感信息的原始数据字符串,用于计算签名。
signature:使用 sha1(rawData + sessionkey) 得到字符串,用于校验用户信息。
encryptedData:包括敏感数据在内的完整用户信息的加密数据。
iv:加密算法的初始向量。
cloudID:敏感数据对应的云 ID,仅开通云开发的小程序返回(基础库 2.7.0 起支持)。
c.示例代码
// 必须是在用户已经授权的情况下调用
wx.getUserInfo({
withCredentials: true, // 是否带上登录态信息
lang: 'zh_CN', // 显示用户信息的语言
success: function(res) {
var userInfo = res.userInfo;
var nickName = userInfo.nickName;
var avatarUrl = userInfo.avatarUrl;
var gender = userInfo.gender; // 性别 0:未知、1:男、2:女
var province = userInfo.province;
var city = userInfo.city;
var country = userInfo.country;
console.log('用户信息:', userInfo);
},
fail: function(err) {
console.error('获取用户信息失败:', err);
},
complete: function() {
console.log('获取用户信息完成');
}
});
d.敏感数据获取方式
a.加密数据解密算法
使用 encryptedData 和 iv 进行解密,获取敏感数据
b.使用 云调用直接获取开放数据 获取得到的开放数据为以下 json 结构
{
"openId": "OPENID",
"nickName": "NICKNAME",
"gender": GENDER,
"city": "CITY",
"province": "PROVINCE",
"country": "COUNTRY",
"avatarUrl": "AVATARURL",
"unionId": "UNIONID",
"watermark": {
"appid": "APPID",
"timestamp": TIMESTAMP
}
}
e.小程序用户信息组件示例代码
a.代码1
<!-- 如果只是展示用户头像昵称,可以使用 <open-data /> 组件 -->
<open-data type="userAvatarUrl"></open-data>
<open-data type="userNickName"></open-data>
<!-- 需要使用 button 来授权登录 -->
<button wx:if="{{canIUse}}" open-type="getUserInfo" bindgetuserinfo="bindGetUserInfo">授权登录</button>
<view wx:else>请升级微信版本</view>
b.代码2
Page({
data: {
canIUse: wx.canIUse('button.open-type.getUserInfo')
},
onLoad: function() {
// 查看是否授权
wx.getSetting({
success(res) {
if (res.authSetting['scope.userInfo']) {
// 已经授权,可以直接调用 getUserInfo 获取头像昵称
wx.getUserInfo({
success: function(res) {
console.log(res.userInfo);
}
});
}
}
});
},
bindGetUserInfo(e) {
console.log(e.detail.userInfo);
}
});
c.UserInfo
a.功能说明
用户信息对象。
用户头像昵称获取规则已调整,详见用户信息接口调整说明。
部分字段已不再返回,详见相关公告。
b.属性说明
a.nickName
类型:string
描述:用户昵称。
b.avatarUrl
类型:string
描述:用户头像图片的 URL。
说明:
URL 最后一个数值代表正方形头像大小。
可选数值:0、46、64、96、132。
0:640x640 的正方形头像。
46:46x46 的正方形头像。
64:64x64 的正方形头像。
96:96x96 的正方形头像。
132:132x132 的正方形头像(默认)。
用户没有头像时该项为空。
若用户更换头像,原有头像 URL 将失效。
c.gender
类型:number
描述:用户性别(不再返回,参考相关公告)。
合法值:0:未知。1:男性。2:女性。
d.country
类型:string
描述:用户所在国家(不再返回,参考相关公告)。
e.province
类型:string
描述:用户所在省份(不再返回,参考相关公告)。
f.city
类型:string
描述:用户所在城市(不再返回,参考相关公告)。
g.language
类型:string
描述:显示 country,province,city 所用的语言。
强制返回值:"zh_CN"(参考相关公告)。
合法值:en:英文。zh_CN:简体中文。zh_TW:繁体中文。
04.授权
a.wx.authorizeForMiniProgram(Object object)
a.功能描述
仅小程序插件中能调用该接口,用法同 wx.authorize。目前仅支持三种 scope(见下)
b.参数
a.Object object
scope:string,必填,需要获取权限的 scope。
合法值:
scope.record
scope.writePhotosAlbum
scope.camera
success:接口调用成功的回调函数。
fail:接口调用失败的回调函数。
complete:接口调用结束的回调函数(调用成功、失败都会执行)。
c.示例代码
wx.authorizeForMiniProgram({
scope: 'scope.record',
success () {
// 用户已经同意小程序使用录音功能,后续调用 wx.startRecord 接口不会弹窗询问
wx.startRecord()
}
})
b.wx.authorize(Object object)
a.功能说明
提前向用户发起授权请求。
调用后会立刻弹窗询问用户是否同意授权小程序使用某项功能或获取用户的某些数据,但不会实际调用对应接口。
如果用户之前已经同意授权,则不会出现弹窗,直接返回成功。
更多用法详见用户授权。
b.支持情况
基础库:1.2.0 起支持。
小程序插件:不支持。
微信 Windows 版:支持。
微信 Mac 版:支持。
微信 鸿蒙 OS 版:支持。
c.参数说明
a.Object object
scope:string,必填,需要获取权限的 scope。
success:接口调用成功的回调函数。
fail:接口调用失败的回调函数。
complete:接口调用结束的回调函数(调用成功、失败都会执行)。
d.示例代码
// 可以通过 wx.getSetting 先查询一下用户是否授权了 "scope.record" 这个 scope
wx.getSetting({
success(res) {
if (!res.authSetting['scope.record']) {
wx.authorize({
scope: 'scope.record',
success() {
// 用户已经同意小程序使用录音功能,后续调用 wx.startRecord 接口不会弹窗询问
wx.startRecord();
},
fail(err) {
console.error('授权失败:', err);
},
complete() {
console.log('授权操作完成');
}
});
}
},
fail(err) {
console.error('获取设置失败:', err);
}
});
05.设置
a.wx.openSetting(Object object)
a.功能描述
调起客户端小程序设置界面,返回用户设置的操作结果。设置界面只会出现小程序已经向用户请求过的权限。
b.参数
a.Object object
withSubscriptions:Boolean,默认值 false,非必填,是否同时获取用户订阅消息的订阅状态。注意:此参数只返回用户勾选过“总是保持以上选择,不再询问”的订阅消息。(2.10.3+ 支持)
success:function,非必填,接口调用成功的回调函数。
fail:function,非必填,接口调用失败的回调函数。
complete:function,非必填,接口调用结束的回调函数(调用成功、失败都会执行)。
c.object.success 回调函数参数
a.Object res
authSetting:AuthSetting,用户授权结果。
subscriptionsSetting:SubscriptionsSetting,用户订阅消息设置,仅当接口参数 withSubscriptions 值为 true 时才返回。(2.10.3+ 支持)
d.注意事项
从 2.3.0 版本开始,用户发生点击行为后,才可以跳转打开设置页,管理授权信息。
e.示例代码
wx.openSetting({
success (res) {
console.log(res.authSetting)
// res.authSetting = {
// "scope.userInfo": true,
// "scope.userLocation": true
// }
}
})
b.wx.getSetting(Object object)
a.功能描述
获取用户的当前设置。返回值中只会出现小程序已经向用户请求过的权限。
b.参数
a. Object object
withSubscriptions:Boolean,默认值 false,非必填,是否同时获取用户订阅消息的订阅状态。注意:此参数只返回用户勾选过“总是保持以上选择,不再询问”的订阅消息。(2.10.1+ 支持)
success:function,非必填,接口调用成功的回调函数。
fail:function,非必填,接口调用失败的回调函数。
complete:function,非必填,接口调用结束的回调函数(调用成功、失败都会执行)。
c.object.success 回调函数参数
a. Object res
authSetting:AuthSetting,用户授权结果。
subscriptionsSetting:SubscriptionsSetting,用户订阅消息设置,仅当接口参数 withSubscriptions 值为 true 时才返回。(2.10.1+ 支持)
miniprogramAuthSetting:AuthSetting,在插件中调用时,当前宿主小程序的用户授权结果。
d.示例代码
// 示例 1: 获取基本授权
wx.getSetting({
success (res) {
console.log(res.authSetting)
// res.authSetting = {
// "scope.userInfo": true,
// "scope.userLocation": true
// }
}
})
// 示例 2: 同时获取订阅消息设置
wx.getSetting({
withSubscriptions: true,
success (res) {
console.log(res.authSetting)
console.log(res.subscriptionsSetting)
// res.subscriptionsSetting = {
// mainSwitch: true,
// itemSettings: {
// 'zun-LzcQyW-edafCVvzPkK4de2Rllr1fFpw2A_x0oXE': 'reject',
// }
// }
}
})
c.AuthSetting
a.功能描述
用户授权设置信息。
b.属性
scope.userInfo:boolean,是否授权用户信息(对应 wx.getUserInfo)。
scope.userLocation:boolean,是否授权精确地理位置(对应 wx.getLocation)。
scope.userFuzzyLocation:boolean,是否授权模糊地理位置(对应 wx.getFuzzyLocation)。
scope.address:boolean,是否授权通讯地址(已取消,默认 true)。
scope.invoiceTitle:boolean,是否授权发票抬头(已取消,默认 true)。
scope.invoice:boolean,是否授权获取发票(已取消,默认 true)。
scope.werun:boolean,是否授权微信运动步数(对应 wx.getWeRunData)。
scope.record:boolean,是否授权录音功能(对应 wx.getRecorderManager)。
scope.writePhotosAlbum:boolean,是否授权保存到相册(对应 wx.saveImageToPhotosAlbum 等)。
scope.camera:boolean,是否授权摄像头(对应 camera 组件)。
scope.bluetooth:boolean,是否授权蓝牙(对应 wx.openBluetoothAdapter 等)。
scope.addPhoneContact:boolean,是否授权添加通讯录联系人(对应 wx.addPhoneContact)。
scope.addPhoneCalendar:boolean,是否授权系统日历(对应 wx.addPhoneCalendar 等)。
d.SubscriptionsSetting
a.功能描述
用户订阅消息设置。
b.属性
mainSwitch:Boolean,订阅消息总开关,true为开启,false为关闭。
itemSettings:Object,每一项订阅消息的订阅状态。对象的键为模板 ID,值为 'accept'(同意)、'reject'(拒绝)或 'ban'(被封禁)。
c.注意事项
itemSettings 只返回用户勾选过“总是保持以上选择,不再询问”的订阅消息。
d.示例代码
wx.getSetting({
withSubscriptions: true,
success (res) {
console.log(res.subscriptionsSetting)
// res.subscriptionsSetting = {
// mainSwitch: true, // 订阅消息总开关
// itemSettings: { // 每一项开关
// SYS_MSG_TYPE_INTERACTIVE: 'accept', // 小游戏系统订阅消息
// zun-LzcQyW-edafCVvzPkK4de2Rllr1fFpw2A_x0oXE: 'reject', // 普通一次性订阅消息
// ke_OZC_66gZxALLcsuI7ilCJSP2OJ2vWo2ooUPpkWrw: 'ban',
// }
// }
}
})
1.17 [3]API:提供接口2
00.汇总
a.路由
wx.navigateTo(Object object) 保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面。使用 wx.navigateBack 可以返回到原页面。小程序中页面栈最多十层。
wx.redirectTo(Object object) 关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到 tabbar 页面。
wx.reLaunch(Object object) 关闭所有页面,打开到应用内的某个页面。
wx.switchTab(Object object) 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面。
wx.navigateBack(Object object) 关闭当前页面,返回上一页面或多级页面。可通过 getCurrentPages 获取当前的页面栈,决定需要返回几层。
wx.rewriteRoute(Object object) 重写正在进行中的路由事件,常用于在 wx.onBeforeAppRoute 回调中改变路由目标。
EventChannel 页面间事件通信通道,在 wx.navigateTo 的 success 回调中获取。
wx.router 用于自定义路由的对象,通过 wx.router 获取。
router.addRouteBuilder(string x, function x) 添加自定义路由配置。
router.removeRouteBuilder(string routeType) 移除自定义路由配置。
router.getRouteContext(Object this) 获取页面对应的自定义路由上下文对象。
b.跳转
wx.restartMiniProgram(Object object) 重启当前小程序
wx.openOfficialAccountProfile(Object object) 通过小程序打开公众号主页
wx.openOfficialAccountChat(Object object) 通过小程序打开公众号会话界面
wx.openOfficialAccountArticle(Object object) 通过小程序打开任意公众号文章(不包括临时链接等异常状态下的公众号文章),必须有点击行为才能调用成功。
wx.openEmbeddedMiniProgram(Object object) 打开半屏小程序。接入指引请参考 半屏小程序能力。
wx.onEmbeddedMiniProgramHeightChange(function l) 监听半屏小程序可视高度变化事件
wx.offEmbeddedMiniProgramHeightChange(function l) 移除半屏小程序可视高度变化事件的监听函数
wx.navigateToMiniProgram(Object object) 打开另一个小程序
wx.navigateBackMiniProgram(Object object) 返回到上一个小程序。只有在当前小程序是被其他小程序打开时可以调用成功。
wx.exitMiniProgram(Object object) 退出当前小程序
c.聊天工具
wx.shareVideoToGroup(Object object) 转发视频到聊天
wx.shareImageToGroup(Object object) 转发图片到聊天
wx.shareFileToGroup(Object object) 转发文件到聊天
wx.shareEmojiToGroup(Object object) 转发表情到聊天
wx.shareAppMessageToGroup(Object object) 转发小程序卡片到聊天
wx.selectGroupMembers(Object object) 选择聊天室的成员,并返回选择成员的 group_openid。若当前为群聊,则会拉起成员选择器;若当前为单聊,则直接返回双方的 group_openid。
wx.openChatTool(Object object) 进入聊天工具模式
wx.notifyGroupMembers(Object object) 提醒用户完成任务,标题长度不超过 30 个字符,支持中英文和数字,中文算2个字符。
wx.getChatToolInfo(Object object) 获取聊天工具模式下的群聊信息
d.转发
wx.updateShareMenu(Object object) 更新转发属性
wx.showShareMenu(Object object) 设置右上角点开的详情界面中的分享按钮是否可用
wx.showShareImageMenu(Object object) 打开分享图片弹窗,可以将图片发送给朋友、分享至朋友圈、收藏或下载
wx.shareVideoMessage(Object object) 转发视频到聊天
wx.shareToOfficialAccount(Object object) 支持拉起公众号图文发表页,用户可将图片与文字内容发表至公众号
wx.shareFileMessage(Object object) 转发文件到聊天
wx.onCopyUrl(function listener) 监听用户点击右上角菜单的「复制链接」按钮时触发的事件。本接口为 Beta 版本,暂只在 Android 平台支持。
wx.offCopyUrl() 移除用户点击右上角菜单的「复制链接」按钮时触发的事件的全部监听函数
wx.hideShareMenu(Object object) 隐藏当前页面的转发按钮
wx.getShareInfo(Object object) 获取转发详细信息(主要是获取群ID)。 从群聊内的小程序消息卡片打开小程序时,调用此接口才有效。
wx.authPrivateMessage(Object object) 验证私密消息。
e.网络
RequestTask wx.request(Object object) 发起 HTTPS 网络请求。
RequestTask.abort() 中断请求任务
RequestTask.onHeadersReceived(function listener) 监听 HTTP Response Header 事件。会比请求完成事件更早
RequestTask.offHeadersReceived(function listener) 移除 HTTP Response Header 事件的监听函数
RequestTask.onChunkReceived(function listener) 监听 Transfer-Encoding Chunk Received 事件。当接收到新的chunk时触发。
RequestTask.offChunkReceived(function listener) 移除 Transfer-Encoding Chunk Received 事件的监听函数
----------------------------------------------------
DownloadTask wx.downloadFile(Object object) 下载文件资源到本地。客户端直接发起一个 HTTPS GET 请求,返回文件的本地临时路径 (本地路径),单次下载允许的最大文件为 200MB。
DownloadTask.abort() 中断下载任务
DownloadTask.onProgressUpdate(function listener) 监听下载进度变化事件
DownloadTask.offProgressUpdate(function listener) 移除下载进度变化事件的监听函数
DownloadTask.onHeadersReceived(function listener) 监听 HTTP Response Header 事件。会比请求完成事件更早
DownloadTask.offHeadersReceived(function listener) 移除 HTTP Response Header 事件的监听函数
----------------------------------------------------
UploadTask wx.uploadFile(Object object) 将本地资源上传到服务器。客户端发起一个 HTTPS POST 请求,其中 content-type 为 multipart/form-data
UploadTask.abort() 中断上传任务
UploadTask.onProgressUpdate(function listener) 监听上传进度变化事件
UploadTask.offProgressUpdate(function listener) 移除上传进度变化事件的监听函数
UploadTask.onHeadersReceived(function listener) 监听 HTTP Response Header 事件。会比请求完成事件更早
UploadTask.offHeadersReceived(function listener) 移除 HTTP Response Header 事件的监听函数
----------------------------------------------------
wx.sendSocketMessage(Object object) 通过 WebSocket 连接发送数据。需要先 wx.connectSocket,并在 wx.onSocketOpen 回调之后才能发送。
wx.onSocketOpen(function listener) 监听 WebSocket 连接打开事件。
wx.onSocketMessage(function listener) 监听 WebSocket 接收到服务器的消息事件。
wx.onSocketError(function listener) 监听 WebSocket 错误事件。
wx.onSocketClose(function listener) 监听 WebSocket 连接关闭事件。
SocketTask wx.connectSocket(Object object) 创建一个 WebSocket 连接。
wx.closeSocket(Object object) 关闭 WebSocket 连接。
f.支付
wx.requestVirtualPayment(Object object) 发起米大师虚拟支付
wx.requestPluginPayment(Object object) 插件中发起支付。
wx.requestPayment(Object object) 发起微信支付。调用前需在小程序微信公众平台-功能-微信支付入口申请接入微信支付
wx.requestMerchantTransfer(Object object) 商家转账用户确认模式下,在微信客户端通过小程序拉起页面请求用户确认收款。调
wx.requestCommonPayment(Object object) 发起通用支付。目前该接口仅支持 B2b 支付类型。
wx.openHKOfflinePayView(Object object) 拉起WeChat Pay HK付款码。
GlobalPayment wx.createGlobalPayment(Object o) 创建全球支付方式的对象。一旦用户选定支付方式后,不可更改。如需重新选择支付方式,需创建新对象。
GlobalPayment 全球收银对象 GlobalPayment
g.数据缓存
wx.setStorageSync(string key, any data) 将数据存储在本地缓存中指定的 key 中。会覆盖掉原来该 key 对应的内容。除非用户主动删除或因存储空间原因被系统清理,否则数据都一直可用。单个 key 允许存储的最大数据长度为 1MB,所有数据存储上限为 10MB。
wx.setStorage(Object object) 将数据存储在本地缓存中指定的 key 中。会覆盖掉原来该 key 对应的内容。除非用户主动删除或因存储空间原因被系统清理,否则数据都一直可用。单个 key 允许存储的最大数据长度为 1MB,所有数据存储上限为 10MB。
----------------------------------------------------
wx.revokeBufferURL(string url) 根据 URL 销毁存在内存中的数据
wx.removeStorageSync(string key) wx.removeStorage 的同步版本
wx.removeStorage(Object object) 从本地缓存中移除指定 key。
----------------------------------------------------
any wx.getStorageSync(string key) 从本地缓存中同步获取指定 key 的内容。
Object wx.getStorageInfoSync() wx.getStorageInfo 的同步版本
wx.getStorageInfo(Object object) 异步获取当前storage的相关信息。
wx.getStorage(Object object) 从本地缓存中异步获取指定 key 的内容。
----------------------------------------------------
string wx.createBufferURL(ArrayBuffer|TypedArray buffer) 根据传入的 buffer 创建一个唯一的 URL 存在内存中
wx.clearStorageSync() wx.clearStorage 的同步版本
wx.clearStorage(Object object) 清理本地数据缓存。
----------------------------------------------------
wx.batchSetStorageSync(Array.<Object> kvList) 将数据批量存储在本地缓存中指定的 key 中。会覆盖掉原来该 key 对应的内容。除非用户主动删除或因存储空间原因被系统清理,否则数据都一直可用。单个 key 允许存储的最大数据长度为 1MB,所有数据存储上限为 10MB。
wx.batchSetStorage(Object object) 将数据批量存储在本地缓存中指定的 key 中。会覆盖掉原来该 key 对应的内容。除非用户主动删除或因存储空间原因被系统清理,否则数据都一直可用。单个 key 允许存储的最大数据长度为 1MB,所有数据存储上限为 10MB。
Array.<any> wx.batchGetStorageSync(Array.<string> keyList) 从本地缓存中同步批量获取指定 key 的内容。
wx.batchGetStorage(Object object) 从本地缓存中异步批量获取指定 key 的内容。
----------------------------------------------------
wx.setBackgroundFetchToken(object object) 数据预拉取和周期性更新:设置自定义登录态,在周期性拉取数据时带上,便于第三方服务器验证请求合法性
wx.onBackgroundFetchData(function listener) 数据预拉取和周期性更新:监听收到 backgroundFetch 数据事件。如果监听时请求已经完成,则事件不会触发。建议和 wx.getBackgroundFetchData 配合使用
wx.getBackgroundFetchToken(Object object) 数据预拉取和周期性更新:获取设置过的自定义登录态。若无,则返回 fail。
wx.getBackgroundFetchData(object object) 数据预拉取和周期性更新:拉取 backgroundFetch 客户端缓存数据。 当调用接口时,若当次请求未结束,会先返回本地的旧数据(之前打开小程序时请求的),如果本地没有旧数据,安卓上会返回fail,不会等待请求完成,iOS上会返回success但fetchedData为空,也不会等待请求完成。建议和 wx.onBackgroundFetchData 配合使用。
----------------------------------------------------
CacheManager wx.createCacheManager(Object object) 缓存管理器:创建缓存管理器
CacheManager 缓存管理器。全局只有唯一实例,一旦被创建出来即表示接入缓存管理器
h.位置
wx.stopLocationUpdate(Object object) 关闭监听实时位置变化,前后台都停止消息接收
wx.startLocationUpdateBackground(Object object) 开启小程序在前后台时均可接收位置消息,后台包括离开小程序后继续使用微信(微信仍在前台)、离开微信(微信在后台)两个场景,需引导用户开启授权。授权以后,小程序在运行中或进入后台均可接受位置消息变化。
wx.startLocationUpdate(Object object) 开启小程序进入前台时接收位置消息。
wx.openLocation(Object object) 使用微信内置地图查看位置
wx.onLocationChangeError(function listener) 监听持续定位接口返回失败时触发。
wx.onLocationChange(function listener) 监听实时地理位置变化事件,需结合 wx.startLocationUpdateBackground、wx.startLocationUpdate使用。
wx.offLocationChangeError(function listener) 移除持续定位接口返回失败时触发。的监听函数
wx.offLocationChange(function listener) 移除实时地理位置变化事件的监听函数
wx.getLocation(Object object) 获取当前的地理位置、速度。当用户离开小程序后,此接口无法调用。
wx.getFuzzyLocation(Object object) 获取当前的模糊地理位置。
wx.choosePoi(Object object) 打开POI列表选择位置,支持模糊定位(精确到市)和精确定位混选。
wx.chooseLocation(Object object) 打开地图选择位置。
i.文件
wx.saveFileToDisk(Object object) 保存文件系统的文件到用户磁盘,仅在 PC 端支持
wx.openDocument(Object object) 新开页面打开文档。微信客户端 7.0.12 版本前默认显示右上角菜单按钮,之后的版本默认不显示,需主动传入 showMenu。
FileSystemManager wx.getFileSystemManager() 获取全局唯一的文件管理器
FileStats 每个 FileStats 对象包含 path 和 Stats
FileSystemManager 文件管理器,可通过 wx.getFileSystemManager 获取。
ReadResult 文件读取结果。 通过 FileSystemManager.readSync 接口返回
Stats 描述文件状态的对象
WriteResult 文件写入结果。 通过 FileSystemManager.writeSync 接口返回
j.Worker多线程
Worker wx.createWorker(string scriptPath, object options) 创建一个 Worker 线程
ArrayBuffer Worker.getCameraFrameData() 获取摄像头当前帧图像,返回ArrayBuffer数据。仅限在 worker 线程中使用。
Worker.onError(function listener) 监听 Worker 线程错误事件。当 Worker 线程中发生脚本错误时会触发此事件。
Worker.onMessage(function listener) 监听主线程/Worker 线程向当前线程发送的消息的事件。
Worker.onProcessKilled(function listener) 监听 worker线程被系统回收事件(开启 useExperimentalWorker 后,当iOS系统资源紧张时,ExperimentalWorker 线程存在被系统回收的可能,开发者可监听此事件并重新创建一个worker)。仅限在主线程 worker 对象上调用。
Worker.postMessage(Object message) 向主线程/Worker 线程发送的消息。
Worker.terminate() 结束当前 Worker 线程。仅限在主线程 worker 对象上调用。
Worker.testOnProcessKilled() 用于模拟 iOS ExperimentalWorker 线程被系统回收事件,以便于调试。接口仅在 worker 线程内可用。参考 Worker.onProcessKilled
01.路由
a.wx.navigateTo(Object object)
a.功能描述
保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面。使用 wx.navigateBack 可以返回到原页面。小程序中页面栈最多十层。
b.支持情况
Promise 风格调用:支持。
页面权限:插件页面与宿主小程序页面之间不可互相调用。
小程序插件:支持(2.2.2+),只能在当前插件的页面中调用。
平台支持:微信 Windows 版、微信 Mac 版、微信 鸿蒙 OS 版。
c.参数
a.Object object
url:string,必填,需要跳转的应用内非 tabBar 页面的路径,路径后可以带参数。
events:Object,否,页面间通信接口,用于监听被打开页面发送到当前页面的数据。(2.7.3+ 支持)
routeType:string,否,自定义路由类型。(2.29.2+ 支持)
routeConfig:Object,否,自定义路由配置。(3.4.0+ 支持)
routeOptions:Object,否,自定义路由参数。(3.4.0+ 支持)
success:function,否,接口调用成功的回调函数。
fail:function,否,接口调用失败的回调函数。
complete:function,否,接口调用结束的回调函数。
d.success回调函数参数
a.Object res
eventChannel:EventChannel,和被打开页面进行通信的对象。
e.示例代码
// ---- 调用页面 a.js ----
wx.navigateTo({
url: 'test?id=1',
events: {
acceptDataFromOpenedPage: function(data) {
console.log(data)
}
},
success: function(res) {
// 通过eventChannel向被打开页面传送数据
res.eventChannel.emit('acceptDataFromOpenerPage', { data: 'test' })
}
})
// ---- 被打开页面 test.js ----
Page({
onLoad: function(option){
const eventChannel = this.getOpenerEventChannel()
// 向上一页面发送事件
eventChannel.emit('acceptDataFromOpenedPage', {data: 'test from opened page'});
// 监听上一页面发送的事件
eventChannel.on('acceptDataFromOpenerPage', function(data) {
console.log(data)
})
}
})
b.wx.redirectTo(Object object)
a.功能描述
关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到 tabbar 页面。
b.支持情况
Promise 风格调用:支持。
页面权限:插件页面与宿主小程序页面之间不可互相调用。
小程序插件:支持(2.2.2+),只能在当前插件的页面中调用。
平台支持:微信 Windows 版、微信 Mac 版、微信 鸿蒙 OS 版。
c.参数
a.Object object
url:string,必填,需要跳转的应用内非 tabBar 的页面的路径,路径后可以带参数。
success:function,否,接口调用成功的回调函数。
fail:function,否,接口调用失败的回调函数。
complete:function,否,接口调用结束的回调函数。
d.示例代码
wx.redirectTo({
url: 'test?id=1'
})
c.wx.reLaunch(Object object)
a.功能描述
关闭所有页面,打开到应用内的某个页面。
b.支持情况
基础库:1.1.0+。
Promise 风格调用:支持。
页面权限:插件页面与宿主小程序页面之间不可互相调用。
小程序插件:支持(2.3.1+),只能在当前插件的页面中调用。
平台支持:微信 Windows 版、微信 Mac 版、微信 鸿蒙 OS 版。
c.参数
a.Object object
url:string,必填,需要跳转的应用内页面路径,路径后可以带参数。
success:function,否,接口调用成功的回调函数。
fail:function,否,接口调用失败的回调函数。
complete:function,否,接口调用结束的回调函数。
d.示例代码
wx.reLaunch({
url: 'test?id=1'
})
d.wx.switchTab(Object object)
a.功能描述
跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面。
b.支持情况
Promise 风格调用:支持。
页面权限:插件页面与宿主小程序页面之间不可互相调用。
小程序插件:支持(2.3.1+),只能在当前插件的页面中调用。
平台支持:微信 Windows 版、微信 Mac 版、微信 鸿蒙 OS 版。
c.参数
a.Object object
url:string,必填,需要跳转的 tabBar 页面的路径(需在 app.json 的 tabBar 字段中定义),路径后不能带参数。
success:function,否,接口调用成功的回调函数。
fail:function,否,接口调用失败的回调函数。
complete:function,否,接口调用结束的回调函数。
d.示例代码
// app.json
{
"tabBar": {
"list": [{
"pagePath": "index",
"text": "首页"
},{
"pagePath": "other",
"text": "其他"
}]
}
}
// index.js
wx.switchTab({
url: '/index'
})
e.wx.navigateBack(Object object)
a.功能描述
关闭当前页面,返回上一页面或多级页面。可通过 getCurrentPages 获取当前的页面栈,决定需要返回几层。
b.支持情况
Promise 风格调用:支持。
页面权限:插件页面与宿主小程序页面之间不可互相调用。
小程序插件:支持(2.1.0+),只能在当前插件的页面中调用。
平台支持:微信 Windows 版、微信 Mac 版、微信 鸿蒙 OS 版。
c.参数
a.Object object
delta:number,默认值 1,否,返回的页面数,如果 delta 大于现有页面数,则返回到页面栈中只剩一个页面为止。
success:function,否,接口调用成功的回调函数。
fail:function,否,接口调用失败的回调函数。
complete:function,否,接口调用结束的回调函数。
d.示例代码
// A页面 -> B页面 -> C页面
// 在C页面内调用
wx.navigateBack({
delta: 2 // 返回到A页面
})
f.wx.rewriteRoute(Object object)
a.功能描述
重写正在进行中的路由事件,常用于在 wx.onBeforeAppRoute 回调中改变路由目标。
b.支持情况
基础库:3.8.0+。
Promise 风格调用:不支持。
小程序插件:支持,只能重写目标为当前插件的页面的路由事件。
c.参数
a.Object object
url:string,必填,重写目标页面的路径,路径后可以带参数。
preserveQuery:boolean,默认值 false,否,是否直接保留当前路由事件的参数,开启时 url 中传入的参数会被丢弃。
success:function,否,接口调用成功的回调函数。
fail:function,否,接口调用失败的回调函数。
complete:function,否,接口调用结束的回调函数。
d.示例代码
wx.onBeforeAppRoute(res => {
if (res.path === '/pages/do/not/access/me') {
wx.rewriteRoute({
url: '/pages/index/index'
})
}
})
g.EventChannel
a.功能描述
页面间事件通信通道,在 wx.navigateTo 的 success 回调中获取。
b.支持情况
基础库:2.7.3+。
c.方法
emit(string eventName, any args):触发一个事件。
on(string eventName, function fn):持续监听一个事件。
once(string eventName, function fn):监听一个事件一次,触发后失效。
off(string eventName, function fn):取消监听一个事件。若只传 eventName,则取消该事件所有监听。
h.wx.router
a.功能描述
用于自定义路由的对象,通过 wx.router 获取。
b.支持情况
基础库:2.29.2+。
c.方法
addRouteBuilder(string routeType, function routeBuilder):添加自定义路由配置。
removeRouteBuilder(string routeType):移除自定义路由配置。
getRouteContext(Object this):获取页面对应的自定义路由上下文对象。
i.router.addRouteBuilder(string routeType, function routeBuilder)
a.功能描述
添加自定义路由配置。
b.支持情况
小程序插件:不支持。
c.参数
routeType:string,路由类型。
routeBuilder:function,路由动画定义函数。
d.示例代码
// 定义从右侧推入效果
const slideRouteBuilder = (customRouteContext) => {
const { primaryAnimation } = customRouteContext
const handlePrimaryAnimation = () => {
'worklet'
const transX = windowWidth * (1 - primaryAnimation.value)
return { transform: `translateX(${transX}px)` }
}
return { handlePrimaryAnimation }
}
// 添加自定义路由
wx.router.addRouteBuilder('slide', slideRouteBuilder)
// 使用自定义路由
wx.navigateTo({
url: 'xxx',
routeType: 'slide'
})
j.router.removeRouteBuilder(string routeType)
a.功能描述
移除自定义路由配置。
b.支持情况
小程序插件:不支持。
c.参数
routeType:string,要移除的路由类型。
d.示例代码
wx.router.removeRouteBuilder('slide')
k.router.getRouteContext(Object this)
a.功能描述
获取页面对应的自定义路由上下文对象。
b.支持情况
小程序插件:不支持。
c.参数
this:Object,页面或自定义组件实例。
d.示例代码
const routeContext = wx.router.getRouteContext(this)
02.跳转
a.wx.restartMiniProgram(Object object)
a.功能描述
重启当前小程序
b.参数
a.Object object
a.path
类型: string
必填: 是
说明: 打开的页面路径,path 中 ? 后面的部分会成为 query
b.success
类型: function
必填: 否
说明: 接口调用成功的回调函数
c.fail
类型: function
必填: 否
说明: 接口调用失败的回调函数
d.complete
类型: function
必填: 否
说明: 接口调用结束的回调函数(调用成功、失败都会执行)
b.wx.openOfficialAccountProfile(Object object)
a.功能描述
通过小程序打开公众号主页
b.参数
a.Object object
a.username
类型: string
必填: 是
说明: 需要打开的公众号的原始 ID
b.success
类型: function
必填: 否
说明: 接口调用成功的回调函数
c.fail
类型: function
必填: 否
说明: 接口调用失败的回调函数
d.complete
类型: function
必填: 否
说明: 接口调用结束的回调函数(调用成功、失败都会执行)
c.示例代码
---
wx.openOfficialAccountProfile({
username: '', // 此处填写公众号的原始 ID
success: res => {
},
fail: res => {
}
})
---
c.wx.openOfficialAccountChat(Object object)
a.功能描述
通过小程序打开公众号会话界面
b.参数
a.Object object
a.username
类型: string
必填: 是
说明: 需要打开的公众号的微信号
b.success
类型: function
必填: 否
说明: 接口调用成功的回调函数
c.fail
类型: function
必填: 否
说明: 接口调用失败的回调函数
d.complete
类型: function
必填: 否
说明: 接口调用结束的回调函数(调用成功、失败都会执行)
c.示例代码
---
wx.openOfficialAccountChat({
username: '', // 此处填写公众号的微信号
success: res => {
},
fail: res => {
}
})
---
d.Tips
跳转的公众号需与小程序为同主体或关联主体
如果用户没有关注则进行回退,跳转到公众号主页
d.wx.openOfficialAccountArticle(Object object)
a.功能描述
通过小程序打开任意公众号文章(不包括临时链接等异常状态下的公众号文章),必须有点击行为才能调用成功。
b.参数
a.Object object
a.url
类型: string
必填: 是
说明: 需要打开的公众号地址
b.success
类型: function
必填: 否
说明: 接口调用成功的回调函数
c.fail
类型: function
必填: 否
说明: 接口调用失败的回调函数
d.complete
类型: function
必填: 否
说明: 接口调用结束的回调函数(调用成功、失败都会执行)
c.object.success 回调函数
a.参数
a.Object res
a.cancel
类型: boolean
说明: 为 true 时,表示用户点击了取消(用于 Android 系统区分点击蒙层关闭还是点击取消按钮关闭)
b.confirm
类型: boolean
说明: 为 true 时,表示用户点击了确定按钮
d.object.fail 回调函数
a.参数
a.Object err
a.errMsg
类型: string
说明: 错误信息
b.errCode
类型: number
说明: 错误码
e.示例代码
---
wx.openOfficialAccountArticle({
url:'', // 此处填写公众号文章连接
success: res => {
},
fail: res => {
}
})
---
e.wx.openEmbeddedMiniProgram(Object object)
a.功能描述
打开半屏小程序。接入指引请参考 半屏小程序能力。
b.参数
a.Object object
a.appId
类型: string
必填: 是
说明: 要打开的小程序 appId
b.path
类型: string
必填: 否
说明: 打开的页面路径,如果为空则打开首页。path 中 ? 后面的部分会成为 query,在小程序的 App.onLaunch、App.onShow 和 Page.onLoad 的回调函数或小游戏的 wx.onShow 回调函数、wx.getLaunchOptionsSync 中可以获取到 query 数据。对于小游戏,可以只传入 query 部分,来实现传参效果,如:传入 "?foo=bar"。
c.extraData
类型: object
必填: 否
说明: 需要传递给目标小程序的数据,目标小程序可在 App.onLaunch,App.onShow 中获取到这份数据。如果跳转的是小游戏,可以在 wx.onShow、wx.getLaunchOptionsSync 中可以获取到这份数据数据。
d.envVersion
类型: string
默认值: release
必填: 否
说明: 要打开的小程序版本。仅在当前小程序为开发版或体验版时此参数有效。如果当前小程序是正式版,则打开的小程序必定是正式版。
a.合法值
a.develop
开发版
b.trial
体验版
c.release
正式版
e.shortLink
类型: string
必填: 否
说明: 小程序链接,当传递该参数后,可以不传 appId 和 path。链接可以通过【小程序菜单】->【复制链接】获取。仅 verify=binding 支持。
f.verify
类型: string
默认值: binding
必填: 否
说明: 校验方式。
最低版本: 2.24.3
a.合法值
a.binding
校验小程序管理后台的绑定关系。
b.unionProduct
校验目标打开链接是否为小程序联盟商品。
g.noRelaunchIfPathUnchanged
类型: boolean
默认值: false
必填: 否
说明: 不reLaunch目标小程序,直接打开目标跳转的小程序退后台时的页面,需满足以下条件:1. 目标跳转的小程序生命周期未被销毁;2. 且目标当次启动的path、query与上次启动相同,apiCategory以wx.getApiCategory接口的返回结果为准。
最低版本: 2.24.0
h.allowFullScreen
类型: boolean
默认值: false
必填: 否
说明: 打开的小程序是否支持全屏。基础库 3.10.0 版本起,强制为 true
最低版本: 2.33.0
i.success
类型: function
必填: 否
说明: 接口调用成功的回调函数
j.fail
类型: function
必填: 否
说明: 接口调用失败的回调函数
k.complete
类型: function
必填: 否
说明: 接口调用结束的回调函数(调用成功、失败都会执行)
f.wx.onEmbeddedMiniProgramHeightChange(function listener)
a.功能描述
监听半屏小程序可视高度变化事件
b.参数
a.function listener
半屏小程序可视高度变化事件的监听函数
a.参数
a.Object res
a.height
类型: number
说明: 可视高度
b.initialHeight
类型: number
说明: 半屏小程序初始高度
c.示例代码
---
const func = function (res) {
console.log(res.height)
console.log(res.initialHeight)
}
wx.onEmbeddedMiniProgramHeightChange(func)
// 取消监听
wx.offEmbeddedMiniProgramHeightChange(func)
---
g.wx.offEmbeddedMiniProgramHeightChange(function listener)
a.功能描述
移除半屏小程序可视高度变化事件的监听函数
b.参数
a.function listener
onEmbeddedMiniProgramHeightChange 传入的监听函数。不传此参数则移除所有监听函数。
c.示例代码
---
const listener = function (res) { console.log(res) }
wx.onEmbeddedMiniProgramHeightChange(listener)
wx.offEmbeddedMiniProgramHeightChange(listener) // 需传入与监听时同一个的函数对象
---
h.wx.navigateToMiniProgram(Object object)
a.功能描述
打开另一个小程序
b.参数
a.Object object
a.appId
类型: string
必填: 否
说明: 要打开的小程序 appId
b.path
类型: string
必填: 否
说明: 打开的页面路径,如果为空则打开首页。path 中 ? 后面的部分会成为 query,在小程序的 App.onLaunch、App.onShow 和 Page.onLoad 的回调函数或小游戏的 wx.onShow 回调函数、wx.getLaunchOptionsSync 中可以获取到 query 数据。对于小游戏,可以只传入 query 部分,来实现传参效果,如:传入 "?foo=bar"。
c.extraData
类型: object
必填: 否
说明: 需要传递给目标小程序的数据,目标小程序可在 App.onLaunch,App.onShow 中获取到这份数据。如果跳转的是小游戏,可以在 wx.onShow、wx.getLaunchOptionsSync 中可以获取到这份数据。
d.envVersion
类型: string
默认值: release
必填: 否
说明: 要打开的小程序版本。仅在当前小程序为开发版或体验版时此参数有效。如果当前小程序是正式版,则打开的小程序必定是正式版。
a.合法值
a.develop
开发版
b.trial
体验版
c.release
正式版
e.shortLink
类型: string
必填: 否
说明: 小程序链接,当传递该参数后,可以不传 appId 和 path。链接可以通过【小程序菜单】->【复制链接】获取。
最低版本: 2.18.1
f.noRelaunchIfPathUnchanged
类型: boolean
默认值: false
必填: 否
说明: 不reLaunch目标小程序,直接打开目标跳转的小程序退后台时的页面,需满足以下条件:1. 目标跳转的小程序生命周期未被销毁;2. 且目标当次启动的path、query与上次启动相同,apiCategory以wx.getApiCategory接口的返回结果为准。
最低版本: 2.24.0
g.success
类型: function
必填: 否
说明: 接口调用成功的回调函数
h.fail
类型: function
必填: 否
说明: 接口调用失败的回调函数
i.complete
类型: function
必填: 否
说明: 接口调用结束的回调函数(调用成功、失败都会执行)
c.使用限制
a.需要用户触发跳转
从 2.3.0 版本开始,若用户未点击小程序页面任意位置,则开发者将无法调用此接口自动跳转至其他小程序。
b.需要用户确认跳转
从 2.3.0 版本开始,在跳转至其他小程序前,将统一增加弹窗,询问是否跳转,用户确认后才可以跳转其他小程序。如果用户点击取消,则回调 fail cancel。
d.运营规范
平台将坚决打击小程序盒子等互推行为,使用此功能时请严格遵守《微信小程序平台运营规范》,若发现小程序违反运营规范将被下架处理。
e.关于调试
在开发者工具上调用此 API 并不会真实的跳转到另外的小程序,但是开发者工具会校验本次调用跳转是否成功。详情
开发者工具上支持被跳转的小程序处理接收参数的调试。详情
f.示例代码
---
wx.navigateToMiniProgram({
appId: '',
path: 'page/index/index?id=123',
extraData: {
foo: 'bar'
},
envVersion: 'develop',
success(res) {
// 打开成功
}
})
---
i.wx.navigateBackMiniProgram(Object object)
a.功能描述
返回到上一个小程序。只有在当前小程序是被其他小程序打开时可以调用成功。
注意:微信客户端 iOS 6.5.9,Android 6.5.10 及以上版本支持
b.参数
a.Object object
a.extraData
类型: Object
默认值: {}
必填: 否
说明: 需要返回给上一个小程序的数据,上一个小程序可在 App.onShow 中获取到这份数据。 详情。
b.success
类型: function
必填: 否
说明: 接口调用成功的回调函数
c.fail
类型: function
必填: 否
说明: 接口调用失败的回调函数
d.complete
类型: function
必填: 否
说明: 接口调用结束的回调函数(调用成功、失败都会执行)
c.示例代码
---
wx.navigateBackMiniProgram({
extraData: {
foo: 'bar'
},
success(res) {
// 返回成功
}
})
---
j.wx.exitMiniProgram(Object object)
a.功能描述
退出当前小程序
b.参数
a.Object object
a.success
类型: function
必填: 否
说明: 接口调用成功的回调函数
b.fail
类型: function
必填: 否
说明: 接口调用失败的回调函数
c.complete
类型: function
必填: 否
说明: 接口调用结束的回调函数(调用成功、失败都会执行)
03.聊天工具
a.wx.shareVideoToGroup(Object object)
a.功能描述
转发视频到聊天
b.参数
a.Object object
a.videoPath
类型: string
必填: 是
说明: 要分享的视频地址,必须为本地路径或临时路径
b.thumbPath
类型: string
必填: 否
说明: 缩略图路径,若留空则使用视频首帧
c.needShowEntrance
类型: boolean
默认值: true
必填: 否
说明: 分享的图片消息是否要带小程序入口
d.entrancePath
类型: string
默认值: ''
必填: 否
说明: 从消息小程序入口打开小程序的路径,默认为聊天工具启动路径
e.success
类型: function
必填: 否
说明: 接口调用成功的回调函数
f.fail
类型: function
必填: 否
说明: 接口调用失败的回调函数
g.complete
类型: function
必填: 否
说明: 接口调用结束的回调函数(调用成功、失败都会执行)
c.示例代码
---
// callback 写法
wx.downloadFile({
url: URL, // 下载url
success (res) {
// 下载完成后转发
wx.shareVideoToGroup({
videoPath: res.tempFilePath,
success() {},
fail: console.error,
})
},
fail: console.error,
})
---
b.wx.shareImageToGroup(Object object)
a.功能描述
转发图片到聊天
b.参数
a.Object object
a.imagePath
类型: string
必填: 是
说明: 要分享的图片地址,必须为本地路径或临时路径
b.needShowEntrance
类型: boolean
默认值: true
必填: 否
说明: 分享的图片消息是否要带小程序入口
c.entrancePath
类型: string
默认值: ''
必填: 否
说明: 从消息小程序入口打开小程序的路径,默认为聊天工具启动路径
d.success
类型: function
必填: 否
说明: 接口调用成功的回调函数
e.fail
类型: function
必填: 否
说明: 接口调用失败的回调函数
f.complete
类型: function
必填: 否
说明: 接口调用结束的回调函数(调用成功、失败都会执行)
c.示例代码
---
wx.downloadFile({
url: 'https://res.wx.qq.com/wxdoc/dist/assets/img/demo.ef5c5bef.jpg',
success: (res) => {
wx.shareImageToGroup({
imagePath: res.tempFilePath
})
}
})
---
c.wx.shareFileToGroup(Object object)
a.功能描述
转发文件到聊天
b.参数
a.Object object
a.filePath
类型: string
必填: 是
说明: 要分享的文件地址,必须为本地路径或临时路径
b.fileName
类型: string
必填: 否
说明: 自定义文件名,若留空则使用filePath中的文件名
c.needShowEntrance
类型: boolean
默认值: true
必填: 否
说明: 分享的图片消息是否要带小程序入口
d.entrancePath
类型: string
默认值: ''
必填: 否
说明: 从消息小程序入口打开小程序的路径,默认为聊天工具启动路径
e.success
类型: function
必填: 否
说明: 接口调用成功的回调函数
f.fail
类型: function
必填: 否
说明: 接口调用失败的回调函数
g.complete
类型: function
必填: 否
说明: 接口调用结束的回调函数(调用成功、失败都会执行)
c.示例代码
---
wx.downloadFile({
url: URL, // 下载url
success (res) {
// 下载完成后转发
wx.shareFileToGroup({
filePath: res.tempFilePath,
success() {},
fail: console.error,
})
},
fail: console.error,
})
---
d.wx.shareEmojiToGroup(Object object)
a.功能描述
转发表情到聊天
b.参数
a.Object object
a.imagePath
类型: string
必填: 是
说明: 要分享的表情地址,必须为本地路径或临时路径
b.needShowEntrance
类型: boolean
默认值: true
必填: 否
说明: 分享的表情消息是否要带小程序入口
c.entrancePath
类型: string
默认值: ''
必填: 否
说明: 从消息小程序入口打开小程序的路径,默认为聊天工具启动路径
d.success
类型: function
必填: 否
说明: 接口调用成功的回调函数
e.fail
类型: function
必填: 否
说明: 接口调用失败的回调函数
f.complete
类型: function
必填: 否
说明: 接口调用结束的回调函数(调用成功、失败都会执行)
c.示例代码
---
wx.downloadFile({
url: 'https://res.wx.qq.com/wxdoc/dist/assets/img/demo.ef5c5bef.jpg',
success: (res) => {
wx.shareEmojiToGroup({
path: res.tempFilePath
})
}
})
---
e.wx.shareAppMessageToGroup(Object object)
a.功能描述
转发小程序卡片到聊天
b.参数
a.Object object
a.title
类型: string
必填: 是
说明: 转发标题
b.path
类型: string
默认值: ''
必填: 否
说明: 转发路径,必须是以 / 开头的完整路径,默认为当前页面
c.imageUrl
类型: string
默认值: ''
必填: 否
说明: 自定义图片路径,支持PNG及JPG,显示图片长宽比是 5:4,默认使用截图
d.success
类型: function
必填: 否
说明: 接口调用成功的回调函数
e.fail
类型: function
必填: 否
说明: 接口调用失败的回调函数
f.complete
类型: function
必填: 否
说明: 接口调用结束的回调函数(调用成功、失败都会执行)
c.示例代码
---
wx.shareAppMessageToGroup({
title: '分享标题',
path: '/path/to/page',
imageUrl: '',
})
---
f.wx.selectGroupMembers(Object object)
a.功能描述
选择聊天室的成员,并返回选择成员的 group_openid。若当前为群聊,则会拉起成员选择器;若当前为单聊,则直接返回双方的 group_openid。
b.参数
a.Object object
a.maxSelectCount
类型: number
必填: 否
说明: 最多可选人数
b.success
类型: function
必填: 否
说明: 接口调用成功的回调函数
c.fail
类型: function
必填: 否
说明: 接口调用失败的回调函数
d.complete
类型: function
必填: 否
说明: 接口调用结束的回调函数(调用成功、失败都会执行)
c.object.success 回调函数
a.参数
a.Object res
a.members
类型: Array.<string>
说明: 所选用户在此聊天室下的唯一标识,同一个用户在不同的聊天室下id不同
d.示例代码
---
wx.selectGroupMembers({
maxSelectCount: 3,
success(res) {
// res.members
}
})
---
g.wx.openChatTool(Object object)
a.功能描述
进入聊天工具模式。
不传入聊天室id时,微信会拉起聊天列表让用户选择,用户选择后绑定聊天室进入聊天工具模式。
传入聊天室id时(群聊为opengid,单聊为open_single_roomid),会直接绑定该聊天室进入,此时必须传入对应的 chatType。
聊天室类型可从 getGroupEnterInfo 返回值中获取。
b.参数
a.Object object
a.url
类型: string
必填: 是
说明: 聊天工具分包内的页面路径
b.roomid
类型: string
必填: 否
说明: 聊天室 id,不传则拉起群选择框,可以传入多聊群的 opengid 值,或者单聊群的 open_single_roomid 值
c.chatType
类型: number
必填: 否
说明: 群聊类型
a.合法值
a.1
微信联系人单聊
b.2
企业微信联系人单聊
c.3
普通微信群聊
d.4
企业微信互通群聊
d.success
类型: function
必填: 否
说明: 接口调用成功的回调函数
e.fail
类型: function
必填: 否
说明: 接口调用失败的回调函数
f.complete
类型: function
必填: 否
说明: 接口调用结束的回调函数(调用成功、失败都会执行)
c.示例代码
---
wx.openChatTool({
roomid: 'open_single_roomid',
chatType: 1
})
wx.openChatTool({
roomid: 'opengid',
chatType: 3
})
---
h.wx.notifyGroupMembers(Object object)
a.功能描述
提醒用户完成任务,标题长度不超过 30 个字符,支持中英文和数字,中文算2个字符。
b.参数
a.Object object
a.title
类型: string
必填: 是
说明: 文字链标题,发送的内容将由微信拼接为:@的成员列表+“请完成:”/"请参与:"+打开小程序的文字链,如「@alex @cindy 请完成:团建报名统计」。
b.members
类型: Array.<string>
必填: 是
说明: 需要提醒的用户 group_openid 列表
c.entrancePath
类型: string
必填: 是
说明: 文字链跳转路径
d.type
类型: string
默认值: complete
必填: 否
说明: 展示的动词
a.合法值
a.participate
请参与
b.complete
请完成
e.success
类型: function
必填: 否
说明: 接口调用成功的回调函数
f.fail
类型: function
必填: 否
说明: 接口调用失败的回调函数
g.complete
类型: function
必填: 否
说明: 接口调用结束的回调函数(调用成功、失败都会执行)
c.示例代码
---
// 最终聊天内显示 @alex @cindy 请完成:团建报名统计
wx.notifyGroupMembers({
title: '团建报名统计',
members: ['alex', 'cindy'],
entrancePath: '/path/to/page',
type: 'complete',
})
---
i.wx.getChatToolInfo(Object object)
a.功能描述
获取聊天工具模式下的群聊信息。
需要注意的是,单聊群和多聊群下返回的群唯一标识是不同的。
多聊群下返回 opengid
单聊群下返回 open_single_roomid
同时将返回用户在群(含单聊)下的唯一标识 group_openid。
b.参数
a.Object object
a.success
类型: function
必填: 否
说明: 接口调用成功的回调函数
b.fail
类型: function
必填: 否
说明: 接口调用失败的回调函数
c.complete
类型: function
必填: 否
说明: 接口调用结束的回调函数(调用成功、失败都会执行)
c.object.success 回调函数
a.参数
a.Object res
a.errMsg
类型: string
说明: 错误信息
b.encryptedData
类型: string
说明: 包括敏感数据在内的完整转发信息的加密数据,详细见加密数据解密算法
c.iv
类型: string
说明: 加密算法的初始向量,详细见加密数据解密算法
d.cloudID
类型: string
说明: 敏感数据对应的云 ID,开通云开发的小程序才会返回,可通过云调用直接获取开放数据,详细见云调用直接获取开放数据
d.示例代码
---
wx.getChatToolInfo({
success(res) {
// res
{
errMsg: 'getChatToolInfo:ok',
encryptedData: '',
iv: ''
}
},
fail() {
}
})
---
e.敏感数据
敏感数据有两种获取方式,一是使用 加密数据解密算法 。 获取得到的开放数据为以下 json 结构(其中 opengid 为当前群的唯一标识):
---
{
"opengid": "OPENGID", // 多聊群下返回的群唯一标识
"open_single_roomid": "", // 单聊群下返回的群唯一标识
"group_openid": "", // 用户在当前群的唯一标识
"chat_type": 3, // 聊天室类型
}
---
04.转发
a.wx.updateShareMenu(Object object)
a.功能描述
更新转发属性
b.参数
a.Object object
a.withShareTicket
类型: boolean
默认值: false
必填: 否
说明: 是否使用带 shareTicket 的转发详情
b.isUpdatableMessage
类型: boolean
默认值: false
必填: 否
说明: 是否是动态消息,详见动态消息
最低版本: 2.4.0
c.activityId
类型: string
必填: 否
说明: 动态消息的 activityId。通过 updatableMessage.createActivityId 接口获取
最低版本: 2.4.0
d.toDoActivityId
类型: string
必填: 否
说明: 群待办消息的id,通过toDoActivityId可以把多个群待办消息聚合为同一个。通过 updatableMessage.createActivityId 接口获取。详见群待办消息
最低版本: 2.11.0
e.templateInfo
类型: Object
必填: 否
说明: 动态消息的模板信息
最低版本: 2.4.0
a.结构属性
a.parameterList
类型: Array.<Object>
必填: 是
说明: 参数列表
a.结构属性
a.name
类型: string
必填: 是
说明: 参数名
b.value
类型: string
必填: 是
说明: 参数值
b.templateId
类型: string
必填: 是
说明: 模板ID
f.isPrivateMessage
类型: boolean
必填: 否
说明: 是否是私密消息。详见 小程序私密消息
最低版本: 2.13.0
g.participant
类型: Array.<string>
默认值: []
必填: 否
说明: 参与用户此聊天室下的 group_openid 列表
h.useForChatTool
类型: boolean
默认值: false
必填: 否
说明: 聊天工具模式特殊动态消息
最低版本: 3.7.8
i.chooseType
类型: number
默认值: 1
必填: 否
说明: 指定成员的方式
最低版本: 3.7.8
j.success
类型: function
必填: 否
说明: 接口调用成功的回调函数
k.fail
类型: function
必填: 否
说明: 接口调用失败的回调函数
l.complete
类型: function
必填: 否
说明: 接口调用结束的回调函数(调用成功、失败都会执行)
c.注意事项
bug:在iOS上,如果 withShareTicket 传了 true ,同时 isUpdatableMessage 传了 false,会导致 withShareTicket 失效。解决办法:当 withShareTicket 传了 true 的时候,isUpdatableMessage 传 true 或者不传都可以,但不要传 false。如果需要关掉动态消息设置,则另外单独调用一次 wx.updateShareMenu({ isUpdatableMessage: false }) 即可。
d.示例代码
---
wx.updateShareMenu({
withShareTicket: true,
success () { }
})
// 转发私密消息
wx.updateShareMenu({
isPrivateMessage: true,
activityId: 'xxx',
templateInfo: {},
success () { },
fail () {}
})
---
b.wx.showShareMenu(Object object)
a.功能描述
设置右上角点开的详情界面中的分享按钮是否可用
b.参数
a.Object object
a.withShareTicket
类型: boolean
默认值: false
必填: 否
说明: 是否使用带 shareTicket 的转发详情
b.menus
类型: Array.<string>
必填: 否
说明: 本接口为 Beta 版本,暂只在 Android 平台支持。需要显示的转发按钮名称列表,默认['shareAppMessage']。按钮名称合法值包含 "shareAppMessage"、"shareTimeline" 两种
最低版本: 2.11.3
c.success
类型: function
必填: 否
说明: 接口调用成功的回调函数
d.fail
类型: function
必填: 否
说明: 接口调用失败的回调函数
e.complete
类型: function
必填: 否
说明: 接口调用结束的回调函数(调用成功、失败都会执行)
c.注意事项
"shareAppMessage"表示“发送给朋友”按钮,"shareTimeline"表示“分享到朋友圈”按钮
显示“分享到朋友圈”按钮时必须同时显示“发送给朋友”按钮,显示“发送给朋友”按钮时则允许不显示“分享到朋友圈”按钮
d.示例代码
---
wx.showShareMenu({
withShareTicket: true,
menus: ['shareAppMessage', 'shareTimeline']
})
---
c.wx.showShareImageMenu(Object object)
a.功能描述
打开分享图片弹窗,可以将图片发送给朋友、分享至朋友圈、收藏或下载
b.参数
a.Object object
a.path
类型: string
必填: 是
说明: 要分享的图片地址,必须为本地路径或临时路径
b.needShowEntrance
类型: boolean
默认值: true
必填: 否
说明: 分享的图片消息是否要带小程序入口
最低版本: 3.2.0
c.entrancePath
类型: string
默认值: ''
必填: 否
说明: 发送给朋友时,小程序入口打开小程序的路径,如果当前页面允许分享给朋友,则默认为当前页面路径,否则默认为小程序首页
最低版本: 3.2.0
d.success
类型: function
必填: 否
说明: 接口调用成功的回调函数
e.fail
类型: function
必填: 否
说明: 接口调用失败的回调函数
f.complete
类型: function
必填: 否
说明: 接口调用结束的回调函数(调用成功、失败都会执行)
c.示例代码
---
wx.downloadFile({
url: 'https://res.wx.qq.com/wxdoc/dist/assets/img/demo.ef5c5bef.jpg',
success: (res) => {
wx.showShareImageMenu({
path: res.tempFilePath
})
}
})
---
d.Tips
从基础库 3.8.2 开始,style 参数废弃
从基础库 3.8.2 开始,needShowEntrance 参数默认值从 false 改为 true
从基础库 3.8.2 开始,支持分享至朋友圈,分享至朋友圈的图片不支持带有二维码(可支持小程序码)
d.wx.shareVideoMessage(Object object)
a.功能描述
转发视频到聊天
b.参数
a.Object object
a.videoPath
类型: string
必填: 是
说明: 要分享的视频地址,必须为本地路径或临时路径
b.thumbPath
类型: string
必填: 否
说明: 缩略图路径,若留空则使用视频首帧
c.success
类型: function
必填: 否
说明: 接口调用成功的回调函数
d.fail
类型: function
必填: 否
说明: 接口调用失败的回调函数
e.complete
类型: function
必填: 否
说明: 接口调用结束的回调函数(调用成功、失败都会执行)
c.示例代码
---
// callback 写法
wx.downloadFile({
url: URL, // 下载url
success (res) {
// 下载完成后转发
wx.shareVideoMessage({
videoPath: res.tempFilePath,
success() {},
fail: console.error,
})
},
fail: console.error,
})
// async await 写法
const { tempFilePath } = await wx.downloadFile({
url: URL, // 下载url
})
// 下载完成后转发
await wx.shareVideoMessage({
videoPath: res.tempFilePath,
})
---
e.wx.shareToOfficialAccount(Object object)
a.功能描述
支持拉起公众号图文发表页,用户可将图片与文字内容发表至公众号
b.参数
a.Object object
a.title
类型: string
必填: 是
说明: 公众号文章标题
b.content
类型: string
必填: 否
说明: 公众号文章正文
c.tags
类型: Array.<string>
必填: 否
说明: 公众号文章标签
d.images
类型: Array.<string>
必填: 否
说明: 公众号文章图片,必须为本地路径或临时路径
e.success
类型: function
必填: 否
说明: 接口调用成功的回调函数
f.fail
类型: function
必填: 否
说明: 接口调用失败的回调函数
g.complete
类型: function
必填: 否
说明: 接口调用结束的回调函数(调用成功、失败都会执行)
c.示例代码
---
wx.shareToOfficialAccount({
title: '标题',
content: '正文',
tags: ['标签1', '标签2'],
success: (res) => {
console.log(res)
},
})
---
f.wx.shareFileMessage(Object object)
a.功能描述
转发文件到聊天
b.参数
a.Object object
a.filePath
类型: string
必填: 是
说明: 要分享的文件地址,必须为本地路径或临时路径
b.fileName
类型: string
必填: 否
说明: 自定义文件名,若留空则使用filePath中的文件名
c.success
类型: function
必填: 否
说明: 接口调用成功的回调函数
d.fail
类型: function
必填: 否
说明: 接口调用失败的回调函数
e.complete
类型: function
必填: 否
说明: 接口调用结束的回调函数(调用成功、失败都会执行)
c.示例代码
---
// callback 写法
wx.downloadFile({
url: URL, // 下载url
success (res) {
// 下载完成后转发
wx.shareFileMessage({
filePath: res.tempFilePath,
success() {},
fail: console.error,
})
},
fail: console.error,
})
// async await 写法
const { tempFilePath } = await wx.downloadFile({
url: URL, // 下载url
})
// 下载完成后转发
await wx.shareFileMessage({
filePath: tempFilePath,
})
---
g.wx.onCopyUrl(function listener)
a.功能描述
监听用户点击右上角菜单的「复制链接」按钮时触发的事件。本接口为 Beta 版本,暂只在 Android 平台支持。
b.参数
a.function listener
用户点击右上角菜单的「复制链接」按钮时触发的事件的监听函数
a.参数
a.Object res
a.query
类型: string
说明: 用短链打开小程序时当前页面携带的查询字符串。小程序中使用时,应在进入页面时调用 wx.onCopyUrl 自定义 query,退出页面时调用 wx.offCopyUrl,防止影响其它页面。
c.示例代码
---
// 绑定分享参数
wx.onCopyUrl(() => {
return { query: 'a=1&b=2' }
})
// 取消绑定分享参数
wx.offCopyUrl()
---
h.wx.offCopyUrl()
a.功能描述
移除用户点击右上角菜单的「复制链接」按钮时触发的事件的全部监听函数
b.示例代码
---
// 绑定分享参数
wx.onCopyUrl(() => {
return { query: 'a=1&b=2' }
})
// 取消绑定分享参数
wx.offCopyUrl()
---
i.wx.hideShareMenu(Object object)
a.功能描述
隐藏当前页面的转发按钮
b.参数
a.Object object
a.menus
类型: Array.<string>
必填: 否
说明: 本接口为 Beta 版本,暂只在 Android 平台支持。需要隐藏的转发按钮名称列表,默认['shareAppMessage', 'shareTimeline']。按钮名称合法值包含 "shareAppMessage"、"shareTimeline" 两种
最低版本: 2.11.3
b.success
类型: function
必填: 否
说明: 接口调用成功的回调函数
c.fail
类型: function
必填: 否
说明: 接口调用失败的回调函数
d.complete
类型: function
必填: 否
说明: 接口调用结束的回调函数(调用成功、失败都会执行)
c.注意事项
"shareAppMessage"表示“发送给朋友”按钮,"shareTimeline"表示“分享到朋友圈”按钮
隐藏“发送给朋友”按钮时必须同时隐藏“分享到朋友圈”按钮,隐藏“分享到朋友圈”按钮时则允许不隐藏“发送给朋友”按钮
d.示例代码
---
wx.hideShareMenu({
menus: ['shareAppMessage', 'shareTimeline']
})
---
j.wx.getShareInfo(Object object)
a.功能描述
获取转发详细信息(主要是获取群ID)。 从群聊内的小程序消息卡片打开小程序时,调用此接口才有效。从基础库 v2.17.3 开始,推荐用 wx.getGroupEnterInfo 替代此接口。
b.参数
a.Object object
a.shareTicket
类型: string
必填: 是
说明: shareTicket,详见获取更多转发信息
b.timeout
类型: number
必填: 否
说明: 超时时间,单位 ms
最低版本: 1.9.90
c.success
类型: function
必填: 否
说明: 接口调用成功的回调函数
d.fail
类型: function
必填:
说明: 接口调用失败的回调函数
e.complete
类型: function
必填: 否
说明: 接口调用结束的回调函数(调用成功、失败都会执行)
c.object.success 回调函数
a.参数
a.Object res
a.errMsg
类型: string
说明: 错误信息
b.encryptedData
类型: string
说明: 包括敏感数据在内的完整转发信息的加密数据,详细见加密数据解密算法
c.iv
类型: string
说明: 加密算法的初始向量,详细见加密数据解密算法
d.cloudID
类型: string
说明: 敏感数据对应的云 ID,开通云开发的小程序才会返回,可通过云调用直接获取开放数据,详细见云调用直接获取开放数据
最低版本: 2.7.0
d.示例代码
敏感数据获取方式 加密数据解密算法 。 获取得到的开放数据为以下 json 结构(其中 openGId 为当前群的唯一标识):
---
{
"openGId": "OPENGID"
}
---
e.Tips
如需要展示群名称,小程序可以使用 开放数据组件
小游戏可以通过 wx.getGroupInfo 接口获取群名称
k.wx.authPrivateMessage(Object object)
a.功能描述
验证私密消息。用法详情见 小程序私密消息使用指南
b.参数
a.Object object
a.shareTicket
类型: string
必填: 是
说明: shareTicket。可以从 wx.getEnterOptionsSync 中获取。详情 shareTicket
b.success
类型: function
必填: 否
说明: 接口调用成功的回调函数
c.fail
类型: function
必填: 否
说明: 接口调用失败的回调函数
d.complete
类型: function
必填: 否
说明: 接口调用结束的回调函数(调用成功、失败都会执行)
c.object.success 回调函数
a.参数
a.Object res
a.errMsg
类型: string
说明: 错误信息
b.valid
类型: boolean
说明: 验证是否通过
c.encryptedData
类型: string
说明: 经过加密的activityId,解密后可得到原始的activityId。若解密后得到的activityId可以与开发者后台的活动id对应上则验证通过,否则表明valid字段不可靠(被篡改) 详细见加密数据解密算法
d.iv
类型: string
说明: 加密算法的初始向量,详细见加密数据解密算法
d.示例代码
---
wx.authPrivateMessage({
shareTicket: 'xxxxxx',
success(res) {
console.log('authPrivateMessage success', res)
// res
// {
// errMsg: 'authPrivateMessage:ok'
// valid: true
// iv: 'xxxx',
// encryptedData: 'xxxxxx'
// }
},
fail(res) {
console.log('authPrivateMessage fail', res)
}
})
---
05.网络
a.发起请求
RequestTask wx.request(Object object) 发起 HTTPS 网络请求。
RequestTask.abort() 中断请求任务
RequestTask.onHeadersReceived(function listener) 监听 HTTP Response Header 事件。会比请求完成事件更早
RequestTask.offHeadersReceived(function listener) 移除 HTTP Response Header 事件的监听函数
RequestTask.onChunkReceived(function listener) 监听 Transfer-Encoding Chunk Received 事件。当接收到新的chunk时触发。
RequestTask.offChunkReceived(function listener) 移除 Transfer-Encoding Chunk Received 事件的监听函数
b.下载
DownloadTask wx.downloadFile(Object object) 下载文件资源到本地。客户端直接发起一个 HTTPS GET 请求,返回文件的本地临时路径 (本地路径),单次下载允许的最大文件为 200MB。
DownloadTask.abort() 中断下载任务
DownloadTask.onProgressUpdate(function listener) 监听下载进度变化事件
DownloadTask.offProgressUpdate(function listener) 移除下载进度变化事件的监听函数
DownloadTask.onHeadersReceived(function listener) 监听 HTTP Response Header 事件。会比请求完成事件更早
DownloadTask.offHeadersReceived(function listener) 移除 HTTP Response Header 事件的监听函数
c.上传
UploadTask wx.uploadFile(Object object) 将本地资源上传到服务器。客户端发起一个 HTTPS POST 请求,其中 content-type 为 multipart/form-data
UploadTask.abort() 中断上传任务
UploadTask.onProgressUpdate(function listener) 监听上传进度变化事件
UploadTask.offProgressUpdate(function listener) 移除上传进度变化事件的监听函数
UploadTask.onHeadersReceived(function listener) 监听 HTTP Response Header 事件。会比请求完成事件更早
UploadTask.offHeadersReceived(function listener) 移除 HTTP Response Header 事件的监听函数
d.WebSocket
wx.sendSocketMessage(Object object) 通过 WebSocket 连接发送数据。需要先 wx.connectSocket,并在 wx.onSocketOpen 回调之后才能发送。
wx.onSocketOpen(function listener) 监听 WebSocket 连接打开事件。
wx.onSocketMessage(function listener) 监听 WebSocket 接收到服务器的消息事件。
wx.onSocketError(function listener) 监听 WebSocket 错误事件。
wx.onSocketClose(function listener) 监听 WebSocket 连接关闭事件。
SocketTask wx.connectSocket(Object object) 创建一个 WebSocket 连接。
wx.closeSocket(Object object) 关闭 WebSocket 连接。
06.支付
a.wx.requestVirtualPayment(Object object)
a.功能描述
发起米大师虚拟支付
b.参数
a.Object object
a.signData
类型: Object
必填: 是
说明: 具体支付参数见signData, 该参数需以string形式传递, 例如signData: '{"offerId":"123","buyQuantity":1,"env":0,"currencyType":"CNY","productId":"testproductId","goodsPrice":10,"outTradeNo":"xxxxxx","attach":"testdata"}'
a.结构属性
a.offerId
类型: string
必填: 是
说明: 在米大师侧申请的应用 id, mp-支付基础配置中的offerid
b.buyQuantity
类型: number
必填: 是
说明: 购买数量
c.env
类型: number
默认值: 0
必填: 否
说明: 环境配置, 0 米大师正式环境, 1 米大师沙箱环境, 默认为 0
d.currencyType
类型: string
必填: 是
说明: 币种
a.合法值
a.CNY
人民币
e.productId
类型: string
必填: 否
说明: 道具ID, 该字段仅mode=short_series_goods时需要必填
f.goodsPrice
类型: number
必填: 否
说明: 道具单价(分), 该字段仅mode=short_series_goods时需要必填, 用来校验价格与后台道具价格是否一致, 避免用户在业务商城页看到的价格与实际价格不一致导致投诉
g.outTradeNo
类型: string
必填: 是
说明: 业务订单号, 每个订单号只能使用一次, 重复使用会失败(极端情况不保证唯一, 不建议业务强依赖唯一性). 要求8-32个字符内, 只能是数字、大小写字母、符号 _-|*@组成, 不能以下划线(_)开头
h.attach
类型: string
必填: 是
说明: 透传数据, 发货通知时会透传给开发者
i.mode
类型: string
必填: 是
说明: 支付的类型, 不同的支付类型有各自额外要传的附加参数
a.合法值
a.short_series_goods
道具直购
b.short_series_coin
代币充值
j.paySig
类型: string
必填: 是
说明: 支付签名, 详见《签名详解》
k.signature
类型: string
必填: 是
说明: 用户态签名, 详见《签名详解》
b.success
类型: function
必填: 否
说明: 接口调用成功的回调函数
c.fail
类型: function
必填: 否
说明: 接口调用失败的回调函数
d.complete
类型: function
必填: 否
说明: 接口调用结束的回调函数(调用成功、失败都会执行)
c.object.success 回调函数
a.参数
a.Object res
a.errMsg
类型: string
说明: 调用成功信息
d.object.fail 回调函数
a.参数
a.Object err
a.errMsg
类型: string
说明: 错误信息
b.errCode
类型: number
说明: 错误码
e.错误
a.错误码与错误信息
1001: 参数错误
-1: 支付失败
-2: 支付取消
-4: 风控拦截
-5: 开通签约结果未知
-15001: 参数错误,具体原因见err_msg
-15002: outTradeNo重复使用,请换新单号重试
-15003: 系统错误
-15004: currencyType错误,目前只能填CNY
-15005: 用户态签名signature错误
-15006: 支付签名paySig错误
-15007: session_key过期
-15008: 二级商户进件未完成
-15009: 代币未发布
-15010: 道具productId未发布
-15011: 现网版本的env只能是0,不能填1(沙盒环境)
-15012: 调用米大师失败导致关单,请换新单号重试
-15013: goodsPrice道具价格错误
-15014: 道具/代币发布未生效,禁止下单,大概10分钟后生效
-15016: signData格式有问题
-15017: 此商家涉嫌违规,收款功能已被限制,暂无法支付。商家可以登录微信商户平台/微信支付商家助手小程序查看原因和解决方案
-15018: 代币或者道具productId审核不通过
-15019: 调微信报商户受限,商家可以登录微信商户平台/微信支付商家助手小程序查看原因和解决方案
-15020: 操作过快,请稍候再试
-15021: 小程序被限频交易
f.注意事项
目前只有 >= v2.19.2 的基础库支持该接口,后续将对更多低版本基础库支持该接口。因此建议开发者这样判断:当前用户的基础库版本 >= v2.19.2 时可以直接用 wx.requestVirtualPayment,小于 v2.19.2 时,用 wx.canIUse('requestVirtualPayment') 来判断接口是否可用。具体判断方法可参考示例代码。
g.示例代码
---
function compareVersion(_v1, _v2) {
if (typeof _v1 !== 'string' || typeof _v2 !== 'string') return 0
const v1 = _v1.split('.')
const v2 = _v2.split('.')
const len = Math.max(v1.length, v2.length)
while (v1.length < len) {
v1.push('0')
}
while (v2.length < len) {
v2.push('0')
}
for (let i = 0; i < len; i++) {
const num1 = parseInt(v1[i], 10)
const num2 = parseInt(v2[i], 10)
if (num1 > num2) {
return 1
} else if (num1 < num2) {
return -1
}
}
return 0
}
const SDKVersion = wx.getSystemInfoSync().SDKVersion
if (compareVersion(SDKVersion, '2.19.2') >= 0 || wx.canIUse('requestVirtualPayment')) {
wx.requestVirtualPayment({
signData: JSON.stringify({
offerId: '123',
buyQuantity: 1,
env: 0,
currencyType: 'CNY',
productId: 'testproductId',
goodsPrice: 10,
outTradeNo: 'xxxxxx',
attach: 'testdata',
}),
paySig: 'd0b8bbccbe109b11549bcfd6602b08711f46600965253a949cd6a2b895152f9d',
signature: 'd0b8bbccbe109b11549bcfd6602b08711f46600965253a949cd6a2b895152f9d',
mode: 'short_series_goods',
success(res) {
console.log('requestVirtualPayment success', res)
},
fail({ errMsg, errCode }) {
console.error(errMsg, errCode)
},
})
} else {
console.log('当前用户的客户端版本不支持 wx.requestVirtualPayment')
}
b.wx.requestPluginPayment(Object object)
a.功能描述
插件中发起支付。
b.参数
a.Object object
a.version
类型: string
必填: 是
说明: 插件版本
a.合法值
a.develop
开发版
b.trial
体验版
c.release
正式版
b.fee
类型: number
必填: 是
说明: 需要显示在页面中的金额,单位为分
c.paymentArgs
类型: Object
必填: 是
说明: 任意数据,传递给功能页中的响应函数
d.currencyType
类型: string
默认值: CNY
必填: 否
说明: 需要显示在页面中的货币符号的代码
e.success
类型: function
必填: 否
说明: 接口调用成功的回调函数
f.fail
类型: function
必填: 否
说明: 接口调用失败的回调函数
g.complete
类型: function
必填: 否
说明: 接口调用结束的回调函数(调用成功、失败都会执行)
c.Tip
tip: 小程序与插件绑定在同一个open平台账号上且小程序与插件均为open账号的同主体/关联主体时,调用此接口将直接拉起支付收银台。
tip: 这个接口本身可以在开发者工具中使用,但功能页的跳转目前不支持在开发者工具中调试,请在真机上测试。
tip: 跳转支付功能页需要在 app.json 中配置 "functionalPages": true
d.示例代码
wx.requestPluginPayment({
version: 'release',
fee: 1,
paymentArgs: {},
currencyType: 'CNY',
success (res) { },
fail (res) { }
})
c.wx.requestPayment(Object object)
a.功能描述
发起微信支付。调用前需在小程序微信公众平台-功能-微信支付入口申请接入微信支付。了解更多信息,可以参考 微信支付开发文档:
如果使用云开发,则 wx.requestPayment 所需参数可以通过云开发微信支付统一下单接口免鉴权获取、并可免证书、免签名的安全调用微信支付服务端接口、及接收异步支付结果回调,详见云开发微信支付。
b.参数
a.Object object
a.timeStamp
类型: string
必填: 是
说明: 时间戳,从 1970 年 1 月 1 日 00:00:00 至今的秒数,即当前的时间
b.nonceStr
类型: string
必填: 是
说明: 随机字符串,长度为32个字符以下
c.package
类型: string
必填: 是
说明: 统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=***
d.signType
类型: string
默认值: MD5
必填: 否
说明: 签名算法,应与后台下单时的值一致
a.合法值
a.MD5
仅在 v2 版本接口适用
b.HMAC-SHA256
仅在 v2 版本接口适用
c.RSA
仅在 v3 版本接口适用
e.paySign
类型: string
必填: 是
说明: 签名,具体见微信支付文档
f.success
类型: function
必填: 否
说明: 接口调用成功的回调函数
g.fail
类型: function
必填: 否
说明: 接口调用失败的回调函数
h.complete
类型: function
必填: 否
说明: 接口调用结束的回调函数(调用成功、失败都会执行)
c.示例代码
a.小程序端示例
---
wx.requestPayment({
timeStamp: '',
nonceStr: '',
package: '',
signType: 'MD5',
paySign: '',
success (res) { },
fail (res) { }
})
---
b.云函数结合示例
注:如果服务端有使用云开发,可以通过云开发微信支付统一下单接口免鉴权获取以上所需所有参数,示例:
a.云函数代码
---
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
})
exports.main = async (event, context) => {
const res = await cloud.cloudPay.unifiedOrder({
"body" : "小秋TIT店-超市",
"outTradeNo" : "1217752501201407033233368018",
"spbillCreateIp" : "127.0.0.1",
"subMchId" : "1900009231",
"totalFee" : 1,
"envId": "test-f0b102",
"functionName": "pay_cb"
})
return res
}
---
b.小程序代码
---
wx.cloud.callFunction({
name: '函数名',
data: {
// ...
},
success: res => {
const payment = res.result.payment
wx.requestPayment({
...payment,
success (res) {
console.log('pay success', res)
},
fail (err) {
console.error('pay fail', err)
}
})
},
fail: console.error,
})
---
d.wx.requestMerchantTransfer(Object object)
a.功能描述
商家转账用户确认模式下,在微信客户端通过小程序拉起页面请求用户确认收款。调用前需在微信支付商户平台/合作伙伴平台-产品中心,申请开通商家转账。
b.参数
a.Object object
a.mchId
类型: string
必填: 是
说明: 商户号
b.subMchId
类型: string
必填: 否
说明: 子商户号,服务商模式下必填
c.appId
类型: string
必填: 否
说明: 商户 appId,普通模式下必填,服务商模式下,appId 和 subAppId 二选一填写
d.subAppId
类型: string
必填: 否
说明: 子商户 appId,服务商模式下,appId 和 subAppId 二选一填写
e.package
类型: string
必填: 是
说明: 商家转账付款单跳转收款页 pkg 信息,商家转账付款单受理成功时返回给商户
f.openId
类型: string
必填: 否
说明: 收款用户 openId, 对应传入的商户 appId 下,某用户的 openId
g.success
类型: function
必填: 否
说明: 接口调用成功的回调函数
h.fail
类型: function
必填: 否
说明: 接口调用失败的回调函数
i.complete
类型: function
必填: 否
说明: 接口调用结束的回调函数(调用成功、失败都会执行)
c.示例代码
---
wx.requestMerchantTransfer({
mchId: '',
subMchId: '',
appId: '',
subAppId: '',
package: '',
openId: '',
success (res) { },
fail (res) { }
})
---
e.wx.requestCommonPayment(Object object)
a.功能描述
发起通用支付。目前该接口仅支持 B2b 支付类型。
b.参数
a.Object object
a.mode
类型: string
必填: 是
说明: 支付的类型
a.合法值
a.retail_pay_goods
B2b支付
b.retail_pay_indirect_goods
间接支付
c.retail_pay_combined_goods
合单支付
d.retail_pay_goods_new
多渠道B2b支付
b.signData
类型: Object
必填: 是
说明: 具体支付参数见signData, 该参数需以string形式传递, 例如signData: '{"mchid":"1234567890","out_trade_no":"test1244","description":"测试测试","amount":{"order_amount":1,"currency":"CNY"},"attach":"test_attach","env":1}'
a.结构属性
a.offerId
类型: string
必填: 是
说明: 在米大师侧申请的应用 id, mp-支付基础配置中的offerid
b.buyQuantity
类型: number
必填: 是
说明: 购买数量
c.env
类型: number
必填: 否
默认值: 0
说明: 环境配置, 0 米大师正式环境, 1 米大师沙箱环境, 默认为 0
a.合法值
a.0
生产环境/现网环境
b.1
沙箱环境/测试环境
d.currencyType
类型: string
必填: 是
说明: 币种
a.合法值
a.CNY
人民币
e.platform
类型: string
必填: 否
说明: 申请接入时的平台, platform 与应用id有关
a.合法值
a.android
安卓平台
f.productId
类型: string
必填: 是
说明: 道具ID
g.goodsPrice
类型: number
必填: 是
说明: 道具单价(分), 用来校验价格与后台道具价格是否一致, 避免用户在业务商城页看到的价格与实际价格不一致导致投诉
h.outTradeNo
类型: string
必填: 是
说明: 业务订单号, 每个订单号只能使用一次, 重复使用会失败(极端情况不保证唯一, 不建议业务强依赖唯一性). 要求8-32个字符内, 只能是数字、大小写字母、符号 _-|*@组成, 不能以下划线(_)开头
i.attach
类型: string
必填: 是
说明: 透传数据, 发货通知时会透传给开发者
j.mchid
类型: string
必填: 是
说明: 由微信支付生成并下发的商户号。示例值:1230000109
k.out_trade_no
类型: string
必填: 是
说明: 商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一,长度限制为[6,32]。示例值:1217752501201407033233368018
l.description
类型: string
必填: 是
说明: 商品描述。示例值:Image形象店-深圳腾大-QQ公仔
m.amount
类型: Object
必填: 是
说明: 订单金额信息。
a.结构属性
a.product_amount
类型: number
必填: 否
说明: 订单所有商品的原价总和,单位为分。示例值:1000
b.freight
类型: number
必填: 否
说明: 订单运费,单位为分。示例值:200
c.discount
类型: number
必填: 否
说明: 订单总计优惠金额,单位为分。示例值:500
d.other_fee
类型: number
必填: 否
说明: 订单其他费用总金额,单位为分。示例值:600
e.order_amount
类型: number
必填: 是
说明: 订单总需支付金额,也即是真正下单总金额,单位为分。示例值:1300
f.currency
类型: string
必填: 否
说明: 货币类型。示例值:CNY
a.合法值
a.CNY
人民币
n.attach
类型: string
必填: 否
说明: 附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用,实际情况下只有支付完成状态才会返回该字段。示例值:test_attach
o.product_info
类型: Object
必填: 否
说明: 订单详细商品信息列表。
a.结构属性
a.spu_id
类型: string
必填: 是
说明: 商户系统内该商品的spuid。示例值:spu123456
b.sku_id
类型: string
必填: 是
说明: 商户系统内该商品的skuid。示例值:sku123
c.title
类型: string
必填: 是
说明: 商品标题。示例值:QQ长鹅
d.path
类型: string
必填: 是
说明: 商户商品详请页小程序路径。示例值:pages/index
e.head_img
类型: string
必填: 是
说明: 商品主图的url,大小建议64*64。示例值:https://mp.weixin.qq.com/123
f.category
类型: string
必填: 是
说明: 商户侧该商品所属的类目。示例值:玩偶
g.sku_attr
类型: string
必填: 是
说明: 商户系统内该商品的sku属性。示例值:50cm
h.org_price
类型: number
必填: 是
说明: 该商品原价,单位为分。示例值:5000
i.sale_price
类型: number
必填: 是
说明: 该商品售价,单位为分。示例值:4000
j.quantity
类型: number
必填: 是
说明: 用户购买该商品的数量。示例值:5
k.delivery_type
类型: number
必填: 否
说明: 配送方式。示例值:2
a.合法值
a.1
同城配送
b.2
快递配送
c.3
门店自提
d.4
无需配送与提货
p.env
类型: number
必填: 是
说明: 下单环境。示例值:0
a.合法值
a.0
生产环境/现网环境
b.1
沙箱环境/测试环境
q.requestPaymentInfo
类型: Object
必填: 否
说明: B2b间连支付场景下,调用requestPaymentInfo的参数
a.结构属性
a.timeStamp
类型: string
必填: 否
说明: 时间戳,从 1970 年 1 月 1 日 00:00:00 至今的秒数,即当前的时间
b.nonceStr
类型: string
必填: 否
说明: 随机字符串,长度为32个字符以下
c.package
类型: string
必填: 否
说明: 统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=***
d.signType
类型: string
必填: 否
说明: 签名算法,应与后台下单时的值一致
e.paySign
类型: string
必填: 否
说明: 签名,具体见微信支付文档
c.paySig
类型: string
必填: 是
说明: 支付签名, 详见《签名详解》
d.signature
类型: string
必填: 是
说明: 用户态签名, 详见《签名详解》
e.success
类型: function
必填: 否
说明: 接口调用成功的回调函数
f.fail
类型: function
必填: 否
说明: 接口调用失败的回调函数
g.complete
类型: function
必填: 否
说明: 接口调用结束的回调函数(调用成功、失败都会执行)
c.object.success 回调函数
a.参数
a.Object res
a.errMsg
类型: string
说明: 调用成功信息
d.object.fail 回调函数
a.参数
a.Object err
a.errMsg
类型: string
说明: 错误信息
b.errno
类型: number
说明: 错误码
e.错误
a.错误码与错误信息
1000: 系统错误
1022: 参数json格式非法
702001: 参数错误,具体原因见errMsg
702002: 用户态签名错误
702003: 支付签名错误
702004: mode不合法
702005: out_trade_no重复,请更换新单号重试
702006: 二级商户进件未完成
702007: 用户未授权给品牌
702008: 正式版小程序只能用生产环境下单
702009: B2b授权关系校验不通过
f.注意事项
(无)
g.示例代码
---
wx.requestCommonPayment({
signData: JSON.stringify({
mchid: '1234567890',
out_trade_no: 'test1244',
description: '测试测试',
amount: {
order_amount: 1,
currency: 'CNY'
},
attach: 'test_attach',
product_info: {
product_list: [{
spu_id: 'spu123456',
sku_id: 'sku123',
title: 'QQ长鹅',
path: 'pages/index',
head_img: 'https://mp.weixin.qq.com/123',
category: '玩偶',
sku_attr: '50cm',
org_price: 5000,
sale_price: 4000,
quantity: 5
}]
},
delivery_type: 2,
env: 0
}),
paySig: 'd0b8bbccbe109b11549bcfd6602b08711f46600965253a949cd6a2b895152f9d',
signature: 'd0b8bbccbe109b11549bcfd6602b08711f46600965253a949cd6a2b895152f9d',
mode: 'retail_pay_goods',
success(res) {
console.log('requestCommonPayment success', res)
},
fail({ errMsg, errno }) {
console.error(errMsg, errno)
},
})
---
f.wx.openHKOfflinePayView(Object object)
a.功能描述
拉起WeChat Pay HK付款码。
b.接入步骤
商户需已经开通微信港币钱包WeChat Pay HK的支付权限, 2.请用商户在微信支付入驻时预留的邮箱,发起邮件申请接入权限:
【收件人】hkpayment@wechat.com
【邮件主题】申请接入拉起WeChat Pay HK付款码+商户名称:***+商户号:***
【邮件内容】因XXX原因(原因请按商户实际情况填写,不合理会驳回),需申请拉起WeChat Pay HK付款码,申请材料如下:
商户名称
商户号
商户资质材料扫描件或照片(CI,BR任一),所有材料均需清晰,且有盖章
拉起WeChat Pay HK付款码的场景说明:需有文字和示意图说明
商户联系方式:邮件***,联系电话***
c.参数
a.Object object
a.timeStamp
类型: string
必填: 是
说明: 时间戳,从 1970 年 1 月 1 日 00:00:00 至今的秒数,即当前的时间
b.nonceStr
类型: string
必填: 是
说明: 随机字符串,长度为32个字符以下
c.package
类型: string
必填: 是
说明: 业务数据包,开发者目前无需感知,直接传空字符串即可
d.signType
类型: string
默认值: SHA1
必填: 否
说明: 签名算法,应与后台下单时的值一致,目前仅支持 SHA1
a.合法值
a.SHA1
SHA1签名算法
e.paySign
类型: string
必填: 是
说明: 签名,具体见微信支付文档
f.success
类型: function
必填: 否
说明: 接口调用成功的回调函数
g.fail
类型: function
必填: 否
说明: 接口调用失败的回调函数
h.complete
类型: function
必填: 否
说明: 接口调用结束的回调函数(调用成功、失败都会执行)
d.示例代码
---
wx.openHKOfflinePayView({
timeStamp: '',
nonceStr: '',
package: '',
signType: 'SHA1',
paySign: '',
success (res) { },
fail (res) { }
})
---
g.GlobalPayment wx.createGlobalPayment(Object object)
a.功能描述
创建全球支付方式的对象。一旦用户选定支付方式后,不可更改。如需重新选择支付方式,需创建新对象。
b.参数
a.Object object
a.mchRegion
类型: string
必填: 是
说明: 根据每笔订单实际的交易地区,提供地区编码,不同地区可能匹配不同的支付方式,参考 ISO3166二位字母代码标准,大写。
b.isSandbox
类型: string
默认值: false
必填: 否
说明: true为开发环境,false为生产环境。不传入该参数,则默认为false,即生产环境。
c.返回值
GlobalPayment
h.GlobalPayment
a.功能描述
全球收银对象 GlobalPayment
b.属性
a.string methodKey
初始值为null。当开发者调用 openMethodPicker 用户选中具体支付方式后确定,后续不再改变。
c.示例代码
---
const goods = {
goods_id: `goods_1`,
goods_name: `拿铁`,
goods_unit_price: {
currency: 'SGD',
total: 10,
},
goods_quantity: '1',
goods_category: '1',
}
const globalPay = async () => {
if (typeof wx.createGlobalPayment !== 'function') {
// 基础库版本不支持
// 方案一、微信支付做兜底
wx.requestPayment({
timeStamp: '',
nonceStr: '',
package: '',
signType: '',
paySign: '',
})
// 方案二、引导用户更新
// 方案三、mp后台设置最低基础库版本 3.7.3
return
}
const payment = wx.createGlobalPayment({ mchRegion: 'SG', isSandbox: true })
try {
const pickerResp = await payment.openMethodPicker({
amount: goods.goods_unit_price,
})
console.log(`openMethodPicker resp: `, pickerResp)
if (pickerResp.methodKey === 'WECHAT_PAY') {
// 发起微信支付
} else {
// 后台接口发起预下单
const preOrderResp = await preOrder(
goods.goods_unit_price,
[goods],
pickerResp.methodKey
)
console.log(`preOrder resp: `, preOrderResp)
const { payment_id, prepay_info } = preOrderResp
const requestPaymentResp = await payment.requestGlobalPayment({
paymentId: payment_id,
prepayInfo: prepay_info,
})
console.log(`requestGlobalPayment resp: `, requestPaymentResp)
}
} catch (error) {
console.log(error)
}
}
---
d.方法
a.Promise GlobalPayment.openMethodPicker(Object object)
拉起全球收银的支付方式选择面板。当用户选择支付方式或者关闭选择面板后,返回相应结果。 当用户选定支付方式后,globalPayment上的属性 methodKey 也会更新,后续该对象再次调用将直接失败,不再拉起选择面板。 若用户选择微信支付,请开发者按原微信支付接口 wx.requestPayment 调用完成后续支付流程。 若用户选择TPG的支付方式,流程会等待开发者前往TPG完成预下单后,携带预支付信息和交易单号调用 requestGlobalPayment,若开发者超时未调用,则会提示用户加载超时(超时时间暂定为30s)。 当用户关闭选择面板,即未选择支付方式,开发者后续仍可继续调用接口拉起支付方式选择面板。
b.Promise GlobalPayment.requestGlobalPayment(Object object)
开发者调用 openMethodPicker 并在返回值 methodKey 中接受到用户选择了TPG的支付方式后,可调用此接口接入TPG的支付流程。 当用户已成功完成当前订单支付后,再次调用该对象的 requestGlobalPayment 会失败。即每次支付都需创建新的 globalPayment 对象重走流程。 仅在 methodKey 为TPG支付类型才能进入全球收银的支付流程,其他情况会失败。 建议在接口返回后,不论成功或失败,均通过 TPG 接口 inquiry-payment 对订单状态进行查询。
c.Promise GlobalPayment.abort()
用户选择TPG的支付方式,界面会进入加载的Toast,等待开发者前往TPG完成预下单后携带预支付信息和交易单号调用 requestGlobalPayment,若开发者在 TPG预下单未成功或出现异常情况,可调用该接口主动终止TPG支付流程,界面加载的Toast将会隐藏,提示用户下单失败。
2 公众号
2.1 开发指南
01.概述
a.说明
为方便开发者快速上手微信公众号的开发对接,本章节主要讲解开发过程与注意点。
公众号开发主要分「服务器对接」与「网页开发」两部分。
b.后端服务器对接
a.说明1
公众号本身包含文章编辑、粉丝管理、消息相关能力。当开发者想对接已有系统,或者想自动化完成某些内容时,就需要与微信服务器交互。
这个交互主要分两种,开发者可以参考下方名录,快速前往相应内容,完成开发对接过程。
b.说明2
内容 介绍
调用服务端API 开发者通过主动调用来完成某些操作或获取一些内容,比如获取草稿箱内容、发送客服消息等。(开发者主动向微信要求)
事件与消息推送 当公众号的用户发消息、或者发生了一些消息以及事件,微信平台需要主动推送至开发者的服务器,让开发者能自动完成一些动作。(微信服务器主动推给开发者,开发者可以选自主安排动作)
c.网页开发
前往微信网页开发
02.服务端API调用
a.接口调用概述
a.获取AppID和AppSecret
微信开发者平台已支持管理公众号的基本信息、开发信息以及绑定关系和授权关系。
操作路径为:「微信开发者平台 - 扫码登录 - 我的业务 - 公众号」,点击后即可进入到公众号的管理页面
其中开发者可在此处直接修改 AppSecret 、API IP 白名单信息、JS接口安全域名以及消息推送的配置
b.AppSecret管理
支持启用、重置、冻结以及解冻的操作;其中冻结与解冻的操作需 10分钟后方可生效。
如长期无AppSecret的使用需求,开发者可以使用管理员账号登录公众平台,在“设置与开发-基本配置”中对AppSeceret进行冻结,提高账号的安全性。
AppSecret冻结后,开发者无法使用AppSecret获取Access token(接口返回错误码40243),不影响账号基本功能的正常使用,不影响通过第三方授权调用后台接口,不影响云开发调用后台接口。
开发者可以随时使用管理员账号登录公众平台,在“设置与开发-基本配置”中对AppSecret进行解冻。
如果secret被冻结了调用getAccessToken 会出现 40243 错误
「微信云托管」具有「免鉴权调用微信开放服务接口」特性的能力,免密钥,全程不暴漏任何信息,开发者无需维护access_token,那对于接口请求的合法性判定,完全由与微信同链路的微信云托管参与实施,具体可前往云托管文档。(如你使用云托管的云调用,则不需要后续生成 Access Token 过程,也无需配置 IP 白名单)
c.IP白名单
即白名单内的 IP 才可以调用获取接口调用凭据接口 或 获取稳定版接口调用凭据接口,否则会提示 61004 错误
d.生成AccessToken
参考获取接口调用凭据接口 或 获取稳定版接口调用凭据 传入上一步获取的 AppID 和 AppSecret 获取 Access Token,两者都可以正常获取,推荐使用稳定版接口。
获取的 Access Token 可用于服务端 API 的调用。
以下是一些注意事项:
access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。建议公众号开发者使用中控服务器统一获取和刷新access_token,其他业务逻辑服务器所使用的access_token均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致access_token覆盖而影响业务;
目前access_token的有效期通过返回的expires_in来传达,目前是7200秒之内的值。中控服务器需要根据这个有效时间提前去刷新新access_token。在刷新过程中,中控服务器可对外继续输出的老access_token,此时公众平台后台会保证在5分钟内,新老access_token都可用,这保证了第三方业务的平滑过渡;
access_token的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新access_token的接口,这样便于业务服务器在API调用获知access_token已超时的情况下,可以触发access_token的刷新流程。
access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。
access_token的存储至少要保留512个字符空间。
这里提供一个较为简单的 access_token 存储和使用方案:
中控服务器定时(建议1小时)调用微信api,刷新access_token,将新的access_token 存入存储;
其他工作服务器每次调用微信api时从mysql(或其他存储)获取access_token,并可在内存缓存一段时间(建议1分钟);
对于可能存在风险的调用,在开发者进行获取 access_token 调用时进入风险调用确认流程,需要用户管理员确认后才可以成功获取。具体流程为:
开发者通过某IP发起调用->平台返回错误码[89503]并同时下发模板消息给公众号管理员->公众号管理员确认该IP可以调用->开发者使用该IP再次发起调用->调用成功。
如公众号管理员第一次拒绝该IP调用,用户在1个小时内将无法使用该IP再次发起调用,如公众号管理员多次拒绝该IP调用,该IP将可能长期无法发起调用。平台建议开发者在发起调用前主动与管理员沟通确认调用需求,或请求管理员开启IP白名单功能并将该IP加入IP白名单列表。
公众号调用各接口时,一般会获得正确的结果,具体结果可见对应接口的说明;返回错误时,可根据返回码来查询错误原因,返回码解释一般在各个接口的文档中有描述,如无特意描述,可直接参考全局返回码
e.接口域名
开发者可以根据自己的服务器部署情况,选择最佳的接入域名(延时更低,稳定性更高)。
除此之外,可以将其他接入域名用作容灾用途,当网络链路发生故障时,可以考虑选择备用域名来接入。请开发者使用域名进行API接口请求,不要使用IP作为访问。若有需要开通网络策略,开发者可以从获取微信服务器IP地址接口定期获取最新的IP信息。
a.通用域名(api.weixin.qq.com),使用该域名将访问官方指定就近的接入点;
b.通用异地容灾域名(api2.weixin.qq.com),当上述域名不可访问时可改访问此域名;
c.上海域名(sh.api.weixin.qq.com),使用该域名将访问上海的接入点;
d.深圳域名(sz.api.weixin.qq.com),使用该域名将访问深圳的接入点;
e.香港域名(hk.api.weixin.qq.com),使用该域名将访问香港的接入点。
f.接口限频
公众号调用接口并不是无限制的。为了防止公众号的程序错误而引发微信服务器负载异常,默认情况下,每个公众号调用接口都不能超过一定限制,具体可参考接口限频说明
g.问题排查
如果你在调用接口时遇到问题,可参考接口报警和排查指引
此外,调用接口遇到报错可前往微信开发者平台使用智能 API 诊断工具,一键精准定位和解决问题。
b.接口限制说明
a.说明
公众号调用接口并不是无限制的。为了防止公众号的程序错误而引发微信服务器负载异常,默认情况下,每个公众号调用接口都不能超过一定限制,当超过一定限制时,调用对应接口会收到如下错误返回码:
{"errcode":45009,"errmsg":"api freq out of limit"}
开发者可以登录微信公众平台,在账号后台开发者中心接口权限模板查看账号各接口当前的日调用上限和实时调用量,对于认证账号可以对实时调用量清零,说明如下:
由于指标计算方法或统计时间差异,实时调用量数据可能会出现误差,一般在1%以内。
每个账号每月共10次清零操作机会,清零生效一次即用掉一次机会(10次包括了平台上的清零和调用接口API的清零)。
第三方帮助公众号调用时,实际上是在消耗公众号自身的quota。
每个有接口调用限额的接口都可以进行清零操作。
当账号粉丝数超过10W/100W/1000W时,部分接口的日调用上限会相应提升,以公众号MP后台开发者中心页面中标明的数字为准。
b.重置API调用次数
我们提供重置API调用次数接口 、重置指定API调用次数以及 使用AppSecret重置API调用次数,可对 API 调用(包括第三方帮其调用)次数进行清零,详情查看对应接口文档。
c.接口报警与排查指引
a.概要说明
微信公众平台已对外开放接口报警,当微信服务器向开发者推送消息失败次数达到预定阈值时,会将报警消息发送到指定微信报警群中(设置方式:公众平台->开发-运维中心->接口报警),请开发者积极主动关注报警,即时解决故障,提高微信公众号的服务质量。
为了更好地根据报警信息尾部的实例(提供了openid及时间戳stamp)进行问题排查,开发者需要在接入层、逻辑层等每一个层级都加上包含关键信息的详细日志,以利于快速定位问题。
b.接口报警
报警目前有2类:
a.通用报警
所有开发者都需要关注。
a.类型 描述
DNS失败 微信服务器向公众号推送消息或事件时,解析DNS失败
DNS超时 微信服务器向公众号推送消息或事件时,解析DNS超时,超时时间为5秒
连接超时 微信服务器连接公众号开发者服务器时发生超时,超时时间为5秒
请求超时 微信服务器向公众号推送消息或事件后,开发者5秒内没有返回
回应失败 微信服务器向公众号推送消息或事件后,得到的回应不合法
MarkFail(自动屏蔽) 微信服务器向公众号推送消息或事件发生多次失败后,暂时不推送消息,一分钟后解除屏蔽
b.公众号第三方平台报警
只有在微信开放平台(open.weixin.qq.com)上申请成为公众号第三方平台的开发者,才需要关注此报警。
a.类型 描述
推送component_verify_ticket超时 推送component_verify_ticket时,开发者5S内没有返回
推送component_verify_ticket失败 推送component_verify_ticket时,开发者没有返回success
推送第三方平台消息超时 推送第三方平台消息(如取消授权消息)等,第三方平台5秒内没有返回
推送第三方平台消息失败 推送第三方平台消息(如取消授权消息)等,第三方平台没有返回success
c.报警内容说明
报警内容描述:
appid:公众号appid
昵称: 公众号昵称
时间:所有报警,都会提供首次发生异常的时间。(如首次发生超时的时间,首次发生回应失败的时间)
内容:错误的具体描述
次数:发生失败的次数
错误样例:错误样例里注明了一些帮助查找问题的信息。如:首次超时开发者的IP和推送消息类型。如果是回应失败,错误样例还会注明首次回应失败时开发者的回包。
一般情况下,通过报警提供的IP,时间,消息类型,能够比较快速的定位到第三方发生问题的原因。
03.消息与事件推送
a.消息与事件推送介绍
a.配置说明
更多详细的消息加解密说明以及调试工具指引,可查看消息加解密说明
关于如何接受普通消息和事件推送,详情可查看接收普通消息以及接收事件推送
除了接受消息之外,开发者可以使用被动回复给发消息的用户回复消息,或使用发送客服消息接口 主动发消息
b.第一步:填写服务器配置
a.说明
可在「微信开发者平台 - 我的业务 - 公众号 - 消息与事件推送」处进行配置。即,填写服务器地址(URL)、Token和EncodingAESKey,
其中URL是开发者用来接收微信消息和事件的接口URL。Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。
EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。
b.具体配置说明如下
a.URL服务器地址
开发者用来接收微信消息和事件的接口 URL,必须以 http:// 或 https:// 开头,分别支持 80 端口和 443 端口。
b.Token令牌
用于签名处理,下文会介绍相关流程。
c.EncodingAESKey
将用作消息体加解密密钥。
d.消息加解密方式
a.明文模式
不使用消息加解密,明文发送,安全系数较低,不建议使用。
b.兼容模式
明文、密文共存,不建议使用。
c.安全模式
使用消息加解密,纯密文,安全系数高,强烈推荐使用。
e.数据格式
消息体的格式,仅支持 XML
c.第二步:验证消息的确来自微信服务器
a.说明
开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:
b.GET请求参数
a.参数
signature
b.描述
微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
a.参数
timestamp
b.描述
时间戳
a.参数
nonce
b.描述
随机数
a.参数
echostr
b.描述
随机字符串
c.说明
开发者通过检验signature对请求进行校验(下面有校验方式)。
若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
1.将token、timestamp、nonce三个参数进行字典序排序
2.将三个参数字符串拼接成一个字符串进行sha1加密
3.开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
d.URL验证工具
为了便于开发者调试,我们提供了URL验证工具供开发者使用。
开发者需填写AccessToken、URL地址、Token,点击“检查参数并发起验证”后,调试工具会发送GET请求到URL所指的服务器,并返回相关调试信息。
d.第三步:依据接口文档实现业务逻辑
验证URL有效性成功后即接入生效。开发者可以在公众平台网站中申请微信认证,认证成功后,将获得更多接口权限,满足更多业务需求。
接入成功后,用户每次向公众号发送消息、或者产生自定义菜单、或产生微信支付订单等情况时,开发者填写的服务器配置URL将得到微信服务器推送过来的消息和事件,开发者可以依据自身业务逻辑进行响应,如回复消息。
用户向公众号发送消息时,公众号方收到的消息发送者是一个OpenID,是使用用户微信号加密后的结果,每个用户对每个公众号有一个唯一的OpenID。
开发者可以通过调用微信 API 接口来实现自己的业务。
e.注意事项
启用后,用户发送的消息将转发至该地址,网站中设置的自动回复和自定义菜单将失效。
b.消息加解密说明
a.消息加解密修改点
新增消息体签名验证,用于公众平台和公众号验证消息体的正确性
针对推送给微信公众号的普通消息和事件消息,以及推送给设备公众号的设备消息进行加密
公众号对密文消息的回复也要求加密
-------------------------------------------------------------------------------------------------
请开发者查看接入指引和开发者FAQ来接入消息体签名及加解密功能:接入指引
启用加解密功能(即选择兼容模式或安全模式)后,公众平台服务器在向公众号服务器配置地址(可在「微信开发者平台 - 我的业务 - 公众号 - 消息与事件推送」处修改)推送消息时,URL将新增加两个参数(加密类型和消息体签名),并以此来体现新功能。加密算法采用AES,具体的加解密流程和方案请看接入指引、技术方案和示例代码。
为了配合消息加密功能的上线,并帮助开发者适配新特性,公众平台提供了3种加解密的模式供开发者选择,即明文模式、兼容模式、安全模式(可在“开发者中心”选择相应模式),选择兼容模式和安全模式前,需在开发者中心填写消息加解密密钥EncodingAESKey。
b.明文模式
维持现有模式,没有适配加解密新特性,消息体明文收发,默认设置为明文模式
c.兼容模式
公众平台发送消息内容将同时包括明文和密文,消息包长度增加到原来的3倍左右;公众号回复明文或密文均可,不影响现有消息收发;开发者可在此模式下进行调试
d.安全模式(推荐)
公众平台发送消息体的内容只含有密文,公众号回复的消息体也为密文,建议开发者在调试成功后使用此模式收发消息
e.EncodingAESKey介绍
微信公众平台采用AES对称加密算法对推送给公众号的消息体对行加密,EncodingAESKey则是加密所用的秘钥。公众号用此秘钥对收到的密文消息体进行解密,回复消息体也用此秘钥加密。
此外,微信公众平台为开发者提供了5种语言的示例代码(包括C++、php、Java、Python和C#版本,点击下载。
f.接入指引
a.消息解密方式为明文模式
假设URL配置为https://www.qq.com/revice, 数据格式为JSON,Token="AAAAA"。
a.推送的URL链接
https://www.qq.com/recive?signature=899cf89e464efb63f54ddac96b0a0a235f53aa78×tamp=1714037059&nonce=486452656
b.推送的包体
---
{
"ToUserName": "gh_97417a04a28d",
"FromUserName": "o9AgO5Kd5ggOC-bXrbNODIiE3bGY",
"CreateTime": 1714037059,
"MsgType": "event",
"Event": "debug_demo",
"debug_str": "hello world"
}
---
c.校验signature签名是否正确,以判断请求是否来自微信服务器。
将token、timestamp(URL参数中的)、nonce(URL参数中的)三个参数进行字典序排序,排序后结果为:["1714037059","486452656","AAAAA"]
将三个参数字符串拼接成一个字符串:"1714037059486452656AAAAA"
进行sha1计算签名:899cf89e464efb63f54ddac96b0a0a235f53aa78
与URL链接中的signature参数进行对比,相等说明请求来自微信服务器,合法。
d.回包给微信
具体回包内容取决于特定接口文档要求,如无特定要求,回复空串或者success即可。
b.消息解密方式为安全模式
假设URL配置为https://www.qq.com/revice, 数据格式为JSON,Token="AAAAA",EncodingAESKey="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",公众号Appid="wxba5fad812f8e6fb9"。
a.推送的URL链接
https://www.qq.com/recive?signature=6c5c811b55cc85e0e1b54100749188c20beb3f5d×tamp=1714112445&nonce=415670741&openid=o9AgO5Kd5ggOC-bXrbNODIiE3bGY&encrypt_type=aes&msg_signature=046e02f8204d34f8ba5fa3b1db94908f3df2e9b3
b.推送的包体
---
{
"ToUserName": "gh_97417a04a28d",
"Encrypt": "+qdx1OKCy+5JPCBFWw70tm0fJGb2Jmeia4FCB7kao+/Q5c/ohsOzQHi8khUOb05JCpj0JB4RvQMkUyus8TPxLKJGQqcvZqzDpVzazhZv6JsXUnnR8XGT740XgXZUXQ7vJVnAG+tE8NUd4yFyjPy7GgiaviNrlCTj+l5kdfMuFUPpRSrfMZuMcp3Fn2Pede2IuQrKEYwKSqFIZoNqJ4M8EajAsjLY2km32IIjdf8YL/P50F7mStwntrA2cPDrM1kb6mOcfBgRtWygb3VIYnSeOBrebufAlr7F9mFUPAJGj04="
}
---
c.校验msg_signature签名是否正确,以判断请求是否来自微信服务器。
注意:不要使用signature验证!
将token、timestamp(URL参数中的)、nonce(URL参数中的)、Encrypt(包体内的字段)四个参数进行字典序排序,排序后结果为: ["+qdx1OKCy+5JPCBFWw70tm0fJGb2Jmeia4FCB7kao+/Q5c/ohsOzQHi8khUOb05JCpj0JB4RvQMkUyus8TPxLKJGQqcvZqzDpVzazhZv6JsXUnnR8XGT740XgXZUXQ7vJVnAG+tE8NUd4yFyjPy7GgiaviNrlCTj+l5kdfMuFUPpRSrfMZuMcp3Fn2Pede2IuQrKEYwKSqFIZoNqJ4M8EajAsjLY2km32IIjdf8YL/P50F7mStwntrA2cPDrM1kb6mOcfBgRtWygb3VIYnSeOBrebufAlr7F9mFUPAJGj04=", "1714112445", "415670741", "AAAAA"]。
将四个参数字符串拼接成一个字符串,然后进行sha1计算签名:046e02f8204d34f8ba5fa3b1db94908f3df2e9b3
与URL参数中的msg_signature参数进行对比,相等说明请求来自微信服务器,合法。
d.解密消息体"Encrypt"密文。
AESKey = Base64_Decode( EncodingAESKey + "=" ),EncodingAESKey 尾部填充一个字符的 "=", 用 Base64_Decode 生成 32 个字节的 AESKey;
将Encrypt密文进行Base64解码,得到TmpMsg, 字节长度为224
将TmpMsg使用AESKey进行AES解密,得到FullStr,字节长度为205。AES 采用 CBC 模式,秘钥长度为 32 个字节(256 位),数据采用 PKCS#7 填充; PKCS#7:K 为秘钥字节数(采用 32),Buf 为待加密的内容,N 为其字节数。Buf 需要被填充为 K 的整数倍。在 Buf 的尾部填充(K - N%K)个字节,每个字节的内容 是(K - N%K)。微信团队提供了多种语言的示例代码(包括 PHP、Java、C++、Python、C#),请开发者尽量使用示例代码,仔细阅读技术文档、示例代码及其注释后,再进行编码调试。示例下载
FullStr=random(16B) + msg_len(4B) + msg + appid,其中:
a.random(16B)
为 16 字节的随机字符串;
b.msg_len
为 msg 长度,占 4 个字节(网络字节序);
c.msg
为解密后的明文;
d.appid
为公众号Appid,开发者需验证此Appid是否与自身公众号相符。
在此示例中:
a.random(16B)
"a8eedb185eb2fecf"
b.msg_len
167(注意:需按网络字节序,占4个字节)
c.msg
"{"ToUserName":"gh_97417a04a28d","FromUserName":"o9AgO5Kd5ggOC-bXrbNODIiE3bGY","CreateTime":1714112445,"MsgType":"event","Event":"debug_demo","debug_str":"hello world"}"
d.appid
"wxba5fad812f8e6fb9"
e.回包给微信服务器
首先需确定回包包体的明文内容,具体取决于特定接口文档要求,如无特定要求,回复空串或者success(无需加密)即可,其他回包内容需加密处理。这里假设回包包体的明文内容为"{"demo_resp":"good luck"}",数据格式为JSON,下面介绍如何对回包进行加密:
a.回包格式
回包格式如下,具体取决于你配置的数据格式(JSON或XML),其中:
Encrypt:加密后的内容;
MsgSignature:签名,微信服务器会验证签名;
TimeStamp:时间戳;
Nonce:随机数
---
{
"Encrypt": "${msg_encrypt}$",
"MsgSignature": "${msg_signature}$",
"TimeStamp": ${timestamp}$,
"Nonce": ${nonce}$
}
---
---
<xml>
<Encrypt><![CDATA[${msg_encrypt}$]]></Encrypt>
<MsgSignature><![CDATA[${msg_signature}$]]></MsgSignature>
<TimeStamp>${timestamp}$</TimeStamp>
<Nonce><![CDATA[${nonce}$]]></Nonce>
</xml>
---
b.Encrypt的生成方法
AESKey = Base64_Decode( EncodingAESKey + "=" ),EncodingAESKey 尾部填充一个字符的 "=", 用 Base64_Decode 生成 32 个字节的 AESKey;
构造FullStr=random(16B) + msg_len(4B) + msg + appid,其中
a.random(16B)
为 16 字节的随机字符串;
b.msg_len
为 msg 长度,占 4 个字节(网络字节序);
c.msg
为明文;
d.appid
为公众号Appid。
在此示例中:
a.random(16B)
"707722b803182950"
b.msg_len
25(注意:需按网络字节序,占4个字节)
c.msg
"{"demo_resp":"good luck"}"
d.appid
"wxba5fad812f8e6fb9"
FullStr的字节大小为63
将FullStr用AESKey进行加密,得到TmpMsg,字节大小为64。AES 采用 CBC 模式,秘钥长度为 32 个字节(256 位),数据采用 PKCS#7 填充; PKCS#7:K 为秘钥字节数(采用 32),Buf 为待加密的内容,N 为其字节数。Buf 需要被填充为 K 的整数倍。在 Buf 的尾部填充(K - N%K)个字节,每个字节的内容 是(K - N%K)。微信团队提供了多种语言的示例代码(包括 PHP、Java、C++、Python、C#),请开发者尽量使用示例代码,仔细阅读技术文档、示例代码及其注释后,再进行编码调试。示例下载
对TmpMsg进行Base64编码,得到Encrypt="ELGduP2YcVatjqIS+eZbp80MNLoAUWvzzyJxgGzxZO/5sAvd070Bs6qrLARC9nVHm48Y4hyRbtzve1L32tmxSQ=="。
c.TimeStamp
由开发者生成,使用当前时间戳即可,示例使用1713424427。
d.Nonce
回填URL参数中的nonce参数即可,示例使用415670741。
e.MsgSignature的生成方法
将token、TimeStamp(回包中的)、Nonce(回包中的)、Encrypt(回包中的)四个参数进行字典序排序,排序后结果为: ["1713424427", "415670741", "AAAAA", "ELGduP2YcVatjqIS+eZbp80MNLoAUWvzzyJxgGzxZO/5sAvd070Bs6qrLARC9nVHm48Y4hyRbtzve1L32tmxSQ=="]
将四个参数字符串拼接成一个字符串,并进行sha1计算签名:1b9339964ed2e271e7c7b6ff2b0ef902fc94dea1
f.最终回包
---
{
"Encrypt": "ELGduP2YcVatjqIS+eZbp80MNLoAUWvzzyJxgGzxZO/5sAvd070Bs6qrLARC9nVHm48Y4hyRbtzve1L32tmxSQ==",
"MsgSignature": "1b9339964ed2e271e7c7b6ff2b0ef902fc94dea1",
"TimeStamp": 1713424427,
"Nonce": "415670741"
}
---
c.调试工具
为了便于开发者调试,我们提供了相关的调试工具(请求构造、调试工具)供开发者使用。
“请求构造”允许开发者填写相关参数后,生成debug_demo事件发包或回包的相关调试信息,供开发者使用。
“调试工具”允许开发者填写AccessToken、Body后,微信服务器会拉取你在公众号后台配置的消息推送配置,实际推送一条debug_demo事件供开发者调试。
2.2 自定义菜单
01.具体功能及服务端接口如下
接口名称 英文名 请求路径
创建自定义菜单 createCustomMenu /cgi-bin/menu/create
查询自定义菜单信息 getCurrentSelfmenuInfo /cgi-bin/get_current_selfmenu_info
获取自定义菜单配置 getMenu /cgi-bin/menu/get
删除自定义菜单 deleteMenu /cgi-bin/menu/delete
创建个性化菜单 addConditionalMenu /cgi-bin/menu/addconditional
删除个性化菜单 deleteConditionalMenu /cgi-bin/menu/delconditional
测试个性化菜单匹配结果 tryMatchMenu /cgi-bin/menu/trymatch
2.3 基础消息
01.接收普通消息
文本消息
图片消息
语音消息
视频消息
小视频消息
地理位置消息
链接消息
02.接收事件推送
关注/取消关注事件
扫描带参数二维码事件
上报地理位置事件
自定义菜单事件
03.被动回复用户消息
回复文本消息
回复图片消息
回复语音消息
回复视频消息
回复音乐消息
回复图文消息
04.群发消息
前言
接口目录
其他说明
图文消息群发前将进行原创校验
群发接口新增原创校验流程
群发接口新增 send_ignore_reprint 参数
使用 clientmsgid 参数,避免重复推送
事件推送群发结果
05.一次性订阅消息
服务号订阅通知功能(见左侧目录“订阅通知”)开启灰度测试,公众号一次性订阅消息能力可正常使用
第一步:需要用户同意授权,获取一次给用户推送一条订阅模板消息的机会
第二步:通过API推送订阅模板消息给到授权微信用户
2.4 素材管理
01.永久素材
接口名称 英文名 请求路径
获取永久素材 getMaterial /cgi-bin/material/get_material
获取永久素材总数 getMaterialCount /cgi-bin/material/get_materialcount
获取永久素材列表 batchGetMaterial /cgi-bin/material/batchget_material
上传图文消息图片 uploadImage /cgi-bin/media/uploadimg
上传永久素材 addMaterial /cgi-bin/material/add_material
删除永久素材 delMaterial /cgi-bin/material/del_material
02.临时素材
接口名称 英文名 请求路径
获取临时素材 getMedia /cgi-bin/media/get
新增临时素材 uploadTempMedia /cgi-bin/media/upload
获取高清语音素材 getHDVoice /cgi-bin/media/get/jssdk
2.5 草稿管理和商品卡片
01.草稿管理
接口名称 英文名 请求路径
草稿箱开关设置 draft_switch /cgi-bin/draft/switch
更新草稿 draft_update /cgi-bin/draft/update
获取草稿列表 draft_batchget /cgi-bin/draft/batchget
新增草稿 draft_add /cgi-bin/draft/add
获取草稿的总数 draft_count /cgi-bin/draft/count
删除草稿 draft_delete /cgi-bin/draft/delete
获取草稿详情 getDraft /cgi-bin/draft/get
02.商品卡片
接口名称 英文名 请求路径
获取商品卡片的DOM结构 ecsgetproductcardinfo /channels/ec/service/product/getcardinfo
2.6 留言管理
01.留言管理
接口名称 英文名 请求路径
打开已群发文章评论 openArticleComment /cgi-bin/comment/open
查看指定文章的评论数据 listComment /cgi-bin/comment/list
关闭已群发文章评论 closecomment /cgi-bin/comment/close
评论标记精选 electcomment /cgi-bin/comment/markelect
评论取消精选 unelectcomment /cgi-bin/comment/unmarkelect
删除评论 delcomment /cgi-bin/comment/delete
回复评论 replycomment /cgi-bin/comment/reply/add
删除回复 delreplycomment /cgi-bin/comment/reply/delete
2.7 发布能力
01.发布能力
接口名称 英文名 请求路径
获取已发布的消息列表 freepublish_batchget /cgi-bin/freepublish/batchget
删除发布文章 freepublishDelete /cgi-bin/freepublish/delete
发布状态查询 freepublish_get /cgi-bin/freepublish/get
获取已发布图文信息 freepublishGetarticle /cgi-bin/freepublish/getarticle
发布草稿 freepublish_submit /cgi-bin/freepublish/submit
2.8 用户能力
01.用户管理
a.UnionID 机制说明
在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的。
对于不同公众号,同一用户的openid不同)。公众号可通过获取用户基本信息来根据OpenID获取用户基本信息,包括语言和关注时间。
请注意,如果开发者有在多个公众号,或在公众号、移动应用、小程序、小店、带货助手、网站应用之间统一用户账号的需求,
需要前往微信开放平台(open.weixin.qq.com)绑定公众号后,才可利用 UnionID 机制来满足上述需求。
b.用户身份说明
用户身份标记有两种,openid 和 unionid
openid 是微信用户对于一个应用(公众号)的身份标记,同一个微信用户对不同应用(公众号)有不同的 openid
unionid 是微信用户对于一个开放平台的身份标记。如果开发者拥有多个移动应用、网站应用和小程序、小店、带货助手等,
可通过获取用户基本信息中的unionid来区分用户的唯一性,因为只要是同一个微信开放平台账号下的移动应用、网站应用和小程序、小店、带货助手,
用户的 unionid 是唯一的。
-----------------------------------------------------------------------------------------------------
速记公式:
微信用户 + 公众号 AppID = openid
微信用户 + 开放平台账号 = unionid
即,只要公众号 AppID 不变化,openid 不会变。只要公众号绑定的开放平台账号不变,unionid 也不会变。
c.请注意
20年6月8日起,用户关注来源“微信广告(ADD_SCENE_WECHAT_ADVERTISEMENT)”从“其他(ADD_SCENE_OTHERS)”中拆分给出,
2021年12月27日之后,不再输出头像、昵称信息。
d.接口列表
a.获取用户基本信息
GET https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=o6_bmjrPTlm6_2sgVt7hMZOPfL2M&lang=zh_CN
b.批量获取用户基本信息
POST https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token=ACCESS_TOKEN
02.接口列表
a.标签管理
接口名称 英文名 请求路径
获取标签下粉丝列表 getTagFans /cgi-bin/user/tag/get
获取标签 getTags /cgi-bin/tags/get
创建标签 createTag /cgi-bin/tags/create
编辑标签 updateTag /cgi-bin/tags/update
删除标签 deleteTag /cgi-bin/tags/delete
批量为用户取消标签 batchUntagging /cgi-bin/tags/members/batchuntagging
批量为用户打标签 batchTagging /cgi-bin/tags/members/batchtagging
获取用户的标签列表 getTagidList /cgi-bin/tags/getidlist
b.用户信息
接口名称 英文名 请求路径
取消拉黑用户 batchUnblacklist /cgi-bin/tags/members/batchunblacklist
获取公众号的黑名单列表 getBlacklist /cgi-bin/tags/members/getblacklist
获取用户基本信息 userInfo /cgi-bin/user/info
批量获取用户基本信息 batchUserinfo /cgi-bin/user/info/batchget
获取关注用户列表 getFans /cgi-bin/user/get
拉黑用户 batchBlacklist /cgi-bin/tags/members/batchblacklist
设置用户备注名 updateRemark /cgi-bin/user/info/updateremark
2.9 客户消息
01.客服消息介绍
a.允许的动作列表
目前允许的动作列表如下(公众平台会根据运营情况更新该列表,不同动作触发后,允许的客服接口)
用户发送信息
点击自定义菜单(仅有点击推事件、扫码推事件、扫码推事件且弹出“消息接收中”提示框这3种菜单类型是会触发客服接口的)
关注公众号
扫描二维码
支付成功
b.客服消息下发规则
场景 下发额度 额度有效期
用户发送消息 5条 48小时
点击自定义菜单 3条 1分钟
关注公众号 3条 1分钟
扫描二维码 3条 1分钟
支付成功 无限制 48小时
特别说明:在用户点击菜单消息时,触发的是点击菜单事件,对应场景2点击自定义菜单的消息规则,不会产生用户发送消息场景的客服消息下发额度。
c.客服账号管理升级
此外,为了帮助公众号使用不同的客服身份服务不同的用户群体,客服接口进行了升级,开发者可以管理客服账号,并设置客服账号的头像和昵称。该能力针对所有拥有客服接口权限的公众号开放。
d.关于media_id的使用
以及,请开发者注意,本接口中所有使用到 media_id 的地方,现在都可以使用素材管理中的永久素材 media_id 。
e.客服消息接口列表
a.客服管理
接口名称 英文名 请求路径
添加客服账号 addkfaccount /customservice/kfaccount/add
获取所有客服账号 getkflist /cgi-bin/customservice/getkflist
获取在线客服列表 getonlinekflist /cgi-bin/customservice/getonlinekflist
修改客服账号 updatekfaccount /customservice/kfaccount/update
删除客服账号 delkfaccount /customservice/kfaccount/del
设置客服头像 uploadkfheadimg /customservice/kfaccount/uploadheadimg
邀请绑定客服账号 invitekfworker /customservice/kfaccount/inviteworker
b.会话控制
接口名称 英文名 请求路径
创建会话 createkfsession /customservice/kfsession/create
获取客服会话列表 getkfsessionlist /customservice/kfsession/getsessionlist
获取客户会话状态 getkfsession /customservice/kfsession/getsession
获取未接入会话列表 getwaitcase /customservice/kfsession/getwaitcase
关闭会话 closeSession /customservice/kfsession/close
c.客服消息
接口名称 英文名 请求路径
获取聊天记录 getMsgList /customservice/msgrecord/getmsglist
发送客服消息 sendCustomMessage /cgi-bin/message/custom/send
客服输入状态 typing /cgi-bin/message/custom/typing
2.10 数据统计
01.数据统计接口介绍
a.权限划分逻辑
在公众号登录授权机制的权限划分逻辑如下:
用户分析数据接口属于用户管理权限
图文分析数据接口属于群发与通知权限
消息分析数据接口属于消息管理权限
b.使用说明
a.通用注意事项
接口侧的公众号数据的数据库中仅存储了2014年12月1日之后的数据,将查询不到在此之前的日期,即使有查到,也是不可信的脏数据;
请开发者在调用接口获取数据后,将数据保存在自身数据库中,即加快下次用户的访问速度,也降低了微信侧接口调用的不必要损耗。
为确保公众号数据已完成统计和处理,请于每天上午8点后查询公众号前一天的数据。
b.用户分析的注意事项
2020年4月起,新增关注渠道增加'他人转载',之前合并在“其他合计”中。
2020年6月起,新增关注渠道增加'微信广告'、'专辑内账号名称',之前合并在“其他合计”中。
2023年6月起,支付后关注合并在“其他合计”中。
c.图文分析的注意事项
额外注意,获取图文群发每日数据接口的结果中,只有中间页阅读人数+原文页阅读人数+分享转发人数+分享转发次数+收藏次数 >=3的结果才会得到统计,过小的阅读量的图文消息无法统计。
2020年2月28日起,获取图文统计数据(getuserread)、图文统计分时数据(getuserreadhour)数据接口的结果中,中间页阅读、分享统一提供user_source字段,用于区分<传播渠道>与<全部>数据,详见参数说明;额外注意,原文页阅读、收藏,只在图文统计数据(getuserread)中提供,并只提供<全部>数据。
d.广告分析的使用指南
详情可查看广告数据分析接口说明
c.接口列表
a.用户数据
接口名称 英文名 请求路径
获取用户增减数据 getusersummary /datacube/getusersummary
获取累计用户数据 getusercumulate /datacube/getusercumulate
b.图文数据
接口名称 英文名 请求路径
获取图文群发每日数据 getarticlesummary /datacube/getarticlesummary
获取图文阅读分时数据 getuserreadhour /datacube/getuserreadhour
获取图文转发分时数据 getusersharehour /datacube/getusersharehour
获取图文阅读概况数据 getuserread /datacube/getuserread
获取图文群发总数据 getarticletotal /datacube/getarticletotal
获取图文转发概况数据 getusershare /datacube/getusershare
c.消息数据
接口名称 英文名 请求路径
获取消息发送概况数据 getupstreammsg /datacube/getupstreammsg
获取消息发送月数据 getupstreammsgmonth /datacube/getupstreammsgmonth
获取消息发送分布周数据 getupstreammsgdistweek /datacube/getupstreammsgdistweek
获取消息发送分布月数据 getupstreammsgdistmonth /datacube/getupstreammsgdistmonth
获取消息发送分时数据 getupstreammsghour /datacube/getupstreammsghour
获取消息发送周数据 getupstreammsgweek /datacube/getupstreammsgweek
获取消息发送分布数据 getupstreammsgdist /datacube/getupstreammsgdist
d.接口数据
接口名称 英文名 请求路径
获取被动回复概要数据 getinterfacesummary /datacube/getinterfacesummary
获取被动回复分布数据 getinterfacesummaryhour /datacube/getinterfacesummaryhour
2.11 网页开发
00.汇总
01.JS-SDK 使用说明
02.iOS WKWebview网页适配
03.鸿蒙网页开发适配指南
04.DarkMode 适配指南
01.JS-SDK 使用说明
a.概述
微信JS-SDK是微信公众平台 面向网页开发者提供的基于微信内的网页开发工具包。
通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的能力,同时可以直接使用微信分享、扫一扫、卡券、支付等微信特有的能力,为微信用户提供更优质的网页体验。
此文档面向网页开发者介绍微信JS-SDK如何使用及相关注意事项。
b.JSSDK使用步骤
a.步骤一:绑定域名
可登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。或者前往微信开发者平台 - 公众号或服务号 - 基本信息 - 开发信息 进行修改
绑定父级域名,其合法的子域名可用
至多可填写 5 个合法域名,
但不支持 IP 地址、端口号及短链域名,此外,域名需通过 ICP 备案的验证,新备案域名需 24 小时后才可配置
备注:登录后可在“开发者中心”查看对应的接口权限。
b.步骤二:引入JS文件
在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.6.0.js
如需进一步提升服务稳定性,当上述资源不可访问时,可改访问:http://res2.wx.qq.com/open/js/jweixin-1.6.0.js (支持https)。
备注:支持使用 AMD/CMD 标准模块加载方法加载
c.步骤三:通过config接口注入权限验证配置
所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次,对于变化url的SPA的web app可在每次url变化时进行调用,目前Android微信客户端不支持pushState的H5新特性,所以使用pushState来实现web app的页面会导致签名失败,此问题会在Android6.2中修复)。
---
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '', // 必填,公众号的唯一标识
timestamp: , // 必填,生成签名的时间戳
nonceStr: '', // 必填,生成签名的随机串
signature: '',// 必填,签名
jsApiList: [] // 必填,需要使用的JS接口列表
});
---
签名算法见文末的附录1,所有JS接口列表见文末的附录2
注意:如果使用的是小程序云开发静态网站托管的域名的网页,可以免鉴权直接跳任意合法合规小程序,调用 wx.config 时 appId 需填入非个人主体的已认证小程序,不需计算签名,timestamp、nonceStr、signature 填入非空任意值即可。
d.步骤四:通过ready接口处理成功验证
---
wx.ready(function(){
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
});
---
e.步骤五:通过error接口处理失败验证
---
wx.error(function(res){
// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
});
---
c.接口调用说明
所有接口通过wx对象(也可使用jWeixin对象)来调用,参数是一个对象,除了每个接口本身需要传的参数之外,还有以下通用参数:
success:接口调用成功时执行的回调函数。
fail:接口调用失败时执行的回调函数。
complete:接口调用完成时执行的回调函数,无论成功或失败都会执行。
cancel:用户点击取消时的回调函数,仅部分有用户取消操作的api才会用到。
trigger: 监听Menu中的按钮点击时触发的方法,该方法仅支持Menu中的相关接口。
备注:不要尝试在trigger中使用ajax异步请求修改本次分享的内容,因为客户端分享操作是一个同步操作,这时候使用ajax的回包会还没有返回。
以上几个函数都带有一个参数,类型为对象,其中除了每个接口本身返回的数据之外,还有一个通用属性errMsg,其值格式如下:
调用成功时:"xxx:ok" ,其中xxx为调用的接口名
用户取消时:"xxx:cancel",其中xxx为调用的接口名
调用失败时:其值为具体错误信息
02.iOS WKWebview网页适配
a.背景
微信 iOS 客户端自 2017 年 3 月 1 日起逐步升级为 WKWebView 内核,网页开发者需提前做好兼容检查和适配。如有疑问,可参考文末联系方式咨询。
WKWebView 是苹果在 iOS 8 中引入的新组件,旨在提供更现代、支持最新 Webkit 功能的网页浏览控件,解决 UIWebView 内存占用大、性能低下等问题。WKWebView 使用与 Safari 相同的 Nitro JavaScript 引擎,极大提升了页面 JS 执行速度。
b.切换方法
自 iOS 微信 6.5.3 版本起,开发者可手动切换 WKWebView 和 UIWebView,以便提前适配。
a.手动切换入口
在微信会话列表页点击右上角“加号按钮”,选择“添加朋友”,在搜索框输入“:switchweb”,点击键盘右下角搜索按钮。切换成功后会提示当前使用的内核(UIWebView 或 WKWebView)。
b.校验切换方法
切换到 WKWebView 后,进入任意网页,加载成功后下拉页面(或点击右上角菜单按钮)显示地址栏。若地址栏以“此网页由”开头,则为 WKWebView;若为“网页由”,则为 UIWebView。
c.页面判断内核方式
可通过微信注入的 window.__wxjs_is_wkwebview 变量判断当前内核。iOS 微信 6.5.3 及以后版本,window.__wxjs_is_wkwebview 为 true 时为 WKWebView,为 false 或 undefined 时为 UIWebView。
c.前端适配关注要点
适配首要原则:若无法区分是 WKWebView 新特性还是微信内部逻辑导致页面异常,可分别在 Safari 和微信 WKWebView 内核下测试,快速定位问题。
d.适配指南
a.不再支持 cache
a.变化
WKWebView 暂不支持 cache jsapi。
b.适配建议
移除相关页面逻辑。
b.LocalID 预览图片
a.变化
JSSDK 1.2.0 以下版本不再支持通过 chooseImage 返回的 localId 以 img src=wxLocalResource://... 方式预览图片。
b.适配建议
升级 JSSDK 至 1.2.0 及以上版本,或使用 getLocalImgData 接口获取数据。
JSSDK 1.2.0 下载地址
c.wx.config 授权后 jsapi 调用失败问题
a.变化
WKWebView 内部实现变更,jsapi 权限管理逻辑调整,极小概率出现授权正常但 jsapi 调用失败。
b.适配建议
iOS 微信 6.5.1:如页面使用 HTML5 History API(pushState、popstate、replaceState)并用 wx.config 授权,可能出现 jsapi 无权限调用失败。建议用 Anchor hash 技术替代 History 技术。
iOS 微信 6.5.2 及以后版本:上述问题已修复,但如页面涉及 history 或 hash 技术,仍需关注相关问题。
d.Cookie 和 LocalStorage 设置相关
退出微信账号后,将清空所有 Cookie 和 LocalStorage。页面依赖 Cookie 或相关逻辑时需注意:
a.变化1:跨域存取 Cookie
问题:页面 A 引用不同域名的页面 B 资源,B 设置 Cookie 时会被 WKWebView 阻止第三方跨域设置 Cookie 的安全策略拦截。
适配建议:通过业务后台存储需传递的信息,给页面分配 access_token,通过 URL 传递信息。
b.变化2:微信原生层网络请求无法读取 WKWebView 设置的 Cookie(即使域名相同)
问题:如资源或图片服务器依赖 Cookie 校验,切换 WKWebView 后,长按保存或预览大图时原生请求不会带上 Cookie,导致保存或预览失败。
适配建议:建议静态资源 cookie free。如需传递信息,同样通过后台存储并用 access_token 方式传递。
除上述两种情况外,其他请求均会带上完整 Cookie,无需担心 Cookie 丢失。
e.页面视频小窗播放
a.变化
iOS 微信 6.5.3 及以后版本,WebView 默认支持小窗播放。开发者需要特别注意小窗播放需要前端同时适配iOS10和iOS10以下的低版本
b.适配建议
需兼容 iOS10 及以下版本,video 标签需如下设置:
<video webkit-playsinline playsinline> </video>
f.WKWebview页面行为与Safari完全一致,会导致页面依赖UIWebview页面行为的逻辑失效或异常
可根据业务自身逻辑,实现测试页面后分别在Safari和微信WKWebview中验证
Safari或微信WKWebview中,页面A跳转到页面B再返回页面A后不会重新执行Script和Ajax(也不会触发页面reload),但会触发页面的pageshow pageHide等事件。
Safari或微信WKWebview中,在页面弹出输入键盘后,会触发JQuery的resize事件,而在UIWebView下不会。
Safari或微信WKWebview中,window unload 事件在只有刷新才能触发,退出页面或者跳转到其他页面都无法触发。
Safari或微信WKWebview中,极少数情况下某些特殊实现的页面点击事件会失效。
03.鸿蒙网页开发适配指南
因鸿蒙系统内浏览器 UserAgent 特征和 iOS、Android 不相同,可能会导致微信内网页应用出现功能异常,为保障用户体验,建议开发者按照下方指引主动进行适配。
a.通用适配说明
a.开发者通过 navigator.userAgent 是否同时包含 'OpenHarmony' 和 'MicroMessenger' 判断当前网页应用的运行环境是否为鸿蒙微信。
b.可通过 wx.checkJsApi 判断当前鸿蒙微信的客户端版本是否支持指定 JS 接口,如果不支持,则在业务层上做兼容处理。
b.微信支付能力适配说明
鸿蒙微信的微信支付能力已于鸿蒙微信 1.0 支持,而在 iOS 与 Android 系统中则是“微信版本号>=5.0”支持微信支付能力,开发者需自查业务程序中是否有针对微信版本号或者其他信息影响支付功能,如果有,开发者需针对鸿蒙微信进行适配处理。
04.DarkMode 适配指南
a.背景
iOS和安卓分别从 iOS 13 和 Android 10(不同厂商不尽相同,部分 Android 9 也支持) 开始加入深色模式的支持,各大浏览器纷纷开始支持深色模式,微信 iOS 客户端 7.0.12、Android 客户端 7.0.13 也支持了深色模式,网页端适配深色模式后将更进一步提高用户体验的一致性。
b.如何切换深色模式
iOS:“设置”--“显示与亮度”--“外观”,选择“深色”
Android(不同厂商可能略有差别,名字也不尽相同):“系统设置”--“显示”--“深色模式”。
c.适配指南
微信内置浏览器基于 Web 标准实现了对深色模式的支持,可以用一般 Web 页面适配的方式进行适配,下面列举几种一般的适配方式:
a.声明 color-scheme
有两种方式:
meta: 在head中声明<meta name="color-scheme" content="light dark">,声明当前页面支持 light 和 dark 两种模式,系统切换到深色模式时,浏览器默认样式也会切换到深色;
css:下面的 css 同样可以实现上面 meta 声明的效果
---
:root {
color-scheme: light dark;
}
---
注意:此声明并非为页面做自动适配,只影响浏览器默认样式
更多信息可查阅 W3C 文档 《CSS Color Adjustment Module Level 1》
b.通过 CSS 媒体查询
---
:root {
color-scheme: light dark;
background: white;
color: black;
}
@media (prefers-color-scheme: dark) {
:root {
background: black;
color: white;
}
}
---
颜色较多的情况,建议使用CSS变量对颜色值进行管理
---
:root {
color-scheme: light dark;
--nav-bg-color: #F7F7F7;
--content-bg-color: #FFFFFF;
--font-color: rgba(0,0,0,.9);
}
@media (prefers-color-scheme: dark) {
:root {
--nav-bg-color: #2F2F2F;
--content-bg-color: #2C2C2C;
--font-color: rgba(255, 255, 255, .8);
}
}
:root {
color: var(--font-color)
}
.header {
background-color: var(--nav-bg-color);
}
.content {
background-color: var(--content-bg-color);
}
---
c.图片适配
利用picture+source标签,设置不同模式下的图片 url。
---
<picture>
<!-- 深色模式下的图片 -->
<source srcset="dark.jpg" media="(prefers-color-scheme: dark)" />
<!-- 默认模式下的图片 -->
<img src="light.jpg"/>
</picture>
---
d.JavaScript中判断当前模式&监听模式变化
利用的是matchMedia方法,具体用法参考以下例子:
---
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')
function darkModeHandler() {
if (mediaQuery.matches) {
console.log('现在是深色模式')
} else {
console.log('现在是浅色模式')
}
}
// 判断当前模式
darkModeHandler()
// 监听模式变化
mediaQuery.addListener(darkModeHandler)
---
3 微信支付
3.1 汇总
01.常用信息
a.小程序支持IOS虚拟支付
a.说明
根据苹果官方公告,参与该计划的开发者在销售符合条件的App内购买项目时,可享受15%的收益抽成减免。
这一比例相较于标准30%的抽成堪称大幅优惠,显示出苹果对小程序生态的支持态度。
3.2 JSAPI支付
01.产品介绍
a.产品概述
JSAPI支付,提供商户在微信客户端内部浏览器网页中使用微信支付收款的能力。
b.JSAPI支付模式介绍
a.说明
用户可以通过公众号、扫一扫、分享链接等方式在微信客户端内部浏览器中打开商户页面,完成支付。
b.应用场景1:商城购物
1、用户在微信客户端浏览器访问商户的网页,选购商品后进入支付环节。
2、用户提交支付后,进入到微信的支付确认界面,用户可在该页面确认收款方和金额。
3、用户确认订单收款方和金额无误后,点击“支付”会出现验密界面(验证密码或指纹等),同时在该页面也可选择支付方式(零钱或银行卡等)。
4、验密付款成功后,微信会展示支付成功页面,以及完成按钮。
5、用户点击“完成”后会返回到商户网页中,商户根据支付结果向用户展示订单支付结果。
6、用户可在微信支付-我的账单-账单明细中查看账单。
c.应用场景2:扫码支付
1、使用【扫一扫】扫描商家收款码
2、打开商家收款页面,并拉起支付
3、用户确认支付
4、展示支付成功提示页面
5、返回商户页面
6、用户在微信查看账单
c.准入条件
a.支持的主体类型
个体工商户、企业、事业单位、政府机关、社会组织
b.支持的应用类型
已认证的服务号、已认证的政府或媒体类型的公众号。
02.快速开始
a.流程说明
1、阅读产品介绍文档,了解JSAPI支付产品特性;
2、参考公众平台账号注册指引注册公众平台账号,只有申请服务号、政府或媒体类型的公众号才支持申请JSAPI支付权限;
3、参考公众平台账号认证指引完成公众平台账号认证,未认证的账号无法申请JSAPI支付权限;
4、如果已有商户号,请超级管理员登录商户平台,按照已有商户号开通JSAPI支付产品权限申请权限,并发起与公众平台APPID授权绑定申请;
如果还没有商户号,请参考申请新商户号和JSAPI支付权限,支持申请JSAPI支付权限的主体类型有:个体工商户、企业、事业单位、政府机关、社会组织,详见:主体类型介绍与各主体权限对照说明,申请完成后,系统会自动对申请权限时填写的APPID发起授权绑定申请;
5、登录公众平台,确认授权绑定的商户号,完成商户号与公众平台APPID绑定;
6、超级管理员登录商户平台,为技术负责人配置商户平台登录账号并设置为安全联系人,详见配置技术负责人账号操作指引;
7、超级管理员登录商户平台,配置JSAPI支付授权目录,配置的内容请和技术负责人确认;
8、获取开发参数,进入开发流程。
03.开发指引
a.整体业务开发流程概览
商户后端调用JSAPI/小程序下单接口获取预支付ID(prepay_id)后,在微信客户端前端页面调用WeixinJSBridge对象方法调起微信支付界面。
当用户取消支付或支付成功后点击"完成"按钮,会返回拉起支付前页面,同时商户前端页面将收到回调,此时商户后端需调用查询订单API接口确认订单状态,
并根据订单状态进行相应的业务逻辑处理(在商户页面向用户展示查询到的订单支付状态、在商户内部系统更新订单状态等),
如果订单支付成功,微信支付系统还会发送支付成功回调通知给商户。具体的支付回调和查单的实现方案,商户可以参考支付回调和查单实现指引。
最后商户可通过下载交易账单进行对账。特殊需要退款的订单,也可调用退款接口完成退款。
b.详细步骤说明
a.商户下单
商户通过调用JSAPI/小程序下单接口生成订单并获取预支付ID。
下单接口关键参数说明:
openid:用户在商户下单的appid下唯一标识,获取方式详见参数说明。
time_expire:支付结束时间。若传递该参数,则用户只能在订单设置的支付结束时间time_expire之前进行支付,超过支付结束时间后,用户支付将收到:"订单已超过商户设置的最晚支付成功时间,请重新发起支付"的提示,商户需对订单进行关单处理。若不传该参数,默认订单支付有效期为7天,用户可在7天内进行支付,超出7天,订单将被关闭。
prepay_id:预支付交易会话标识。调起支付时需要使用的参数,prepay_id有效期为2小时,超过2小时,商户需要使用原下单参数重新请求下单接口,获取新的prepay_id。
b.商户调起支付
商户调起支付前,请确保已在商户平台配置好JSAPI支付授权目录(只有配置了JSAPI支付授权目录的网页才能调起支付),
然后通过调用微信浏览器内置对象方法来调起微信收银台,具体请参考JSAPI调起支付
c.用户支付
用户在微信收银台完成支付/取消支付,返回商户前端页面后,微信浏览器内置对象方法会收到回调,此时商户需要调查询订单API接口确认订单状态,并根据订单状态向用户展示支付结果。
同时,如果用户支付成功,微信支付系统会向商户发送支付成功回调。未收到回调时,商户也可调用查询订单API接口确认订单状态。具体实现方案商户可以参考支付回调和查单实现指引。
若商户需要限制用户支付的时间,有以下两种方式:
1、下单时通过time_expire参数,设置订单的支付结束时间,超过设置的结束时间后,商户进行关单处理。
2、商户在自己的系统内进行倒计时,超过有效期,进行关单处理。
若因特殊原因需在用户可支付时间范围内关闭订单,商户可通过调用查询订单API接口确认订单状态,若订单仍是未支付状态,商户可以调用关闭订单API接口关单,关单后可以将订单当作失败终态处理。
d.商户对账
账单产品介绍
e.订单退款
退款产品介绍
c.普通支付订单状态流转图
1、商户调用JSAPI/小程序下单接口下单成功后,商户可以调用查询订单接口来确认订单状态,详情请参考支付回调和查单实现指引。
2、当订单状态处于未支付(trade_state:NOTPAY)时,用户可对订单进行支付,若用户支付失败,订单状态不变。
3、7天内商户可对无需继续支付的订单(例如用户超过商户系统内部规定的支付时间,或超过商户下单设置的最晚支付时间(time_expire)的订单)调用关单接口,使订单关闭,或超过7天后由微信侧自动关单。关单后,订单状态会从未支付(trade_state:NOTPAY)流转为已关闭(trade_state:CLOSED)。
4、当用户成功支付订单时,订单状态会从未支付(trade_state:NOTPAY)流转为支付成功(trade_state:SUCCESS)。
5、当订单状态为支付成功(trade_state:SUCCESS)时,如果用户需要退款,商户可调用申请退款接口(仅支持支付成功后1年内的订单),退款申请成功后,订单状态会从支付成功(trade_state:SUCCESS)流转为转入退款(trade_state:REFUND),退款状态可通过查询退款单接口进行确认。
6、以下三个状态为终态
trade_state:CLOSED
trade_state:SUCCESS
trade_state:REFUND
04.常见问题
a.前端报错
a.调起支付提示“交易失败,今日收款超出单日收款最大金额”
小微商户日收款额度为1万-30万,以当日实际收款提示情况为准,信用卡日收款限额为1000元,月收款限额调整为10000元。
其他类型商户没有限额,可通过商户平台站内信或下方指引,查询是否有违约记录。
商户违约记录查询与申诉指引(移动端):https://kf.qq.com/faq/240129aQZjiM240129QRBFRV.html
微信支付商户自查违约记录/申诉指引(电脑端):https://kf.qq.com/faq/240129iuEZBJ240129meAR3u.html
b.JSAPI调起支付报错"当前页面的URL未注册"
请参考配置JSAPI支付目录。
c.JSAPI调起支付报错"该商户暂不支持通过外部拉起微信完成支付"
JSAPI支付必需从微信浏览器里调起。
d.JSAPI调起支付报错"JSAPI缺少参数total_fee"
请按照以下两点检查:
1,package参数格式错误,正确的package参数格式应该prepay_id=xxx,例如package:"prepay_id=wx201222229874569b201de80e089456213"。
2,package参数为空,请按照文档要求上传正确的参数。
e.JSAPI调起支付报错"下单账号与支付账号不一致,请核实后再支付"
JSAPI下单传的openid所属用户需要和实际调起支付用户一致。
f.如何判断用户是通过微信内置浏览器还是外部浏览器访问商户的H5网页?
可以使用下列代码判断是否在微信内置浏览器打开,true为微信内部浏览器
---
/**
* 检测当前是否运行在微信内置浏览器中
*/
function detectWeChatBrowser() {
// 确保 navigator 对象存在(避免特殊运行环境报错)
if (typeof navigator === 'undefined') {
console.warn('当前环境无 navigator 对象,无法检测浏览器类型');
return;
}
// 使用 includes 替代 indexOf,语义更清晰(ES6 特性,现代浏览器均支持)
const isWeChat = navigator.userAgent.includes('MicroMessenger');
//若需支持 IE11 等不支持 includes的旧浏览器,可将 includes替换为 indexOf !== -1
//const isWeChat = navigator.userAgent.indexOf('MicroMessenger') !== -1;
// 三元表达式简化条件输出
console.log(isWeChat ? '微信内置浏览器' : '外部浏览器');
}
// 执行检测
detectWeChatBrowser();
---
g.前端如何判断是用户主动取消支付,还是密码输入错误导致失败?
可以判断用户取消支付,无法判断密码输入错误,密码输入错误不是终态,用户还可以继续输入密码。
小程序支付:requestPayment:fail cancel(用户取消支付),参考小程序调起支付。
App支付:errCode=-2(用户取消支付),参考APP调起支付。
JSAPI支付:get_brand_wcpay_request:cancel(用户取消支付),参考JSAPI调起支付。
注意:前端回调并不保证它绝对可靠,不可只依赖前端回调判断订单支付状态,订单状态需以后端查询订单和支付成功回调通知为准。
h.支付和退款可以分别使用不同版本(v2和v3)的接口吗?
可以,但不建议跨版本使用。
i.微信小游戏调起JSAPI支付提示:“WeixinJSBridge.invoke is not a function”
微信小游戏不支持调用JSAPI支付,需要使用小游戏虚拟支付。
j.JSAPI调起支付报错:system:access_denied
参考以下几点排查:
1、小程序不支持内嵌web-view发起JSAPI支付
2、调起支付的页面url过长会导致微信webview鉴权异常,需要商户精简下url长度。
k.JSAPI调起支付报错:“调用支付JSAPI缺少参数: appld”
参考以下几点排查:
1、请检查调起支付的参数是否传入了appId;
2、如使用的是JS-SDK中的wx.chooseWXpay方法拉起支付,该方法调起支付时的appId依赖wx.config获取,请检查wx.config注入是否成功。
b.后端报错(接口)
a.JSAPI/小程序下单返回报错"appid和mch_id不匹配,请检查后再试"
下单传的appid需要和商户号绑定,详细请参考微信支付普通商户与AppID账号关联管理。
b.JSAPI/小程序下单返回报错"appid与openid不匹配"
下单传的openid不存在或者不是从对应appid下的,获取方式详见参数说明。
c.下单接口返回”此商家的收款功能已被限制,暂无法支付。商家可登录微信商户平台/微信支付商家助手小程序/经营账户页面查看原因和解决方案“报错如何处理?
商户号超级管理员可通过“微信支付商家助手”公众号,点击“我的商家”;或小程序搜索“微信支付商家助手”关键字进入“微信支付商家助手”小程序,进行解脱。
具体步骤请参考:
商户违约记录查询与申诉指引(移动端):https://kf.qq.com/faq/240129aQZjiM240129QRBFRV.html
微信支付商户自查违约记录/申诉指引(电脑端):https://kf.qq.com/faq/240129iuEZBJ240129meAR3u.html
d.调用接口报错:“商户未申请过证书。请到商户平台上申请证书授权机构颁发的证书。详情可参考:http://kf.qq.com/faq/180824JvUZ3i180824YvMNJj.html。”
请核实请求头传入的mchid商户号有没有申请商户API证书,如未申请,请参考商户API证书申请指引。
e.在微信支付中,transaction_id与prepay_id这两个订单号字段有什么区别?
1、 prepay_id :商户调用微信支付下单接口成功后返回的预支付交易会话标识,用于拉起支付(如JSAPI、APP支付等),有效期为2小时
2、transaction_id :支付成功后由微信支付系统生成的订单号,用于唯一标识一笔成功支付的交易,仅在支付成功回调或查单接口中返回。
f.下单返回报错:"商户号该产品权限未开通,请前往商户平台>产品中心检查后重试"
需要先开通权限,请参考快速开始-步骤4。
g.下单返回报错:{"code":"PARAM_ERROR";"message":"受理机构必须传入sub_mch_id"}
服务商商户号无法调用普通商户模式接口。
h.v3支付回调通知解密报错:“init client setting err:decrypt downloaded certificate failed: cipher: message authentication failed”。
请参考以下几点排查:
1、解密使用的APIv3密钥错误。
2、检查密文是否被截断或篡改(需完整传递ciphertext、associated_data、nonce)。
i.通过哪个接口可以查询商户号结算信息?
可以通过申请资金账单接口获取商户号结算信息。
j.支付回调怎么测试?
微信支付未提供线上测试回调接口。如需测试支付回调功能,建议通过生产环境验证,在真实支付场景中测试回调地址是否能正常接收通知。
注意:回调地址需确保公网可访问的,详细参考回调通知注意事项。
k.下单报错:{"code":"SIGN_ERROR","message":"商户证书序列号有误。请使用签名私钥匹配的证书序列号"},什么原因?
请求的Authorization头中的商户API证书序列号serial_no,与用于计算签名的商户API证书私钥不匹配。可参考如何计算签名指引排查。
l.下单报错:{ "code": "PARAM_ERROR","message": "http header中的mchid与post payload中的mchid不匹配"},是什么原因?
请求头中的mchid与请求体中的mchid不一致,请检查参数传递是否正确。
m.第一次下单未支付,第二次用同一个out_trade_no再次调用可以吗?
可以。需保证所有参数与首次下单一致(如 appid、mchid、金额、商品描述等),否则会报“201 商户订单号重复”错误。
n.下单返回商户订单号重复是什么原因?
同一个商户订单号(out_trade_no),不允许更换参数或更换其他下单接口重复下单。
o.回调验签报错:“Last unit does not have enough valid bits”,是什么原因,如何处理?
原因:这是签名探测流量导致的报错。探测流量的签名值不是合法的Base64,会触发“Last unit does not have enough valid bits”这类Base64解码错误。
快速判断:查看回调头 Wechatpay-Signature 的值,若以“WECHATPAY/SIGNTEST/”为前缀,即可确认是探测流量签名。
处理建议:对探测流量回调,正常返回失败(非2xx),不要按业务成功处理,等待后续微信返回带有正确签名的正式回调。
p.开通了商户号,如果长期没发生交易收款,商户号会被关闭吗?
1、连续30天无收单交易:关闭信用卡支付、全渠道收单限额
2、连续90天无收 den 交易且资料异常 或 连续365天无收单交易:关闭收单权限
3、入驻以来连续180天交易:不收不付(保留退款)管控。
3.3 APP支付
01.产品概述
a.APP支付示例说明
用户进入商户App,选择商品下单、确认购买,进入支付环节。
用户选择使用微信支付后,跳转到微信的支付确认界面,用户可在该页面确认订单收款方和金额。
用户确认订单收款方和金额无误后,点击“立即支付”会出现验密界面(验证密码或指纹等),同时在该页面也可选择支付方式(零钱或银行卡等)。
验密付款成功后,微信会展示支付成功页面,以及返回商家选项。
用户点击“返回商家”后会返回到商户App中,商户App根据支付结果向用户展示订单支付结果。
用户在微信支付-我的账单-账单明细中查看账单。
用户选购商品,商户发起支付
跳转到微信支付
用户确认支付
展示支付成功提示页面
返回到商家App
用户在微信查看账单
b.准入条件
支持的主体类型:个体工商户、企业、事业单位、政府机关、社会组织,详见:主体类型介绍与各主体权限对照说明;
支持的应用类型:已认证的开放平台账号,需创建了移动应用类型的APPID。
c.结算规则
收款资金结算规则说明
d.资金提现
收款资金提现
02.快速开始
a.接入流程说明
阅读产品介绍文档,了解APP支付产品特性;
参考开放平台账号注册指引注册开放平台账号;
参考开放平台账号认证指引完成开放平台账号认证,未认证的账号无法申请APP支付权限;
参考创建移动应用appid指引创建移动应用的appid,只有移动应用才支持申请APP支付权限;
注意:创建移动应用时需要找技术负责人获取移动应用参数(Android:应用包名和应用签名;鸿蒙:Bundle ID和Identifier;IOS:Bundle ID和Universal Links);
如果已有商户号,请超级管理员登录商户平台,按照已有商户号开通APP支付产品权限申请权限,并发起APPID授权绑定申请;
如果还没有商户号,请参考申请新商户号和APP支付权限,支持申请APP支付权限的主体类型有:个体工商户、企业、事业单位、政府机关、社会组织,详见:主体类型介绍与各主体权限对照说明,申请完成后,系统会自动对申请权限时填写的APPID发起授权绑定申请;
登录开放平台,确认授权绑定的商户号,完成商户号与开放平台APPID绑定;
超级管理员登录商户平台,为技术负责人配置商户平台登录账号并设置为安全联系人,详见配置技术负责人账号操作指引;
获取开发参数,进入开发流程。
03.开发指引
a.整体业务开发流程概览
商户后端调用APP支付下单接口获取预支付ID(prepay_id)后,在商户APP中通过微信OpenSDK提供的sendReq方法实现APP调起支付,跳转到微信,并唤起微信支付收银台。
当用户在收银台完成支付后点击完成按钮,或中途取消支付,页面会从收银台跳转到商户APP内,同时商户APP前端将收到OpenSDK发送的onResp回调,此时商户后端需调用查询订单API接口确认订单状态,
并根据订单状态进行相应的业务逻辑处理(在商户页面向用户展示查询到的订单支付状态、在商户内部系统更新订单状态等),如果订单支付成功,微信支付系统还会发送支付成功回调通知给商户。具体的支付回调和查单的实现方案,商户可以参考支付回调和查单实现指引。
最后商户可通过下载交易账单进行对账。需要退款的订单,也可调用退款接口完成退款。
b.详细步骤说明
a.商户下单
商户需要通过调用APP支付下单API接口进行下单,并获取预支付ID(prepay_id)。
下单接口关键参数说明:
time_expire:支付结束时间。若传递该参数,则用户只能在订单设置的支付结束时间time_expire之前进行支付,超过支付结束时间后,用户支付将收到:"订单已超过商户设置的最晚支付成功时间,请重新发起支付"的提示,商户需对订单进行关单处理。若不传该参数,默认订单支付有效期为7天,用户可在7天内进行支付,超出7天,订单将被关闭。
prepay_id:预支付交易会话标识。调起支付时需要使用的参数,prepay_id有效期为2小时,超过2小时,商户需要使用原下单参数重新请求下单接口,获取新的prepay_id。
b.商户调起支付
商户调起支付前,需根据不同客户端系统接入对应的OpenSDK(推荐使用最新版本,具体请参考OpenSDK接入指南),然后通过OpenSDK的sendReq方法调起微信支付页面,具体请参考APP调起支付
注意:
开发微信支付接入Android系统的OpenSDK时,需要实现WXPayEntryActivity类,否则可能支付完成后,无法从微信内返回到商户APP,参考如下代码。
Android13开始Intent过滤器会屏蔽不匹配的intent,存在无法返回商户APP的问题,解决方法:在manifest中,去除WXPayEntryActivity的intent-filter。
---
<activity
android:name=".wxapi.WXPayEntryActivity"
android:label="@string/app_name"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:exported="true"
android:taskAffinity="填写你的包名"
android:launchMode="singleTask">
</activity>
---
c.用户支付
用户在微信收银台完成支付/取消支付,返回商户APP后,商户APP前端将收到opensdk发送的onResp回调,此时商户需要调查询订单API接口确认订单状态,并根据订单状态向用户展示支付结果。
同时,如果用户支付成功,微信支付系统会向商户发送支付成功回调。未收到回调时,商户也可调用查询订单API接口确认订单状态。具体实现方案商户可以参考支付回调和查单实现指引。
若商户需要限制用户支付的时间,有以下两种方式:
1、下单时通过time_expire参数,设置订单的支付结束时间,超过设置的结束时间后,商户进行关单处理。
2、商户在自己的系统内进行倒计时,超过有效期,进行关单处理。
若因特殊原因需在用户可支付时间范围内关闭订单,商户可通过调用查询订单API接口确认订单状态,若订单仍是未支付状态,商户可以调用关闭订单API接口关单,关单后可以将订单当作失败终态处理。
d.商户对账
详细参考:账单产品介绍
e.订单退款
详细参考:退款产品介绍
c.APP支付订单状态流转图
商户调用APP支付下单接口下单成功后,商户可以调用查询订单接口来确认订单状态,详情请参考支付回调和查单实现指引。
当订单状态处于未支付(trade_state:NOTPAY)时,用户可对订单进行支付,若用户支付失败,订单状态不变。
7天内商户可对无需继续支付的订单(例如用户超过商户系统内部规定的支付时间,或超过商户下单设置的最晚支付时间(time_expire)的订单)调用关单接口,使订单关闭,或超过7天后由微信侧自动关单。关单后,订单状态会从未支付(trade_state:NOTPAY)流转为已关闭(trade_state:CLOSED)。
当用户成功支付订单时,订单状态会从未支付(trade_state:NOTPAY)流转为支付成功(trade_state:SUCCESS)。
当订单状态为支付成功(trade_state:SUCCESS)时,如果用户需要退款,商户可调用申请退款接口(仅支持支付成功后1年内的订单),退款申请成功后,订单状态会从支付成功(trade_state:SUCCESS)流转为转入退款(trade_state:REFUND),退款状态可通过查询退款单接口进行确认。
以下三个状态为终态
trade_state:CLOSED
trade_state:SUCCESS
trade_state:REFUND
04.常见问题
a.业务常见问题
a.APP支付和其它的基础支付除了下单接口不一样以外,其余接口都一样吗
APP支付和其它的基础支付在接口使用上,除了下单接口和调起支付接口存在差异外,其余接口都是相同的。您可以根据具体的支付场景选择合适的支付方式。
b.技术常见问题
a.前端报错
a.微信App支付,前端调起时返回errcode=-1,如何进行排查?
请遵循以下步骤进行故障排除:
1、检查App下单参数:
核实调起支付前是否获取到了正确的prepay_id。
2、验证签名正确性:
仔细检查参与签名的参数名大小写是否与文档一致。
注意App下单返回的签名与调起支付时使用的签名不同,调起支付时需根据文档参数单独生成签名。
可使用工具生成签名,验证代码生成的签名是否与工具生成的签名一致,工具生成签名参考:如何使用签名/验签工具。
3、检查客户端调用sendReq(PayReq)对象赋值的正确性:
如果数据是通过异步请求获得的(例如data对象),确保属性值正确赋值,避免出现空值情况。例如:
request.AppID = data.AppID; // 确保这里的AppID属性值不为空。
4、审查开发配置:
核查iOS的AppID配置是否正确。
检查Android的应用包名及应用签名设置是否正确。
检查鸿蒙的Bundle ID和Identifier设置是否正确
通过以上步骤,您应该能够定位并解决微信App支付前端调起时返回errcode = -1的问题。
b.APP支付调起支付请求返回:商户传入的APPID参数不正确,请联系商户处理
结论:APP支付调起支付请求返回错误,原因是商户传入的APPID参数不正确。
建议方案/详细操作流程:
检查下单接口传递的APPID和调起支付接口传递的APPID是否一致。
检查参数是否有空格、大小写等问题。
c.APP调起支付提示"签名不对,请检查签名是否与开放平台上填写的一致”
请检查代码中配置的包名或者签名是否与开放平台配置的应用包名和应用签名一致,可参考生成微信开放平台移动应用 Android 签名文档进行确认。
b.后端报错(接口)
a.用java语言实现app支付怎么生成sign
为了实现APP支付的签名生成,建议您使用微信支付官方提供的SDK,它已经包含了签名和验签功能,无需您自行实现签名。
您可以参考这个链接了解如何使用SDK:SDK&工具。
如果您想了解更多关于签名生成的步骤,可以查看这个链接:签名生成。
b.H5内嵌APP支付该申请什么类型的appid
根据微信支付的规定,目前暂不支持H5内嵌APP支付。如果您需要在APP内进行支付,请使用APP支付功能,并申请相应的APP移动应用类型的appid。如果需要在外部浏览器中进行支付,请使用H5支付功能。
c.APP支付和JSAPI支付的APPID是一样的吗
不一样,JSAPI支付只能使用公众号/服务号类型的APPID,而APP支付则需要使用移动应用类型的APPID。因此,请根据您的具体支付场景选择对应的支付功能,以及对应类型的APPID。
d.更改开放平台配置的universal link是否会对APP支付接口的正常使用产生影响?
更改开放平台配置的universal link不会对APP支付接口的正常使用产生影响,但可能会导致universal link校验不通过从而影响拉起微信收银台。因此,在更改universal link时,请确保其符合微信支付的要求,以避免潜在的问题。
3.4 H5支付
01.产品介绍
a.产品概述
H5支付,提供商户在手机浏览器网页(非微信客户端内部浏览器)中使用微信支付收款的能力,请注意不支持在APP内使用H5支付,若是APP场景请使用APP支付。
b.H5支付模式介绍
用户从手机浏览器中进入商户的H5网页,选择商品下单、确认购买,进入支付环节。
用户选择使用微信支付后,跳转到微信的支付确认界面,用户可在该页面确认订单收款方和金额。
用户确认订单收款方和金额无误后,点击“立即支付”会出现验密界面(验证密码或指纹等),同时在该页面也可选择支付方式(零钱或银行卡等)。
输入正确密码后,微信会展示支付成功页面,以及“完成”按钮。
用户点击“完成”可返回商家H5页面,商户H5页面根据支付结果向用户展示订单支付结果。
支付成功后,用户在微信支付-我的账单-账单明细中查看账单。
1、用户在H5页面选购商品,商户发起支付
2、跳转到微信支付
3、用户确认支付
4、支付成功提示页面
5、返回到商户H5页面
6、用户在微信查看账单
c.准入条件
1、支持的主体类型:企业、事业单位、政府机关、社会组织,详见:主体类型介绍与各主体权限对照说明;
2、支持的应用类型:已认证的服务号、已认证的政府或媒体类型的公众号,已认证的小程序,已认证的移动应用。
d.结算规则
收款资金结算规则说明
e.资金提现
收款资金提现
02.快速开始
a.流程说明
1、阅读产品介绍文档,了解H5支付产品特性;
2、H5支付可以使用以下任意一种公众账号类型来申请权限,请参考指引注册账号:
a.服务号、政府或媒体类型的公众号:参考指引注册服务号/公众号类型的公众平台账号;
b.小程序:参考指引注册小程序类型的公众平台账号;
c.移动应用:先参考指引注册开放平台账号,再参考指引创建移动应用;
3、公众账号认证(未认证的账号无法绑定商户号):
a.服务号、政府或媒体类型的公众号:参考服务号/公众号认证指引完成公众平台账号认证;
b.小程序:参考小程序认证指引完成公众平台账号认证;
c.移动应用:参考开放平台账号认证指引完成开放平台账号认证;
4、申请H5支付权限:
a.如果已有商户号,请超级管理员登录商户平台,按照申请H5支付产品权限申请权限,并发起与APPID授权绑定申请;支持绑定的APPID类型:服务号、政府或媒体类型的公众号,小程序,移动应用;
b.如果还没有商户号,请参考微信支付商户入驻详细流程指引先申请商户号,再按照上方4.1流程申请H5支付权限,支持申请H5支付权限的主体类型有:企业、事业单位、政府机关、社会组织,详见:主体类型介绍与各主体权限对照说明;
5、登录公众平台或开放平台,确认授权绑定的商户号,完成商户号与APPID的绑定;
6、超级管理员登录商户平台,为技术负责人配置商户平台登录账号并设置为安全联系人,详见配置技术负责人账号操作指引;
7、超级管理员登录商户平台,配置H5支付域名,配置的内容请和技术负责人确认;
8、获取开发参数,进入开发流程。
03.开发指引
a.整体业务开发流程概览
商户通过调用H5支付下单接口获取H5支付链接(h5_url),然后商户在已配置H5支付域名的前端网页跳转该支付链接(如需支付后返回指定页面,可在H5支付链接后拼接redirect_url参数),并唤起微信支付收银台。
当用户在收银台完成支付后点击完成按钮,或中途取消支付,页面会从收银台返回到拉起支付前的H5页面(若拉起收银台时有拼接redirect_url参数将返回指定页面),此时商户后端需调用查询订单API接口确认订单状态,并根据订单状态进行相应的业务逻辑处理(在商户页面向用户展示查询到的订单支付状态、在商户内部系统更新订单状态等)。如果订单支付成功,微信支付系统还会发送支付成功回调通知给商户。具体的支付回调和查单的实现方案,商户可以参考支付回调和查单实现指引。
最后商户可通过下载交易账单进行对账。需要退款的订单,也可调用退款接口完成退款。
b.详细步骤说明
a.商户下单
用户在商户H5页面操作下单后,商户需要通过调用H5支付下单API接口生成订单并获取微信H5支付链接(h5_url)。在这个过程中,商户必须做好安全校验,防止本次交易被不法分子利用。
当跨域请求不是简单请求时,浏览器会发起Options预检请求,此时商户后台需要支持Options请求且校验Origin头部,如果不在允许的白名单列表内,则返回403且不返回"Access-Control-Allow-*"相关头部。
针对GET/POST的跨域下单请求,商户后台需要校验Origin头部是否合法且用户Cookie是否完备(若用户未登陆则先引导登陆商户站点),否则返回403且不返回"Access-Control-Allow-*"相关头部。
安全标准规范流程图:
注意:
商户需按照安全规范进行接入,若因未遵循规范接入而出现安全问题,财付通将根据《微信支付服务协议》条款处理。
以上图示,仅为示例,只供参考。请商户自行确认是否实现了跨域访问白名单限制和用户登录态校验。
下单接口关键参数说明:
time_expire:支付结束时间。若传递该参数,则用户只能在订单设置的支付结束时间time_expire之前进行支付,超过支付结束时间后,用户支付将收到:"订单已超过商户设置的最晚支付成功时间,请重新发起支付"的提示,商户需对订单进行关单处理。若不传该参数,默认订单支付有效期为7天,用户可在7天内进行支付,超出7天,订单将被关闭。
h5_url:支付跳转链接。调起支付时需要使用的参数,h5_url有效期为5分钟,超过5分钟,商户需要使用原下单参数重新请求下单接口,获取新的h5_url。
b.商户调起支付
商户调起支付前,请确保已在商户平台配置好H5支付域名,只有配置了H5支付域名的网页才能跳转H5支付链接(如需在支付后返回至指定页面,可在h5支付链接后面拼接上redirect_url参数),调起微信支付页面。
c.用户支付
用户在微信收银台完成支付/取消支付,会返回商户调起支付时的页面,若调起支付时拼接了redirect_url,则会返回指定的页面,此时商户需要调用查询订单API接口确认订单状态,并根据订单状态展示支付结果。
如果用户支付成功,微信支付系统会向商户发送支付成功回调,未收到回调时,商户可调用查询订单API接口确认订单状态。具体实现方案商户可以参考支付回调和查单实现指引。
若商户需要限制用户支付的时间,有以下两种方式:
1、下单时通过time_expire参数,设置订单的支付结束时间,超过设置的结束时间后,商户进行关单处理。
2、商户在自己的系统内进行倒计时,超过有效期,进行关单处理。
若因特殊原因需在用户可支付时间范围内关闭订单,商户可通过调用查询订单API接口确认订单状态,若订单仍是未支付状态,商户可以调用关闭订单API接口关单,关单后可以将订单当作失败终态处理。
d.商户对账
详细参考:账单产品介绍
e.订单退款
详细参考:退款产品介绍
c.普通支付订单状态流转图
1、商户调用H5支付下单接口下单成功后,商户可以调用查询订单接口来确认订单状态,详情请参考支付回调和查单实现指引。
2、当订单状态处于未支付(trade_state:NOTPAY)时,用户可对订单进行支付,若用户支付失败,订单状态不变。
3、7天内商户可对无需继续支付的订单(例如用户超过商户系统内部规定的支付时间,或超过商户下单设置的最晚支付时间(time_expire)的订单)调用关单接口,使订单关闭,或超过7天后由微信侧自动关单。关单后,订单状态会从未支付(trade_state:NOTPAY)流转为已关闭(trade_state:CLOSED)。
4、当用户成功支付订单时,订单状态会从未支付(trade_state:NOTPAY)流转为支付成功(trade_state:SUCCESS)。
5、当订单状态为支付成功(trade_state:SUCCESS)时,如果用户需要退款,商户可调用申请退款接口(仅支持支付成功后1年内的订单),退款申请成功后,订单状态会从支付成功(trade_state:SUCCESS)流转为转入退款(trade_state:REFUND),退款状态可通过查询退款单接口进行确认。
6、以下三个状态为终态
trade_state:CLOSED
trade_state:SUCCESS
trade_state:REFUND
04.常见问题
a.调起H5支付报"商家参数格式有误,请联系商家解决"
请按以下几点进行排查:
1、当前调起H5支付的referer为空导致,一般是因为直接访问h5_url调起H5支付导致的,请按正常流程进行页面跳转后发起支付,或自行抓包确认referer值是否为空。
2、如果是App里调起H5支付,需要在webview中手动设置referer,如(Map extraHeaders = new HashMap();extraHeaders.put("Referer", "商户申请H5时提交的授权域名");//例如 https://pay.wechatpay.cn )
b.调起H5支付时出现 “商家存在未配置的参数,请联系商家解决”报错,该如何排查?
出现「图1」错误时,请登录商户平台,进入【产品中心】>【开发配置】中查看“H5支付”栏目下当前商户号配置的H5支付域名,可参考查看和配置H5支付域名指引。
获取已配置的域名后,请逐一检查以下两项是否与该域名完全一致:
1、检查支付发起页面的域名
确认您当前集成并调起H5支付的网页,其地址栏中的域名(不含http://或https://)是否与商户平台中配置的H5支付域名完全一致,可以参考「图 2」来查看地址栏的域名。
示例:若配置的域名为pay.example.com,则调起H5支付的页面域名也必须是pay.example.com,而不能是www.example.com或其他子域名。
2、检查支付成功后的回跳地址域名(如已设置)
调起H5支付时,若在h5_url参数后拼接了redirect_url回跳地址参数(用于指定支付成功后返回的页面),需确保该回跳地址的域名与商户平台配置的H5支付域名完全一致。
如果检查发现不一致,请将相关域名修改为与商户平台配置完全一致的域名后重试。
图1:报错场景示例
图2:查看调起H5支付页面的地址栏域名
c.调起H5支付报"支付请求已失效,请重新发起支付"
下单获取的支付跳转链接有效期为5分钟,超过有效期后需要重入下单接口获取新的支付跳转链接。
d.调起H5支付报" 请在微信外打开订单,进行支付"
H5支付不能直接在微信客户端内调起,请在外部浏览器调起,如需在微信内部浏览器拉起支付,请使用JSAPI支付。
e.调起H5支付报" 签名验证失败"或“系统繁忙,请稍后再试”
请按以下几点进行排查:
1、请确认同一个h5_url只被一个微信号调起,如果不同微信号调起请重新下单生成新的H5_URL。
2、如h5_url有添加redirect_url,请确认参数拼接格式是否有误,是否有对redirect_url的值做urlencode,可参考以下例子格式:
https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx20161110163838f231619da20804912345&package=1037687096&redirect_url=https%3A%2F%2Fwww.wechatpay.com.cn
3、请确认h5_url链接是否完整,是否与下单接口返回的h5_url一致
IOS:签名验证失败 安卓:系统繁忙,请稍后再试
f.调起H5支付报" 由于商家传入的H5交易参数有误,该笔交易暂时无法完成,请联系商家解决”
下单参数中 payer_client_ip 字段必须为客户端IP地址,不能填127.0.0.1
g.H5支付场景中,用户不安装微信客户端也可以完成支付么?
不能,必须安装微信客户端。
h.申请H5支付权限被驳回,驳回原因:目前该类业务形态不支持暂不支持开通 H5 支付进行收款,请使用其他支付方式。
不支持业务形态包括但不限于微信支付商户不支持的经营场景。
3.5 Native支付
01.产品介绍
a.产品概述
Native支付,提供商户在PC端网页浏览器中使用微信支付收款的能力。
b.Native支付模式介绍
商户下单获取订单的二维码链接code_url,将code_url转换为二维码图片展示给用户。
用户使用微信“扫一扫”进行扫码(不支持通过相册识别或长按识别二维码的方式完成支付)。
扫码进入到微信的支付确认界面,用户可在该页面确认收款方和金额。
用户确认订单收款方和金额无误后,点击“立即支付”会出现验密界面(验证密码或指纹等),同时在该页面也可选择支付方式(零钱或银行卡等)。
验密付款成功后,微信会展示支付成功页面。
支付成功后,用户在微信支付-我的账单-账单明细中查看账单。
1、将code_url转换为支付二维码
2、打开微信扫一扫二维码
3、进入到微信支付
4、用户确认支付
5、支付成功提示页面
6、用户在微信查看账单
c.准入条件
1、支持的主体类型:个体工商户、企业、事业单位、政府机关、社会组织,详见:主体类型介绍与各主体权限对照说明;
2、支持的应用类型:已认证的服务号、已认证的政府或媒体类型的公众号,已认证的小程序,已认证的移动应用。
d.结算规则
收款资金结算规则说明
e.资金提现
收款资金提现
02.快速开始
a.流程说明
1、阅读产品介绍文档,了解Native支付产品特性;
2、Native支付可以使用以下任意一种公众账号类型来申请权限,请参考指引注册账号:
a.服务号、政府或媒体类型的公众号:参考指引注册服务号/公众号类型的公众平台账号;
b.小程序:参考指引注册小程序类型的公众平台账号;
c.移动应用:先参考指引注册开放平台账号,再参考指引创建移动应用;
3、公众账号认证(未认证的账号无法绑定商户号):
a.服务号、政府或媒体类型的公众号:参考服务号/公众号认证指引完成公众平台账号认证;
b.小程序:参考小程序认证指引完成公众平台账号认证;
c.移动应用:参考开放平台账号认证指引完成开放平台账号认证;
4、申请Native支付权限:
a.如果已有商户号,请超级管理员登录商户平台,按照已有商户号开通Native支付产品权限指引申请权限,并发起与APPID的授权绑定申请;支持绑定的APPID类型:服务号、政府或媒体类型的公众号,小程序,移动应用;
b.如果没有商户号,请参考申请新商户号和Native支付权限,支持申请Native支付权限的主体类型有:个体工商户、企业、事业单位、政府机关、社会组织,详见:主体类型介绍与各主体权限对照说明,申请时如填写了服务号或公众号类型的APPID,申请完成后,系统会自动对该APPID发起授权绑定申请;
5、登录公众平台或开放平台,确认授权绑定的商户号,完成商户号与APPID的绑定;
6、超级管理员登录商户平台,为技术负责人配置商户平台登录账号并设置为安全联系人,详见配置技术负责人账号操作指引;
7、获取开发参数,进入开发流程。
03.开发指引
a.整体业务开发流程概览
商户后端通过调用Natvie支付下单接口获取二维码code(code_url)后,然后由商户侧前端将二维码code转换为二维码图片展示给用户,用户微信扫描二维码拉起支付收银台。
当用户在收银台完成支付后点击完成按钮,微信支付会给商户后端发送支付成功回调,如果商户后端未收到支付回调可以调用查询订单API,并根据查询的订单状态进行相应的业务逻辑处理(在商户页面向用户展示查询到的订单支付状态、在商户内部系统更新订单状态等)。具体的支付回调和查单的实现方案,商户可以参考支付回调和查单实现指引。
最后商户可通过下载交易账单进行对账。需要退款的订单,也可调用申请退款接口完成退款。
b.详细步骤说明
a.商户下单
商户通过调用Native支付下单API接口生成订单并获取二维码code_url,随后将该code_url传递至前端,由前端将其转换为二维码图片展示给用户。
下单接口关键参数说明:
time_expire:支付结束时间。若传递该参数,则用户只能在订单设置的支付结束时间time_expire之前进行支付,超过支付结束时间后,用户支付将收到:"订单已超过商户设置的最晚支付成功时间,请重新发起支付"的提示,商户需对订单进行关单处理。若不传该参数,默认订单支付有效期为7天,用户可在7天内进行支付,超出7天,订单将被关闭。
code_url:二维码链接。此URL用于生成支付二维码,然后提供给用户扫码支付。code_url有效期为2小时,超过2小时,商户需要使用原下单参数重新请求下单接口,获取新的code_url。
b.用户扫码调起支付
用户通过微信扫一扫,扫商户前端展示的支付二维码图片来调起微信收银台。具体请参考Native调起支付
注意:
二维码不支持通过相册识别或长按识别二维码的方式完成支付
c.用户支付
用户在微信收银台完成支付/取消支付,商户后端则需要轮询调用普通支付查询订单API接口获取订单状态,并根据订单状态向用户展示支付结果。
同时,如果用户支付成功,微信支付系统会向商户发送支付成功回调。未收到回调时,商户也可调用查询订单API接口确认订单状态。具体实现方案商户可以参考支付回调和查单实现指引。
若商户需要限制用户支付的时间,有以下两种方式:
1、下单时通过time_expire参数,设置订单的支付结束时间,超过设置的结束时间后,商户进行关单处理。
2、商户在自己的系统内进行倒计时,超过有效期,进行关单处理。
若因特殊原因需在用户可支付时间范围内关闭订单,商户可通过调用查询订单API接口确认订单状态,若订单仍是未支付状态,商户可以调用关闭订单API接口关单,关单后可以将订单当作失败终态处理。
d.商户对账
详细参考:账单产品介绍
e.订单退款
详细参考:退款产品介绍
c.普通支付订单状态流转图
1、商户调用Native支付下单接口下单成功后,商户可以调用查询订单接口来确认订单状态,详情请参考支付回调和查单实现指引。
2、当订单状态处于未支付(trade_state:NOTPAY)时,用户可对订单进行支付,若用户支付失败,订单状态不变。
3、7天内商户可对无需继续支付的订单(例如用户超过商户系统内部规定的支付时间,或超过商户下单设置的最晚支付时间(time_expire)的订单)调用关单接口,使订单关闭,或超过7天后由微信侧自动关单。关单后,订单状态会从未支付(trade_state:NOTPAY)流转为已关闭(trade_state:CLOSED)。
4、当用户成功支付订单时,订单状态会从未支付(trade_state:NOTPAY)流转为支付成功(trade_state:SUCCESS)。
5、当订单状态为支付成功(trade_state:SUCCESS)时,如果用户需要退款,商户可调用申请退款接口(仅支持支付成功后1年内的订单),退款申请成功后,订单状态会从支付成功(trade_s_t_a_t_e:SUCCESS)流转为转入退款(trade_state:REFUND),退款状态可通过查询退款单接口进行确认。
6、以下三个状态为终态
trade_state:CLOSED
trade_state:SUCCESS
trade_state:REFUND
04.常见问题
a.技术常见问题
a.前端问题
a.调用Native支付统一下单成功但是扫描二维码支付时返回系统繁忙,请稍后再试。
可能是由于系统繁忙或参数问题导致的。建议您按照以下步骤进行排查和解决:
检查传入的参数是否有空格或特殊字符,确保参数格式正确;
检查传入的参数值是否为null,不需要的参数可以不传递,避免以null形式传入。
b.长按识别Native支付二维码返回:该商户暂不支持通过长按识别二维码完成支付。
微信支付已经不支持通过长按识别二维码的方式完成支付。如果您需要使用微信支付,请尝试使用微信扫一扫功能扫描商家提供的支付二维码。
c.通过从相册识别Native支付二维码返回:为保障支付安全,暂不支持通过从相册识别二维码完成支付。
微信支付暂不支持通过从相册识别二维码完成支付。如果您需要使用微信支付,请尝试使用微信扫一扫功能扫描商家提供的支付二维码。
d.Native支付和其它的基础支付除了下单接口不一样以外,其余接口都一样吗。
Native支付和其它的基础支付在接口使用上,除了下单接口和调起支付接口存在差异外,其余接口都是相同的。您可以根据具体的支付场景选择合适的支付方式。
e.Native支付,生成二维码后,用户支付的时候报错:"商家订单信息有误,请重新下单支付"。
同一笔订单不允许使用不同的微信号扫码调起支付。商户需要引导用户重新下单,并且提示用户使用同一个微信号扫码拉起支付。
f.对于Native支付,如果用户当时没有支付,在微信里可以看到订单并再次进行支付吗?
未支付的订单在微信客户端不会显示。通常用户可通过商户系统找到待支付订单主动发起支付操作。
3.6 订单退款
01.产品介绍
a.产品概述
在交易成功后的一年内(自支付成功时间起算+365天),如因用户或商户原因需退款,商户可通过退款接口将支付款项全额或部分原路退还给用户。
在退款成功后,微信支付会向用户的微信客户端发送一条退款到账通知,详见下方退款到账通知的UI示例图:
使用银行卡支付退回至银行卡
使用零钱支付退回至零钱
注意:若订单退款金额≤1元,且属于部分退款,则不会在退款消息中体现退款原因
b.退款发起方式
通过API接口发起退款,详见开发指引。
通过商户平台手动退款,商户可登录微信支付的商户平台,进入交易中心手动处理退款。
c.订单退款规则
a.订单退款时间
订单只能在支付后1年内(支付时间+365天)发起退款,超出时间的订单,无法退款。
b.全额或部分退款
商户可根据实际情况选择全额退款或部分退款(最多支持50次部分退款)。
c.退款资金路径
退款资金将从商户的基本账户原路退还至用户的支付账户。如用户使用银行卡支付,则资金会原路退还到该银行卡账户;使用零钱支付,则资金原路退还到该零钱账户。
d.使用了代金券的订单退款规则
a.申请全额退款
退款规则: 按用户实际支付金额退款
退款金额计算公式: 退给用户金额 = 用户实际支付金额
案例: 订单总金额10元,3元的代金券,用户支付7元,现在要退10元。退给用户金额 = 7元
b.申请部分退款
退款规则: 按退款比例计算退给用户金额(四舍五入)
退款金额计算公式: 退给用户金额 = 用户申请退款金额 × (用户实际支付金额 ÷ 订单总金额)
案例: 订单总金额10元,3元的代金券,用户支付7元,现在要退9元。退给用户金额 = 9 × (7 ÷ 10) = 6.3元
e.存在分账的订单退款规则
a.订单未分账
申请退款金额: 申请全额/部分退款
退款前提: 无,直接退款
退款出资账户(商户基本账户): 不可用余额
b.订单部分分账
a.申请全额退款
退款前提: 1、需要先调“完结分账”接口,将订单剩余冻结资金全部解冻,详细参考分账介绍。2、解冻后商户可用余额>退款金额
退款出资账户(商户基本账户): 可用余额
b.申请部分退款
当申请退款金额≤订单未分账冻结金额,直接可退
退款出资账户(商户基本账户): 不可用余额
1、当申请退款金额>订单未分账冻结金额,需要先调“完结分账”接口,将冻结资金全额解冻
2、解冻后商户可用余额>退款金额
退款出资账户(商户基本账户): 可用余额
c.订单已完结分账
申请退款金额: 申请全额/部分退款
退款前提: 解冻后商户可用余额>退款金额,直接可退
退款出资账户(商户基本账户): 可用余额
02.开发指引
a.整体业务开发流程概览
若存在退款需求,商户需先调用查询订单状态接口以确认订单支付状态为已支付成功,随后调用申请退款API创建退款单后,可通过查询单笔退款信息或退款回调通知以确认最终的退款结果。若退款状态为退款异常,则需调用发起异常退款API进行退款操作。
b.详细步骤说明
a.查询订单状态
商户在退款之前调用微信支付订单号查询订单API或商户订单号查询订单API,确认订单支付状态,支付成功才可进行退款。
b.申请退款
商户调用申请退款API创建退款单,退款单受理成功后,微信会从交易商户的基本账户内扣除需退款的资金,退款资金会进入到微信侧退款的中间账户,然后再退回给用户。
注意:
对于合单支付的订单,无法通过合单支付总单号combine_out_trade_no退款,只能根据单个子单进行退款。
若支付订单为分账订单,存在分账给其他商户号成功情况,退款不会自动回退分账金额,退款出资为商户基本账户可用余额。
申请退款接口需要注意的参数:
普通支付订单退款或合单支付订单退款时,需选择填写 transaction_id或out_trade_no中的一个,普通支付订单退款按照API接口参数填写;合单支付订单退款需要特别注意以下参数字段:
transaction_id:填写原合单支付订单的 sub_orders.transaction_id【子单微信支付订单号】
out_trade_no:填写原合单支付订单的 sub_orders.out_trade_no【子单商户订单号】
c.确认退款结果
退款处理完成后,微信支付会将退款结果通知发送到申请退款时传递的【notify_url】地址,通知内容需要使用APIV3密钥进行加密解密,所以需要提前设置APIV3密钥,设置指引:APIv3密钥设置方法。
若未收到退款回调通知或商户希望主动获取退款状态时,可调用 查询单笔退款(按商户退款单号)查询退款单信息,推荐申请退款后间隔1分钟调用该接口轮询一次退款状态,若超过5分钟仍是退款处理中状态,建议开始逐步衰减轮询频率(比如之后间隔5分钟、10分钟、20分钟、30分钟……轮询一次)。
退款状态:
SUCCESS—退款成功
CLOSED—退款关闭:此状态表明您的退款请求已经关闭。原因是退款单已经处于“退款处理中”的状态超过7天,并且在这段时间内,出资账户的余额不足以完成退款操作。可充值后生成新的商户退款单号,重新调用退款申请API。
PROCESSING—退款处理中:可稍后再次调用查询单笔退款(按商户退款单号),确认最终退款结果。
ABNORMAL—退款异常:退款到银行发现用户的卡作废或者冻结了,导致原路退款银行卡失败,可前往商户平台-交易中心,手动处理此笔退款。或调用发起异常退款API接口处理异常退款。
注意:
退款有一定延时,零钱支付的订单退款一般5分钟内到账,银行卡支付的订单退款一般1-3个工作日到账,具体以查询退款接口返回状态为准。
d.发起异常退款
提交退款申请后,若查询退款确认状态为退款异常,退款资金会停留在退款的中间账户内,商户可调用此接口发起异常退款,使退款资金从退款中间账户退到用户的银行卡,或退回交易商户基本账户的结算银行账户。
注意:
退款至用户时,仅支持以下银行的借记卡:招行、交通银行、农行、建行、工商、中行、平安、浦发、中信、光大、民生、兴业、广发、邮储、宁波银行。
发起异常退款关键参数:
type:可选择退款到用户银行卡,或退回到交易商户银行账户内。
若选择退款给用户银行卡,需在对收款银行卡号bank_account和收款用户姓名real_name进行敏感信息加密。
c.退款单状态流转图
退款单状态流转说明
1、商户调用退款申请接口受理成功后,可以调用查询单笔退款(按商户退款单号)接口来确认退款单状态。
2、当退款单状态为退款处理中(status:PROCESSING)时,退款受理超过7天且账户资金不足时,退款单状态将流转为退款关闭(status:CLOSED)。
3、当退款单状态为退款处理中(status:PROCESSING)时,若因用户账户异常(例如银行卡作废或冻结)导致资金无法按原路退回,微信支付会优先尝试将退款金额转入用户的微信零钱。仅当用户的微信零钱账户也已注销时,退款单状态才会流转为退款异常(status:ABNORMAL)。
4、当退款成功时,退款单状态将从退款处理中(status:PROCESSING)流转为退款成功(status:SUCCESS)。
5、当退款单状态为退款异常(status:ABNORMAL)时,此时商户可以到【商户平台 —>交易中心】手动处理退款或调用发起异常退款接口处理异常退款,当退款成功后,退款单状态将流转为退款成功(status:SUCCESS)。
6、以下两个状态为终态
status:SUCCESS
status:CLOSED
03.常见问题
a.在使用申请退款接口时,能否设置“附加数据”参数?
依据微信支付API文档,申请退款接口是不支持设置“附加数据”参数的。
b.在哪些情况下,会显示退款已关闭的状态?
退款关闭状态可能由以下情况引发:
退款申请受理后,若商户资金不足且经过7天的重试仍未达到所需金额,将导致退款关闭。
当退款申请受理时,若订单资金状态不符合指定的出款账户要求(如尝试从不可用的分账余额中出款,但资金已全部解冻),也将导致退款关闭。
为避免退款关闭,建议商户确保资金充足并满足出款账户的相关要求。
c.必须在完结分账后才能进行退款吗?
不需要。退款和分账是两个相互独立的操作。您完全可以先执行退款,随后再进行分账。如果需要在分账之前处理退款,可以直接调用退款接口来完成相应操作。
d.退款过程中是否需要支付手续费?
手续费采用轧差计算方式。对于可用余额退款,即新资金流商户已结算订单的退款,微信支付平台仅扣除商户应承担的退款金额,而前期已收取的手续费则按比例直接返还给用户。具体细节请参阅交易退款常见问题。
以一个例子说明:假设原订单金额为100元,申请退款50元,商户费率为0.6%。在这种情况下,微信支付平台将从商户的可用余额或基本户中扣除49.7元,并将微信返还的0.3元手续费一并退还给用户,总计退款金额为50元。
e.为什么申请退款接口提交后仅显示请求受理成功,而非直接给出退款结果?
申请退款接口提交后仅显示请求受理成功,是因为资金处理包含多个环节,需一定时间完成。为确保获取准确的退款结果,建议您依据商户退款单号调用查询单笔退款接口,进而了解具体的退款状态与进展。
f.查询单笔退款接口能查询多久以前的退款记录?
查询单笔退款接口没有设定时间限制,任何通过申请退款接口成功处理的退款订单,都可以使用此接口查询其退款详情。
g.支付和退款是否可以使用不同的商户号处理同一笔订单?
不可以。一旦订单支付成功,它就会与下单时传入的商户号绑定,在任何情况下都不允许其他商户号对该订单进行操作。这是微信支付平台为确保交易安全和可追溯性而设定的规则。
h.退款成功后多久内会收到微信侧的退款结果通知?
退款成功后,微信侧一般会实时发送对应的退款结果通知。为确保能及时收到通知,建议商户检查退款通知的配置,并确保系统能够正常处理这些通知。
i.部分退款后,调用查询接口查询该订单的交易状态是什么?
部分退款后,调用查询接口查询该订单,其交易状态将显示为“REFUND:转入退款”。
j.调用退款接口时报错“缺少参数refund_fee”,怎么解决?
报错是因为未传入必填的refund_fee参数。请检查并确保在请求中包含此参数,且值正确。建议查阅微信支付官方文档中的申请退款部分,严格按照参数要求传递信息。
k.调用申请退款API时出现错误:“code":"INVALID_REQUEST","message":"您的请求参数与订单信息不一致”,应如何处理?
当您在调用申请退款API时遇到此错误,意味着您提供的请求参数与原始订单信息不匹配。请确保以下几点:
1、核对订单号:确认发起退款请求时使用的订单号与支付成功时的订单号完全一致。
2、核对商户号:确保使用的商户号与支付时的商户号相符。
3、仔细检查所有相关参数:确保所有传入的参数均准确无误。
完成上述核对后,重新尝试发起退款请求。
l."查询单笔退款API"接口是否每次只能查询一条退款记录?
是的,查询单笔退款API接口设计为每次只能查询一条退款记录。若需要批量查询,您可以通过多次调用该接口并传入不同的退款订单号来实现。
m.调用“申请退款API”时,如果用户绑定的银行卡已注销,退款将如何处理?
在使用“申请退款API”处理退款时,如果用户绑定的银行卡已注銷,微信支付系统会尝试将退款资金退至用户的微信零钱。若用户的微信零钱账户也已注销或不可用,退款单将进入“退款异常”状态。此时,可选择调用发起异常退款API进行处理,或直接在商户平台手动完成退款操作。
n.调用"申请退款API"接口后,返回结果为空,应如何排查问题?
当调用"申请退款API"接口返回为空时,可能是由以下原因导致的:
1、响应体读取问题:请确保正确读取了响应体内容,并根据响应头中的Content-Length长度进行验证。
2、接口调用错误:检查API接口的调用是否准确无误,特别是参数设置和签名验证部分。
针对以上两点进行检查和调整,有助于解决返回结果为空的问题。
o.调用"申请退款"接口时返回错误码USER_ACCOUNT_ABNORMAL,应如何处理?
当调用"申请退款"接口返回错误码USER_ACCOUNT_ABNORMAL时,意味着退款申请未能成功处理,这通常是由于用户账号处于异常状态,比如已注销。
针对这一情况,建议采取以下步骤:
1、核实用户账号状态:商户需要首先确认用户的账号状态。如果确认用户账号已注销,则无法继续进行退款操作。
2、检查并重新发起退款请求:如果用户账号状态正常,建议商户仔细核查退款请求中的参数是否正确,并在确认无误后重新提交退款申请。
p.调用"申请退款"接口时返回错误码TRADE_OVERDUE,是什么意思?
错误码TRADE_OVERDUE表示您尝试退款的订单已超过可退款的最大期限,即在支付完成后的一年内。超出此期限的订单将无法进行退款操作。
q.调用退款接口,报错提示:"当前使用此业务的用户较多,请稍后再试",应如何处理?
您遇到的问题可能是由于系统繁忙导致的。建议您稍后再试,如果问题仍然存在,请检查您的请求参数是否正确,或者尝试重新发起退款请求。
r.调用申请退款接口时报错提示“REFUND_FEE_MISMATCH”,“订单金额或退款金额与之前请求不一致,请核实后再试”,应如何处理?
针对您遇到的“REFUND_FEE_MISMATCH”错误提示,可以按照以下步骤进行排查和解决:
1、核实退款金额:确保退款金额没有超过实际支付的金额。
2、检查退款单号:
如果进行了多次退款操作,请确认每次的out_refund_no(商户退款单号)参数都是唯一的,若重复请更换新的退款单号后再次尝试。
检查所使用的退款单号是否已被使用过。
遵循以上步骤,您应该能够解决该错误提示所遇到的问题。
s.退款回调报文为什么是xml格式?
订单通过v2申请退款接口发起了退款,或者调用申请退款接口时未传入notify_url(回调地址)且商户平台-交易中心-退款管理-退款配置中设置了退款回调地址,发送的是v2版本xml格式退款回调通知。
t.超过一年的订单如何退款?
交易时间超过一年的订单暂无法提交退款,
1、直连商户可接入商家转账或商户自行联系用户线下退款;
2、服务商需要商户自行联系用户线下退款。
u.在商户平台页面操作的退款,怎么同步到自己的系统内部呢?
商户平台操作退款,如需接收退款结果通知,可以登录【商户平台-交易中心-退款管理-退款配置】设置回调通知地址。
v.订单退款后,代金券状态会变更吗?
请参考以下几点:
1、有效期内退款:已核销的代金券若在有效期内发生订单退款,代金券会退回用户账户并恢复为可用状态。
2、活动过期后退款:若代金券所参与的活动已过期,即使发生退款,代金券在微信侧的状态会标记为过期。
3、退款详情记录:通过promotion_detail字段可查看代金券退款详情,包含代金券ID、金额、退款金额等信息,用于追踪状态变化。
具体状态变更需结合退款时的代金券活动状态及退款规则判断。
w.订单处于分账冻结状态时,退款可以原路退回吗?
可以的,分账退款规则具体参考分账退款处理。
3.7 下载账单
01.产品介绍
a.产品概述
在交易成功后的一年内(自支付成功时间起算+365天),如因用户或商户原因需退款,商户可通过退款接口将支付款项全额或部分原路退还给用户。
在退款成功后,微信支付会向用户的微信客户端发送一条退款到账通知,详见下方退款到账通知的UI示例图:
使用银行卡支付退回至银行卡
使用零钱支付退回至零钱
注意:若订单退款金额≤1元,且属于部分退款,则不会在退款消息中体现退款原因
b.退款发起方式
通过API接口发起退款,详见开发指引。
通过商户平台手动退款,商户可登录微信支付的商户平台,进入交易中心手动处理退款。
c.订单退款规则
a.订单退款时间
订单只能在支付后1年内(支付时间+365天)发起退款,超出时间的订单,无法退款。
b.全额或部分退款
商户可根据实际情况选择全额退款或部分退款(最多支持50次部分退款)。
c.退款资金路径
退款资金将从商户的基本账户原路退还至用户的支付账户。如用户使用银行卡支付,则资金会原路退还到该银行卡账户;使用零钱支付,则资金原路退还到该零钱账户。
d.使用了代金券的订单退款规则
a.申请全额退款
退款规则: 按用户实际支付金额退款
退款金额计算公式: 退给用户金额 = 用户实际支付金额
案例: 订单总金额10元,3元的代金券,用户支付7元,现在要退10元。退给用户金额 = 7元
b.申请部分退款
退款规则: 按退款比例计算退给用户金额(四舍五入)
退款金额计算公式: 退给用户金额 = 用户申请退款金额 × (用户实际支付金额 ÷ 订单总金额)
案例: 订单总金额10元,3元的代金券,用户支付7元,现在要退9元。退给用户金额 = 9 × (7 ÷ 10) = 6.3元
e.存在分账的订单退款规则
a.订单未分账
申请退款金额: 申请全额/部分退款
退款前提: 无,直接退款
退款出资账户(商户基本账户): 不可用余额
b.订单部分分账
a.申请全额退款
退款前提: 1、需要先调“完结分账”接口,将订单剩余冻结资金全部解冻,详细参考分账介绍。2、解冻后商户可用余额>退款金额
退款出资账户(商户基本账户): 可用余额
b.申请部分退款
当申请退款金额≤订单未分账冻结金额,直接可退
退款出资账户(商户基本账户): 不可用余额
1、当申请退款金额>订单未分账冻结金额,需要先调“完结分账”接口,将冻结资金全额解冻
2、解冻后商户可用余额>退款金额
退款出资账户(商户基本账户): 可用余额
c.订单已完结分账
申请退款金额: 申请全额/部分退款
退款前提: 解冻后商户可用余额>退款金额,直接可退
退款出资账户(商户基本账户): 可用余额
02.开发指引
a.整体业务开发流程概览
若存在退款需求,商户需先调用查询订单状态接口以确认订单支付状态为已支付成功,随后调用申请退款API创建退款单后,可通过查询单笔退款信息或退款回调通知以确认最终的退款结果。若退款状态为退款异常,则需调用发起异常退款API进行退款操作。
b.详细步骤说明
a.查询订单状态
商户在退款之前调用微信支付订单号查询订单API或商户订单号查询订单API,确认订单支付状态,支付成功才可进行退款。
b.申请退款
商户调用申请退款API创建退款单,退款单受理成功后,微信会从交易商户的基本账户内扣除需退款的资金,退款资金会进入到微信侧退款的中间账户,然后再退回给用户。
注意:
对于合单支付的订单,无法通过合单支付总单号combine_out_trade_no退款,只能根据单个子单进行退款。
若支付订单为分账订单,存在分账给其他商户号成功情况,退款不会自动回退分账金额,退款出资为商户基本账户可用余额。
申请退款接口需要注意的参数:
普通支付订单退款或合单支付订单退款时,需选择填写 transaction_id或out_trade_no中的一个,普通支付订单退款按照API接口参数填写;合单支付订单退款需要特别注意以下参数字段:
transaction_id:填写原合单支付订单的 sub_orders.transaction_id【子单微信支付订单号】
out_trade_no:填写原合单支付订单的 sub_orders.out_trade_no【子单商户订单号】
c.确认退款结果
退款处理完成后,微信支付会将退款结果通知发送到申请退款时传递的【notify_url】地址,通知内容需要使用APIV3密钥进行加密解密,所以需要提前设置APIV3密钥,设置指引:APIv3密钥设置方法。
若未收到退款回调通知或商户希望主动获取退款状态时,可调用 查询单笔退款(按商户退款单号)查询退款单信息,推荐申请退款后间隔1分钟调用该接口轮询一次退款状态,若超过5分钟仍是退款处理中状态,建议开始逐步衰减轮询频率(比如之后间隔5分钟、10分钟、20分钟、30分钟……轮询一次)。
退款状态:
SUCCESS—退款成功
CLOSED—退款关闭:此状态表明您的退款请求已经关闭。原因是退款单已经处于“退款处理中”的状态超过7天,并且在这段时间内,出资账户的余额不足以完成退款操作。可充值后生成新的商户退款单号,重新调用退款申请API。
PROCESSING—退款处理中:可稍后再次调用查询单笔退款(按商户退款单号),确认最终退款结果。
ABNORMAL—退款异常:退款到银行发现用户的卡作废或者冻结了,导致原路退款银行卡失败,可前往商户平台-交易中心,手动处理此笔退款。或调用发起异常退款API接口处理异常退款。
注意:
退款有一定延时,零钱支付的订单退款一般5分钟内到账,银行卡支付的订单退款一般1-3个工作日到账,具体以查询退款接口返回状态为准。
d.发起异常退款
提交退款申请后,若查询退款确认状态为退款异常,退款资金会停留在退款的中间账户内,商户可调用此接口发起异常退款,使退款资金从退款中间账户退到用户的银行卡,或退回交易商户基本账户的结算银行账户。
注意:
退款至用户时,仅支持以下银行的借记卡:招行、交通银行、农行、建行、工商、中行、平安、浦发、中信、光大、民生、兴业、广发、邮储、宁波银行。
发起异常退款关键参数:
type:可选择退款到用户银行卡,或退回到交易商户银行账户内。
若选择退款给用户银行卡,需在对收款银行卡号bank_account和收款用户姓名real_name进行敏感信息加密。
c.退款单状态流转图
退款单状态流转说明
1、商户调用退款申请接口受理成功后,可以调用查询单笔退款(按商户退款单号)接口来确认退款单状态。
2、当退款单状态为退款处理中(status:PROCESSING)时,退款受理超过7天且账户资金不足时,退款单状态将流转为退款关闭(status:CLOSED)。
3、当退款单状态为退款处理中(status:PROCESSING)时,若因用户账户异常(例如银行卡作废或冻结)导致资金无法按原路退回,微信支付会优先尝试将退款金额转入用户的微信零钱。仅当用户的微信零钱账户也已注销时,退款单状态才会流转为退款异常(status:ABNORMAL)。
4、当退款成功时,退款单状态将从退款处理中(status:PROCESSING)流转为退款成功(status:SUCCESS)。
5、当退款单状态为退款异常(status:ABNORMAL)时,此时商户可以到【商户平台 —>交易中心】手动处理退款或调用发起异常退款接口处理异常退款,当退款成功后,退款单状态将流转为退款成功(status:SUCCESS)。
6、以下两个状态为终态
status:SUCCESS
status:CLOSED
03.常见问题
a.在使用申请退款接口时,能否设置“附加数据”参数?
依据微信支付API文档,申请退款接口是不支持设置“附加数据”参数的。
b.在哪些情况下,会显示退款已关闭的状态?
退款关闭状态可能由以下情况引发:
退款申请受理后,若商户资金不足且经过7天的重试仍未达到所需金额,将导致退款关闭。
当退款申请受理时,若订单资金状态不符合指定的出款账户要求(如尝试从不可用的分账余额中出款,但资金已全部解冻),也将导致退款关闭。
为避免退款关闭,建议商户确保资金充足并满足出款账户的相关要求。
c.必须在完结分账后才能进行退款吗?
不需要。退款和分账是两个相互独立的操作。您完全可以先执行退款,随后再进行分账。如果需要在分账之前处理退款,可以直接调用退款接口来完成相应操作。
d.退款过程中是否需要支付手续费?
手续费采用轧差计算方式。对于可用余额退款,即新资金流商户已结算订单的退款,微信支付平台仅扣除商户应承担的退款金额,而前期已收取的手续费则按比例直接返还给用户。具体细节请参阅交易退款常见问题。
以一个例子说明:假设原订单金额为100元,申请退款50元,商户费率为0.6%。在这种情况下,微信支付平台将从商户的可用余额或基本户中扣除49.7元,并将微信返还的0.3元手续费一并退还给用户,总计退款金额为50元。
e.为什么申请退款接口提交后仅显示请求受理成功,而非直接给出退款结果?
申请退款接口提交后仅显示请求受理成功,是因为资金处理包含多个环节,需一定时间完成。为确保获取准确的退款结果,建议您依据商户退款单号调用查询单笔退款接口,进而了解具体的退款状态与进展。
f.查询单笔退款接口能查询多久以前的退款记录?
查询单笔退款接口没有设定时间限制,任何通过申请退款接口成功处理的退款订单,都可以使用此接口查询其退款详情。
g.支付和退款是否可以使用不同的商户号处理同一笔订单?
不可以。一旦订单支付成功,它就会与下单时传入的商户号绑定,在任何情况下都不允许其他商户号对该订单进行操作。这是微信支付平台为确保交易安全和可追溯性而设定的规则。
h.退款成功后多久内会收到微信侧的退款结果通知?
退款成功后,微信侧一般会实时发送对应的退款结果通知。为确保能及时收到通知,建议商户检查退款通知的配置,并确保系统能够正常处理这些通知。
i.部分退款后,调用查询接口查询该订单的交易状态是什么?
部分退款后,调用查询接口查询该订单,其交易状态将显示为“REFUND:转入退款”。
j.调用退款接口时报错“缺少参数refund_fee”,怎么解决?
报错是因为未传入必填的refund_fee参数。请检查并确保在请求中包含此参数,且值正确。建议查阅微信支付官方文档中的申请退款部分,严格按照参数要求传递信息。
k.调用申请退款API时出现错误:“code":"INVALID_REQUEST","message":"您的请求参数与订单信息不一致”,应如何处理?
当您在调用申请退款API时遇到此错误,意味着您提供的请求参数与原始订单信息不匹配。请确保以下几点:
1、核对订单号:确认发起退款请求时使用的订单号与支付成功时的订单号完全一致。
2、核对商户号:确保使用的商户号与支付时的商户号相符。
3、仔细检查所有相关参数:确保所有传入的参数均准确无误。
完成上述核对后,重新尝试发起退款请求。
l."查询单笔退款API"接口是否每次只能查询一条退款记录?
是的,查询单笔退款API接口设计为每次只能查询一条退款记录。若需要批量查询,您可以通过多次调用该接口并传入不同的退款订单号来实现。
m.调用“申请退款API”时,如果用户绑定的银行卡已注销,退款将如何处理?
在使用“申请退款API”处理退款时,如果用户绑定的银行卡已注銷,微信支付系统会尝试将退款资金退至用户的微信零钱。若用户的微信零钱账户也已注销或不可用,退款单将进入“退款异常”状态。此时,可选择调用发起异常退款API进行处理,或直接在商户平台手动完成退款操作。
n.调用"申请退款API"接口后,返回结果为空,应如何排查问题?
当调用"申请退款API"接口返回为空时,可能是由以下原因导致的:
1、响应体读取问题:请确保正确读取了响应体内容,并根据响应头中的Content-Length长度进行验证。
2、接口调用错误:检查API接口的调用是否准确无误,特别是参数设置和签名验证部分。
针对以上两点进行检查和调整,有助于解决返回结果为空的问题。
o.调用"申请退款"接口时返回错误码USER_ACCOUNT_ABNORMAL,应如何处理?
当调用"申请退款"接口返回错误码USER_ACCOUNT_ABNORMAL时,意味着退款申请未能成功处理,这通常是由于用户账号处于异常状态,比如已注销。
针对这一情况,建议采取以下步骤:
1、核实用户账号状态:商户需要首先确认用户的账号状态。如果确认用户账号已注销,则无法继续进行退款操作。
2、检查并重新发起退款请求:如果用户账号状态正常,建议商户仔细核查退款请求中的参数是否正确,并在确认无误后重新提交退款申请。
p.调用"申请退款"接口时返回错误码TRADE_OVERDUE,是什么意思?
错误码TRADE_OVERDUE表示您尝试退款的订单已超过可退款的最大期限,即在支付完成后的一年内。超出此期限的订单将无法进行退款操作。
q.调用退款接口,报错提示:"当前使用此业务的用户较多,请稍后再试",应如何处理?
您遇到的问题可能是由于系统繁忙导致的。建议您稍后再试,如果问题仍然存在,请检查您的请求参数是否正确,或者尝试重新发起退款请求。
r.调用申请退款接口时报错提示“REFUND_FEE_MISMATCH”,“订单金额或退款金额与之前请求不一致,请核实后再试”,应如何处理?
针对您遇到的“REFUND_FEE_MISMATCH”错误提示,可以按照以下步骤进行排查和解决:
1、核实退款金额:确保退款金额没有超过实际支付的金额。
2、检查退款单号:
如果进行了多次退款操作,请确认每次的out_refund_no(商户退款单号)参数都是唯一的,若重复请更换新的退款单号后再次尝试。
检查所使用的退款单号是否已被使用过。
遵循以上步骤,您应该能够解决该错误提示所遇到的问题。
s.退款回调报文为什么是xml格式?
订单通过v2申请退款接口发起了退款,或者调用申请退款接口时未传入notify_url(回调地址)且商户平台-交易中心-退款管理-退款配置中设置了退款回调地址,发送的是v2版本xml格式退款回调通知。
t.超过一年的订单如何退款?
交易时间超过一年的订单暂无法提交退款,
1、直连商户可接入商家转账或商户自行联系用户线下退款;
2、服务商需要商户自行联系用户线下退款。
u.在商户平台页面操作的退款,怎么同步到自己的系统内部呢?
商户平台操作退款,如需接收退款结果通知,可以登录【商户平台-交易中心-退款管理-退款配置】设置回调通知地址。
v.订单退款后,代金券状态会变更吗?
请参考以下几点:
1、有效期内退款:已核销的代金券若在有效期内发生订单退款,代金券会退回用户账户并恢复为可用状态。
2、活动过期后退款:若代金券所参与的活动已过期,即使发生退款,代金券在微信侧的状态会标记为过期。
3、退款详情记录:通过promotion_detail字段可查看代金券退款详情,包含代金券ID、金额、退款金额等信息,用于追踪状态变化。
具体状态变更需结合退款时的代金券活动状态及退款规则判断。
w.订单处于分账冻结状态时,退款可以原路退回吗?
可以的,分账退款规则具体参考分账退款处理。
3.8 分账
01.产品介绍
a.简介
普通商户分账主要用于商户将交易成功的资金,按照一定的周期,分账给其他方,可以是合作伙伴、员工、用户或者其他分润方。
b.使用场景
a.员工奖励
零售、餐饮等行业中,当销售人员销售完成后,达到可奖励的条件,可以通过分账,将销售奖励分给员工。
b.管理资金到账时间
在酒店行业中,利用分账功能中的“冻结/解冻”能力,避免用户退款时商户账户资金不足的情况。当用户预订/入住酒店时,交易资金先冻结在酒店的账户中;当用户确认消费离店后,再利用“分账”功能中的“分账完结”解冻资金到酒店的账户中。
c.分润给合作伙伴
在与他方合作的情况下,可以用“分账”功能,将交易资金分给合作伙伴,例如物流合作商。
c.名词解释
a.分账方
将部分交易资金分出的一方,这里指直连商户本身。
b.分账接收方
接收资金的一方,可以是商户,可以是个人。
d.产品特点
a.待分账资金冻结,可实时分账或延时分账,实现管理账期
微信支付平台提供资金冻结的能力,所有需要分账的订单,待分账资金将先冻结在商户的商户号中,商户可根据实际业务情况,在交易完成后,实时(建议1分钟后)或30天内调分账接口,传输分账指令,微信支付平台将根据商户的指令进行分账。
b.基于每笔订单按金额进行分账,可单次或多次分账,每次分给多方
实际分账时,商户传入具体的分账接收方和分账金额进行订单分账。一笔订单最多可以分50次,每一次可以分给50方。
c.可分给微信商户账户或个人零钱
分账是在微信体系内进行的,分账接收方的账户可以是商户微信账户或个人零钱账户。
d.商户的超管须配置允许分账的最大比例
为保护商户资金安全,开通此功能时,商户号超管需配置允许订单分账的最大比例,实际分账金额必须小于订单金额*允许分账的最大比例,目前默认最高分账比例为30%。
e.零成本,免手续费
02.接入前准备
a.选择接入模式
商户需要判断自己公司注册区域适用的接入模式和自身实际情况,申请成为普通商户或普通服务商:
普通商户自行申请入驻微信支付,无需服务商协助。
普通服务商则自身无法作为一个普通商户直接发起交易,其发起交易必须传入相关特约商户商户号的参数信息。
具体接入模式介绍请参考接入模式文档,并按照参考文档完成相应模式的接入。
b.申请参数
请根据自身接入模式分别参考微信支付接入准备-普通商户或微信支付接入准备-普通服务商中的参数申请 - 配置API key - 下载并配置商户证书三个步骤申请接入参数。
c.开通流程
商户在商户平台 【产品中心 > 我的产品】,支付扩展工具中开通分账产品。
添加分账接收方。
可在【微信商户平台 > 交易中心 > 管理分账接收方】中添加分账接收方,或调用添加分账接收方接口,通过接口来添加分账接收方。
03.开发指引
a.接口规则
为了在保证支付安全的前提下,带给商户简单、一致且易用的开发体验,我们推出了全新的微信支付APIv3接口。该版本API的具体规则请参考APIv3接口规则。
b.开发准备
a.搭建和配置开发环境
开发者应当依据自身的编程语言来构建并配置相应的开发环境。
c.快速接入
a.业务流程图
重点步骤说明:
步骤4:商户发起添加分账接收方请求(添加分账接收方API),商户的分账接收方数量上限为2万。若已达到上限,可删除部分未使用的接收方后重新添加。
步骤6:在基础支付中上传参数profit_sharing,请求支付。支付完成后,调用请求分账接口;
步骤7:请求分账接口采用异步处理模式,即在接收到商户请求后,会先受理请求(受理请求返回的结果非最终分账结果)再异步处理,最终的分账结果需要通过查询分账结果接口获取;
步骤8:调用查询分账结果接口,根据receivers.result判断每个接收方的分账结果,如返回CLOSED:已关闭,可根据返回的receivers.fail_reason分账失败原因参考分账失败处理指引进行处理。
a.是否需要分账
变量: profit_sharing
类型[长度限制]: boolean
必填: 否
描述: 是否指定分账,枚举值 true:是 false:否
说明: 实现分账只是在普通支付下单接口中新增了一个分账参数profit_sharing,其他与普通支付方式完全相同。目前支持付款码支付、JSAPI支付、Native支付、App支付、小程序支付、H5支付、委托代扣。
04.常见问题
a.分类1
a.下单
在JSAPI支付、付款码支付、Native支付、APP支付、H5支付、小程序支付、代扣下单接口需要增加新的入参。
a.是否需要分账
变量: profit_sharing
必填: 否
类型: boolean
示例: true
描述: 需要分账(传入true),不需要分账(传入false或不传,默认为false)
b.按金额分账
分账资金只能按金额传入,不支持按比例。分账总额不能超过订单金额减去手续费的净额。
c.资金冻结期
资金冻结期最长是30天,如果在30天内商户没有发起分账指令,则订单冻结资金将全部解冻,订单将处于完结状态,无法发起分账。
d.分账方资金
属于分账方的资金,微信支付平台自动解冻给分账方。商户只需传入分给他方的账号和资金,订单剩余未分账的资金平台默认都属于分账方,平台在处理分账的同时,将直接解冻给分账方。
e.分账接收方资金
分账接收方收到分账资金后,需要手动提现到银行账户。
f.分账次数限制
同一笔订单最多分账50次,每次可向50个接收方分账。
g.分账失败处理
由于接收方账户不可用导致的个别接收方分账失败,失败的分账资金,平台将直接转回给分账方。
h.退款
未分账订单发起退款,资金将从冻结资金中直接出款退给用户,订单分账之后发生退款,在接收方同意分账回退的情况下,资金先可以从接收方(仅限商户类型)的账户中回退至分账方账户,再进行退款。
i.调用请求分账接口返回”非分账订单不支持分账“是什么原因?
请按照以下几点检查:
微信订单号填写错误,请检查确认
V3下单时未上传分账标识(profit_sharing =true)的订单,是不支持分账的
j.调用请求分账接口返回”分账金额不足“是什么原因?
请按照以下几点检查:
该订单已全额退款,没有资金可以分账
在微信支付中,实际收款之后微信支付会收取一定的结算手续费,在减去手续费后剩余的钱才能分账,详情可参考结算规则、费率、周期说明
该订单已解冻,已无分账资金(普通商户分账订单默认冻结期是30天)
超过订单剩余可分账金额或者该订单已无可分账金额,请检查确认(可调用查询订单待分账金额API确认剩余可分账金额)
k.调用解冻剩余资金接口报错:“分账金额不足”
请参考以下几点排查:
1、订单已全额退款,无可用资金分账;
2、订单已经逾期解冻;
3、订单已经分账完毕,没有剩余待分账金额。
l.调用请求分账接口返回”分账接收方关系不存在,请检查参数中每个接收方的关系“是什么原因?
未添加分账接收方,分账接收方在分账之前需要调用“添加分账接收方接口”添加,请添加接收方后再调用请求分账接口。
m.调用请求分账接口返回“分账金额超出最大分账比例”是什么原因?
请检查分账的金额是否超出在商户平台设置的允许分账的最大比例,设置路径如下:
普通直连商户设置分账比例路径:登陆商户平台-产品中心-分账-分账管理比例
n.调用请求分账接口返回”无分账权限“是什么原因?
请按照以下几点排查:
1、未开通分账权限,请开通后再调用分账接口,可参考接入前准备
2、请求参数错误
o.分账调用“添加分账接收方接口”返回:微信用户姓名与实名不一致
请求中传了字段“个人姓名name”,该字段传了之后会校验用户实名是否正确,请填写正确的用户实名(查看用户实名认证路径:微信-我-服务-右上角三点-实名认证-姓名)
p.分账接收方类型包括哪些?
有以下几个类型:
MERCHANT_ID:商户ID
PERSONAL_OPENID:个人openid(由父商户APPID转换得到)
PERSONAL_SUB_OPENID: 个人sub_openid(由子商户APPID转换得到)
q.分账调用“请求分账接口”返回:订单处理中,请稍后重试
请按照以下几点检查:
请在订单支付成功1分钟后再调用分账接口
未结算的订单,请在结算后再调用分账接口请求分账。查看结算周期路径:超级管理员使用电脑登录商户平台,通过【账户中心】->【商户信息】->【结算信息】进行查看
老资金流商户的订单,不支持分账(旧资金流流水介绍、新资金流流水介绍)
商户开通了收支分离但手续费账户余额不足(手续费账户最低余额要求是100元以上,在充值手续费账户1小时后,订单会正常结算,即可正常调用分账接口)
r.分账调用“请求分账接口”返回:分账接收方与原请求不一致
商户分账单号填写错误,调用“请求分账接口”多次分账,要生成新的“商户分账单号”,不能使用已经分过账的商户分账单号
s.调用分账接口是否有额外的手续费
没有,商户的交易订单,平台会正常的收取结算手续费。商户使用分账功能没有额外的费用
t.分账调用“请求添加分账接收方接口”返回:分账接收商户全称不匹配
请按照以下几点检查:
分账接收商户全称填写错误,请填写正确的商户全称,商户全称对应进件接口中的字段“商户名称merchant_name”
字段值没有加密,该字段值需要加密后上传,请正确加密后再提交。
上传的中文全称乱码,请检查接口编码是否正确,接口需要使用UTF-8编码
u.分账调用“添加分账接收方接口”返回:账户不存在 ,请先点击充值
账户未开通,请接收方商户在商户平台点击“充值”创建账户(商户平台-交易中心-充值)
v.分账如果有退款怎么处理,是否可以回退?
需注意以下几点:
已分出去的资金,在商户接收方同意的情况下,可以发起分账回退。(接收方可在“商户平台-交易中心-分账-分账接收设置”中开启同意分账回退)需要有接收分账成功记录才会有入口
分账退款逻辑
a.订单未分账
申请退款金额: 申请全额/部分退款
退款前提: 无,直接可退
退款出款账户: 商户冻结账户资金
b.订单部分分账
a.申请全额退款
退款前提: 1、需要先调“解冻剩余资金”接口,将订单剩余冻结资金全部解冻 2、解冻后商户可用余额充足
退款出款账户: 商户可用余额
b.申请部分退款
当申请退款金额≤订单未分账冻结金额,直接可退
退款出款账户: 商户冻结账户资金
1、当申请退款金额>订单未分账冻结金额,需要先调“解冻剩余资金”接口,将冻结资金全额解冻
2、解冻后商户可用余额充足
退款出款账户: 商户可用余额
c.订单已完结分账
申请退款金额: 申请全额/部分退款
退款前提: 商户可用余额充足,直接可退
退款出款账户: 商户可用余额
注意:
分账订单的退款与分账回退并无强耦合,分账回退的资金是回到商户可用余额中,分账回退可先于退款发起,可后于退款发起,或者根据分账方与商户的约定,不发起分账回退
w.分账添加接收方接口,是在分账前添加一次,如果接收方无变化,后续是否还需要调用接口再添加
是的,如果接收方没有变化,只需要添加一次即可
x.分账调用“查询分账结果接口”返回的分账单状态有几种
分账单状态:
PROCESSING—处理中
FINISHED—处理完成
分账接收方列表状态
PENDING:待分账
SUCCESS:分账成功
CLOSED:已关闭
y.在商户平台设置了分账动账通知url,为什么收不到通知
请按照以下几点排查:
未设置动账通知url,该链接是通过商户平台【交易中心-分账接收设置】中配置的通知url,必须为https协议。如果链接无法访问,商户将无法接收到微信通知。必须为直接可访问的url,不能携带参数。
商户未设置加密的密钥,请登录商户平台操作!请参考APIv3密钥设置方法
只有分账接收方才能收到分账动账通知,分账方是不会有通知的,建议分账发起方,通过查询分账结果接口获取分账单最新的状态
z.分账调用“请求分账接口”返回:对同笔订单分账频率过高
同笔订单多次分账频率是1秒1次,请降低频率后重试
b.分类2
a.分账后资金到可提现是否有中间状态
没有中间状态
b.分账后的资金什么时候可提现
分账后钱已经到商户的账户了,可以立刻提现
c.分账调用“解冻剩余资金接口”的作用是什么
调用该接口,可以将不需要进行分账的订单金额解冻给商户,解冻后的资金商户可自行发起提现
d.分账调用“分账回退接口”返回:参数不正确,请检查参数
return_account与mch_id不能填写为相同的商户号,分账方与接收方商户号一致时,不需要回退
e.分账订单调用“申请退款接口”返回:申请退款金额大于剩余未分账金额,请等待分账完成后再试
订单有过部分分账,退款金额不能大于剩余未分账金额,请调用“解冻剩余资金接口”解冻剩余资金后再发起退款
f.查询分账结果接口里面分账单状态(status)字段,当值为FINISHED时是表示分账成功了吗
分账单FINISHED状态是表示分账动作执行完毕,并不代表分账是否成功。查看分账是否成功,需要调用查询分账结果接口,查看返回参数“分账接收方列表”里面的字段“分账结果result=SUCCESS”才是分账成功。
若分账结果 result=CLOSED 可以认为分账失败,可参考分账失败处理指引。
g.调用“添加分账接收方接口”一次可以添加多个接收方吗
不可以,一次只能添加一个
h.请求分账接口返回:分账接收方不允许为分账出资方
V3接口,finish为true的情况,“请求分账接口”分账接收方不允许为分账出资方(这种场景,直接调完结分账API就好)。finish为false的情况,“请求分账接口”分账接收方可以为分账出资方
i.调用“请求分账接口”,分账分给多个接收方,会出现分账既有成功又有失败的情况吗
同一次分账请求,会出现有的成功,有的失败的情况。具体请调用“查询分账结果接口”,查看返回参数“分账接收方列表”里面的字段“分账结果result=SUCCESS”才是分账成功。
j.“请求分账接口”分账接收方列表中的参数description会体现在分账账单里面吗
在分账方分账账单和资金账单、分账接收方的资金账单里面都会体现
k.调用“添加分账接收方接口”返回:请求正在处理中,请稍后重试
商户请求并发导致,重新再请求一次即可
l.调用“添加分账接收方接口”返回:商户已添加的分账接收方个数过多。请先删除多余的分账接收方,并在24小时之后再尝试添加
添加分账接收方的个数限制是2W个,超过这个限制,请按照提示处理
m.调用“请求分账回退接口”返回:可用余额不足,请充值后重新发起
“回退商户号”的账户可用余额不足,需充值后再原单重试才能回退成功。(充值指引:登陆商户平台【交易中心】->【资金管理】->【充值/转入】,根据指引充值即可)
n.调用“请求分账回退接口”返回:可用余额不足,请充值后重新发起。这个时候,调用“查询分账回退结果API”却返回:PROCESSING(处理中),这个逻辑是正常的吗
是正常的,逻辑就是这样的。这种情况,商户可以按照提示要求,提醒“回退商户号”充值后再原单重试即可回退成功
o.调用“请求分账回退接口”返回:PROCESSING(处理中),什么情况会返回这种状态
请参考以下几点:
网络抖动导致请求中断
商户账户资金转账频繁,导致回退在排队时超时
p.调用“查询分账回退结果接口”返回:TIME_OUT_CLOSED
TIME_OUT_CLOSED是fail状态了,也就是处于最终态,是不需要重试的。状态是SUCCESS也同理,也是最终态,不需要重试。返回TIME_OUT_CLOSED时可更换一个回退单,重新分账回退一次即可
q.一笔交易在分账完成之后,将接收方和分账账户的绑定关系解除(删除分账接收方),然后进行分账回退,会成功吗
会回退成功,不受删除分账关系的影响
这里的逻辑有两个:
这笔单曾经分给过了这个商户,且分账成功
这个商户开通了分账回退
r.分账调用“分账回退接口”返回:PROCESSING
过一分钟后原单重试即可
s.分账回退有时间限制吗
从订单创建的时间算起,现在分账回退限制180天以内的分账请求
t.分账方添加接口,如果相同的分账方重复提交,会返回添加失败,还是覆盖之前的分账方信息
如果系统检测到已经绑定,那么会保留原来的数据,不更新数据,直接返回成功
u.在商户平台-管理分账接收方中手动添加分账接收方报错:系统错误,请稍后再试
这个报错的原因是:账户未开通,请接收方商户在商户平台点击“充值”创建账户(商户平台-交易中心-充值)
v.免充值和预充值的代金券,分账的时候,可分账的金额判断逻辑是一样的吗?比如10-5,使用了免充值代金券,可分账金额是5,使用了预充值代金券,可分账金额是10元还是5元呢
不一样,使用了免充值代金券,可分账金额是5,使用了预充值代金券,可分账金额是10
w.请求分账接口返回:appid与openid不匹配
请求分账接口里面的APPID必须传绑定商户号的APPID,所以商户在添加分账接收方时获取的openid,也必须是这个商户号绑定的APPID获取的openid
x.请求分账回退接口返回:分账指令不存在,请检查是否有对应的分账单
请按照以下几点排查:
分账回退里面的商户分账单号out_order_no,必须是请求分账接口的商户分账单号out_order_no
请先调用查询分账回退结果API确认分账是否成功,分账成功的分账单才能调用回退接口正常回退。
从订单创建的时间算起,分账回退限制180天以内的分账请求,超过180天不支持回退
y.查询订单待分账金额返回:记录不存在
请按照以下几点排查:
记录不存在,可能是单号拼错了,请检查确认
订单未结算,请在订单结算后再查询
非分账订单,请检查订单支付时是否传了分账标识,传了分账标识的订单,才能正确查询
z.商户号能正常解冻剩余资金,但是查询分账结果却提示“无分账权限”。是什么原因?
1、分账权限被冻结,请登陆商户平台查看站内信,按照指引申诉处理。
2、解冻剩余资金是将订单中可分账的剩余资金解冻至自己账户,无需权限校验,但查询分账结果需要校验权限。
c.分类3
a.请求分账接口,当提交请求后返回报错SYSTEM_ERROR,这个时候调用查询分账结果接口查询,每10分钟查询一次,共查询3次(共30分钟)。这样的情况下,是否可以不用原单重试?查询后是否可以换单再提交?
请求分账返回SYSTEM_ERROR时,调用查询分账结果接口3次(30分钟)后,查询结果仍然是不存在的情况:如果商户能保证在30分钟的窗口期内都不会重试,这样做是安全的。
但我们建议在返回SYSTEM_ERROR 情况下,商户还是原单重试,这种最安全,也不用查询和等待一个窗口期。
b.一个微信支付单被全额退款,还可以继续分账吗?
不可以了,分账是针对该订单冻结的金额进行分账,如果退完款,就不能再分账了。
c.比如一个订单支付金额是100.1元,假如手续费是0.1元。分账前先退款了30元,默认分账比例是30%,现在可以分账的金额还是30元,那就是说,可能出现100退了80,分出去30这种情况?
不会, 两个相加不会超过订单金额的, 也就是说退款没有超过70元的话,可分账金额是30,超过70,可分账金额是剩下的钱。
d.直连分账,添加分账接收方这个APPID,如果商户号绑定了两个APPID“B”和"C",需要分账的订单下单中传的APPID是B,这个时候,添加分账接收方中的这APPID可以是“C”吗?还是说必须是“B”?
请注意以下两点:
添加分账接收方的时候,B下的openid,C下的openid都可以
但是执行分账的时候,一次分账请求里,只能是同一个appid下的openid,不支持一次分账请求里的openid分别是俩appid下的
e.查询分账结果接口返回:记录不存在
请按照以下几点排查:
记录不存在,可能是单号拼错了,请检查确认
订单未结算,请在订单结算后再查询
非分账订单,请检查订单支付时是否传了分账标识,传了分账标识的订单,才能正确查询
订单未分账,所以没有记录,请在订单分账后再查询
f.单次分账请求可以向同一接收方分多笔金额吗?
不支持,单次分账请求中,每个分账接收方只能出现一次,如有多个金额分给同一接收方,请提前合并为一笔总额再进行分账。
g.调用分账回退接口,回退的资金会到哪?
退回到分出商户号可用余额账户。
h.分帐到个人金额是否有上限?
单月个人收款限额20w。
i.请求分账报错:“分账接收方金额与原请求不一致”
重复使用了商户分账单号并修改了接收方信息,若需要重入请不要修改分账接收方与金额。
j.请求分账接口报错:"订单处理中,请在到达结算周期之后再请求分账"
商户号被处罚了延长结算周期,可通过商户平台站内信或下方指引,查询和申诉。申诉成功后处罚期间的订单仍按处罚的结算周期结算,不会加速结算。
商户违约记录查询与申诉指引(移动端)
微信支付商户自查违约记录/申诉指引(电脑端)
k.请求分账返回{"code":"INVALID_REQUEST","message":"appid与openid不匹配"}
请求分账传的openid不存在或者不是从对应appid下的,openid获取方式详见参数说明。
l.当订单资金处于分账冻结时,如果商户关闭分账产品权限,资金是否会自动解冻?
会的,关闭分账产品不影响自动解冻,普通商户和普通服务商默认30天自动解冻,平台收付通默认180天自动解冻。
m.分账账单有v2版本的接口吗?
没有,目前只有v3版本接口。
n.分账接口,分账完成后多久会到账?
通常到账时间是准实时。
o.分账接口的频率是多少?
请求分账接口的频率:300QPS
查询分账结果接口的频率:500QPS
请求分账回退接口的频率:100QPS
查询分账回退结果接口的频率:500QPS
p.分账前的订单金额能否作为商户号余额用于其他订单退款?这笔资金是否算作商户号余额?
不可以。分账前的订单资金处于冻结状态,不能给其他订单进行退款。
这笔资金仅计入基本账户的不可用余额,不属于可用余额。待分账解冻成功(如分账完成、解冻剩余资金或超时自动解冻)后,资金会转入基本账户可用余额,届时才可用于其他订单退款。
补充说明:该订单本身的退款不受影响,可按正常流程原路退回。
q.超过分账退回有效期的错误码是什么样的?
{"code":"INVALID_REQUEST","message":"分账指令不存在,或超过分账回退时效,请检查对应的分账单"}。
r.订单处于分账冻结状态时,退款可以原路退回吗?
可以的,分账退款规则具体参考分账退款处理。
s.分账方用不用承担接收方的税?
分账功能仅实现资金分配,不涉及税务处理。
t.商户分账完结后资金会立刻解冻吗?是否有T+1限制?
调用解冻剩余资金接口解冻资金是准实时的,没有T+1的限制。