小程序开发流程
<h1 class="md-end-block md-heading"><span class="md-plain">小程序的运行环境差异</span></h1><p class="md-end-block md-p md-focus"><span class="md-plain md-expand">小程序开发过程中需要面对的是两大操作系统 iOS 和 Android 的微信客户端</span></p>
<p class="md-end-block md-p md-focus"><span class="md-plain md-expand"><img src="https://img2020.cnblogs.com/blog/1186521/202110/1186521-20211015170118662-1816010651.png" alt="" loading="lazy"></span></p>
<h1 class="md-end-block md-heading"><span class="md-plain">小程序开发流程</span></h1>
<h3 class="md-end-block md-heading"><span class="md-plain">注册小程序:申请帐号</span></h3>
<p class="md-end-block md-p"><span class="md-plain">注册小程序链接:<span class="md-link md-pair-s">https://mp.weixin.qq.com/wxopen/waregister?action=step1</span></span></p>
<h3 class="md-end-block md-heading"><span class="md-plain">登录小程序后台</span></h3>
<p class="md-end-block md-p"><span class="md-plain">登录链接:<span class="md-link md-pair-s">https://mp.weixin.qq.com/</span></span></p>
<p class="md-end-block md-p"><span class="md-plain">在菜单 “开发”-“开发设置” 看到小程序的 <span class="md-pair-s "><strong>AppID</strong></span></span></p>
<h3 class="md-end-block md-heading"><span class="md-plain">开发工具下载</span></h3>
<p class="md-end-block md-p"><span class="md-plain">微信开发者工具下载链接:<span class="md-link md-pair-s">https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html</span></span></p>
<h3 class="md-end-block md-heading md-focus"><span class="md-plain">新建小程序:如下图步骤</span></h3>
<p><span class="md-plain"><img src="https://img2020.cnblogs.com/blog/1186521/202110/1186521-20211015170155012-1202699861.png" alt="" loading="lazy"></span></p>
<p class="md-end-block md-p"><span class="md-plain">注:没有APPID会限制功能体验具体参照微信开发者文档!</span></p>
<h3 class="md-end-block md-heading"><span class="md-plain">小程序文件的相关作用</span></h3>
<ol class="ol-list" start="">
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-pair-s"><code>.json</code><span class="md-plain"> 后缀的 <span class="md-pair-s"><code>JSON</code><span class="md-plain"> 配置文件</span></span></span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-pair-s"><code>.wxml</code><span class="md-plain"> 后缀的 <span class="md-pair-s"><code>WXML</code><span class="md-plain"> 模板文件</span></span></span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-pair-s"><code>.wxss</code><span class="md-plain"> 后缀的 <span class="md-pair-s"><code>WXSS</code><span class="md-plain"> 样式文件</span></span></span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-pair-s"><code>.js</code><span class="md-plain"> 后缀的 <span class="md-pair-s"><code>JS</code><span class="md-plain"> 脚本逻辑文件</span></span></span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-pair-s"><code>app.json</code><span class="md-plain"> 是当前小程序的全局配置,包括了小程序的所有页面路径、界面表现、网络超时时间、底部 tab 等</span></span></p>
</li>
</ol>
<p class="md-end-block md-p"><span class="md-plain">小程序全局配置文档(app.json文件):<span class="md-link md-pair-s">https://developers.weixin.qq.com/miniprogram/dev/reference/configuration/app.html</span></span></p>
<p class="md-end-block md-p"><span class="md-plain">小程序页面配置文档(每个页面的json文件)<span class="md-link md-pair-s">https://developers.weixin.qq.com/miniprogram/dev/reference/configuration/page.html</span></span></p>
<p class="md-end-block md-p"><span class="md-plain">页面中配置项在当前页面会覆盖 <span class="md-pair-s"><code>app.json</code><span class="md-plain"> 的 <span class="md-pair-s"><code>window</code><span class="md-plain"> 中相同的配置项</span></span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-plain">sitemap 配置文档:<span class="md-link md-pair-s">https://developers.weixin.qq.com/miniprogram/dev/reference/configuration/sitemap.html</span></span></p>
<p class="md-end-block md-p"><span class="md-plain">开发者可以通过 <span class="md-pair-s"><code>sitemap.json</code><span class="md-plain"> 配置,或者管理后台页面收录开关来配置其小程序页面是否允许微信索引。当开发者允许微信索引时,微信会通过爬虫的形式,为小程序的页面内容建立索引。当用户的搜索词条触发该索引时,小程序的页面将可能展示在搜索结果中</span></span></span></p>
<p class="md-end-block md-p"><span class="md-plain">项目配置文件(project.config.json)文档:<span class="md-link md-pair-s">https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html</span></span></p>
<h3 class="md-end-block md-heading"><span class="md-plain">配合weui使用</span></h3>
<p class="md-end-block md-p"><span class="md-plain">组件库文档:<span class="md-link md-pair-s">https://developers.weixin.qq.com/miniprogram/dev/extended/weui/</span></span></p>
<p class="md-end-block md-p md-focus"><span class="md-plain">在全局配置app.json文件下增加如下配置即可正常使用内部组件</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;"> "useExtendedLib": {
"weui": true
},
</pre>
</div>
<div class="cnblogs_code">
<pre>"usingComponents"<span style="color: rgba(0, 0, 0, 1)">: {
</span>"mp-icon": "weui-miniprogram/icon/icon"<span style="color: rgba(0, 0, 0, 1)">
}</span></pre>
</div>
<p><span class="md-plain md-expand">另外一种npm方式具体参考文档:<span class="md-link md-pair-s md-expand">https://developers.weixin.qq.com/miniprogram/dev/devtools/npm.html</span></span></p>
<h1 class="md-end-block md-heading md-focus"><span class="md-plain md-expand">小程序版本</span></h1>
<p><span class="md-plain md-expand"><img src="https://img2020.cnblogs.com/blog/1186521/202110/1186521-20211015170352684-2117774880.png" alt="" loading="lazy"></span></p>
<h3 class="md-end-block md-heading"><span class="md-plain">小程序测试号申请</span></h3>
<p class="md-end-block md-p"><span class="md-plain">微信扫描二维码,即可获得为自己分配好的小程序和小游戏测试账号</span></p>
<p class="md-end-block md-p"><span class="md-plain">链接:<span class="md-link md-pair-s">https://mp.weixin.qq.com/wxamp/sandbox?doc=1</span></span></p>
<h3 class="md-end-block md-heading"><span class="md-plain">发布上线</span></h3>
<p class="md-end-block md-p"><span class="md-plain">一个小程序从开发完到上线一般要经过 预览-> 上传代码 -> 提交审核 -> 发布等步骤</span></p>
<h3 class="md-end-block md-heading"><span class="md-plain">代码管理(也可上传自己的git)</span></h3>
<p class="md-end-block md-p"><span class="md-plain">链接:<span class="md-link md-pair-s">https://git.weixin.qq.com/</span></span></p>
<h3 class="md-end-block md-heading"><span class="md-plain">运营数据查看</span></h3>
<p class="md-end-block md-p"><span class="md-plain">有两种方式可以方便的看到小程序的<span class="md-meta-i-cmd-link"><span class="md-plain">运营数据</span></span></span></p>
<p class="md-end-block md-p"><span class="md-plain">方法一:登录 <span class="md-meta-i-cmd-link"><span class="md-plain">小程序管理后台</span><span class="md-plain"> - 数据分析,点击相应的 tab 可以看到相关的数据。</span></span></span></p>
<p class="md-end-block md-p"><span class="md-plain">方法二:使用小程序数据助手,在微信中方便的查看运营数据</span></p>
<h1 class="md-end-block md-heading"><span class="md-plain">小程序开发注意事项</span></h1>
<h3 class="md-end-block md-heading"><span class="md-plain">允许上传的文件</span></h3>
<p class="md-end-block md-p"><span class="md-plain">只有后缀名在白名单内的文件可以被上传,不在白名单列表内文件在开发工具能被访问到,但无法被上传</span></p>
<ol class="ol-list" start="">
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">wxs</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">png</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">jpg</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">jpeg</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">gif</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">svg</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">json</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">cer</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">mp3</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">aac</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">m4a</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">mp4</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">wav</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">ogg</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">silk</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">wasm</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">br</span></p>
</li>
</ol>
<h3 class="md-end-block md-heading md-focus"><span class="md-plain">小程序生命周期</span></h3>
<p><span class="md-plain"><img src="https://img2020.cnblogs.com/blog/1186521/202110/1186521-20211015170500797-1803060638.png" alt="" loading="lazy"></span></p>
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">App() 必须在 <span class="md-pair-s"><code>app.js</code><span class="md-plain"> 中调用,必须调用且只能调用一次。不然会出现无法预期的后果</span></span></span></strong></span></p>
<h3 class="md-end-block md-heading md-focus"><span class="md-plain">页面路由</span></h3>
<p><span class="md-plain"><img src="https://img2020.cnblogs.com/blog/1186521/202110/1186521-20211015170524754-1490945022.png" alt="" loading="lazy"></span></p>
<ul class="ul-list" data-mark="-">
<li class="md-list-item md-focus-container">
<p class="md-end-block md-p md-focus"><span class="md-pair-s md-expand"><code>navigateTo</code><span class="md-plain">, <span class="md-pair-s"><code>redirectTo</code><span class="md-plain"> 只能打开非 tabBar 页面。</span></span></span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-pair-s"><code>switchTab</code><span class="md-plain"> 只能打开 tabBar 页面。</span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-pair-s"><code>reLaunch</code><span class="md-plain"> 可以打开任意页面。</span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">页面底部的 tabBar 由页面决定,即只要是定义为 tabBar 的页面,底部都有 tabBar。</span></p>
</li>
<li class="md-list-item md-focus-container">
<p class="md-end-block md-p md-focus"><span class="md-plain">调用页面路由带的参数可以在目标页面的<span class="md-pair-s"><code>onLoad</code><span class="md-plain md-expand">中获取</span></span></span></p>
</li>
</ul>
<h3 class="md-end-block md-heading"><span class="md-plain md-expand">关于异步 API 返回 Promise</span></h3>
<p class="md-end-block md-p"><span class="md-plain">基础库 <span class="md-meta-i-cmd-link"><span class="md-plain">2.10.2</span><span class="md-plain"> 版本起,异步 API 支持 callback & promise 两种调用方式。当接口参数 Object 对象中不包含 success/fail/complete 时将默认返回 promise,否则仍按回调方式执行,无返回值</span></span></span></p>
<h3 class="md-end-block md-heading"><span class="md-plain">ES6 转 ES5</span></h3>
<p class="md-end-block md-p"><span class="md-plain">在 0.10.101000 以及之后版本的开发工具中,会默认使用 <span class="md-pair-s"><code>babel</code><span class="md-plain"> 将开发者 <span class="md-pair-s"><code>ES6</code><span class="md-plain"> 语法代码转换为三端都能很好支持的 <span class="md-pair-s"><code>ES5</code><span class="md-plain"> 的代码,帮助开发者解决环境不同所带来的开发问题</span></span></span></span></span></span></span></p>
<h3 class="md-end-block md-heading"><span class="md-plain">小程序检测版本更新(启动时更新和未启动时更新)</span></h3>
<p class="md-end-block md-p"><span class="md-pair-s "><strong>未启动时更新</strong></span></p>
<p class="md-end-block md-p"><span class="md-plain">开发者在管理后台发布新版本的小程序之后,如果某个用户本地有小程序的历史版本,此时打开的可能还是旧版本。微信客户端会有若干个时机去检查本地缓存的小程序有没有更新版本,如果有则会静默更新到新版本。总的来说,开发者在后台发布新版本之后,无法立刻影响到所有现网用户,但最差情况下,也在发布之后 24 小时之内下发新版本信息到用户。用户下次打开时会先更新最新版本再打开</span></p>
<p class="md-end-block md-p"><span class="md-pair-s "><strong>启动时更新</strong></span></p>
<p class="md-end-block md-p md-focus"><span class="md-plain">在app.js中载入</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"> onShow() {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">使用更新对象之前判断是否可用</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (wx.canIUse('getUpdateManager'<span style="color: rgba(0, 0, 0, 1)">)) {
const updateManager </span>=<span style="color: rgba(0, 0, 0, 1)"> wx.getUpdateManager()
updateManager.onCheckForUpdate(</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (res) {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 请求完新版本信息的回调</span>
console.log(res.hasUpdate) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> res.hasUpdate返回boolean类型</span>
<span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (res.hasUpdate) {
updateManager.onUpdateReady(</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> () {
wx.showModal({
title: </span>'更新提示'<span style="color: rgba(0, 0, 0, 1)">,
content: </span>'新版本已经准备好,是否重启当前应用?'<span style="color: rgba(0, 0, 0, 1)">,
success(res) {
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (res.confirm) {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 新的版本已经下载好,调用applyUpdate应用新版本并重启</span>
<span style="color: rgba(0, 0, 0, 1)"> updateManager.applyUpdate()
}
}
})
})
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 新版本下载失败时执行</span>
updateManager.onUpdateFailed(<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> () {
wx.showModal({
title: </span>'发现新版本'<span style="color: rgba(0, 0, 0, 1)">,
content: </span>'请删除当前小程序,重新搜索打开...'<span style="color: rgba(0, 0, 0, 1)">,
})
})
}
})
} </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">如果小程序需要在最新的微信版本体验,如下提示</span>
<span style="color: rgba(0, 0, 0, 1)"> wx.showModal({
title: </span>'更新提示'<span style="color: rgba(0, 0, 0, 1)">,
content: </span>'当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。'<span style="color: rgba(0, 0, 0, 1)">
})
}
},</span></pre>
</div>
<p>封装一个方法也行onLaunch()钩子中调用</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">checkUpdateVersion() {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">判断微信版本是否 兼容小程序更新机制API的使用</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (wx.canIUse('getUpdateManager'<span style="color: rgba(0, 0, 0, 1)">)) {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建 UpdateManager 实例</span>
const updateManager =<span style="color: rgba(0, 0, 0, 1)"> wx.getUpdateManager();
console.log(</span>'是否进入模拟更新'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">检测版本更新</span>
updateManager.onCheckForUpdate(<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (res) {
console.log(</span>'是否获取版本'<span style="color: rgba(0, 0, 0, 1)">,res);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 请求完新版本信息的回调</span>
<span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (res.hasUpdate) {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">监听小程序有版本更新事件</span>
updateManager.onUpdateReady(<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> () {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">TODO 新的版本已经下载好,调用 applyUpdate 应用新版本并重启 ( 此处进行了自动更新操作)</span>
<span style="color: rgba(0, 0, 0, 1)"> updateManager.applyUpdate();
})
updateManager.onUpdateFailed(</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> () {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 新版本下载失败</span>
<span style="color: rgba(0, 0, 0, 1)"> wx.showModal({
title: </span>'已经有新版本喽~'<span style="color: rgba(0, 0, 0, 1)">,
content: </span>'当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试!'<span style="color: rgba(0, 0, 0, 1)">,
})
})
}
})
} </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">TODO 此时微信版本太低(一般而言版本都是支持的)</span>
<span style="color: rgba(0, 0, 0, 1)"> wx.showModal({
title: </span>'更新提示'<span style="color: rgba(0, 0, 0, 1)">,
content: </span>'当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试!'<span style="color: rgba(0, 0, 0, 1)">
})
}
},</span></pre>
</div>
<h3 class="md-end-block md-heading"><span class="md-plain">低版本兼容处理</span></h3>
<p class="md-end-block md-p md-focus"><span class="md-plain md-expand">对于新增的 API,可以通过判断该API是否存在来判断是否支持用户使用的基础库版本</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (wx.openBluetoothAdapter) {
wx.openBluetoothAdapter()
} </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 如果希望用户在最新版本的客户端上体验您的小程序,可以这样子提示</span>
<span style="color: rgba(0, 0, 0, 1)">wx.showModal({
title: </span>'提示'<span style="color: rgba(0, 0, 0, 1)">,
content: </span>'当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。'<span style="color: rgba(0, 0, 0, 1)">
})
}</span></pre>
</div>
<p>对于 API 的参数或者返回值有新增的参数,可以判断用以下代码判断</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">wx.showModal({
success: </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(res) {
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (wx.canIUse('showModal.success.cancel'<span style="color: rgba(0, 0, 0, 1)">)) {
console.log(res.cancel)
}
}
})</span></pre>
</div>
<p>组件兼容处理使用组件的地方判断是否可支持使用</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">data: {
canIUse: wx.canIUse(</span>'cover-view'<span style="color: rgba(0, 0, 0, 1)">)
}</span></pre>
</div>
<p>设置最低基础库版本:登录小程序管理后台,进入「设置 - 基本设置 - 基础库最低版本设置」进行配置</p>
<h3 class="md-end-block md-heading"><span class="md-plain">小程序授权登录</span></h3>
<p><span class="md-plain"><img src="https://img2020.cnblogs.com/blog/1186521/202110/1186521-20211015170806606-246908841.png" alt="" loading="lazy"></span></p>
<ol class="ol-list" start="">
<li class="md-list-item md-focus-container">
<p class="md-end-block md-p md-focus"><span class="md-plain md-expand">调用 <span class="md-meta-i-cmd-link"><span class="md-plain">wx.login()</span><span class="md-plain"> 获取 <span class="md-pair-s "><strong>临时登录凭证code</strong><span class="md-plain"> ,并回传到开发者服务器。</span></span></span></span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">调用 <span class="md-meta-i-cmd-link"><span class="md-plain">auth.code2Session</span><span class="md-plain"> 接口,换取 <span class="md-pair-s "><strong>用户唯一标识 OpenID</strong><span class="md-plain"> 、 用户在微信开放平台帐号下的<span class="md-pair-s "><strong>唯一标识UnionID</strong><span class="md-plain">(若当前小程序已绑定到微信开放平台帐号) 和 <span class="md-pair-s "><strong>会话密钥 session_key</strong></span></span></span></span></span></span></span></span></p>
</li>
<li class="md-list-item md-focus-container">
<p class="md-end-block md-p md-focus"><span class="md-plain md-expand">临时登录凭证 code 只能使用一次</span></p>
</li>
</ol>
<h3 class="md-end-block md-heading"><span class="md-plain md-expand">配置流程</span></h3>
<p class="md-end-block md-p"><span class="md-plain">服务器域名请在 「小程序后台-开发-开发设置-服务器域名」 中进行配置,配置时需要注意:</span></p>
<ul class="ul-list" data-mark="-">
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">域名只支持 <span class="md-pair-s"><code>https</code><span class="md-plain"> (<span class="md-meta-i-cmd-link"><span class="md-plain">wx.request</span><span class="md-plain">、<span class="md-meta-i-cmd-link"><span class="md-plain">wx.uploadFile</span><span class="md-plain">、<span class="md-meta-i-cmd-link"><span class="md-plain">wx.downloadFile</span><span class="md-plain">) 和 <span class="md-pair-s"><code>wss</code><span class="md-plain"> (<span class="md-meta-i-cmd-link"><span class="md-plain">wx.connectSocket</span><span class="md-plain">) 协议;</span></span></span></span></span></span></span></span></span></span></span></span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">域名不能使用 IP 地址(小程序的<span class="md-meta-i-cmd-link"><span class="md-plain">局域网</span><span class="md-plain"> IP 除外)或 localhost;</span></span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">可以配置端口,如 <span class="md-link md-pair-s">https://myserver.com:8080<span class="md-plain">,但是配置后只能向 <span class="md-link md-pair-s">https://myserver.com:8080<span class="md-plain"> 发起请求。如果向 <span class="md-link md-pair-s">https://myserver.com<span class="md-plain">、<span class="md-link md-pair-s">https://myserver.com:9091<span class="md-plain"> 等 URL 请求则会失败。</span></span></span></span></span></span></span></span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">如果不配置端口。如 <span class="md-link md-pair-s">https://myserver.com<span class="md-plain">,那么请求的 URL 中也不能包含端口,甚至是默认的 443 端口也不可以。如果向 <span class="md-link md-pair-s">https://myserver.com:443<span class="md-plain"> 请求则会失败。</span></span></span></span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">域名必须经过 ICP 备案;</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">出于安全考虑,<span class="md-pair-s"><code>api.weixin.qq.com</code><span class="md-plain"> 不能被配置为服务器域名,相关API也不能在小程序内调用。</span></span></span></strong><span class="md-plain"> 开发者应将 AppSecret 保存到后台服务器中,通过服务器使用 <span class="md-pair-s"><code>getAccessToken</code><span class="md-plain"> 接口获取 <span class="md-pair-s"><code>access_token</code><span class="md-plain">,并调用相关 API;</span></span></span></span></span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">不支持配置父域名,使用子域名</span></p>
</li>
</ul>
<h3 class="md-end-block md-heading"><span class="md-plain">开发者代码注入优化</span></h3>
<p class="md-end-block md-p md-focus"><span class="md-plain">自基础库版本 2.11.1 起,小程序支持<span class="md-meta-i-cmd-link"><span class="md-pair-s "><strong>懒注入</strong></span><span class="md-plain">,在 <span class="md-pair-s"><code>app.json</code><span class="md-plain"> 中配置</span></span></span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">{
</span>"lazyCodeLoading": "requiredComponents"<span style="color: rgba(0, 0, 0, 1)">
}</span></pre>
</div>
<p class="md-end-block md-p"><span class="md-pair-s "><strong>添加这项配置后,未使用到的代码文件将不被执行</strong></span></p>
<h3 class="md-end-block md-heading"><span class="md-plain">其他优化</span></h3>
<p class="md-end-block md-p"><span class="md-plain md-expand">提前首屏数据请求</span></p>
<ol class="ol-list" start="">
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-meta-i-cmd-link"><span class="md-plain">数据预拉取</span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-meta-i-cmd-link"><span class="md-plain">周期性更新</span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">骨架屏</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">缓存请求数据</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">精简首屏数据:推荐开发者延迟请求非关键渲染数据,与视图层渲染无关的数据尽量不要放在 data 中,加快页面渲染完成时间</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">性能数据获取:<span class="md-meta-i-cmd-link"><span class="md-plain">小程序助手</span></span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">性能得分:</span></p>
<ul class="ul-list" data-mark="-">
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">首屏时间不超过 5 秒</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">渲染时间不超过 500ms</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">一个执行周期内脚本运行时间不超过 1 秒</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">每秒调用<span class="md-pair-s"><code>setData</code><span class="md-plain">的次数不超过 20 次</span></span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-pair-s"><code>setData</code><span class="md-plain">的数据在<span class="md-pair-s"><code>JSON.stringify</code><span class="md-plain">后不超过 256KB</span></span></span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">页面WXML节点少于 1000 个,节点树深度少于 30 层,子节点数不大于 60 个</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">所有图片均开启 HTTP 缓存</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">图片宽高乘积 <= 实际显示宽高乘积 <span>*<span class="md-plain"> (设备像素比 ^ 2)</span></span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">所有网络请求都在 1 秒内返回结果</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">通过<span class="md-pair-s"><code>wx.request</code><span class="md-plain">发起的耗时超过 300ms 的请求并发数不超过 10 个</span></span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">同域名耗时超过 100ms 的图片请求并发数不超过 6 个</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">3 分钟以内同一个url请求不出现两次回包大于 128KB 且一模一样的内容</span></p>
</li>
</ul>
</li>
</ol>
<h1 class="md-end-block md-heading md-focus"><span class="md-plain">小程序基础语法</span></h1>
<p><span class="md-plain">数据绑定</span></p>
<div class="cnblogs_code">
<pre><view> {{ message }} </view></pre>
</div>
<div class="cnblogs_code">
<pre><view id="item-{{id}}"> </view></pre>
</div>
<div class="cnblogs_code">
<pre><checkbox checked="{{false}}"> </checkbox></pre>
</div>
<p>三元运算</p>
<div class="cnblogs_code">
<pre><view hidden="{{flag ? true : false}}"> Hidden </view></pre>
</div>
<p>算术运算</p>
<div class="cnblogs_code">
<pre><view> {{a + b}} + {{c}} + d </view></pre>
</div>
<p>遍历</p>
<div class="cnblogs_code">
<pre><view wx:<span style="color: rgba(0, 0, 255, 1)">for</span>="{{array}}" wx:<span style="color: rgba(0, 0, 255, 1)">for</span>-index="idx" wx:<span style="color: rgba(0, 0, 255, 1)">for</span>-item="itemName"><span style="color: rgba(0, 0, 0, 1)">
{{idx}}: {{itemName.message}}
</span></view></pre>
</div>
<p><span class="md-plain">条件渲染(<span class="md-pair-s"><code>wx:if</code><span class="md-plain"> 有更高的切换消耗而 <span class="md-pair-s"><code>hidden</code><span class="md-plain md-expand"> 有更高的初始渲染消耗。因此,如果需要频繁切换的情景下,用 <span class="md-pair-s"><code>hidden</code><span class="md-plain"> 更好)</span></span></span></span></span></span></span></p>
<div class="cnblogs_code">
<pre><view wx:<span style="color: rgba(0, 0, 255, 1)">if</span>="{{condition}}"> </view></pre>
</div>
<p class="md-end-block md-p md-focus"><span class="md-plain md-expand">定义模板</span></p>
<p class="md-end-block md-p"><span class="md-plain">使用 name 属性,作为模板的名字。然后在<span class="md-pair-s"><code><template/></code><span class="md-plain">内定义代码片段</span></span></span></p>
<div class="cnblogs_code">
<pre><template name="msgItem">
<view>
<text> {{index}}: {{msg}} </text>
<text> Time: {{time}} </text>
</view>
</template></pre>
</div>
<p>使用模板:用 is 属性,声明需要的使用的模板,然后将模板所需要的 data 传入;</p>
<div class="cnblogs_code">
<pre><template is="msgItem" data="{{...item}}"/></pre>
</div>
<p><span class="md-plain">引用:WXML 提供两种文件引用方式<span class="md-pair-s"><code>import</code><span class="md-plain">和<span class="md-pair-s"><code>include</code></span></span></span></span></p>
<div class="cnblogs_code">
<pre><import src="item.wxml"/></pre>
</div>
<div class="cnblogs_code">
<pre><include src="header.wxml"/></pre>
</div>
<p class="md-end-block md-p"><span class="md-plain">import 有作用域的概念,即只会 import 目标文件中定义的 template,而不会 import 目标文件 import 的 template</span></p>
<p class="md-end-block md-p md-focus"><span class="md-pair-s"><code>include</code><span class="md-plain md-expand"> 可以将目标文件<span class="md-pair-s "><strong>除了</strong><span class="md-plain"> <span class="md-pair-s"><code><template/></code><span class="md-plain"> <span class="md-pair-s"><code><wxs/></code><span class="md-plain"> 外的整个代码引入,相当于是拷贝到 <span class="md-pair-s"><code>include</code><span class="md-plain"> 位置</span></span></span></span></span></span></span></span></span></span></p>
<h3 class="md-end-block md-heading"><span class="md-plain">tabbar的配置(小程序自带配置好页面和路径以及图标和选中图标即可生效)</span></h3>
<div class="cnblogs_code">
<pre>"tabBar"<span style="color: rgba(0, 0, 0, 1)">: {
</span>"color": "#6e6d6b"<span style="color: rgba(0, 0, 0, 1)">,
</span>"selectedColor": "#f9f027"<span style="color: rgba(0, 0, 0, 1)">,
</span>"borderStyle": "white"<span style="color: rgba(0, 0, 0, 1)">,
</span>"backgroundColor": "#000"<span style="color: rgba(0, 0, 0, 1)">,
</span>"list"<span style="color: rgba(0, 0, 0, 1)">: [
{
</span>"pagePath": "pages/index/index"<span style="color: rgba(0, 0, 0, 1)">,
</span>"iconPath": "images/tabbar-01.png"<span style="color: rgba(0, 0, 0, 1)">,
</span>"selectedIconPath": "images/tabbar-01-active.png"<span style="color: rgba(0, 0, 0, 1)">,
</span>"text": "首页"<span style="color: rgba(0, 0, 0, 1)">
},
{
</span>"pagePath": "pages/sort/index"<span style="color: rgba(0, 0, 0, 1)">,
</span>"iconPath": "images/tabbar-02.png"<span style="color: rgba(0, 0, 0, 1)">,
</span>"selectedIconPath": "images/tabbar-02-active.png"<span style="color: rgba(0, 0, 0, 1)">,
</span>"text": "分类"<span style="color: rgba(0, 0, 0, 1)">
},
{
</span>"pagePath": "pages/cart/index"<span style="color: rgba(0, 0, 0, 1)">,
</span>"iconPath": "images/tabbar-03.png"<span style="color: rgba(0, 0, 0, 1)">,
</span>"selectedIconPath": "images/tabbar-03-active.png"<span style="color: rgba(0, 0, 0, 1)">,
</span>"text": "购物车"<span style="color: rgba(0, 0, 0, 1)">
},
{
</span>"pagePath": "pages/my/index"<span style="color: rgba(0, 0, 0, 1)">,
</span>"iconPath": "images/tabbar-04.png"<span style="color: rgba(0, 0, 0, 1)">,
</span>"selectedIconPath": "images/tabbar-04-active.png"<span style="color: rgba(0, 0, 0, 1)">,
</span>"text": "我的"<span style="color: rgba(0, 0, 0, 1)">
}
]
},</span></pre>
</div>
<h3 class="md-end-block md-heading"><span class="md-plain">常用API </span></h3>
<p class="md-end-block md-p"><span class="md-plain">一般建议该用同步的时候就要用同步,同步解决不了的问题再用异步</span></p>
<p class="md-end-block md-p"><span class="md-pair-s"><span style="text-decoration: underline"><span class="md-pair-s "><strong>wx.canIUse(string schema)</strong></span></span></span></p>
<p class="md-end-block md-p md-focus"><span class="md-plain">判断小程序的API,回调,参数,组件等是否在当前版本可用</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">wx.getSystemInfo()系统信息(同步版本)
wx.getSystemInfoAsync()系统信息(异步版本)
wx.getSystemInfo() 获取系统信息[一般用这个就好]</span></pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
const res </span>=<span style="color: rgba(0, 0, 0, 1)"> wx.getSystemInfoSync()
console.log(res)
} </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (e) {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Do something when catch error</span>
}</pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">wx.getSystemInfo({
success (res) {
console.log(res)
}
})</span></pre>
</div>
<p class="md-end-block md-p"><span class="md-pair-s"><strong><span class="md-pair-s"><span style="text-decoration: underline"><span class="md-plain">wx.updateWeChatApp(Object object)</span></span></span></strong></span></p>
<p class="md-end-block md-p md-focus"><span class="md-plain md-expand">更新客户端版本。当判断用户小程序所在客户端版本过低时,可使用该接口跳转到更新微信页面</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">wx.updateWeChatApp({
success(res){
console.log(res,</span>'res'<span style="color: rgba(0, 0, 0, 1)">)
}
})</span></pre>
</div>
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-pair-s"><span style="text-decoration: underline"><span class="md-plain">wx.getUpdateManager()</span></span></span></strong></span></p>
<p class="md-end-block md-p"><span class="md-plain">获取<span class="md-pair-s "><strong>全局唯一</strong><span class="md-plain">的版本更新管理器,用于管理小程序更新(相关代码前面小程序检测版本更新章节有参考)</span></span></span></p>
<p class="md-end-block md-p"><span class="md-pair-s "><strong>关于小程序页面跳转</strong></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">wx.switchTab()
跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面
wx.reLaunch()
关闭所有页面,打开到应用内的某个页面
wx.redirectTo()
关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到 tabbar 页面
wx.navigateTo()
保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面。使用 wx.navigateBack 可以返回到原页面。小程序中页面栈最多十层
wx.navigateBack()
关闭当前页面,返回上一页面或多级页面。可通过 getCurrentPages 获取当前的页面栈,决定需要返回几层</span></pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">wx.switchTab({
url: </span>'/index'<span style="color: rgba(0, 0, 0, 1)">
})
wx.reLaunch({
url: </span>'test?id=1'<span style="color: rgba(0, 0, 0, 1)">
})
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 页面内获取参数</span>
<span style="color: rgba(0, 0, 0, 1)">Page({
onLoad (option) {
console.log(option.query)
}
})
wx.redirectTo({
url: </span>'test?id=1'<span style="color: rgba(0, 0, 0, 1)">
})
wx.navigateTo({
url: </span>'test?id=1'<span style="color: rgba(0, 0, 0, 1)">
})
wx.navigateBack({
delta: </span>2<span style="color: rgba(0, 0, 0, 1)">
})</span></pre>
</div>
<p class="md-end-block md-p"><span class="md-pair-s"><span style="text-decoration: underline"><span class="md-pair-s "><strong>wx.showLoading(Object object)</strong></span></span></span></p>
<p class="md-end-block md-p"><span class="md-pair-s"><span style="text-decoration: underline"><span class="md-pair-s "><strong>wx.showToast(Object object)</strong></span></span></span></p>
<ul class="ul-list" data-mark="-">
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-meta-i-c md-link md-expand"><span class="md-plain">wx.showLoading</span><span class="md-plain"> 和 <span class="md-meta-i-cmd-link"><span class="md-plain">wx.showToast</span><span class="md-plain"> 同时只能显示一个</span></span></span></span></p>
</li>
<li class="md-list-item md-focus-container">
<p class="md-end-block md-p md-focus"><span class="md-meta-i-cmd-link"><span class="md-plain">wx.showToast</span><span class="md-plain"> 应与 <span class="md-meta-i-cmd-link"><span class="md-plain">wx.hideToast</span><span class="md-plain"> 配对使用</span></span></span></span></p>
</li>
</ul>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">wx.showToast({
title: </span>'操作成功'<span style="color: rgba(0, 0, 0, 1)">,
icon: </span>'loading', <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> success(成功) | error(失败) | loading(加载中..) | none(无图标)</span>
duration: 2000<span style="color: rgba(0, 0, 0, 1)">,
})</span></pre>
</div>
<p><span class="md-pair-s md-expand"><strong><span class="md-pair-s"><span style="text-decoration: underline"><span class="md-plain">wx.showModal(Object object)</span></span></span></strong><span class="md-plain md-expand"> 显示模态对话框</span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">wx.showModal({
title: </span>'提示'<span style="color: rgba(0, 0, 0, 1)">,
content: </span>'这是一个模态弹窗'<span style="color: rgba(0, 0, 0, 1)">,
success (res) {
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (res.confirm) {
console.log(</span>'用户点击确定'<span style="color: rgba(0, 0, 0, 1)">)
} </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (res.cancel) {
console.log(</span>'用户点击取消'<span style="color: rgba(0, 0, 0, 1)">)
}
}
})</span></pre>
</div>
<p><span class="md-pair-s md-expand"><strong><span class="md-pair-s"><span style="text-decoration: underline"><span class="md-plain">wx.setNavigationBarTitle()</span></span></span></strong><span class="md-plain md-expand"> 动态设置当前页面的标题</span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">wx.setNavigationBarTitle({
title:</span>'自定义标题覆盖当前设置的'<span style="color: rgba(0, 0, 0, 1)">
})</span></pre>
</div>
<p><span class="md-pair-s "><strong><span class="md-pair-s"><span style="text-decoration: underline"><span class="md-plain">wx.setNavigationBarColor()</span></span></span></strong><span class="md-plain"> 设置页面导航条颜色 背景字体样式对应api也可设置</span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">wx.setNavigationBarColor({
frontColor: </span>'#ffffff'<span style="color: rgba(0, 0, 0, 1)">,
backgroundColor: </span>'#ff0000'<span style="color: rgba(0, 0, 0, 1)">,
animation: {
duration: </span>400<span style="color: rgba(0, 0, 0, 1)">,
timingFunc: </span>'easeIn'<span style="color: rgba(0, 0, 0, 1)">
}
})</span></pre>
</div>
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-pair-s"><span style="text-decoration: underline"><span class="md-plain">wx.hideHomeButton()</span></span></span></strong><span class="md-plain"> 隐藏返回首页按钮</span></span></p>
<p class="md-end-block md-p"><span class="md-plain">微信7.0.7版本起,当用户打开的小程序最底层页面是非首页时,默认展示“返回首页”按钮,开发者可在页面 onShow 中调用 hideHomeButton 进行隐藏。</span></p>
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-pair-s"><span style="text-decoration: underline"><span class="md-plain">wx.showTabBar()</span></span></span></strong><span class="md-plain"> 显示 tabBar</span></span></p>
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-pair-s"><span style="text-decoration: underline"><span class="md-plain">wx.hideTabBar()</span></span></span></strong><span class="md-plain"> 隐藏 tabBar</span></span></p>
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-pair-s"><span style="text-decoration: underline"><span class="md-plain">wx.pageScrollTo(Object object)</span></span></span></strong></span></p>
<p class="md-end-block md-p"><span class="md-plain">将页面滚动到目标位置,支持选择器和滚动距离两种方式定位</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">wx.pageScrollTo({
scrollTop: </span>0<span style="color: rgba(0, 0, 0, 1)">,
duration: </span>300<span style="color: rgba(0, 0, 0, 1)">
})</span></pre>
</div>
<p><span class="md-pair-s"><strong><span class="md-pair-s"><span style="text-decoration: underline"><span class="md-plain">wx.request(Object object)</span></span></span></strong><span class="md-plain"> 网络请求(ajax)</span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">wx.request({
url: </span>'/api/login', <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">仅为示例,并非真实的接口地址</span>
<span style="color: rgba(0, 0, 0, 1)">data: {
parmas1: </span>''<span style="color: rgba(0, 0, 0, 1)">,
parmas2: </span>''<span style="color: rgba(0, 0, 0, 1)">
},
header: {
</span>'content-type': 'application/json' <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 默认值</span>
<span style="color: rgba(0, 0, 0, 1)">},
success (res) {
console.log(res.data)
}
})</span></pre>
</div>
<p><span class="md-pair-s "><strong><span class="md-pair-s"><span style="text-decoration: underline"><span class="md-plain">wx.uploadFile()</span></span></span></strong><span class="md-plain"> 上传文件</span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">wx.chooseImage({
success (res) {
const tempFilePaths </span>=<span style="color: rgba(0, 0, 0, 1)"> res.tempFilePaths
wx.uploadFile({
url: </span>'https://example.weixin.qq.com/upload', <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">仅为示例,非真实的接口地址</span>
filePath: tempFilePaths,
name: </span>'file'<span style="color: rgba(0, 0, 0, 1)">,
formData: {
</span>'user': 'test'<span style="color: rgba(0, 0, 0, 1)">
},
success (res){
const data </span>=<span style="color: rgba(0, 0, 0, 1)"> res.data
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">do something</span>
<span style="color: rgba(0, 0, 0, 1)"> }
})
}
})</span></pre>
</div>
<p><span class="md-pair-s md-expand"><strong><span class="md-pair-s"><span style="text-decoration: underline"><span class="md-plain">wx.downloadFile()</span></span></span></strong><span class="md-plain md-expand"> 下载文件</span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">wx.downloadFile({
url: </span>'https://example.com/audio/123', <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">仅为示例,并非真实的资源</span>
<span style="color: rgba(0, 0, 0, 1)">success (res) {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 只要服务器有响应数据,就会把响应内容写入文件并进入 success 回调,业务需要自行判断是否下载到了想要的内容</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (res.statusCode === 200<span style="color: rgba(0, 0, 0, 1)">) {
wx.playVoice({
filePath: res.tempFilePath
})
}
}
})</span></pre>
</div>
<p><strong><span class="md-pair-s"><span style="text-decoration: underline"><span class="md-plain">小程序数据缓存</span></span></span></strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">wx.setStorageSync() 将数据存储在本地缓存中指定的key中(同步)
wx.setStorage()从本地缓存中移除指定 key(异步)
wx.removeStorageSync() 从本地缓存中移除指定 key[同步]
wx.removeStorage() 从本地缓存中移除指定 key[异步]
wx.getStorageSync() 从本地缓存中获取指定 key[同步]
wx.getStorage() 从本地缓存中获取指定 key[异步]
wx.clearStorageSync() 清除缓存所有key[同步]
wx.clearStorage() 清除缓存所有key[异步]
wx.getStorageInfoSync() 从本地缓存中获取所有 key(同步)
wx.getStorageInfo() 从本地缓存中获取所有key(异步)
最后面两个几乎用不上</span></pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置</span>
<span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
wx.setStorageSync(</span>'key', 'value'<span style="color: rgba(0, 0, 0, 1)">)
} </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (e) { }
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 移除</span>
<span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
wx.removeStorageSync(</span>'key'<span style="color: rgba(0, 0, 0, 1)">)
} </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (e) {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Do something when catch error</span>
<span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 获取</span>
<span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">var</span> value = wx.getStorageSync('key'<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (value) {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Do something with return value</span>
<span style="color: rgba(0, 0, 0, 1)">}
} </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (e) {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Do something when catch error</span>
<span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 清除</span>
<span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
wx.clearStorageSync()
} </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)">(e) {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Do something when catch error</span>
}</pre>
</div>
<p class="md-end-block md-p md-focus"><span class="md-pair-s "><strong><span class="md-pair-s"><span style="text-decoration: underline"><span class="md-plain">wx.getLocation()</span></span></span></strong><span class="md-plain"> 获取当前的地理位置、速度。<span class="md-softbreak"> <span class="md-plain">开启高精度定位,接口耗时会增加,可指定 highAccuracyExpireTime 作为超时时间。<span class="md-pair-s "><strong>地图相关使用的坐标格式应为 gcj02。</strong><span class="md-plain md-expand">高频率调用会导致耗电,如有需要可使用持续定位接口 wx.onLocationChange()</span></span></span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-plain">使用:在app.json文件中配置</span></p>
<div class="cnblogs_code">
<pre>"permission"<span style="color: rgba(0, 0, 0, 1)">: {
</span>"scope.userLocation"<span style="color: rgba(0, 0, 0, 1)">: {
</span>"desc": "你的位置信息将用于小程序位置接口的效果展示"<span style="color: rgba(0, 0, 0, 1)">
}
}</span></pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">wx.getLocation({
type: </span>'wgs84'<span style="color: rgba(0, 0, 0, 1)">,
success (res) {
console.log(res,</span>'res'<span style="color: rgba(0, 0, 0, 1)">)
}
})</span></pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">wx.getLocation({
type: </span>'gcj02', <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">返回可以用于wx.openLocation的经纬度</span>
<span style="color: rgba(0, 0, 0, 1)"> success (res) {
const latitude </span>=<span style="color: rgba(0, 0, 0, 1)"> res.latitude
const longitude </span>=<span style="color: rgba(0, 0, 0, 1)"> res.longitude
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 使用微信内置地图查看位置</span>
<span style="color: rgba(0, 0, 0, 1)"> wx.openLocation({
latitude,
longitude,
scale: </span>18 <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 5 - 18 级 缩放比例</span>
<span style="color: rgba(0, 0, 0, 1)"> })
}
})</span></pre>
</div>
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-pair-s"><span style="text-decoration: underline"><span class="md-plain">wx.chooseLocation()</span></span></span></strong><span class="md-plain"> 打开地图选择位置</span></span></p>
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-pair-s"><span style="text-decoration: underline"><span class="md-plain">wx.showShareMenu()</span></span></span></strong><span class="md-plain"> 显示当前页面的转发按钮参数</span></span></p>
<ul class="ul-list" data-mark="-">
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">"shareAppMessage"表示“发送给朋友”按钮,"shareTimeline"表示“分享到朋友圈”按钮</span></p>
</li>
<li class="md-list-item md-focus-container">
<p class="md-end-block md-p md-focus"><span class="md-plain md-expand">显示“分享到朋友圈”按钮时必须同时显示“发送给朋友”按钮,显示“发送给朋友”按钮时则允许不显示“分享到朋友圈”按钮</span></p>
</li>
</ul>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">wx.showShareMenu({
withShareTicket: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
menus: [</span>'shareAppMessage', 'shareTimeline'<span style="color: rgba(0, 0, 0, 1)">]
})</span></pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 隐藏当前页面的转发按钮</span>
<span style="color: rgba(0, 0, 0, 1)">wx.hideShareMenu({
menus: [</span>'shareAppMessage', 'shareTimeline'<span style="color: rgba(0, 0, 0, 1)">]
})</span></pre>
</div>
<p><span class="md-pair-s "><strong><span class="md-pair-s"><span style="text-decoration: underline"><span class="md-plain">wx.showShareImageMenu()</span></span></span></strong><span class="md-plain"> 打开分享图片弹窗</span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">wx.showShareImageMenu({
path: </span>'../../images/tabbar-01-active.png'<span style="color: rgba(0, 0, 0, 1)">,
})</span></pre>
</div>
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-pair-s"><span style="text-decoration: underline"><span class="md-plain">wx.shareVideoMessage()</span></span></span></strong><span class="md-plain"> 转发视频到聊天(功能类似分享图片)</span></span></p>
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-pair-s"><span style="text-decoration: underline"><span class="md-plain">wx.shareFileMessage()</span></span></span></strong><span class="md-plain"> 转发文件到聊天(功能类似分享图片)</span></span></p>
<p class="md-end-block md-p md-focus"><span class="md-pair-s "><strong><span class="md-pair-s"><span style="text-decoration: underline"><span class="md-plain">wx.scanCode()</span></span></span></strong><span class="md-plain"> 调起客户端扫码界面进行扫码</span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 允许从相机和相册扫码</span>
<span style="color: rgba(0, 0, 0, 1)">wx.scanCode({
success (res) {
console.log(res)
}
})</span></pre>
</div>
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-pair-s"><span style="text-decoration: underline"><span class="md-plain">wx.authorize()</span></span></span></strong><span class="md-plain"> 授权 </span></span></p>
<p class="md-end-block md-p"><span class="md-plain">调用后会立刻弹窗询问用户是否同意授权小程序使用某项功能或获取用户的某些数据,但不会实际调用对应接口。如果用户之前已经同意授权,则不会出现弹窗,直接返回成功。</span></p>
<p class="md-end-block md-p"><span class="md-plain">小程序插件可以使用 <span class="md-meta-i-cmd-link"><span class="md-plain">wx.authorizeForMiniProgram</span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 可以通过 wx.getSetting 先查询一下用户是否授权了 "scope.record" 这个 scope</span>
<span style="color: rgba(0, 0, 0, 1)">wx.getSetting({
success(res) {
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (!res.authSetting['scope.record'<span style="color: rgba(0, 0, 0, 1)">]) {
wx.authorize({
scope: </span>'scope.record'<span style="color: rgba(0, 0, 0, 1)">,
success () {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 用户已经同意小程序使用录音功能,后续调用 wx.startRecord 接口不会弹窗询问</span>
<span style="color: rgba(0, 0, 0, 1)"> wx.startRecord()
}
})
}
}
})</span></pre>
</div>
<p><strong><span class="md-plain">授权列表</span></strong></p>
<p><strong><img src="https://img2020.cnblogs.com/blog/1186521/202110/1186521-20211015171837912-1477402460.png" alt="" loading="lazy"></strong></p>
<p class="md-end-block md-p"><span class="md-pair-s "><strong>授权有效期</strong></span></p>
<p class="md-end-block md-p"><span class="md-plain">一旦用户明确同意或拒绝过授权,其授权关系会记录在后台,直到用户主动删除小程序。</span></p>
<p class="md-end-block md-p"><span class="md-pair-s "><strong>最佳实践</strong></span></p>
<p class="md-end-block md-p"><span class="md-plain">在真正需要使用授权接口时,才向用户发起授权申请,并在授权申请中说明清楚要使用该功能的理由。</span></p>
<p class="md-end-block md-p"><span class="md-pair-s "><strong>注意事项</strong></span></p>
<ol class="ol-list" start="">
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-pair-s"><code>wx.authorize({scope: "scope.userInfo"})</code><span class="md-plain">,不会弹出授权窗口,请使用 <span class="md-tag md-raw-inline"><button open-type="getUserInfo"/><span class="md-plain"> <span class="md-meta-i-cmd-link"><span class="md-plain">[``](https://developers.weixin.qq.com/miniprogram/dev/component/button.html)</span></span></span></span></span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">需要授权 <span class="md-pair-s"><code>scope.userLocation</code><span class="md-plain"> <span class="md-pair-s"><code>scope.userLocationBackground</code><span class="md-plain"> 时必须<span class="md-meta-i-cmd-link"><span class="md-plain">配置地理位置用途说明</span></span></span></span></span></span></span></p>
</li>
</ol>
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-pair-s"><span style="text-decoration: underline"><span class="md-plain">wx.navigateToMiniProgram()</span></span></span></strong><span class="md-plain"> 打开另一个小程序</span></span></p>
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-pair-s"><span style="text-decoration: underline"><span class="md-plain">wx.navigateBackMiniProgram()</span></span></span></strong><span class="md-plain"> 返回到上一个小程序</span></span></p>
<p class="md-end-block md-p"><span class="md-plain">只有在当前小程序是被其他小程序打开时可以调用成功</span></p>
<p class="md-end-block md-p"><span class="md-plain">注意:<span class="md-pair-s "><strong>微信客户端 iOS 6.5.9,Android 6.5.10 及以上版本支持</strong></span></span></p>
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-pair-s"><span style="text-decoration: underline"><span class="md-plain">wx.getUserProfile()</span></span></span></strong><span class="md-plain"> 获取用户信息</span></span></p>
<p class="md-end-block md-p"><span class="md-plain">页面产生点击事件(例如 <span class="md-pair-s"><code>button</code><span class="md-plain"> 上 <span class="md-pair-s"><code>bindtap</code><span class="md-plain"> 的回调中)后才可调用,每次请求都会弹出授权窗口,用户同意后返回 <span class="md-pair-s"><code>userInfo</code><span class="md-plain">。该接口用于替换 <span class="md-pair-s"><code>wx.getUserInfo</code></span></span></span></span></span></span></span></span></p>
<p class="md-end-block md-p md-focus"><span class="md-plain">优化改进规则:<span class="md-link md-pair-s">https://developers.weixin.qq.com/community/develop/doc/000cacfa20ce88df04cb468bc52801?highLine=login</span></span></p>
<div class="cnblogs_code">
<pre><block wx:elif="{{!hasUserInfo}}">
<button wx:<span style="color: rgba(0, 0, 255, 1)">if</span>="{{canIUseGetUserProfile}}" bindtap="getUserProfile"> 获取头像昵称 </button>
<button wx:elif="{{canIUse}}" open-type="getUserInfo" bindgetuserinfo="getUserInfo"> 获取头像昵称 </button>
<view wx:<span style="color: rgba(0, 0, 255, 1)">else</span>> 请使用1.4.4及以上版本基础库 </view>
</block>
<block wx:<span style="color: rgba(0, 0, 255, 1)">else</span>>
<image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" mode="cover"></image>
<text class="userinfo-nickname"> {{userInfo.nickName}}</text>
</block></pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"> getUserProfile(e) {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需用户确认,开发者妥善保管用户快速填写的头像昵称,避免重复弹窗</span>
<span style="color: rgba(0, 0, 0, 1)"> wx.getUserProfile({
desc: </span>'展示用户信息', <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写</span>
success: (res) =><span style="color: rgba(0, 0, 0, 1)"> {
console.log(res)
</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setData({
userInfo: res.userInfo,
hasUserInfo: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
})
}
})
},
getUserInfo(e) {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 不推荐使用getUserInfo获取用户信息,预计自2021年4月13日起,getUserInfo将不再弹出弹窗,并直接返回匿名的用户个人信息</span>
<span style="color: rgba(0, 0, 0, 1)"> console.log(e)
</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setData({
userInfo: e.detail.userInfo,
hasUserInfo: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
})
}</span></pre>
</div>
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-pair-s"><span style="text-decoration: underline"><span class="md-plain">wx.login()</span></span></span></strong><span class="md-plain"> 调用接口获取登录凭证(code)</span></span></p>
<p class="md-end-block md-p"><span class="md-plain">通过凭证进而换取用户<span class="md-pair-s "><strong>登录态信</strong><span class="md-plain">息,包括用户在当前小程序的唯一标识(openid)、微信开放平台帐号下的唯一标识(unionid,若当前小程序已绑定到微信开放平台帐号)及本次登录的会话密钥(session_key)等</span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 登录</span>
<span style="color: rgba(0, 0, 0, 1)">wx.login({
success: res </span>=><span style="color: rgba(0, 0, 0, 1)"> {
console.log(res,</span>'login信息'<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 发送 res.code 到后台换取 openId,sessionKey, unionId</span>
<span style="color: rgba(0, 0, 0, 1)"> }
})</span></pre>
</div>
<p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-pair-s"><span style="text-decoration: underline"><span class="md-plain">wx.checkSession()</span></span></span></strong><span class="md-plain"> 检查登录态是否过期</span></span></p>
<p class="md-end-block md-p"><span class="md-plain">通过 wx.login 接口获得的用户登录态拥有一定的时效性。用户越久未使用小程序,用户登录态越有可能失效。反之如果用户一直在使用小程序,则用户登录态一直保持有效。具体时效逻辑由微信维护,对开发者透明。开发者只需要调用 wx.checkSession 接口检测当前用户登录态是否有效。</span></p>
<p class="md-end-block md-p"><span class="md-plain">登录态过期后开发者可以再调用 wx.login 获取新的用户登录态。调用成功说明当前 session_key 未过期,调用失败说明 session_key 已过期。</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">wx.checkSession({
success () {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">session_key 未过期,并且在本生命周期一直有效</span>
<span style="color: rgba(0, 0, 0, 1)">},
fail () {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> session_key 已经失效,需要重新执行登录流程</span>
wx.login() <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">重新登录</span>
<span style="color: rgba(0, 0, 0, 1)">}
})</span></pre>
</div>
<p class="md-end-block md-p md-focus"><span class="md-plain md-expand">如果你只是用wx.login实现用户快速登陆账号,那么不需要使用checkSession。</span></p>
<p class="md-end-block md-p"><span class="md-plain">除非服务端与小程序API交互需要用session_key时候(例如 获取用户绑定的手机号),不过期无所谓,过期了就重新wx.login,给后台换新的session_key</span></p>
<p class="md-end-block md-p"><span class="md-plain">wx.checkSession几乎没有必要调用,而且他本身耗时,长达300+ms</span></p>
<p class="md-end-block md-p"><span class="md-plain">以上API是较为常用的在实际项目开发中梳理了一遍; 其他API遵照官方文档即可;</span></p>
<h1 class="md-end-block md-heading"><span class="md-plain">公众号关联小程序</span></h1>
<p class="md-end-block md-p"><span class="md-pair-s "><strong>关联规则:</strong></span></p>
<ol class="ol-list" start="">
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">所有公众号都可以关联小程序。</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">公众号可关联10个同主体,3个非同主体小程序。公众号一个月可新增关联小程序13次。</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">小程序可设置无需关联确认。设置后,公众号关联小程序不需要小程序确认,单方操作即可关联成功。</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">小程序可设置需关联确认。设置后,公众号关联小程序需小程序管理员确认后才能关联成功。</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">小程序可设置不允许被关联。设置后,公众号无法关联此小程序。</span></p>
</li>
</ol>
<p class="md-end-block md-p"><span class="md-pair-s "><strong>关联流程:</strong></span></p>
<p class="md-end-block md-p"><span class="md-plain">登录公众号后台-小程序-小程序管理-添加-关联小程序</span></p>
<p class="md-end-block md-p md-focus"><span class="md-plain"> "style": "v2" wx7f576b5fa5065792</span></p>
<h1 class="md-end-block md-heading"><span class="md-plain">结语</span></h1>
<p class="md-end-block md-p"><span class="md-plain">以上就是小程序开发流程规范以及常用的API使用和注意的点,具体和齐全api参照官方文档!以上内容自己总结,未经允许,请勿随意转载~谢谢合作!</span></p>
</div>
<div id="MySignature" role="contentinfo">
<p>本文来自博客园,作者:鱼樱前端,转载请注明原文链接:https://www.cnblogs.com/lhl66/p/15411951.html</p><br><br>
来源:https://www.cnblogs.com/lhl66/p/15411951.html
頁:
[1]