- 报告一个文档问题
https://developers.weixin.qq.com/doc/oplatform/openApi/OpenApiDoc/thirdparty-management/template-management/addToTemplate.html [图片] "小程序模板库介绍"链接的文档并没有说明标准模板库和普通模板库的区别。
2024-09-20 - 小程序直播组件开通不了
小程序直播组件开通不了吗
02-24 - 小程序插件里面有微信支付。一定要用wx.requestPluginPayment吗?
我添加了一个小程序插件。插件的内容里面包含了微信支付。原先在小程序里面是用wx.requestPayment.现在在插件里面一定要用wx.requestPluginPayment调起支付吗
01-16 - Skyline 渲染引擎常见问题
Skyline 一定需要应用到整个小程序吗? 不需要,Skyline 支持按页面粒度开启,建议开发者逐个页面适配 在 Skyline 模式下,为什么使用真机调试会显示空白并且工具报错? 目前 Skyline 模式下暂不支持真机调试,建议使用真机预览完成调试,平台在尽快支持真机调试能力。 在 Skyline 模式下,为什么微信开发者工具热重载无响应? Skyline 模式暂不支持热重载,建议先关闭热重载,重新编译来预览渲染结果。后续平台将支持热重载能力。 开启 Skyline 后布局错乱 大多是由于没有全局滚动而导致挤压,以及 flex-direction 默认为 column 造成。前者只需要加上 scroll-view,后者可以在声明了display:flex 但又没指定 flex-direction的地方显示指定flex-direction:row。推荐开发者开启默认 Block 布局。 切换 Skyline后,为什么顶部原生导航栏消失? 不支持原生导航栏,需自行实现,或使用 weui 组件库 伪类及伪元素部分支持 对于伪类,目前只支持常用的 :first-child 和 :last-child 。其它伪类可通过按需添加 class 替代,如 :active 则手动给点击状态下的节点加个.active class 对于伪元素,目前只支持 ::before 和:after。其它伪元素建议用真实 WXML 节点实现。 全局固定元素失效 因不支持 fixed 导致,但由于没有全局滚动,在页面根节点下使用 absolute 即可达到 fixed 的效果,倘若封装原因无法移至页面根节点,可使用 root-portal 组件包裹 切换 Skyline 后,为什么 position: absolute 相对坐标不准确? 在 Skyline 模式下,所有节点默认是 relative,可能导致 absolute 相对坐标不准。建议开发者修改节点 position 或者修改相对坐标。 多段文本无法内联 因不支持 inline 布局导致,需改成 flex 布局实现,或者使用 text 组件包裹多段文本,而不是用 view 组件包裹,也可以使用 span 组件包裹 text 和 image 混合内联。如 、<span><image /></span>,<span><view style="width: 50px;"/></span> 多行文本的省略样式失效 在单行文本省略的基础上,通过 text 组件的 max-lines 属性设置最长行数,即 <text max-lines="{{2}}"></text> z-index 表现异常 这是由于 Skyline 不支持 web 标准的层叠上下文所致,只有在同层级的节点之前应用 z-index才有效,可根据实际情况调整取值 weui 扩展库无法使用 平台正在支持扩展库,预计近期上线。建议开发者使用 npm 安装 weui 组件库 后,将 node_ modules/weui-miniprogram 下的miniprogram_ dist 替换为 链接 中的 miniprogram_dist,然后在微信开发中工具中构建 npm 即可。 不支持组件 animate 动画接口 暂不支持组件 animate 动画接口。如需实现相关效果,可使用 worklet 动画机制 实现 svg 渲染不正确 Skyline 上的 SVG 不支持 <style> 选择器匹配,可自行转成内联的方式;不支持 rgba 格式,可使用 fill-opacity 替代;建议用 SVGO 在线工具优化 scroll-view 横向滚动不生效 横向滚动需打开 enable-flex 以兼容 WebView,同时 scroll-view 添加样式 display: flex; flex-direction: row;,scroll-view 子节点添加样式 flex-shrink: 0; icon-font 图标不显示 最新版本已支持伪元素,低版本可参考 代码片段 实现图标
2023-10-18 - 2024年微信小程序优化神器:Donut-产品体验分析
写在前面 自古深情留不住,唯有套路得人心! 小程序We分析大家肯定都很熟悉,里边有很多指标,今天只讲其中的两个指标,用户留存率,用户使用时长。要想留住用户,首先需要站在用户的角度去思考,理解他们的痛点和需求。只有深入了解用户的需求,才能为他们提供贴合实际、解决问题的产品和服务。 除非跟用户有很好的互动和良好的反馈(比如开放社区),很多情况我们并不能真正站在用户的角度去考虑,基本是根据以往经验来想象用户的需求。 之前做H5开发,为了统计了解用户的操作情况,都需要自己做一些数据埋点,例如百X统计。这种方式不仅繁琐,且不够直观。 Donut开发平台:产品体验分析 微信Donut开发平台有4大模块:多端框架、安全网关、多端身份登录、产品体验分析。之前对Donut的印象一直停留在前两个模块上面(这里要甩个锅给官方,因为官方一直大力推广这两个模块,看看多端框架和安全网关有多少文章 -.-) 前阵子才发现产品体验分析这个模块,花费5分钟了解,接入功能后3分钟就能看到详细数据分析,感觉相见恨晚。目前这个模块还是公测期间,基本免费使用!不需要一行代码,就能快速发现产品优化的方向! 重点功能推荐 可视化日志 可视化日志可以精准还原用户在小程序内的全部操作过程,就像上帝视角一样。 可视化日志是单个用户完整的一次体验为一条记录,可以通过几十个维度种条件筛选日志。 举个例子:筛选活跃时长小于10S的用户,查看此类用户操作过程来分析用户是对首页功能的不了解还是页面太繁杂找不到自己想要的功能,着重优化首页布局或增加新手引导等设计,优化用户体验时长以及提升留存率! [图片] [图片] 热力图 热力图功能可以非常直观的看到用户高频点击的页面元素和页面滚动的深度,也可以多维度筛选某些条件下的热力图情景,一目了然。 我们可以根据热力详情优化页面的功能、布局等 [图片] 自动生成体验分析报告 用户体验数据有了,自己懒得分析或者刚开始用不知道如何下手,可以看体验分析报告。 体验分析报告会从8个大的维度进行总结分析结果。 例如记录出未访问过的页面,页面最低访问时长 首屏加载速度处于同行业什么水平、什么场景加载速度最慢 用户在什么页面或者什么操作下容易流失 单个页面加载、浏览等数据详情、访问时长分布 重点数据分析: 浏览不足3s的访问、异常事件的出现次数,无效点击的次数 等等等等… [图片] 总结 通过近期对产品体验功能的体验,还是非常推荐这个功能,奇怪的是这么好用的功能平台竟然没有大力推广 不懂技术无所谓,项目所有角色成员基本都能看懂! 目前产品还是在公测中,功能页面可能有一些小BUG,主要功能模块是不影响使用的,目前基本处于免费状态,不需要代码就能体验热力图可视化日志功能,非常赞!希望这个产品继续丰富完善下去。 相关链接 产品体验分析 · 官方文档 功能控制台
2024-08-22 - 微信开放平台更换服务器证书通知
微信开发者: 微信开放平台使用 HTTPS 协议来确保通信的安全性。在开发者调用微信开放平台 API 的过程中,会通过服务器证书来验证微信服务器及其域名的真实性。 由于 Mozilla 信任库更新了其根证书信任策略,微信开放平台计划于 2024 年 10 月 22 日 0:00 开始,逐步更换我们的服务器证书。新的证书将由 DigiCert Global Root G2 签发,替代现有的 DigiCert Global Root CA (G1)。 为确保此次服务器证书更换不会影响到你的正常服务,我们强烈建议你通知贵司技术开发人员仔细阅读我们提供的《微信开放平台新服务器证书兼容性验证指引》,请确保在 2024 年 10 月 22 日 0:00 前完成对微信开放平台新服务器证书的验证。 服务器证书验证仅涉及技术层面的工作,感谢你的理解和配合。 微信团队 2024年7月22日
2024-07-23 - 【微信小程序年审认证】微信小程序一次性认证转变为年审制度?关于小程序年审你想知道的都在这里!
这两年关于小程序,官方进行了大量的改革和变化!如小程序需要备案、手机号快速验证开始收费等,现在小程序认证,也将从一次性认证,转变为年审制度了!微信官方,在这段时间针对小程序年审,也开启了灰度测试,部分来一间商家,也收到来自微信公众平台的小程序年审通知。那关于小程序年审的内容,我们总结在这篇文章,希望能够帮助到来一间商家,提前准备资料,避免错过年审时间,导致小程序无法使用! 小程序年审需要准备哪些材料 营业执照 对公账户信息 认证联系人信息 小程序年审流程 1、登录小程序后台 登录小程序后台(https://mp.weixin.qq.com),收到年审通知的来一间商家,登录以后,会直接在首页显示年审通知,通过“去年审”按钮,可进入微信认证界面! 登录小程序后台-设置-基本设置-微信认证,可以查看到当前小程序认证状态,目前是否需要年审! [图片] 2、同意协议 点击去年审后,第一步为勾选同意《微信公众平台认证服务协议》 [图片] 3、填写资料 选择认证主体类型,根据提示,提交相应的认证材料(营业执照、对公账户、法人信息)可自主选择主体验证方式(对公账户打款、法人扫脸、电子营业执照验证) (个体工商户和企业类型准备材料大体一致,个体工商户无需准备对公账户、验证方式仅为法人扫脸) [图片] 4、确认名称 来一间商家,如有修改小程序名称需求,可在这步进行名称修改,如果名称检查名称不合规,可上传商标进行认证,可能会有原有小程序名,认证不通过的可能,需要注意! (命名规则:账号名不得侵犯注册商标专用权,小程序名称具有唯一性) [图片] 5、发票填写 输入发票基本信息,如发票类型、发票抬头、税号、备注等信息 [图片] 6、费用支付 支付审核费用,目前仅支持微信支付,企业主体需缴纳300元认证费,个人主体目前需缴纳30元认证费;审核时长大概在支付完费用后的1到3天内完成 认证状态查看路径:设置-微信认证-查看,也可以拨打第三方审核公司客服电话进行查询。 提示: 由于认证需要审核过程,建议预留一些时间,避免认证中断,影响小程序正常使用! 小程序年审注意事项 1、之前通过服务商接口进行小程序认证的商家,如有收到年审通知,也需要进行年审 2、因为官方目前对小程序年审制度属于灰度测试,所以暂未收到年审通知的商家,可不用进行年审操作 3、小程序不能通过公众号资质复用进行认证了,选择资质复用,仅会保留认证信息,还需另外缴纳费用! 4、认证审核通过后,有效期为“t+365天”。(注:t 为原认证到期时间) 5、平台将在认证到期前的3个月、2个月、1个月、7天提醒用户进行年审,如未在规定时间内完成年审,将会影响账号功能正常使用。
2024-01-22 - 微信认证年审相关说明
1、微信认证年审的费用需要多少? 微信认证年审费用,跟首次微信认证一样,都是300元/次,是支付给第三方专业审核机构的审核服务费用。 2、微信认证年审时,主体(企业/组织)全称为什么不能修改? 由于认证主体变更,可能出现相关商业收入被盗取到其他企业/组织的情况;同时他人关注公众号是因为它是A企业,如果突然变成B企业,也会降低平台和帐号对用户的公信力。因此,微信认证年审时,认证主体(企业/组织)全称不支持修改。 温馨提示:若同一家企业,只是名称发生变更的情况,可提交工商变更证明材料,审核公司核实属实之后可变更名称。 3、之前已经通过微信认证名称为“A123”年审是否还能用“A123”微信认证帐号命名原则? 只要符合微信认证命名规则,年审时还是可以继续使用“A123”作为帐号名称。 温馨提示: 若同一家企业,只是名称发生变更的情况,可提交变更证明材料,审核公司核实属实之后可变更名称; 保护注册商标原则:帐号名称不得侵犯注册商标专用权,否则、可能不通过帐号名称审核,或被权利人进行侵权投诉; 认证命名唯一原则:帐号名称不得与认证成功时间在先的帐号名称重复,否则将不能通过帐号名称审核。
2020-04-23 - 30多个小程序一键发布——miniprogram-ci
概述 miniprogram-ci 是从微信开发者工具中抽离的关于小程序/小游戏项目代码的编译模块。 开发者可不打开小程序开发者工具,独立使用 miniprogram-ci 进行小程序代码的上传、预览等操作。 miniprogram-ci 从 1.0.28 开始支持第三方平台开发的上传和预览,调用方式与普通开发模式无异。查看详情 密钥及 IP 白名单配置 使用 miniprogram-ci 前应访问"微信公众平台-开发-开发设置"后下载代码上传密钥,并配置 IP 白名单 开发者可选择打开 IP 白名单,打开后只有白名单中的 IP 才能调用相关接口。我们建议所有开发者默认开启这个选项,降低风险 代码上传密钥拥有预览、上传代码的权限,密钥不会明文存储在微信公众平台上,一旦遗失必须重置,请开发者妥善保管 [图片] 功能 miniprogram-ci 目前提供以下能力: 上传代码,对应小程序开发者工具的上传 预览代码,对应小程序开发者工具的预览 构建 npm,对应小程序开发者工具的: 菜单-工具-构建npm 上传云开发云函数代码,对应小程序开发者工具的上传云函数能力 上传云托管代码,对应小程序开发者工具的上传云托管能力 上传云存储/静态托管文件,对应小程序开发者工具-云开发-云存储和静态托管文件管理 代理,配置 miniprogram-ci 的网络请求代理方式 支持获取最近上传版本的 sourceMap 支持 node 脚本调用方式和 命令行 调用方式 脚本调用 [代码]npm install miniprogram-ci --save [代码] 代码 preview.js [代码]const ci = require('miniprogram-ci'); const fs = require('fs'); const path = require('path'); let config = { xcxKey: [], //需要上传的小程序列表 version: "", //版本号 desc: "", //备注 appindex: 0 //当前执行到第几个 } exports.start = async () => { //先拿到需要上传的列表,也就是小程序的appid和名称等相关信息,还有上传的版本和备注 fs.readFile( path.join(__dirname, '../xcxkey/xcxkey.json'), 'utf-8', (err, data) => { const fileJson = JSON.parse(data) config.xcxKey = fileJson.xcxKey; config.version = fileJson.version; config.desc = fileJson.desc; config.env = fileJson.env; config.appindex = 0; console.log(`本次提交--${config.xcxKey.map(item=> config.env + item.desc + config.desc)}`); console.log(`版本--${config.version}`); previewStart(); } ); } const previewStart = async () => { if (!config.xcxKey[config.appindex]) { console.log('上传完成') return; } //开始上传,首先修改文件信息 await setProjectConfig(); await setMain(); console.log(`${config.xcxKey[config.appindex].desc}--${config.env}开始`); const project = new ci.Project({ appid: config.xcxKey[config.appindex].appid, type: 'miniProgram', projectPath: path.resolve(__dirname, '../unpackage/dist/dev/mp-weixin'), privateKeyPath: path.resolve(__dirname, `../xcxkey/private.${config.xcxKey[config.appindex].appid}.key`), ignores: ['node_modules/**/*'], }); // 预览 const uploadResult = await ci.preview({ project, version: config.xcxKey[config.appindex].version, desc: `${config.env}——${config.desc}`, setting: { es6: true, minifyJS: true, minifyWXML: true, minifyWXSS: true, minify: true }, qrcodeFormat: 'image', qrcodeOutputDest: path.resolve(__dirname, `../ci/preview-images/${config.xcxKey[config.appindex].title}.jpg`), onProgressUpdate: getstate, pagePath: 'pages/home/index', // 预览页面 searchQuery: '' // 预览参数 [注意!]这里的`&`字符在命令行中应写成转义字符`\&` }); //监听上传过程,如果上传完成延迟10秒再上传下一个 function getstate(e) { console.log('eeee', e); if (e._status === "done" && e._msg === "upload") { console.log(`${config.xcxKey[config.appindex].desc}--${config.env}上传完成`) setTimeout(() => { config.appindex += 1; previewStart(); }, 1000) } } } //修改 project.config.json 内容 const setProjectConfig = async () => { // 要读取和替换的文件路径 const project_config = '../unpackage/dist/dev/mp-weixin/project.config.json'; const promise = new Promise((resolve, reject) => { // 读取 project.config.json fs.readFile( path.join(__dirname, project_config), 'utf8', (err, data) => { if (err) throw err; let json = JSON.parse(data); // 替换 appid 和 projectname json.appid = config.xcxKey[config.appindex].appid; json.projectname = config.xcxKey[config.appindex].name; // 改写 project.config.json 中 appid 和 projectname fs.writeFile( path.join(__dirname, project_config), JSON.stringify(json, null, 4), (err) => { if (err) throw err; resolve(); } ); } ); }); return promise; } //修改 main.js 内容 const setMain = async () => { // 要读取和替换的文件路径 const app_main_file = '../unpackage/dist/dev/mp-weixin/common/main.js'; const promise = new Promise((resolve, reject) => { // 读取 unpackage/dist/dev/mp-weixin/common/main.js fs.readFile( path.join(__dirname, app_main_file), 'utf8', (err, data) => { if (err) throw err; let app_main = data; const hotel_id = config.xcxKey[config.appindex].hotel_id; // 替换 source_hotel_id let re = /(?<=source_hotel_id:").*?(?=",source_hotel_id_end_ci:)/; app_main = app_main.replace(re, hotel_id); // 改写 unpackage/dist/dev/mp-weixin/common/main.js 中 source_hotel_id fs.writeFile( path.join(__dirname, app_main_file), app_main, (err) => { if (err) throw err; resolve(); } ); } ); }); return promise; } [代码] upload.js [代码]const ci = require('miniprogram-ci'); const fs = require('fs'); const path = require('path'); let config = { xcxKey: [], //需要上传的小程序列表 version: "", //版本号 desc: "", //备注 env: "", appindex: 0 //当前执行到第几个 } exports.start = async () => { //先拿到需要上传的列表,也就是小程序的appid和名称等相关信息,还有上传的版本和备注 fs.readFile( path.join(__dirname, '../xcxkey/xcxkey.json'), 'utf-8', (err, data) => { const fileJson = JSON.parse(data) console.log(fileJson); config.xcxKey = fileJson.xcxKey; config.version = fileJson.version; config.desc = fileJson.desc; config.env = fileJson.env; config.appindex = 0; console.log(`本次提交--${config.xcxKey.map(item=> config.env + item.desc)} --- config.desc`); console.log(`版本--${config.version}`); uploadStart(); } ); } const uploadStart = async () => { if (!config.xcxKey[config.appindex]) { console.log('上传完成') return; } //开始上传,首先修改文件信息 await setProjectConfig(); await setMain(); console.log(`${config.xcxKey[config.appindex].desc}--${config.env}开始`); const project = new ci.Project({ appid: config.xcxKey[config.appindex].appid, type: 'miniProgram', projectPath: path.resolve(__dirname, '../unpackage/dist/dev/mp-weixin'), privateKeyPath: path.resolve(__dirname, `../xcxkey/private.${config.xcxKey[config.appindex].appid}.key`), ignores: ['node_modules/**/*'], }); // 上传 const uploadResult = await ci.upload({ project, version: config.xcxKey[config.appindex].version, desc: `${config.env}——${config.desc}`, setting: { es6: true, minifyJS: true, minifyWXML: true, minifyWXSS: true, minify: true }, onProgressUpdate: getstate, }); console.log(uploadResult) //监听上传过程,如果上传完成延迟10秒再上传下一个 function getstate(e) { if (e._status == "done" && e._msg == "upload") { console.log(`${config.xcxKey[config.appindex].desc}--${config.env}上传完成`) setTimeout(() => { config.appindex += 1; uploadStart(); }, 1000) } } } //修改 ext.json 内容 const setExtConfig = async () => { // 要读取和替换的文件路径 const project_config = '../ext.json'; const promise = new Promise((resolve, reject) => { // 读取 project.config.json fs.readFile( path.join(__dirname, project_config), 'utf8', (err, data) => { if (err) throw err; let json = JSON.parse(data); // 替换 appid 和 projectname json.extAppid = config.xcxKey[config.appindex].appid; // 改写 project.config.json 中 appid 和 projectname fs.writeFile( path.join(__dirname, project_config), JSON.stringify(json, null, 4), (err) => { if (err) throw err; resolve(); } ); } ); }); return promise; } //修改 project.config.json 内容 const setProjectConfig = async () => { // 要读取和替换的文件路径 const project_config = '../unpackage/dist/dev/mp-weixin/project.config.json'; const promise = new Promise((resolve, reject) => { // 读取 project.config.json fs.readFile( path.join(__dirname, project_config), 'utf8', (err, data) => { if (err) throw err; let json = JSON.parse(data); // 替换 appid 和 projectname json.appid = config.xcxKey[config.appindex].appid; json.projectname = config.xcxKey[config.appindex].name; // 改写 project.config.json 中 appid 和 projectname fs.writeFile( path.join(__dirname, project_config), JSON.stringify(json, null, 4), (err) => { if (err) throw err; resolve(); } ); } ); }); return promise; } //修改 main.js 内容 const setMain = async () => { // 要读取和替换的文件路径 const app_main_file = '../unpackage/dist/dev/mp-weixin/common/main.js'; const promise = new Promise((resolve, reject) => { // 读取 unpackage/dist/dev/mp-weixin/common/main.js fs.readFile( path.join(__dirname, app_main_file), 'utf8', (err, data) => { if (err) throw err; let app_main = data; const hotel_id = config.xcxKey[config.appindex].hotel_id; // 替换 source_hotel_id let re = /(?<=source_hotel_id:").*?(?=",source_hotel_id_end_ci:)/; app_main = app_main.replace(re, hotel_id); // 改写 unpackage/dist/dev/mp-weixin/common/main.js 中 source_hotel_id fs.writeFile( path.join(__dirname, app_main_file), app_main, (err) => { if (err) throw err; resolve(); } ); } ); }); return promise; } [代码] package.json [代码]{ "scripts": { "upload": "node upload-ci.js", "preview": "node preview-ci.js" }, "dependencies": { "gulp": "^4.0.2", "miniprogram-ci": "^1.8.12" } } [代码] [图片] preview-ci.js [代码] const path = require('path'); const preview = require(path.join(__dirname, './ci/preview')); ; (async () => { preview.start(); })() [代码] upload-ci.js [代码] const path = require('path'); const upload = require(path.join(__dirname, './ci/upload')); ; (async () => { upload.start(); })() [代码] [图片] [代码]{ "xcxKey": [ { "name": "名称", "title": "title", "appid": "appid", "version": "1.0.0", "desc": "备注" }, ... ], "env": "正式环境", "desc": "备注", "version": "1.0.0" } [代码] [代码]// npm run preview(会把xcxkey中的所有小程序打包预览) // npm run upload(会把xcxkey中的所有小程序打包提交体验版) [代码]
2023-07-06 - 小程序点金计划,支付完成之后到点金计划跳转页,怎么跳转回小程序了?
小程序点金计划,支付完成之后到点金计划跳转页,怎么跳转回小程序了?
2023-09-22 - 【本地服务-保健品】类目修改指引说明
代码审核环节,将会对小程序运营的内容与所选类目是否相符进行核实,当小程序涉及提供保健食品在线销售配送或预购自提等服务,需要补充【本地服务-保健品】类目合规提审,否则代码审核环节将面临因类目不符被驳回情形。 一、本地服务-保健品服务,你需要了解: [图片] 注意:申请类目资质时,若当地存在不需要办理相关资质即可从事相关服务内容,建议可提供包含但不限于当地的政策/法规/主管部门等情况材料说明直接申请类目,类目侧会根据提供的材料进一步评估反馈。 二、应用场景示例与整改指引: 【本地服务-保健品】类目:适用于提供保健食品在线销售配送或预购自提等服务。 示例: [图片] 整改建议(2选1): 1、补充选择:本地服务-保健品类目。 2、或自查代码,确保移除保健食品在线销售配送或预购自提等内容及相关分类标签。 本文档为本地服务-保健品类目的介绍说明,如存在上述问题应及时调整、修整,避免后续存在上诉问题审核失败;若仍有其他疑惑,可以通过以下咨询入口反馈: 1、微信开放社区-交流专区-小程序发帖咨询-提出问题-运营相关问题 2、代码审核驳回站内信通知-客服咨询入口(客服咨询入口目前正在测试开放阶段,若无客服入口,建议前往开放社区发帖咨询) 我们会根据新出现的问题、相关法律法规更新或产品运营的需要及时对其内容进行修改并更新,制定新的规则,保证微信用户的体验。建议开发者反复查看以便获得最新信息,定期了解更新情况。
2022-09-02 - 微信支付成功后接口被多次回调是什么原因?
微信支付功能接口,支付成功后回调自己开发的一个发送短信的接口。短信接口被发送了十多次,那么我的客户就陆陆续续的收到了十多条的短信。请相关技术人员电话联系:13621871917,跪谢!
2024-01-15 - image组件自适应高度解决方案
imageload(e){ // console.log("widthwidth",e.detail) var { height, width } = e.detail; // console.log("width/height",width/height) if(height>=width){ if(height/width>2){ this.setData({ imageMode:"aspectFill", imgHeight : 360, imgWidth : 180, }) return }else if(height/width>1.3){ this.setData({ imageMode:"heightFix", imgHeight : 350 }) }else{ this.setData({ imageMode:"heightFix", imgHeight : 320 }) } }else{ var ratio=width/height if(ratio>2){ this.setData({ imageMode:"aspectFill", imgHeight : 250, imgWidth : 500, }) }else if(ratio>1.3){ this.setData({ imageMode:"widthFix", imgWidth : 400 }) }else{ this.setData({ imageMode:"widthFix", imgWidth : 350 }) } } },
2024-06-03 - wx.chooseMedia 为什么压缩了图片,之前都没有?
wx.chooseMedia({ count: 9, mediaType: ['image'], sourceType: ['album'], success: (res) => { }, fail: (res) => { }, }); 图片地址:https://host.weddingbo.com/xlapi/HostManage/HostUserManage/HostSmall/GetStartCode?content=e1691ef1173f46fb92a7526505fbfdca&type=0&branchId=2271 [图片][图片] [图片]
2024-05-29 - 纯js绘制雷达,折线图easyCharts.
[图片][图片] import radarMap from "@/components/radar/radar.vue";//组件引入 export default{ components:{ radarMap }, } polygon:{//参数设置 colorAreaInside:"#5179d7",//区域内圈透明颜色 colorAreaOutside:"#d69384",//区域外圈透明颜色 alpha: 0.4,//2个区域透明值 1~0; dege: 6,//几边形 part: 5,//内圈几个 R: 10,//圆的半径 可以不传参默认height的0.4 } 展示网址:http://jstopo.top
2022-08-30 - 2024-09-09
- 多端框架用户成功案例
Donut 多端框架是小程序团队推出的移动应用开发框架。开发者可以使用小程序技术与工具,高效率开发移动应用,实现一次开发多端运行。现在已有不同领域的开发者选择多端框架,实现更高的开发经营效率。
2024-07-10 - 小程序webview访问oss的图片资源httpstatus是0,是什么原因导致的?
小程序webview访问oss的图片资源httpstatus是0,可能是什么原因导致的,是小程序哪里设置的不对吗?求指教!
2023-08-13 - 微信小程序实现音频播放动态效果代码片段
微信小程序实现音频播放动态效果代码片段 背景 最近在模拟微信小程序里面背景播放音频时,微信原生的浮窗效果,体验了很多优秀的小程序案例 看到好的效果就想看看代码是怎么写的,发现不少优雅的写法 如下图所示,在底部右下角有个音频播放的动态效果,这个实现的方式很多,前几天看组长代码写的也很独辟蹊径,两个图片互相错一位就搞定了 今天在看下面小程序的代码发现这个实现方式更是别出心裁,竟然没有任何素材 [图片] ~ 代码片段 [图片][图片] [图片] ~ 微信小程序实现音频播放动态效果代码片段
2023-06-14 - ICP备案申请指南
根据工信部管理规定,对经营性互联网信息服务实行许可制度;对非经营性互联网信息服务实行备案制度。未取得许可或者未履行备案手续的,不得从事互联网信息服务。 如你的网站没有申请过ICP备案,根据国家相关规定,可能会对网站的解析产生影响,建议尽快到所在省市的通信管理局完成ICP备案。 【申请地址】请点击这里 温馨提示: 若是点击无法跳转,请复制链接"https://beian.miit.gov.cn/#/Integrated/index“更换其他浏览器打开 【申请流程】 一、ICP信息报备流程图: [图片] 二、ICP信息报备流程: 1.网站主办者登陆接入服务商企业侧系统 网站主办者进行网站备案时可有三种供选择的登录方式: 方式一:网站主办者登录部级系统,通过主页面“自行备案导航”栏目获取为您网站提供接入服务的企业名单(只能选择一个接入服务商),并进入企业侧备案系统办理网站备案业务。 [图片] 方式二:网站主办者登录住所所在地省局系统,通过主页面“自行备案导航”栏目获取为您网站提供接入服务的企业名单(只能选择一个接入服务商),并进入企业侧备案系统办理网站备案业务。 登录部级系统,并找到你所在的省局系统点击办理: [图片] 方式三:网站主办者直接登录到接入服务商企业侧系统。请联系你的接入服务商。 2.网站主办者登陆接入服务商企业系统自主报备信息或由接入服务商代为提交信息: 网站主办者通过三种登录方式(详见1)登录到企业侧系统,注册用户->填写备案信息->接入服务商校验所填信息,反馈网站主办者。 网站主办者委托接入服务商代为报备网站的全部备案信息并核实信息真伪->接入服务商核实备案信息->将备案信息提交到省管局系统。 3.接入服务商核实备案信息流程: 接入服务商对网站主办者提交的备案信息进行当面核验:当面采集网站负责人照片;依据网站主办者证件信息核验提交至接入服务商系统的备案信息;填写《网站备案信息真实性核验单》。如果备案信息无误,接入服务商提交给省管局审核;如果信息有误,接入者在备注栏中注明错误信息提示后退回给网站主办者进行修改。 4.网站主办者所在省通信管理局审核备案信息流程: 网站主办者所在地省管局对备案信息进行审核,审核不通过,则退回企业侧系统由接入服务商修改;审核通过,生成的备案号、备案密码(并发往网站主办者邮箱)和备案信息上传至部级系统,并同时下发到企业侧 1.什么是经营性的互联网信息服务?什么是非经营性互联网信息服务? 根据《国务院互联网信息服务管理办法》(国务院292号令)的第三条规定,“经营性互联网信息服务”是指通过互联网向上网用户有偿提供信息或者网页制作等服务活动。“非经营性互联网信息服务”是指通过互联网向上网用户无偿提供具有公开性、共享性信息的服务活动。 2.如何修改备案信息? 根据现有流程,用户在提交网站备案信息后,可通过接入服务商的企业备案系统修改信息,或者由其接入服务商代为修改,其目的在于强化接入服务商的代备案责任,减轻网站主办者自行备案负担。具体可咨询您的接入服务商。 3.在提交新备案信息时,系统提示主体冲突如何处理? 备案系统对主体的要求必须唯一性,即一个主体只能有一个备案号。判断主体冲突,并不是以主办单位名称为标准,而是依据“主办单位证件类型+证件号码”来判断主体是否唯一的。如果提示主体冲突,就说明该证件号码已经在备案库中存在了。您可以通过备案系统公共查询来查主体证件号码是否已经备案过。如果您要注销该主体冲突,请联系备案号发放地通信管理局,按要求提交相应的证明材料后才可进行注销。 4.在提交新备案信息时,系统提示域名冲突如何处理? 如果您在备案过程中发现您的域名先前已经被别人备案过了,可能是因为您以前已经备案过或者在您注册域名前有人购买过该域名并进行了备案。您还可以在备案网站公共查询中查询该域名的备案地(备案号第一个字是省份的简称),并联系该地通信管理局申请网站注销,按要求提交相应的证明材料后才可进行注销。 5.备案密码忘记了怎么办? 方法一:您可以通过备案系统找回。登陆https://beian.miit.gov.cn/#/Integrated/index,在右下角有“找回备案密码”按钮,选择主体所在省,在跳出的网页中,输入“备案/许可证号、证件类型、证件号码”,输入完成后点提交。如果信息填写正确,系统会向您当年注册的E-mail发送新备案密码。 方法二:如果您的备案信息是接入商代为备案的,您可以联系代为备案的接入商告诉您如何找回备案密码。 方法三:您也可以通过联系备案号发放地通信管理局,并按要求提供相应的证明材料后,取回备案密码。 6.在新、旧备案系统中网站备案的流程是否有差别? 升级后的网站备案管理系统实现了工业和信息化部、各通信管理局、接入服务企业三级备案管理服务模式。在原网站备案管理系统的服务功能基础上,增加了通信管理局级和接入服务企业级网站备案管理系统。网站主办者仅需向接入服务企业提交备案申请,接入服务企业核验后将备案信息提交至通信管理局备案系统,通信管理局进行审核,审核通过后生成备案号发给网站主办者和接入服务企业。 7.网站涉及哪些信息内容应办理前置审批手续? 根据《互联网信息服务管理办法》(国务院292号令)第5条等有关规定,拟从事新闻、出版、教育、医疗保健、药品和医疗器械、文化、广播电影电视节目等互联网信息服务,依照法律、行政法规以及国家有关规定应经有关主管部门审核同意的,在履行备案手续时,还应向其住所所在地省通信管理局提交相关主管部门审核同意的文件。 8.备案的审核时间要多长? 根据《非经营性互联网信息服务备案管理办法》(信息产业部令33号令)第12条规定,省通信管理局在收到备案人提交的备案材料后,材料齐全的,应在二十个工作日内予以备案;材料不齐全的,不予备案,在二十个工作日内通知备案人并说明理由。首次备案的,用户备案信息须经过接入商核实后才会递送到通信管理局进行审核;备案信息修改的,备案信息最后修改日期为起始计算时间。工作日不包含法定节假日和周末。 9.我的网站只有独立的IP地址,没有域名需要办理网上备案手续吗? 需要。无论您的网站是通过域名方式访问或是通过IP地址的方式访问,只要在中华人民共和国境内提供非经营性互联网信息服务都要办理备案手续。 10.如果一个备案单位同时具有两个网站,可以将两个网站分别备案在两个相同的主体下吗? 不可以,如果两个网站的备案主体都是同一个备案单位,那么只能将两个网站备案在同一个主体下。
2024-06-21 - 关于小程序隐私保护指引设置的公告
为规范开发者的用户个人信息处理行为,保障用户的合法权益,自2023年9月15日起,对于涉及处理用户个人信息的小程序开发者,微信要求,仅当开发者主动向平台同步用户已阅读并同意了小程序的隐私保护指引等信息处理规则后,方可调用微信提供的隐私接口。 开发者首先需确定小程序是否涉及处理用户个人信息,如涉及,则需配置用户隐私授权弹窗,且仅有在平台《小程序用户隐私保护指引》中声明了所处理的用户个人信息,才可以调用平台提供的对应接口或组件。(隐私相关接口) 隐私协议设置整体流程参考下方指引: 一、设置《小程序用户隐私保护指引》 开发者需在「小程序管理后台」设置《小程序用户隐私保护指引》 [图片] [图片] 二、填写《小程序用户隐私保护指引》 [图片] 只有在指引中声明所处理的用户个人信息,才可以调用平台提供的对应接口或组件。若未声明,对应接口或组件将无法调用成功。隐私接口与对应的处理的用户个人信息关系可见:小程序用户隐私保护指引内容介绍 三、配置用户隐私授权弹窗 微信提供了wx.onNeedPrivacyAuthorization(function callback) 接口,意为用户触发了一个微信侧未记录过同意的隐私接口调用,开发者可通过响应该事件选择提示用户的时机。此外,微信还提供了 wx.requirePrivacyAuthorize(Object object) 接口,可用于模拟触发 onNeedPrivacyAuthorization 事件。 小程序开发者可自行设计提示方式与触发时机,详细文档可查看隐私协议开发指南。 仅有在指引中声明所处理的用户个人信息,才可以调用平台提供的对应接口或组件。若未声明,对应接口或组件将直接禁用。 [图片] (参考样例) 四、如要进行代码提审,开发者需先自行声明是否有采集用户隐私,如有,则需在提审页面-「用户隐私保护设置」选择“采集用户隐私” [图片]
2023-09-18 - 关于新版隐私协议接口wx.onNeedPrivacyAuthorization的适配解读以及实现代码
官方公告地址: https://developers.weixin.qq.com/community/develop/doc/00042e3ef54940ce8520e38db61801 目前,开发工具或者体验版的小程序,调试基础库如果是2.33.0及以上就得适配了,线上版本9月15日之后生效,所以这之前需要尽快改完,发布一版,否则到了9月15号之后 线上就会生效报错了。 其实改起来也很简单,以下是实现步骤和代码: 1、首先看一下这个网址,里边包含涉及到的隐私的接口,这些接口都要适配一下 https://developers.weixin.qq.com/miniprogram/dev/framework/user-privacy/miniprogram-intro.html [图片] 在以上接口用到的页面,需要画一下类似上边的弹窗(这个弹窗可以全局定义个组件,方便多个页面共用),然后里边蓝字可以点击后调用wx.openPrivacyContract(Object object)接口即可,会自动跳转打开隐私协议页面。 拒绝按钮可以加一个点击事件,然后在事件里这样写 [图片] 同意按钮比较特殊,布局需要用button这样写,记得给button加一个Id [图片] 然后在handleAgreePrivacyAuthorization里就可以获取到点击事件,这样写 [图片] 2、最后需要在onLoad或者onShow里加上以下监听代码,在这里边让自定义的隐私弹窗显示出来即可。 [图片] 以上代码加上就可以了,如果业务逻辑用到了需要判断是否授权过,可以加上 wx.getPrivacySetting(Object object)去获取是否授权过,用不到可以不加这个判断。
2023-08-16 - 场景值1168具体是啥意思?
我们小程序目前只在微信里使用,但是发现有1168的访问来源,这是什么原因呢?
2022-09-13 - wx.requestSubscribeMessage 弹出框的消息订阅默认不选中?
[图片]之前是默认选中的,今天打开手机发现默认不选中了,是怎么回事??
2023-07-25 - 小程序公众号干货运营之注销篇
各位亲,面对帐号注销是不是束手无策呢?帐号如何注销,怎么注销,注销需要提供什么信息内容呢?请仔细往下看看 小程序 关于小程序注销的条件,若未冻结的个人帐号和组织类帐号就不 一 一 细讲,详情请参腾讯客服文档:https://kf.qq.com/product/wx_xcx.html#hid=2826 1:小程序注销之政府无对公账户: 详细流程请参考:https://kf.qq.com/faq/190104YnQbYN190104RzaYba.html 政府的有一致主体是提供一致的主体证件和公章,如果有变更请提供4项材料:因机构改革、单位合并、撤一建一等情况,导致机构主体名称有变更,提供以下材料申请注销: 1、更名相关的红头文件(有鲜章); 2、主体名称变更情况说明书(加盖新主体公章); 3、变更后新主体的主体证件;(原件拍照或加盖公章的复印件) 4、注销申请函(加盖新主体公章); 2:小程序注销之个体工商户 若个体工商户存在对公账户,请使用对公账户小额打款注销 若个体工商户类型无对公账户注销小程序工单指引流程如下 工单所需材料 1、小程序绑定邮箱/原始ID: 2、主体证件材料(营业执照/组织机构代码证等): 3、小程序绑定的法人身份证原件正反面的清晰扫描件或照片: 4、小程序的注销书面申请,申请书必须加盖公章。(若个体户没有公章可支持法人手写签名) 附注:注销申请书模板(https://kf.qq.com/faq/200306R7N3mI200306I3aEBz.html) 材料提交链接:https://kf.qq.com/touch/bill/200306selfqaafe6c551.html(手机端打开) 3:小程序注销之帐号主体已注销 主体已注销小程序工单指引流程如下, 1、小程序绑定邮箱/原始ID: 2、主体注销证明: 3、小程序绑定的法人身份证原件正反面的清晰扫描件或照片: 4、小程序的注销书面申请,企业账号的申请必须有加盖公章的函件(公章被收的请法人手写签字)附注:注销申请书模板(https://kf.qq.com/faq/200306R7N3mI200306I3aEBz.html) 材料提交链接:https://kf.qq.com/touch/bill/200306selfqaafe6c551.html(手机端打开) 4:小程序注销之门店小程序 门店小程序依附于公众号,不支持单独注销,公众号注销门店小程序才支持注销 5:公众号正常运营,门店小程序如何释放昵称 如果需要释放该小店小程序昵称,发送邮件到“miniprogram@tencent.com”,标题格式【关于XXX名称释放请求】,需提供以下材料: 1、小程序帐号(原始ID); 2、绑定的管理员微信号; 3、小程序主体营业执照等主体证件; 4、小程序所有者的书面申请,申请书需加盖小程序主体公章;(个体户无公章:申请书需要加上法人签名); 邮件内容:需包含背景、释放请求原因。 6:复用公众号资质快速注册的小程序如何注销 复用资质申请的小程序是独立存在的,请按照正常流程注销即可 7:注册小程序选择微信认证,若未完成微信认证如何注销呢? 小程序30天未认证或认证失败且7天内未发起认证不会释放邮箱,但该邮箱支持重新注册小程序,会释放主体信息、管理员信息、昵称。 公众号 关于公众号若未冻结的个人帐号和组织类帐号就不一一细讲,详情请参考腾讯客服文档:https://kf.qq.com/product/weixinmp.html#hid=2267 1:公众号注销之政府无对公账户: 详细流程请参考:https://kf.qq.com/faq/190531qyuuiY190531BjyyEv.html 政府的有一致主体是提供一致的主体证件和公章,如果有变更请提供4项材料:因机构改革、单位合并、撤一建一等情况,导致机构主体名称有变更,提供以下材料申请注销: 1、更名相关的红头文件(有鲜章); 2、主体名称变更情况说明书(加盖新主体公章); 3、变更后新主体的主体证件;(原件拍照或加盖公章的复印件) 4、注销申请函(加盖新主体公章); 2:公众号注销之个体工商户 若个体工商户存在对公账户,请使用对公账户小额打款注销 若个体工商户类型无对公账户,请使用法人扫脸注销公众号 详情请参考:https://kf.qq.com/faq/220309bUvmIB220309BbAjMz.html 3:公众号注销之帐号主体已注销 主体已注销公众号工单指引流程如下, 1、公众号绑定邮箱/原始id/微信号: 2、主体注销证明: 3、公众号绑定的法人身份证原件正反面的清晰扫描件或照片: 4、公众号的注销书面申请,企业账号的申请必须有加盖公章的函件(公章被收的请法人手写签字) 附注:注销申请书模板(http://kf.qq.com/faq/171018R3IVBF171018INjUvA.html ) 材料提交链接:https://kf.qq.com/touch/bill/180227selfqa9ab6ac55.html(手机端打开) 4:未注册成功的帐号如何注销 若帐号当时没有走完注册流程且长期没有登录该帐号,到期会被系统注销。没有走完注册流程的帐号不占用个人信息,也不支持找回,建议重新注册 5:注册公众号选择微信认证,若未完成微信认证如何注销呢? 若公众号注册时选择微信认证,自注册日起30天内未进行认证(第30天仍在认证中不算),点击“重新提交材料”,帐号角色变为注册失败,不会释放帐号邮箱,但该邮箱支持重新注册公众号,会释放主体信息、管理员信息、昵称, 6:小程序公众号注销确认期 注销确认期的7天内每天会发送一次确认注销的通知,若管理员一直未点击确认注销则默认取消注销,注销失败。因此管理员请关注公众平台安全助手!!!
2022-04-08 - 码农进阶中的思维变化
一、引子 时光如逝,2023年眨眼已经过去快六分之一了,近来跟同事和朋友聊的时候发现,有小伙伴对未来的发展方向和能力提升方式都有一些迷茫和不知所措,同时跟一些大牛们讨论过如何向上向下汇报、如何推动项目、如何成长,也随之有了一些感悟,借此机会写下来,希望能跟大家能一起探讨探讨。 二、概述 本篇文章的主题是思维变化,即讨论研发人员如何在思维上改变自己的工作和学习习惯从而提升自己的整体水平。 三、思维是什么,对我们有什么影响 思维是人类所具有的高级认识活动。按照信息论的观点,思维是对新输入信息与脑内储存知识经验进行一系列复杂的心智操作过程。分析与综合 是最基本的思维活动。以上来自百度百科哈哈:)。从“思维”两个字中,我们也可以领悟到一些东西,“思”即是思考,比较容易理解,关键在“维”字,“维”有角度、维度的意思。言归正传,对一个码农来说日常的工作就是代码开发,而思维方式会决定我们的代码水平和研发能力的提升。 思维如何影响我们呢,举个经典例子:一家大公司引进了一条肥皂生产线。这条生产线能将肥皂从原材料的加入直到包装装箱自动完成。 但是销售部门反映有的肥皂盒是空的,经理要求工程师们解决这个问题。于是成立一个以几名博士为核心、十几名研究生为骨干的团队。在耗费数十万后,工程师们在生产线上一套X光机和高分辨率监视器,当机器对X光图像进行识别后,一条机械臂会自动将空盒从生产线上拿走。 另外一家乡镇企业也遇到了同样的情况,管理生产线的小工找来一台电风扇,摆在生产线旁。装肥皂的盒子逐一在风扇前通过,只要有空盒子便会被吹离生产线,掉在箩筐里。 [图片] 就从本事例上来说确实一套高科技的检测流程还不如一台电风扇,不同的思维方式导致花费的代价不同。 大家别慌,让我们再换个角度探讨一下,假设我们现在生产的装肥皂的盒子进行了改良更精美也更重了,电风扇吹不动了怎么办;假设我们另一个做罐头的生产线也需要检测罐头里是否有桃子怎么办。 再换个角度看上面的例子,有没有感觉像是我们开发一个很小的项目时,投入了大量的人力物力做了一个apm系统来保障这个小项目的线上正常运行和安排一个同学每天去线上看一眼是不是项目还在正常运行类似,那么大家觉得这个apm系统应该不应该开发?对于这个问题,我们先不着急把答案定下来,看完下面的分析我在再来讨论。 四、研发能力的评判 对于研发的能力,各厂都有自己的职级划分,这里我们举个例子吧(一家之言,大家轻拍) 入门阶段:在他人指导下能够完成比较简单的任务 编码达人:代码的质量和效率都很好,能独立完成任务 独当一面:作为核心骨干能够负责中小型项目的研发管理 技术专家:具备架构设计能力,有实现大型系统的能力 领域专家:行业的领军人物,某个头部系统或者产品的领头人 以上不同的级别对应不同的能力,而我们的成长应该包括两个方面,一个是知识,另一个是思维,两者相辅相成。有了一定的知识会改变我们的思维模式;有了一定的思维模式时,会自动去学习欠缺的知识。知识的学习已经又很多教程了,下面我们先从思维模式上聊一聊。 五、聊聊几种研发中的思维 1、框架思维 软件开发是一种知识活动,因此知识的聚集和积累是至关重要的。框架能够采用一种结构化的方式对某个特定的业务领域进行描述,也就是将这个领域相关的技术以代码、文档、模型等方式固化下来。 2、架构思维 一个系统的运行模式是怎样进行,前后端如何协作、数据如何处理、前端如何展示通用逻辑如何公共和抽象、开发调试部署的流程、功能的可扩展性、服务的稳定性设计、高并发的设计、程序的安全性设计、生态建设等等,我们可以将这些通用的设计从架构层面上进行考虑和实现,而业务开发只需关注业务的逻辑。 3、懒人思维 软件的目标,是某些工作自动化,从而让某些人可以更懒。重复的事情一定不要自己手工重复完成,侧重于自动化。思考如何把这些原来需要很麻烦的事情,自动化执行。比如使用脚手架进行项目的初始化、CI/CD减少项目运维的工作、自动化测试减少测试的工作量。 4、全局思维 任何一个岗位都有其上下游的链接。比如研发的上面有市场,下面有生产。当你写客户软件时,你得站在客户的角度看看方不方便使用、系统稳定不稳定、体验有好不友好;当你设计架构的时候,你得考虑软件工程师方不方便使用;当你设计整个开发流程时,你得考虑团队的效能。更进一步,你的这个技术方案对于公司整体技术方案的适配性怎么样,也应该考虑考虑。 5、系统性的思维 当你在写代码的时候,你很容易就认为只要你按照需求实现了指定的功能,你的代码就写完了。如果想写出真正有影响力的代码,你需要从整个系统去理解你的工作: 1).你的代码和其他人写的代码在功能上是什么关系? 2).你有没有好好测试你的代码?或者其他人是否很容易测试你的代码? 3).为了部署你的代码,线上生产环境的代码是不是需要改动? 4).新的代码会不会影响到已经运行的代码? 5).在新的功能下,你的目标用户的行为是不是你期望的? 6).你的代码有没有产生商业上的影响? 7).你的代码是否兼容老数据?兼容不同的入口场景? 6、创新思维 是指一种能够激发创造力和创新灵感的思考方式。创新思维通常包括挑战常规思维方式的能力、在问题解决中采用多种不同的角度和方法、发掘新的机会、将不同的元素或概念组合起来以创造新的东西等能力。技术的更新迭代很快、软件产品也越来越多,各行各业、时时刻刻都在有创新,别人创造出来了,我们不学习就会落后,只有保持进步和创新才能不被这个时代所抛弃。 以上总共介绍了6种思维(如有遗漏欢迎补充),对我们研发来说,如何通过思维上的改变来提升自己的能力呢? 六、能力进阶与思维改变 对于不同阶段的人,进阶的路线也是不一样的,这里我们还是以之前的职级为例,探讨一下如何通过思维的改变来完成能力的进阶,希望能给对自己的成长路线不太明朗的同学有所帮助。 1、假如你是一个加入到码农行业的同学:希望你能有“框架思维”,在稳固基础知识的同时,能够养成良好的思维习惯,做任务前能够了解何种技术可以实现你的需求,完成任务时做好总结并形成文档,反思自己做的好的地方与不好的地方,将解决过程和避坑经验进行归档,方便后来人的查阅和学习,在日益的积累中,你代码的质量和效率都得到很好的提升; 2、假如你是一个编码达人:希望你能有“系统性的思维”,工作中要不断的思考你负责的模块在整个项目中是属于哪部分,你的程序是如何运行,模块之间是如何互相调用的,项目周期的每个阶段需要做那些事情,了解你的角色以及项目负责人的角色需要做哪些事情。日常工作中要以积极的态度去推动项目的进行、遇到技术卡点问题要多从原理层面进行分析。强烈的责任心、良好业务能力、出众的技术能力是你成为项目负责人所不可或缺的因素。 3、假如你已能独当一面:希望你能在日常工作中不仅仅局限于业务的研发,在代码开发的过程中能有“架构思维”。针对需求的实现,要关注:架构设计的是否合理、性能上是否有不必要的浪费、安全漏洞是否有统一解决方案或防御、公共能力的抽象和使用是否合理、核心业务逻辑的流程是否合理、库表设计是否有空间的浪费等等;技术选型上参考以往类似实现怎么做的,是否还适用、是否要有改进、依赖哪些能力等; 4、假如你是一个技术专家:你需要有“全局思维”、“懒人思维”。你已经拥有架构能力,可以设计项目的架构,但与此同时也更需要关注系统的兼容性、数据迁移方案、可拓展性、稳定性,以及架构提供的能力是否可以让开发者不必关注底层基础能力、公共能力而只专注于业务开发;在开发流程上是否可以做到精简,减少项目上线的流程;通过自动化的检测代码安全、逻辑漏洞、文件格式化、测试等提高开发效率保证运行质量;提供的公共化能力是否有相应的文档建设、测试用例、生态能力;完善基建平台的能力,比如监控系统运行情况的apm、实时更新应用配置的配置中心、应用部署运维的平台、公司内部的管理/工具平台等等;产品的功能是否做到了人无我有、人有我优,交互和性能的体验是否做到了行业领尖,如何做到超越;这些都是我们走向行业顶尖所需要的基本能力; 5、“创新思维”具体对我们研发来说怎么理解呢?我先抛个砖:已有的事物,去研究实现的过程,叫学习或者模仿;知道一些技术或理论,去制造未出现的东西,叫创新。创新比较难,相对而言模仿比较简单,因为我们有行业的标准作为参考,比如“小程序”,自从微信有了这个产品之后,大家竞相模仿;但是相反我们会开发native的app却不一定能创新性的开发出“小程序”。不过创新其实无处不在,我举个例子,假设我们学会来使用游戏引擎Cocos,用它我们可以实现一个“小猪挖土豆”(查了下还真没有)的游戏,这个算是一种创新;如果有实力换种实现方式重新写个游戏引擎,这也是一种创新。保持一种思维习惯,说不定哪天突然灵光一闪,就走上人生巅峰了。 最后呢,我们再看下之前说的一个小项目,我们有没有必要花费大量的人力物力去建一个apm系统?这是一个开放的话题,假设的条件不同答案也不相同,但是我相信很多人已经有了自己的想法了。 七、小结: 谈思维是一件很空洞的事情 ,因为思维实在看不见,摸不清。它不像知识,知之为知之,不知为不知。经常听到人说,你说的我都懂,可我就是做不到,这就是一种思维习惯。所以思维不在于你知道还是不知道,而是一个思维惯性,思考问题的时候,多去提醒自己去往这个维度上想一想,时间久了也就成自然了。ps:如有不合适的地方,请指正~
2023-02-24 - 小程序TypeScript请求封装(TS+request),拿来就能用
最近新开项目,想找一份完整版的ts,封装request完整版都很少,于是最近研究并结合网上的资料进行封装,本api封装支持Promise返回,支持传入泛型,定义返回的数据结构,使用该封装大大减少查看字段及维护难问题。 目录结构 [代码]- miniprogram - api - index.ts - base.ts - system - userApi.ts - utils - request.ts [代码] 封装request 首先,我们先搞wx.request先,这个搞完,其它都是小意思,代码如下:<br/> 文件名称[代码]request.ts[代码] [代码] /** * @description: HTTP请求方法枚举 */ export enum HttpMethod { GET = 'GET', POST = 'POST', OPTIONS = 'OPTIONS', PUT = 'PUT', DELETE = 'DELETE' } /** * @description: HTTP请求配置 */ interface RequestConfig { /** API路径 */ url?: string /** Method类型 */ method?: HttpMethod /** 接口返回数据 */ data?: any /** 无TOKEN触发异常捕获时,是否执行异常逻辑 */ needToken?: boolean /** Header头部 */ header?: object /** 返回的数据格式 */ dataType?: string /** 请求报错时,是否弹出message提示(默认弹出)*/ noShowMsg?: boolean } /** * @description: 声明业务数据类型 */ export interface MyAwesomeData<T> { code: number msg: string data: T } class HttpRequest { private static instance: HttpRequest private constructor() { } /** 请求函数(单例模式) * * **注意:** * `method`需使用`HttpMethod`枚举类,切勿自行定义 * * **示例代码** * ```js HttpRequest.getInstance().request({ url: '/Api', method: HttpMethod.GET }) * ``` */ public static getInstance(): HttpRequest { if (!this.instance) { this.instance = new HttpRequest() } return this.instance } // 处理请求异常状态码 private handerErrorStatus(statusCode: number, requestConfig: RequestConfig) { let msg = '服务找不到' if (statusCode === 502 || statusCode === 503) { msg = '服务器开小差了~' } !requestConfig.noShowMsg && wx.showToast({ title: `${msg},错误码:${statusCode}`, icon: 'none' }) return msg } // 处理请求异常 private handerError(err: { errMsg: string }, requestConfig: RequestConfig) { let msg = `请求异常` if (/timeout/.test(err.errMsg)) { msg = '请求超时' } !requestConfig.noShowMsg && wx.showToast({ title: msg, icon: 'none' }); return msg } // 服务器接口请求 public request<T>(requestConfig: RequestConfig): Promise<MyAwesomeData<T>> { let _this = this return new Promise((resolve, reject) => { // 默认header const contentType = requestConfig.method === 'GET' ? 'application/x-www-form-urlencoded' : 'application/json' const header = { 'content-type': contentType } wx.request({ method: requestConfig.method, url: `${requestConfig.url}`, data: requestConfig.data, header: Object.assign(header, requestConfig?.header), dataType: !requestConfig.dataType ? 'json' : '其他', success: function (res) { // console.log('发送返回:', res) //res:{cookies, data, header, statusCode} const code = res.statusCode || -404 const data = res.data /** 接口请求成功*/ if (code == 200) { resolve(data as any) } else if (code === 401) { // 未授权 !requestConfig.noShowMsg && wx.showModal({ title: '登录失效', content: '登录失效,请重新登录', }).then(resModa => { if (resModa.confirm) { } }) reject({ code, msg: '未登录', data: data }) } else { //非200及401状态码-数据处理 const errMsg = _this.handerErrorStatus(code, requestConfig) reject({ code, msg: errMsg, data }) } }, fail: err => { let msg = _this.handerError(err, requestConfig) reject({ msg }) } }) }) } /** * @description: get请求函数 * @param {string} url 请求地址 * @param {Object} data 请求参数 * @param {RequestConfig} OtherConfig request其他配置 * @return {*} */ public get<T>(url: string, data?: Object, OtherConfig?: RequestConfig) { return this.request<T>({ method: HttpMethod.GET, url, data, ...OtherConfig }) } /** * @description: post请求函数 * @param {string} url 请求地址 * @param {Object} data 请求参数 * @param {RequestConfig} OtherConfig request其他配置 * @return {*} */ public post<T>(url: string, data: Object, OtherConfig?: RequestConfig) { return this.request<T>({ method: HttpMethod.POST, url, data, ...OtherConfig }) } /** * @description: delete请求函数 * @param {string} url 请求地址 * @param {Object} data 请求参数 * @param {RequestConfig} OtherConfig request其他配置 * @return {*} */ public delete<T>(url: string, data: Object, OtherConfig?: RequestConfig) { return this.request<T>({ method: HttpMethod.DELETE, url, data, ...OtherConfig }) } /** * @description: put请求函数 * @param {string} url 请求地址 * @param {Object} data 请求参数 * @param {RequestConfig} OtherConfig request其他配置 * @return {*} */ public put<T>(url: string, data?: Object, OtherConfig?: RequestConfig) { return this.request<T>({ method: HttpMethod.PUT, url, data, ...OtherConfig }) } } export const httpRequest = HttpRequest.getInstance() [代码] 封装接口api 对接口名称进行封装,文件名称api-> system-> userApi.ts [代码]import { httpRequest } from '../../utils/request' const baseUrl = require('../base').allBaseUrl.GDEnvs.host export default class userApi { /** * @description: 获取用户信息 * @return {*} */ static getUserInfo = (data: UserInfo) => httpRequest.post<ReturnUserInfo>( baseUrl + '/mock/getUserInfo', data ) /** * @description: * @return {*} */ static getVillageList = () => httpRequest.get<VillageList>( baseUrl + '/mock/villageList', ) } [代码] 环境判断封装 对环境进行封装,可自行判断,目录:api-> base.ts [代码]/** * 获取小程序版本信息 * 值有:develop(开发版)、trial(体验版)、release(正式版) */ const accountInfo = wx.getAccountInfoSync() const envVersion = accountInfo.miniProgram.envVersion || 'release' /** * 国地服务器 */ const GDEnvs = { develop: { host: 'https://mock.com', imgHost: 'http://192.168.0.2:20087' }, trial: { host: 'http://192.168.0.1:20086', imgHost: 'http://192.168.0.2:20086' }, release: { host: 'https://XXXXX.com', imgHost: 'http://image.XXXXX.com' }, } export class allBaseUrl { /** * 国地服务器 */ static GDEnvs = GDEnvs[envVersion] } [代码] 接口统一输出 对封装好的api接口统一输出,这个非必要,见仁见智,目录api-> index.ts [代码]/* * @Author: caiyongqiang * @Date: 2022-10-20 10:46:54 * @LastEditTime: 2022-10-20 16:58:01 * @LastEditors: caiyongqiang * @Description: */ import userApi from './system/userApi' class apis { /** * @description: 用户相关Api */ static userApi = userApi } export default apis [代码] 页面使用 在页面中可以直接api/index.ts引入使用 [代码]import $api from '../../api/index' // 调用 $api.userApi.getUserInfo({ username: 'demo', password: '123456' }).then((res) => { if (res.code === 200) { userStore.setUserInfo(res.data.userInfo) } }) [代码]
2022-11-11 - 微信小程序头像昵称实战篇
2022-08-25 api文档地址: https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/userProfile.html 目前的api变更后,得到的地址为 临时地址, 这个是文档没有说明的, 最佳实践,是需要把得到的地址上传到自己的服务器,然后用服务器返回的地址作为 真实头像的永久地址. 核心点说明: //获取到api返回的新地址路径 onChooseAvatar(e) { this.avatarUrl = e.detail.avatarUrl console.log('e.detail', e.detail) // this.updateUserInfo(); this.uploadFile(); }, /* 上传 头像 转 话格式*/ uploadFile(){ uni.uploadFile({ url: config.webUrl + '/upload/uploadImages',//后台接口 filePath: this.avatarUrl,// 上传图片 url name:'image', // formData: this.formData, header: { 'content-type': 'multipart/form-data', 'token': uni.getStorageSync('token') }, // header 值 success: res => { let obj = JSON.parse(res.data) console.log('obj', obj) if (obj.code == 1) { let imgUrl = obj.data.full_path; this.userImg = imgUrl; this.updateUserInfo(); } else { uni.showToast({ icon: 'none', title: '图片太大,请重新选择!' }); } }, fail: e => { this.$toast('上传失败') } }); }, 这里需要注意, wx.uploadFile 返回的是字符串类型,需要前端自己处理一下数据结构: [图片] 完整代码如下: import config from "@/common/config.js"; import {debounce} from '@/utils/debounce.js' export default { data() { return { defaultAvatarUrl: 'https://mmbiz.qpic.cn/mmbiz/icTdbqWNOwNRna42FI242Lcia07jQodd2FJGIYQfG0LAJGFxM4FbnQP6yfMxBgJ0F3YRqJCJ1aPAK2dQagdusBZg/0', avatarUrl: '', nick_name: '', userImg: '', } }, onLoad() { let userInfo = uni.getStorageSync('userInfo') || {}; let { nick_name,img_url } = {...userInfo}; this.userImg = img_url; this.nick_name = nick_name; }, methods: { onChooseAvatar(e) { this.avatarUrl = e.detail.avatarUrl console.log('e.detail', e.detail) // this.updateUserInfo(); this.uploadFile(); }, inputWord: debounce(function(e){ this.nick_name = e.detail.value console.log('this.nick_name.length',this.nick_name.length) let str = this.nick_name.trim(); if(str.length==0){ this.$toast('请输入合法的昵称') return } if((/[^/a-zA-Z0-9\u4E00-\u9FA5]/g).test(str)){ this.$toast('请输入中英文和数字') return } this.updateUserInfo() }, 1500), /* 上传 头像 转 话格式*/ uploadFile(){ uni.uploadFile({ url: config.webUrl + '/upload/uploadImages',//后台接口 filePath: this.avatarUrl,// 上传图片 url name:'image', // formData: this.formData, header: { 'content-type': 'multipart/form-data', 'token': uni.getStorageSync('token') }, // header 值 success: res => { let obj = JSON.parse(res.data) console.log('obj', obj) if (obj.code == 1) { let imgUrl = obj.data.full_path; this.userImg = imgUrl; this.updateUserInfo(); } else { uni.showToast({ icon: 'none', title: '图片太大,请重新选择!' }); } }, fail: e => { this.$toast('上传失败') } }); }, updateUserInfo(){ let self = this; uni.showLoading({}); let params = { img_url: this.userImg, nick_name: this.nick_name.trim(), } self.$http.post('updateUserInfo', params).then(res => { uni.hideLoading() if (res.data.code == 1) { self.$toast('修改成功!') }else { self.$toast(res.data.msg) } }) }, } } 请一键三连,争取升个级,谢谢各位道友! 补充一下,如果api不生效注意切换一下版本库: 我本地用的2.26.1 [图片] 实际效果图: [图片] [图片]
2022-11-24 - 小程序突破10层路由方案
问题:微信限制10层内的路由跳转 10以后报错 需要使用redirectTo跳转 先前条件:使用这套解决方案需要项目中所有跳转页面的地方调同一个方法 解决方案:添加一个中转页面,由开发者维护一套虚拟路由栈数据,当跳转页面路由到第十层时需要把第9层重定向到中转页,再由中转页跳转到10层 方案细节: 9层(含9层)以内路由:走小程序自己的历史栈就,跳转时候更新一下自己维护的路由栈从9层跳转10层:需要把第9层重定向到中转页,再由中转页跳转到10层10层以后跳转:在navigateTo方法中处理,到10层之后,再跳转就第10层页面一直做redirectTo操作了10层以上返回:先返回到中转页,根据自己维护的虚拟路由栈判断具体返回到哪个页面,然后navigateTo过去从10层返回到9层:返回到中转页,将中转页redirectTo到第9层页面9层内的返回:使用小程序自己的返回更新虚拟栈节点 // 虚拟栈操作 switch (type) { case 'navigateTo': $history.push(target); break; case 'redirectTo': if (originType === 'navigateTo') $history.push(target); else $history.replace(target); break; case 'switchTab': $history.reset(target); break; case 'reLaunch': $history.reset(target); break; default: break; } 方案缺点:虽然突破了10层路由的限制但是10层之后的跳转会有中转页闪一下,返回也要重新走一遍小程序生命周期。(如果你的项目超过了10层路由先看能不能从产品角度优化掉毕竟10层路由对用户来说入口太深了~)
2022-11-07 - 自己写的一个前端面试题库微信小程序上线了
业余时间做了一个前端题库的一个小程序,设计也是自己做的,希望能给入门的朋友们做个学习参考 下面是部分功能截图: [图片][图片][图片][图片] 第三方服务来源: 前端面试3+1每日鸡汤:爱词霸 功能介绍 首页(展示今日题目,分类,热门题目,精选文章等)题库 (展示所有分类下的题目)我的 (个人信息墙)基础架构 |- app.js 工程入口 |- app.json 小程序原生配置 |- app.wxss 部分公共样式 |- image 资源目录 |- components 公用组件存放目录 |- pages 页面路径 |- service 适配当期页面服务,api存放 request 请求 |- utils 工程工具类 开源地址 https://git.weixin.qq.com/JsLin/fe-source 附言 有兴趣的小伙伴可以体验下看看,给出宝贵意见,下面是体验码 [图片]
2022-10-20 - 小程序订单中心path设置审核一直不通过?
我们提交审核,会有40%的概率不通过,腾讯审核进入到了我们的订单详情页面。明明提交的是订单中心页面。为什么会进入订单详情页面??
2022-12-27 - 关于小程序订单中心页设置的公告
为进一步规范小程序交易生态、提升用户购物体验、满足用户在有交易的小程序中便捷查看订单信息的诉求,自 2022 年 12 月 31 日起,对于有 “选择商品 / 服务 - 下单 - 支付” 功能的小程序,需按照平台制定的规范,在小程序内设置订单中心页。同时开发者需将小程序订单中心页的 path 同步给平台,以便平台核实设置情况。 一、需设置订单中心页的小程序类型针对同时满足以下条件的小程序,开发者需在小程序内设置订单中心页并将对应 path 同步给平台 1、实际经营类型为电商平台、商家自营、生活服务等涉及线上支付的小程序,购买对象为实物、虚拟商品或线下 / 线上服务等; 2、小程序内的交易涉及选择商品 / 服务 - 下单 - 支付的完整流程。 涉及的小程序类目如下: [图片] 二、订单中心页的设计规范为保障用户易用性,订单中心页需通过统一页面,展示所有涉及资金交易的订单明细或订单分类入口,详情请参考以下两种设计规范: 1、页面包含所有涉及资金交易的订单明细 [图片] 2、页面包含所有涉及资金交易的订单分类入口 [图片] 三、小程序订单中心页 path 规范1、规范生效的时间 自 2022 年 12 月 1 日起,开发者可通过代码提审入口、小程序管理后台 -> 设置 -> 功能设置进行 path 登记; 自 2022年 12 月 31 日起,若相关小程序仍未提交符合规范的订单中心页 path ,其后续代码提审可能会被驳回。 2、规范细则 (1)格式规范 i. 通过主 path(不拼接参数)可访问订单中心页面,设置时仅填写主 path; ii. path 内不含中文字符。 (2)跳转规范 i. 通过 path 进入订单中心,不自动跳转至小程序首页等其他页面,页面不出现加载失败等 bug ; ii. 通过 path 进入订单中心,如检测到用户无登录态,则在该页面通过弹窗等方式引导用户登录,登录后停留在订单中心页;或者跳转到登录页面,登录成功后返回订单中心页。 (3)修改规范 path 设置成功后,若对页面内容有调整,请确保调整后的页面仍符合订单中心页的各项规范。对于已发现的不再符合规范的订单中心页,平台会通知开发者限期调整。 四、订单中心页 path 同步方式自 2022 年 12 月 1 日起,平台提供以下两种方式供开发者将小程序订单中心页的 path 同步给平台(订单中心页的 path 如有变更,请及时重新设置): 1、对于新注册或有版本迭代需求的小程序:可在代码提审环节设置订单中心 path 2、对于无版本迭代需求的小程序:可在小程序管理后台 -> 设置 -> 功能设置 -> 小程序订单中心 path 设置入口进行设置 [图片] 五、第三方开发者代设置 path 的方式1、对于新注册或有版本迭代需求的小程序:可在提审时通过参数配置该商家小程序的订单中心页 path 新增参数为:order_path;接口为:submit_audit2、对于无版本迭代需求的小程序:第三方开发者可通过以下接口代商家设置订单中心页 path applySetOrderPathInfo:该接口可用于批量代商家小程序提交申请设置订单中心页 pathgetOrderPathInfo:该接口可用于查询商家小程序订单中心页 path 信息 微信团队 2022年12月2日
2023-09-26 - 扫普通链接二维码打开小程序的问题
https://developers.weixin.qq.com/miniprogram/introduction/qrcode.html 官方文档里有这么一句话:一个小程序帐号一个月可发布不多于100次二维码跳转规则。 如果我有几千个人员, 每个人员要生成普通二维码,是不是不支持?
2022-06-15 - canvas的bindtouchstart、bindtouchend失效,没有参数
第一次的touchstart的事件是有参数的,在点击就没有了(第二张图) iPhone 11 ios:16.0.3 微信:8.0.29 [图片][图片] [图片]
2022-10-18 - 微信人脸核身接口能力
一、能力背景 近年来,国家在医疗挂号、APP注册、快递收寄、客运、运营商等多领域规定,需要用户实名才可办理业务,预计后续也会有越来越多的此类法规。因此,微信参照公安部“互联网+”可信身份认证服务平台标准,依托腾讯公司及微信的生物识别技术,建立微信“实名实人信息校验能力” ,即通过人脸识别+权威源比对,校验用户实名信息和本人操作(简称微信人脸核身)。 目前接口限定主体及行业类目开放公测,提供给资质符合要求的业务方,在合适的业务场景内使用。目前仅支持持二代身份证的大陆居民。 由于人脸核身功能涉及到用户的敏感、隐私信息,因此调用此接口的小程序,需要满足一定的条件。即:小程序的主体以及类目,需要在限定的类目范围内,且与小程序的业务场景一致。开展的业务也需要是国家相关法规、政策规定的需要“实名办理”的相关业务(其他未在范围内的业务,则暂不支持)。 以下为接口接入及开发的详细内容。如开发中遇到任何疑问,可以点击此处通过社区反馈,将有工作人员跟进回复。 文档第四部分【再次获取核验结果api】,有助于提高业务方安全性,请务必接入! 现阶段微信人脸核验能力,针对小程序,开放的主体类目范围包含: 小程序一级类目 小程序二级类目 小程序三级类目 使用人脸核验接口所需资质 物流服务 收件/派件 / 《快递业务经营许可证》 物流服务 货物运输 / 《道路运输经营许可证》(经营范围需含网络货运) 教育 学历教育(学校) / (2选1):1、公立学校:由教育行政部门出具的审批设立证明 或 《事业单位法人证书》;2、私立学校:《民办学校办学许可证》与《民办非企业单位登记证书》 医疗 公立医疗机构 / 《医疗机构执业许可证》与《事业单位法人证书》 医疗 互联网医院 / 仅支持公立医疗机构互联网医院(2选1):1、卫生健康部门的《设置医疗机构批准书》;2、 《医疗机构执业许可证》(范围均需含“互联网诊疗”或名称含“互联网医院”等相关内容 医疗服务 三级私立医疗机构 / 仅支持三级以上私立医疗机构,提供《医疗机构执业许可证》、《营业执照》及《医院等级证书》 政务民生 所有二级类目 / 仅支持政府/事业单位,提供《组织机构代码证》或《统一社会信用代码证》。 金融业 银行 / (2选1):1、《金融许可证》; 2、《金融机构许可证》。 金融业 信托 / (2选1):1、《金融许可证》; 2、《金融机构许可证》。 金融业 公募基金 / (4选1):1、《经营证券期货业务许可证》且业务范围必须包含“基金”;2、《基金托管业务许可证》; 3、《基金销售业务资格证书》;4、《基金管理资格证书》。 金融业 证券/期货 / 《经营证券期货业务许可证》 金融业 保险 / (8选1):1、《保险公司法人许可证》;2、《经营保险业务许可证》;3、《保险营销服务许可证》;4、《保险中介许可证》;5、《经营保险经纪业务许可证》;6、《经营保险公估业务许可证》或《经营保险公估业务备案》;7、《经营保险资产管理业务许可证》 ;8、《保险兼业代理业务许可证》。 金融业 消费金融 / 银监会核准开业的审批文件与《金融许可证》与《营业执照》。 金融业 非金融机构自营小额贷款 / 仅支持省金融办监管的网络小贷主体,同时提供:1、《小额贷款公司经营许可证》或《小额贷款机构经营许可证》或省金融办批准文件;2、申请主体资质承诺函。 金融业 汽车金融/金融租赁 / 仅支持汽车金融/金融租赁主体,同时提供:1、《营业执照》(公司名称包含“汽车金融” /“金融租赁”;营业范围包含“汽车金融”/“金融租赁”业务);2、《金融许可证》或银保监会及其派出机构颁发的开业核准批复文件。 交通服务 网约车 快车/专车/其他网约车 (自营性网约车)提供《网络预约出租汽车经营许可证》。(网约车平台)提供与网约车公司的合作协议以及合作网约车公司的《网络预约出租汽车经营许可证》。 交通服务 航司服务 / 提供《公共航空运输企业经营许可证》 交通服务 机场服务 / 提供《民用机场使用许可证》或《运输机场使用许可证》 交通服务 公交/地铁 / 提供公交/地铁/交通卡公司《营业执照》 交通服务 水运 / (船企)提供《水路运输许可证》。(港口)提供《港口经营许可证》 交通服务 骑车 / 仅支持共享单车,提供共享单车公司《营业执照》 交通服务 火车/高铁/动车 / 仅支持铁路局/公司官方,提供铁路局/公司《营业执照》 交通服务 长途汽车 / (2选1):1、《道路运输经营许可证》(经营范围需含客运);2、官方指定联网售票平台(授权或协议或公开可查询文件)。 交通服务 租车 / 运营公司提供《备案证明》与对应公司《营业执照》,且营业执照中包含汽车租赁业务 交通服务 高速服务 / 仅支持ETC发行业务,(2选1):1、事业单位主体,需提供《事业单位法人证书》;2、官方指定的发行单位(一发单位),需提供“官方授权或协议,或公开可查询的文件”; 生活服务 生活缴费 / (供电类)提供《电力业务许可证》与《营业执照》,且《营业执照》且经营范围含供电。(燃气类)提供《燃气经营许可证》与《营业执照》,且《营业执照》且经营范围含供气。(供水类)提供《卫生许可证》与《营业执照》。(供热类)提供《供热经营许可证》与《营业执照》,且《营业执照》且经营范围含供热。 IT科技 基础电信运营商 / (2选1):1、基础电信运营商:提供《基础电信业务经营许可证》;2、运营商分/子公司:提供营业执照(含相关业务范围)。 IT科技 转售移动通信 / 仅支持虚拟运营商,提供《增值电信业务许可证》(业务种类需含通过转售方式提供移动通信业务) 旅游服务 住宿服务 / 仅支持酒店,提供《酒店业特种行业经营许可证》 旅游服务 旅游管理单位 / 仅支持政府/事业单位,提供《组织机构代码证》或《统一社会信用代码证》 商业服务 公证 / 仅支持公证处,提供《公证处执业许可证》或《事业单位法人证书》 社交 直播 / (2选1):1、《信息网络传播视听节目许可证》;2、《网络文化经营许可证》(经营范围含网络表演)。 如对以上类目或资质有疑问,可点击参考小程序“非个人主体开放的服务类目”,详细了解小程序开放的服务类目及对应资质。 二、准备接入 (请在小程序发布后,再提交人脸核身接口申请) 满足第一节中描述的类目和主体的小程序,可申请微信人脸核验接口。目前微信人脸核身接口已改为线上自助申请方式,需按照如下图例指引,进行接口申请: 第一步:请通过mp.weixin.qq.com登录小程序账号在后台“功能-人脸核身”的路径,点击开通按钮—— [图片] 第二步:仔细查阅《人脸识别身份信息验证服务条款》后,点击“同意并下一步”—— [图片] 第三步:请正确填写服务信息,并上传该小程序类目下所要求的资质—— [图片] 第四步:请按照业务实际需求填写使用人脸接口的场景和用途—— [图片] 第五步:请完善测试信息和联系人—— [图片] 第六步:提交后请耐心等待1-3个工作日的审核期,审核结果将以站内信通知—— 如申请期间遇到问题,可联系腾讯工作邮箱 wx_city@tencent.com,将会有相关工作人员进一步指引。 三、接口文档: (一)接口描述 名称: wx.startFacialRecognitionVerify(OBJECT) 功能:请求进行基于生物识别的人脸核身 验证方式:在线验证 兼容版本: 一闪:android 微信7.0.22以上版本, iOS 微信7.0.18以上版本 建议在微信官网升级至最新版本 (二)参数说明 1、OBJECT参数说明: 参数 类型 必填 说明 name String 是 姓名 idCardNumber String 是 身份证号码 success Function 否 调用成功回调 fail Function 否 调用失败回调 complete Function 是 调用完成回调(成功或失败都会回调) 2、CALLBACK返回参数 参数 类型 说明 errMsg String 错误信息 errCode Number 错误码 verifyResult String 本次认证结果凭据,第三方可以选择根据这个凭据获取相关信息 注 1:传递用户姓名和身份证有两种方式 业务方没有用户实名信息,用户需要在前端填写身份证和姓名,那么前端直接通过jsapi 调用传递 name 和 idCardNumber。 业务方已经有用户实名信息,后台通过微信提供的 api(详情见文档后面“上传姓名身份证后台 api”)上传用户身份证姓名和身份证,api 返回 user_id_key 作为凭证传给前端,前端再调用 jsapi,用户姓名、身份证信息不需要经过前端,参数只需要传递 userIdKey。Tips:使用该功能需要小程序基础库版本号>=1.9.3。 3、回调结果说明 回调结果请参考以下释义: [图片] [图片] [图片] 4、示例代码 [图片] [图片] (三)上传用户姓名身份证的后台api 1、API说明 1.1说明 业务方上传用户姓名和身份证,获取用户凭证,把凭证给到前端通过 jsapi 调用。 Tips :使用该功能需要小程序基础库版本号>=1.9.3。 1.2请求URL https://api.weixin.qq.com/cityservice/face/identify/getuseridkey?access_token={ac cess_token} 1.3请求方式 POST 2、请求数据格式 [代码]Json { "name" : “张三”, "id_card_number" : "452122xxxxxxx43215" } [代码] 请求示例 [代码]#!/bin/bash TOKEN='xxxxxxxxxxxx' URL='https://api.weixin.qq.com/cityservice/face/identify/getuseridkey' JSON='{ "name": "张三", "id_card_number": "452344xxxxxxxxxxxxx234"}' curl "${URL}?access_token=${TOKEN}" -d "${JSON}" [代码] 参数说明 json 字段 中文显示 是否必传 name 姓名 是 id_card_number 身份证号码 是 out_seq_no 业务方唯一流水号 否 3、返回数据 参数 类 型 说明 errcode int 错误码 errmsg string 错误信息 user_id_key string 用于后台交互表示用户姓名、身份证的凭证 expires_in uint32 user_id_key 有效期,过期需重新获取 [代码]{ "errcode" : 0, "errmsg" : "ok", "user_id_key" : "id_key_xxxx", "expires_in": 3600 } [代码] 4、后台消息推送 如果业务方传入out_seq_no,核身完成后会通过消息推送回调给业务方的服务器,如果回调业务方失败,会在5s尽力推送,超过5s不再推送。 参数说明 参数 类 型 说明 ToUserName string 小程序原始ID FromUserName string 事件消息openid CreateTime uint32 消息推送时间 MsgType string 消息类型 Event string 事件类型 openid string 核身用户的openid out_seq_no string 业务方唯一流水号 verify_result string 核身返回的加密key(凭据) 返回示例 [代码]{ "ToUserName": "gh_81fxxxxxxxx", "FromUserName": "oRRn15NUibBxxxxxxxxx", "CreateTime": 1703657835, "MsgType": "event", "Event": "face_identify", "openid": "oRRn15NUibBxxxxxxxxx", "out_seq_no": "test1234", "verify_result": "XXIzTtMqCxwOaawoE91-VNGAC3v1j9MP-5fZJxv0fYT4aGezzvYlUb-n6RWQa7XeJpQo0teKj8mGE4ZcRe1JI3GqzADBYORBu613rKjKAFfEXTXw_bu1bs7MnmPOpguS" } [代码] 四、再次获取核验结果api 此接口是前端完成人脸核身后,基于前端返回的凭据,通过后台api再次进行核验结果和身份信息的校验,有助于提高安全性,请务必接入! 前端获取结果不可信,存在被篡改的风险,为了保障请求结果安全性,请务必对identify_ret、id_card_number_md5、name_utf8_md5字段进行校验! (一)API说明 1、说明 人脸核身之后,开发者可以根据jsapi返回的verify_result向后台拉取当次认证的结果信息。 2、请求URL https://api.weixin.qq.com/cityservice/face/identify/getinfo?access_token={access_token} 3、请求方式 POST 4、请求格式 json (二)请求数据说明 1、请求 参数 类型 是否必填 描述 verify_result String 是 jsapi返回的加密key(凭据) 2、数据返回 HTTP 头如下 Date: Mon, 06 Feb 2017 08:12:58 GMT Content-Type: application/json; encoding=utf-8 Content-Length: 85 Connection: close json示例 [代码]{ "errcode" : 0, [代码] [代码]"errmsg" : "ok", "identify_ret" : 0, "identify_time" : 1486350357 "validate_data": "8593" [代码] [图片] (三)返回参数说明 1、返回参数 注:errcode和identify_ret同时为0,代表本次认证成功。 参数 类型 描述 errcode int 错误码, 0表示本次api调用成功 errmsg string 本次api调用的错误信息 identify_ret int 人脸核身最终认证结果 identify_time uint32 认证时间 validate_data string 用户读的数字(如是读数字) openid string 用户openid user_id_key string 用于后台交互表示用户姓名、身份证的凭证 finish_time uint32 认证结束时间 id_card_number_md5 string 身份证号的md5(最后一位X为大写) name_utf8_md5 string 姓名MD5 2、错误码对应信息 errcode 备注 84001 非法identity_id 84002 用户信息过期 84003 用户信息不存在 五、小程序辅助接口:检查设备是否支持人脸检测 1、接口名称 接 口 :wx.checkIsSupportFacialRecognition(OBJECT) 功能:检查设备是否支持人脸检测 2、接口说明和使用 小程序调用该接口,可以检测当前手机设备是否具备支持人脸检测的能力,可与以上接口分开使用,为了用户体验,建议调用后对手机设备不支持的用户做对应功能处理。 3、接口说明和使用 01 OBJECT 参数说明: 参数 类型 是否必填 描述 success Function 否 调用成功回调 fail Function 否 调用失败回调 complete Function 是 调用完成回调(成功或失败都会回调) checkAliveType Number 否 人脸核验的交互方式,默认读数字(见表 2) 表 2:checkAliveType 的值和对应的解释: 参数 解释 2 先检查是否可以屏幕闪烁,不可以则自动为读数字 02 CALLBACK 返回参数 参数 类型 说明 errMsg Boolean 错误信息 errCode Number 错误码 03 回调结果说明 回调类型 ErrCode 说明 sucess 0 支持人脸采集 fail 10001 不支持人脸采集:设备没有前置摄像头 fail 10002 不支持人脸采集:没有下载到必要模型 fail 10003 不支持人脸采集:后台控制不支持 回调结果说明仅对Android生效,iOS不返回errcode。 04 示例代码 [图片] 六、安全性说明 为保障业务可用性以及安全性,请详细研读微信人脸核身接口相关基础说明及安全说明文档:https://docs.qq.com/doc/DTFB0YWFIdGV6amly 备注:如开发中遇到任何疑问,可以点击此处通过社区反馈,将有工作人员跟进回复。 七、案例展示及补充说明 安徽医科大学第二附属医院,微信人脸核验登录: 安徽医科大学第二附属医院,是三级甲等综合医院。其小程序为用户提供挂号、门诊费用、住院费用、检查报告、体检等医疗服务,同时也提供停车、餐饮等便民服务,是医疗小程序中完整的案例。 小程序使用了微信人脸核验能力作为登录的核验。满足医院管理要求,也满足国家对于实名就医的管理规则。 案例实现的截图效果如下: [图片] [图片] 针对近期少数小程序方面反馈的两类问题,也在本课程进行补充说明。 1、本接口的开放范围,即:可支持的主体类目,是否可以扩大? 说明:基于本接口整体使用范围的评估、相关法规的参考、监管策略的理解执行等,暂时未立刻进行扩大开放范围的工作。 但我们会持续基于不同行业的法规、政策及监管要求等,逐一进行研究考量,以便确认如何扩大开放范围。 2、小程序如果涉及用户本人的生物特征采集,(如本人人脸照片、人脸视频),或涉及采集用户本人生物特征信息并开展人脸核验功能,则存在被驳回的情况? 说明:近两年“人脸识别”技术在社会上掀起了热潮。人脸识别虽然作为摆脱“中间媒介”或“承载载体”的一种直接技术手段,解决了部分政务、交通、医疗、零售等证明“操作者是本人”的问题,但也因此,引入了新的更大的安全风险。 一是,虚假安全风险。 身份认证领域的安全三因素包括“我知道什么”、“我拥有什么”、“我的特征是什么”,通用的安全做法,是要双因素认证(2FA),人脸识别技术如仅凭“我的特征是什么”这一个因素,则容易被攻破或利用。表象给用户以安全的感觉,但实际并不能达到安全效果。 二是,信息泄漏的风险。 越来越多的组织或个人,在并非必需用户敏感信息、生物特征的情况下,采集并存储此类信息。在信息加密、传输、存储过程中,容易暴漏更多的网络节点,使得此类信息有更大的风险被网络黑客拦截、窃听、窃取,或直接被脱库。 三是,消除风险的难度大。 以往基于“中间媒介”或“承载载体”的方式,如出现丢失、被冒用、恶意盗用等风险,可以通过挂失、更换、使用新载体或新媒介等方式,快速排除一定的风险。C端主动,B端主动,都能解决一部分问题。但人脸识别做为更直接的方式,一旦出现冒用、盗用,受害者将面临更大的财产及人生安全风险,且C端用户更多时候无法主动消除风险。 基于以上问题风险,加之国家出台《网络安全法》、《用户隐私保护条例》等法律法规标准,网信办、公安部、工信部及市场监管总局等四部委发起的app获取隐私整治,结合平台安全、用户敏感隐私信息保护要求及监管,针对部分暂无相关法规或要求,需要采集或生物认证方式进行身份核验的,或以“追热点”或“尝鲜”为目的,采集用户生物特征或进行身份核验的,进行严格审核,必要时不予以支持。
03-25 - 如何编写微信小程序大赛参赛作品的介绍文档
本人声明:这里所写的内容只是我个人的观点,不代表大赛官方,仅供选手参考。这个不是标准模板,大赛介绍文档没有模板,自己的文档应该怎么写比较好是你们自己考虑的事情,事后不能以此文档的建议作为评价标准来要求。 参赛作品提交要求: 1. 介绍文档:综合描述作品情况,突出作品的创新点和优势,内容应包括但不限于小程序说明、应用场景、解决的实际问题、产品设计、技术实现方案(包括小程序端和后台服务器端)等。使用微信云开发作为作品主要后端服务的小程序,应在技术实现方案中说明所使用的云开发技术。如果参赛作品引用了非团队成员的开发成果(如开源代码或其他应用系统),请务必在文档中说明。文档要求提交PDF格式,文件大小在10M以内。 2. 演示视频:演示参赛作品的主要使用流程并配上讲解,时长限在3分钟内,在微信开发者工具直接上传视频文件。 3. 小程序appid(允许上线版本和体验版)。 很多选手一直在问到底如何写介绍文档,我这里将之前在群里的讨论交流归纳整理如下几点建议,选手可以参考,但不要局限于此。 (一)介绍文档有什么用?让评委老师更好地了解你的作品! 虽然开发团队对自己的作品很熟悉,但是评委并不清楚这个小程序,包括应用背景、内部技术、作品特色以及未来运维等等,这些内容也无法通过直接试用而全面了解,所以团队需要在文档中清楚地展现这些内容。 (二)介绍文档主要应该写什么? 文档应该包括封面、目录和正文三个部分,封面仅列出作品名称即可,目录要清晰正确,封面和正文中都不要刻意出现团队和学校信息。如果作品需要给评委提供测试帐号,或者另有一个管理端小程序,建议在正文的第一页进行简单说明,并提供帐号信息或小程序码,以免放在正文后面被评委忽略。 正文部分简单地说,就是针对作品评分标准,写清楚相关的内容。下面所列的部分只是一个引导,选手可以根据自己的产品进行删减和补充,不一定要全部照搬。 1. 选题定位 (1) 应该说清楚这是一个什么小程序,具体的应用场景是什么以及解决什么实际问题?建议直接了当,突出重点,应用场景和实际问题要有一定的调查材料支撑,注意不能是网上随便抄来的。这部分是让评委大概了解这个小程序是干什么用的以及为什么要开发。 (2) 提出现实问题之后,建议简单地阐述一下自己的产品方案,这里的方案不是技术方案,而是自己打算做一个什么样的产品来解决现实的问题。 (3) 今年大赛的作品主题是“用科技创造社会价值与助力乡村振兴”,希望选手不要仅仅局限在校园范围去选题,可以从创造社会价值或乡村振兴等角度去寻找突破。注意避免随便选择往届比赛中做过多遍的选题,如果没有更多的创新而只是重复模仿,作品选题部分的得分肯定受影响。 2. 需求分析 (1) 在用户和业务分析方面,大家可以采用自己学过的一些方法和技术,原则就是用户分析到位,尤其要知道用户的人群和特点,明确相应业务的完整流程。 (2) 系统需求应该包括功能需求和非功能需求,不论是哪方面的需求,都应该是紧密结合自己要开发的系统,而不是泛泛地抄一些类似教科书上面的内容。 举例:“参观清华”小程序的非功能需求就是根据系统的实际要求,提出了关键的三个内容:一是性能,给出具体的量化指标;二是安全性,诸如身份证敏感信息等;三是可靠性,包括停电和断网问题、游客快速进入的问题等。 (3) 在做需求调研时选手应该适当进行一定的竞品分析,包括这些竞品的用户群、覆盖的主要业务场景以及产品功能和页面设计等。在文档中可以选1-2个竞品进行简单的对比分析,说明自己产品的优势和创新之处。 3. 产品设计 交互设计部分应展现整个系统的信息结构,说明配色和整体设计原则,把系统核心功能的交互设计图展现出来,然后选择自己认为可以突出亮点的几个关键设计进行说明。 4. 技术实现 作品的技术方案部分应给出系统的总体框架设计图,并做相应的说明,然后给出系统的技术选型、开发环境,包括所采用的框架、第三方组件等。 总体框架介绍清楚之后,应该着重介绍系统开发方面自己的突出贡献部分或者亮点部分,这个需要根据自己开发的系统进行归纳,选择核心重点或技术难点部分来说明相应的技术实现。 系统测试可以考虑写一下功能测试和性能测试,说明测试方案和测试结果,要注意清楚而且有实际的真实测试结果,不要乱写乱编。如果自己开发的系统非常简单,而且没有特别的性能要求,可以忽略性能测试部分。 5. 应用运营 大赛鼓励参赛作品上线发布,如果由于个人资质受限等因素无法上线,也可以提交体验版。对于同等质量的作品,上线版本略有优势,但是需要强调的是作品质量更为重要。 对于一些需要自己运营的作品,这部分也是非常重要的,需要说明如何上线以及未来的运营和维护方案,特别是一些需要特殊资质的作品,更要说清楚这一点。 如果上线发布的作品已经积累了一定的用户量,可以用小程序上线后的实际运行数据展现产品的应用效果,注意数据要有说服力。 (三)其他 也许选手们认为评委只要体验小程序就应该可以了解整个作品,实际上小程序本身呈现的更多是从用户角度的使用,对于小程序的应用背景、交互设计思路、所用开发技术的复杂度和难度以及系统实现水平等,很难从简单的试用了解清楚,因此需要开发团队在文档中写清楚,以便评委更好地了解你们的作品。但是,需要特别强调的是要阐述清楚和突出重点,切忌胡抄乱写,也不建议套用所谓某些软件工程文档模板而长篇大论,太长的文档是很难阅读的。当然,文档只是作品的一部分,好的小程序是至关重要的!
2022-05-28 - 小程序发布新版本后,线上始终有部分人使用的旧版本(老版本)
小程序具体更新机制请参考 https://developers.weixin.qq.com/miniprogram/dev/framework/runtime/update-mechanism.html 但有开发者咨询为什么小程序加了强制更新的机制后线上还始终有部分有旧版? 当用户网络较差时,更新新版本失败时用户会打开旧版本,不然他们就会打开失败微信客户端版本较低的版本也会存在更新不及时的情况之前有打开小程序的用户才可能打开旧版本,如果是新用户一定会打开最新版本对这部分用户官方暂时没有提供让他们强制更新的能力,官方在丰富能力让开发者选择是否打开失败还是打开旧版本
2023-11-13 - 微信支付V3-商家转账到零钱
微信支付V3-商家转账到零钱 ~ [图片] ~ 连续熬了几个晚上,终于在社区某高人的指点下完成了这块逻辑。由于V3的逻辑相对复杂,网上的资料也相对有限,在这块遇到很多坑 场景 最近答题活动增加了抽奖发红包的活动,抽奖其实在答题活动经常存在,但是之前都是通过线下领取奖励或者充话费的行为完成这个闭环模式; 在当前新的项目中是要抽奖并实时下发奖励,具体就是直接把对应抽中的金额下发到用户的微信零钱里面 效果 [图片] ~ 准备条件 1、商户号码 2、APIV3秘钥 3、证书系列 4、api cert 5、需要在小程序进行绑定 参考资料 ~ 参考项目1 https://github.com/wechatpay-apiv3/wechatpay-php [图片] ~ 参考项目2 https://github.com/TheNorthMemory/wechatpay-php [图片] 相关细节 ~ 调用下发的接口,会返回以下信息,我们不能通过该成功回调去判断是否真的已经发放成功了,这是V3很重要的一点 [图片] 下发的数据结构 "appid" => "wxcc26cf72611aeef0", "out_batch_no" => "45465plfk2020042013", "batch_name" => "2019年1月深圳分部报销单", "batch_remark" => "2019年1月深圳分部报销单", "total_amount" => 30, "total_num" => 1, "transfer_detail_list" => [[ "out_detail_no" => "1234x23zy545Bd5436", "transfer_amount" => 30, "transfer_remark" => "2020年4月报销", "openid" => "osPw15JkAUgpY6aPTrnBIg2gZ5zU" ],] ~ [图片] ~ { "appid": "wxcc26cf72611aeef0", "batch_id": "1030001083101257713912022062300867725335", "detail_id": "1040001083101257713912022062300861404139", "detail_status": "FAIL", "fail_reason": "TRANSFER_QUOTA_EXCEED", "openid": "osPw15JkAUgpY6aPTrnBIg2gZ5zU", "out_batch_no": "plfk2020042013", "out_detail_no": "x23zy545Bd5436", "transfer_amount": 10, "transfer_remark": "2020年4月报销", "update_time": "2022-06-23T09:43:52+08:00" } ~ 到账属于准实时 PAYEE_ACCOUNT_ABNORMAL:用户账户收款异常,请引导用户完善其在微信支付的身份信息以继续收款 REALNAME_ACCOUNT_RECEIVED_QUOTA_EXCEED:用户账户收款受限,请引导用户在微信支付查看详情 以下场景,即使调用成功也不会成功发放 1)用户微信支付被封 2)用户没有实名认证 待办 后面还有一些优化事项需要完成 2)抽奖规则梳理 1)安全策略,这块就是通过商户后台进行设置以下事项 1)下发最高奖励设置 2)单日下发次数限制 3)请求安全校验,真实下发之前,对入参进行校验,以排查一些非法的请求。 商家转账到零钱 答题抽奖活动 答题活动抽奖
2022-06-24 - 微信公众号无法注销,管理员要怎么解绑?
我有一个公众号,是几年前从某宝购买的,该公众号状态正常。 现在想注销,但是无法法人扫脸或者打款,因为我根本不认识法人更不知道她的对公账号。 但我确实是该公众号的管理员,现在我已经不想要这个账号了。 我有什么办法注销或者解绑这个公众号吗?
2022-08-05 - 小程序代码加固功能上线公告
为提高微信开放平台生态安全性,针对小程序开发过程中的安全问题,如代码易被反编译,核心业务逻辑被破译,算法易被二次打包等,导致小程序存在被破解、核心代码被盗取的风险,平台在微信开发者工具上线了代码加固功能,协助开发者保护小程序安全。 一、功能介绍 小程序代码加固是提供给开发者对小程序前端代码进行加密的功能,以防止代码暴露。该功能可将 JavaScript 文件传递给加密工具,从而实现字符串加密、属性加密、调用转换、代码混淆等多项保护措施,提高攻击者阅读前端代码逻辑的难度。 二、解决方案 微信开放平台通过在微信开发者工具中提供插件的方式,以便开发者进行功能的使用。同时还提供了Sourcemap代码加固调试工具,来帮助开发者对于加固后的文件进行错误分析。 三、功能使用 1、首先需在微信开发者工具选择代码加固插件进行安装; 2、选择需要加固的文件并进行配置操作,建议加固小程序中的敏感数据信息、核心算法逻辑、关键执行路径、接口(签名算法、协议、密钥等)。 另:界面操作和渲染、引用的第三方开源库等非必要安全保护内容可不进行加固,避免过多影响小程序体积及性能。 3、最后加固成功后可进行后续页面的预览,具体使用说明详见 功能介绍文档。 四、常见问题 Q1: 加固后显示编译结果失败? A1: 表示所加固的小程序内容,在小程序编译结果中没有对应的代码,所以导致替换失败,可以根据失败的提示信息,进行具体排查 [图片] Q2: 如果想一次性批量进行代码加固,应该如何操作呢?A2: 若需要批量进行代码加固,可直接修改[代码]code_obfuscation_config.json[代码]中的[代码]configs[代码]字段即可 [图片] 代码示例如下: [图片] Q3: 使用 Sourcemap 代码加固调试时,为什么查找不到报错路径?A3: srcMiniprogramRoot目录下不存在该报错文件所对应的源文件 [图片] Q4: 代码加固后会对产品性能有影响吗?A4: 产品性能影响与代码加固的内容、大小和数量有关,可能会影响代码体积,产品初始化耗时和执行速度,可通过 性能说明文档 作进一步了解。 如有其他相关疑问,欢迎随时参与社区讨论。
2022-07-22 - 地理位置接口新增与相关流程调整
一、地理位置接口新增说明 由于精确地理位置接口只允许部分类目的小程序申请使用,为了满足开发者在更多场景使用地理位置接口,自 2022 年 7 月 14 日起,新增获取模糊地理位置接口(wx.getFuzzyLocation)。同时为保障用户合法权益,该接口调用前需进行准入开通申请,该接口准入规则与 wx.chooseLocation 一致。 wx.getFuzzyLocation 接口说明: 1、该接口返回的是经过模糊处理的经纬度坐标; 2、该接口支持返回 wgs84 或 gcj02 两种类型的坐标; 3、该接口需要用户授权 scope.userFuzzyLocation。 二、app.json 的配置指引 为了开发者能够正常使用获取模糊地理位置等接口,以及后续对于代码提审环节的优化(见「三、地理位置接口使用流程」),自 2022 年 7 月 14 日起,开发者在使用地理位置相关接口时(共计 8 个,见表1),需要提前在 app.json 中进行配置。 1、需配置的接口列表 [图片] 表1 2、配置规则 1)在代码中使用的地理位置相关接口(共计 8 个,见表1),开发者均需要在 app.json 中 requiredPrivateInfos 配置项中声明,代码格式如下: [图片] 2)表1中模糊位置信息(序号1)和精确位置信息(序号2-5)是互斥的,即声明了模糊位置信息就无法声明精确位置信息。若同时声明模糊位置信息和精确位置信息,则在编译代码时出现错误; 3)注意:自 2022 年 7 月 14 日后发布的小程序,如果未在 app.json 中声明表1中的相关接口,则小程序调用这些接口(表1)时会出现错误,在 2022 年 7 月 14 日之前发布的小程序不受影响; 4)对于第三方开发者,需要在上传代码时通过参数在 ext.json 中声明其需调用的地理位置相关接口,配置规则和普通小程序的配置规则相同。 三、地理位置接口使用流程 自 2022 年 7 月 14 日起,开发者如需在最新版本发布后使用地理位置相关接口,除需完成接口权限开通外,还需在 app.json(或ext.json)配置环节,具体如下: 1、接口权限开通 以下 8 个接口需完成准入开通流程:wx.getFuzzylocation、wx.getLocation、wx.onLocationChange、wx.chooseAddress、wx.choosePoi、wx.chooseLocation、wx.startLocationUpdate、wx.startLocationUpdateBackground 1)普通开发者:需要在 “小程序管理后台 -「开发」-「开发管理」-「接口设置」” 中完成权限申请; 2)第三方开发者:可通过 apply_privacy_interface 接口完成权限申请。 2、app.json(或 ext.json)配置 1)普通开发者:需在 app.json 中声明其需调用的地理位置相关接口,具体配置流程见「二、app.json 的配置指引」; 2)第三方开发者:需要在上传代码时通过参数在 ext.json 中声明其需调用的地理位置相关接口(配置方式:可通过 commit 接口配置)。 同时,为了提升开发者体验,平台在代码提审环节会协助开发者对地理位置接口进行检测,如检测出代码中包含未完成准入开通的地理位置接口,平台将再次提醒开发者确认是否需使用相关接口。 1)普通开发者:若无需使用,开发者可在提审时确认不使用该接口,即可正常进行代码提审。小程序审核通过且新版本发布完成后,平台将对小程序确认不使用的接口关闭使用权限; 2)第三方开发者:若无需使用,可在提审时通过参数声明不使用该接口(声明方式:可通过 submit_audit 接口配置),即可正常进行代码提审,审核通过后发布上线,将对其声明不使用的接口关闭使用权限。 以上调整将仅对所有小程序生效。 微信团队 2022年6月1日
2023-09-26 - 小程序性能优化实践
小程序性能优化课程基于实际开发场景,由资深开发者分享小程序性能优化的各项能力及应用实践,提升小程序性能表现,满足用户体验。
2024-10-09 - URL Link和URL schema 打开小程序属于哪种统计指标?
[图片] 如果小程序是通过URL Link或者URL schema 打开,在统计里的场景访问里面,属于哪种指标?
2022-05-26 - innerAudioContext.pause 方法触发碰到bug,暂停不了?
调用innerAudioContext.onTimeUpdate方法获取播放时间,根据播放时长对比设定时长,超过设定时长则暂停。目前碰到的问题是,第一次触发超过时长的判断的时候,暂停失败、第二次触发事件之后才能成功暂停。开发工具中没有碰到这个问题,问题是真机调试的时候碰到的[图片][图片][图片]
2022-05-22 - 小程序客服能力迭代 - 移动端操作bar+PC端设置改版 20220517
本次迭代针对移动端「客服小助手」会话操作区域和PC端网页客服「设置」模块(https://mpkf.weixin.qq.com/)做升级迭代,提升客服回复效率。 1. 移动端「客服小助手」会话操作区域改版 新增移动端客服会话页消息输入栏上方操作栏,便于客服直接发送图片、转接会话、结束会话等操作,后续操作栏功能项将会持续新增迭代。 [图片] 2. PC端网页客服设置改版(https://mpkf.weixin.qq.com/) 2.1 网页端设置入口位置从左下角改为左侧导航栏,原左下角区域改为展示客服个人头像和设置在线状态。 [图片] 2.2 网页端客服工作台设置模块新增修改名称、快捷键的能力。 客服名称展示在用户会话页客服接入时,客服名称修改仅在单个小程序生效。 [图片] [图片] 后续客服系统将会持续迭代更新,欢迎各位开发者/商家分享使用体验及建议。
2022-07-11 - PowerWeChat 微信SDK 介绍
## 产品介绍 PowerWechat是一款全覆盖微信开发接口,基于Golang的开源项目。您只需安装一次Power WeChat SDK,就可以对接企业微信,小程序,公众号,支付等,微信的开发功能接口。同时我们提供了丰富的文档教程和辅助工具,帮助您轻松使用微信的接口功能。 ## 快速上手 go get -u github.com/ArtisanCloud/PowerWeChat/v2 示范:初始化实例对象,调用小程序的授权登陆接口 ```go import ( "github.com/ArtisanCloud/PowerWeChat/v2/src/miniProgram" "os" ) // 1. 初始化小程序应用实例 app, err := miniProgram.NewMiniProgram(&miniProgram.UserConfig{ AppID: os.Getenv("miniprogram_app_id"), // 小程序、公众号或者企业微信的appid Secret: os.Getenv("miniprogram_secret"), // 商户号 appID HttpDebug: true, Debug: false, }) // 2. 调用小程序的授权登陆接口 var code string = "CODE" // 前端小程序登录时,从微信获取的 coders, err := app.Auth.Session(code) // 查看获取强类型对象的属性 // 请参考官方文档的返回值 printf(rs.OpenID) printf(rs.SessionKey) printf(rs.UnionID) ``` 更多实例接口,请打开 https://powerwechat.artisan-cloud.com/zh/start/ ## 产品概述 ### 核心产品 [PowerWeChat SDK](https://powerwechat.artisan-cloud.com/ "PowerWeChat SDK") :是核心的SDK产品,安装后即可开箱即用。 在github上,长期维护的开源项目,可以提Issue在讨论版块。也可以在ArtisanCloud官网上,扫企业微信讨论群,方便用户提问,给宝贵的意见。 ### 辅助产品 PowerWeChat Document :全面的接口文档,方便用户查找,使用我们开发的sdk功能 PowerWeChat Tutorial :独立的golang项目,提供完整的web接口,让开发者方便调试PowerWeChat 接口实例 [图片] PowerWeChat 配置中心客户端/SAAS:如果您有多个微信的开发环境,或者多个应用,可以使用这个配置中心来方便切换账号(此应用暂时内部使用,如需体验,可以联系我们) [图片] # 产品诞生背景 团队也是很多同学一样,从PHP转向Golang,具体为什么,有什么好处,就不用我这里多介绍了吧。 但是现在因为微信的生态做私域化管理是得天独厚,所以我们公司也开发了蛮多企业微信的功能。只是在转型golang的过程中,没有找到像 (PHP语言)这样好用的sdk。所以我们就自己想为golang的同学们做一点贡献。产品会长期维护,迭代,希望同学们有兴趣在使用的过程中,多给意见。 # 产品特性 - 简易上手,安装一次,全覆盖微信功能接口 - 开源项目,丰富的文档内容,长期维护 - 新增群机器接口和文档 - Golang特性,强类型覆盖 - 完整的测试项目,支持web API测试 # 相关资源 ## 阅览教程文档 ## Github开源代码 [图片]
2022-05-31 - 小程序云测试服务近期更新(2022.05.05)
体验地址:快速开始 近期小程序云测试服务新增以下特性 `A` 支持设置录制回放和Minium的用例排序功能`A` 任务结束通知优化,增加邮件和短信的通知方式`A` 支持通过HTTPS第三方接口提测任务`A` 录制回放报告在出错时,新增下载错误步骤wxml功能修复或优化以下问题 `F`修复了Minium框架中自定义组件定位问题`U` Minium与录制回放任务增加初始化失败自动重试功能`U`【录制回放优化】当回放超时任务时,可查看超时时用例运行的进度`U`【录制回放优化】优化录制回放异步加载页面加载完成的判断,减少由页面未加载完成引起的"element not found"的报错 1、支持设置录制回放和Minium的用例排序功能 用户打开插件后,在“测试用例管理”—“测试计划”—“新建测试计划/编辑”,勾选测试用例时,根据勾选的顺序来执行用例 [图片] 2、任务结束通知优化,增加邮件和短信的通知方式 用户 前往“我的信息”页面绑定自己的邮箱或手机号,任务结束会通知到相关账号 [图片] 3、支持通过HTTPS第三方接口提测任务 用户可以通过第三方HTTPS接口提测云测任务,方便和现有的Devops流程打通。Jenkins打通可参考 教程 4、录制回放报告在出错时,新增下载错误步骤wxml功能 录制回放任务步骤执行失败时,支持下载WXML功能,方便用户排查问题。WXML文件可在开发工具中直接打开,主要用于排查元素找不到问题,具体使用可以参考 录制回放常见问题汇总文档。 [图片]
2022-06-14 - map上的cover-view标签里动态数据偶现渲染不出来,还比较频繁,有什么解决办法吗?
[图片][图片]
2022-05-07 - 开发智能名片小程序时遇到的技术问题以及解决办法
开发智能名片小程序时遇到的技术问题以及解决办法[图片]智能名片小程序,又叫电子名片小程序 关键词 this & thatthis是相对于当前函数而言的。如果在onLoad里定义了一个函数,并且需要调用根部数据 则可以在onLoad里先定义一个变量that,将this赋值给that 那此时调用的that,则是相对于onLoad()的当前对象onLoad函数内一个function需要用到setData;则可以在onLoad里先定义;再在function里调用that.setData setData对单个元素进行赋值直接this.setData({ele : ele})对数组赋值先拼接字符串 eg:对Stu: ['Li' , 'Yang' , 'Wang']进行某一索引值var index = 0 var str = "Stu[" + index + "]" for(index = 0; index < length; index++) this.setData({ str : "" }) 对对象赋值首先let arr = this.data.arr 然后创造obj let obj = {} 对obj赋值——类似于数组赋值,在拼接字符串时,后面加上.属性即可 最后用arr.push(obj) 数组push时被覆盖问题描述 这是一个数据库读取事件,actLine被加值后,在下次开启加值时,会将之前加的值替换,但对原本的值无影响,即几次push后,所有push的值都会变成最后一次push的值//原代码 if(res.data.length != 0){ //查询成功时 for(let i = 0; i < res.data.length; i++){ obj.title = res.data[i].title obj.host = res.data[i].host actLine.push(obj)) console.log(i,actLine) } 解决方法 第五行push时将其改为以下内容if(res.data.length != 0){ //查询成功时 for(let i = 0; i < res.data.length; i++){ obj.title = res.data[i].title obj.host = res.data[i].host actLine.push(Object.assign({}, obj)) //采用Object.assign将obj置于对象中再push给actLine console.log(i,actLine) } 原理 Object.assign() : 将所有可枚举的自有属性的值从一个或多个源对象复制到目标对象,返回目标对象。 icon与文字对不齐问题描述 使用vant组件库图标时,将icon与文字放在一个view标签里。显示情况,总是icon偏上一些,无论怎样调节字号都无效。/*原代码*/ <view class="actLable"><van-icon name="label-o" size="40rpx" />{{item.lable}}</view> 解决办法 在wxss里对vant-icon设置垂直居中即可van-icon { vertical-align:middle } icon 换行与连续空格换行 wxml里的/n或者br都不会被识别; 通过后台中传入的富文本换行,富文本中的\n会被当作字符串处理; 所以要在js里声明,wxml里调用/*js*/ Page({ data: { text: '这是一个段落 \n 看我变身换行', }, }) /*wxml*/ <view> <text>这是一个段落 \n 看我变身换行</text> </view> <view> <text>{{text0}}</text> </view> 连续空格 在view里输入多个空格,只会被当作一个处理;要放在text标签里,并且设置decode为ture ensp:中文字符一半大小 emsp:中文字符大小 nbsp:根据字体设置<view> <text decode="{{true}}">我要 开始 空格了(空格是中文字符一半大小)</text> </view> <view> <text decode="{{true}}">我要 开始 空格了(空格是中文字符大小)</text> </view> <view> <text decode="{{true}}">我要 开始 空格了(空格根据字体设置)</text> </view> [图片] 智能名片小程序,又叫电子名片小程序 [图片]
2022-04-25 - 社区每周 | 单页模板开放公测、模板有奖调研启动及上周问题反馈(3.28-4.01)
各位微信开发者: 以下是单页模板开放公测、模板有奖调研启动及上周我们在社区收到的问题反馈的处理进度,希望与大家一同打造更好的小程序生态! 单页模板开放公测 模板有奖调研启动 微信云开发「单页模板」功能已开放公测,支持在微信开发者工具中快速导入官方提供的小程序业务常用模块,导入后即可快速获得前端示例源码,同时支持可视化管理后台。开发者仅需要根据单页模板所提供的已封装好的功能接口,专注前端页面的交互开发,即可快速上线此类功能。同时还支持对模块代码进行二次开发以满足业务个性化需求,让标准化的组件获得 “新生” 。 当前已支持积分中心、签到打卡、邀请有礼模板,邀请各位开发者参与 模板有奖调研。官方团队将根据大家的反馈,不断优化模板功能,满足更多开发需求。 注意:请下载 1.05.2203251 预发布版本的微信开发者工具体验此功能。下载地址 上周问题反馈和处理进度(3.28-4.01) 已修复的问题取消开通的交易组件一直加载中的问题 查看详情 修复中的问题 通过微信开发者工具 picker 省市区选择器,设置 level 属性却出现点击不触发的问题 查看详情 URL Scheme 唤起微信频繁卡在 “请稍后” 页面的问题 查看详情 微信团队 2022.4.8
2022-04-10 - 小程序没有 DOM 接口,原因竟然是……?
拥有丰富的 Web 前端开发经验的工程师小赵今天刚刚来到新的部门,开始从事他之前没有接触过的微信小程序开发。在上手的第一天,他就向同办公室的小程序老手老李请教了自己的问题。 [图片] ———— 翻了一圈文档,小程序好像并不提供 DOM 接口?我还以为可以像之前一样用我喜欢的前端框架来做开发呢。老李,你说小程序为什么不给我们提供 DOM 接口呀? ———— [图片] 要提供 DOM 接口也没那么容易。你知道小程序的双线程模型吗?小程序是基于 Web 技术的,这你应该知道,但小程序和普通的移动端网页也不一样。你做了很多前端项目了,应该知道在浏览器里,UI 渲染和 JavaScript 逻辑都是在一个线程中执行的? [图片] ———— 这我知道,在同一个线程中,UI 渲染和 JavaScript 逻辑交替执行,JavaScript 也可以通过 DOM 接口来对渲染进行控制。 ———— [图片] 小程序使用的是一种两个线程并行执行的模式,叫做 双线程模型 。像我下图画的这样,两个线程合力完成小程序的渲染:一个线程专门负责渲染工作,我们一般称之为渲染层;而另外有一个线程执行我们的逻辑代码,我们一般叫做逻辑层。这两个线程同时运行,并通过微信客户端来交换数据。在小程序运行的时候,逻辑层执行我们编写的逻辑,将数据通过 setData 发送到渲染层;而渲染层解析我们的 WXML 和 WXSS,并结合数据渲染出页面。一方面,每个页面对应一个 WebView 渲染层,对于用户来说更加有页面的感觉,体验更好,而且也可以避免单个 WebView 的负担太重;另一方面,将小程序代码运行在独立的线程中的模式有更好的安全表现,允许有像 open-data 这样的组件可以在确保用户隐私的前提下让我们展示用户数据。 [图片] [图片] ———— 怪不得所有和页面有关的改动都只能通过 setData 来完成。但是用两个线程来渲染我们平时用单线程来渲染的 Web 页面,会不会有些「浪费」?而且每一个页面有一个对应的渲染层,那页面变多的时候,岂不是会有很大的开销? ———— [图片] 并不浪费,因为界面的渲染和后台的逻辑处理可以在同一时间运行了,这使得小程序整体的响应速度更快了。而在小程序的运行过程中,逻辑层需要常驻,但渲染层是可以回收的。实际上,当页面栈的层数比较高的时候,栈底页面的渲染层是会被慢慢回收的。 [图片] ———— 原来如此。这么说的话,实际的 DOM 树是存在于渲染层的,逻辑层并不存在,所以逻辑层才没有任何的 DOM 接口,我明白了。但是……既然可以实现像 setData 这样的接口,为什么不能直接把 DOM 接口也代理到逻辑层呢?我觉得小程序可以做一个封装,让我们在逻辑层调用 DOM 接口,在渲染层调用接口后再把结果返回给我们呀。 ———— [图片] 从理论上来说确实是可以的。但是线程之间的通信是需要时间的呀。将调用发送到渲染层,再将 DOM 调用结果发送回来,这中间由于线程通信发生的时间损耗可能会比这个接口本身需要的时间要多得多。如果以此为基础使用基于 DOM 接口的前端框架,大量的 DOM 调用可能会非常缓慢,让这个设计失去意义。 在实际测试中,如果每次 DOM 调用都进行一次线程通信,耗时大约是同等节点规模直接在渲染层调用的百倍以上;如果忽略通信需要的时间,一个实现良好的基于 DOM 代理的框架可以近似地看成一个动态模板的框架,而动态模板和静态模板相比要慢至少 50%。 [图片] ———— 原来如此,线程通信的时间确实是我没有考虑到的问题。那现在的小程序框架中难道不存在这个问题吗? ———— [图片] 在现在的小程序框架中,这个问题也是存在的,这也是现在的框架基于静态模板渲染的原因。静态模板可以在运行前就做好打包,直接注入到渲染层,省去线程传输的时间。在运行时,逻辑层只和渲染层进行最少的、必要的数据交换:也就是渲染用的数据,或者说 data 。另一方面,静态模板让两个线程都在启动时就拥有模板相关的所有数据,所以框架也充分利用了这一点,进行了很多优化。 [图片] ———— 怪不得我在文档里发现很多和 setData 有关的性能提示,都提醒尽量减少设置不必要的数据,现在总算是知道为什么了。但是具体到实际开发里的时候,还是总觉得很难每次只设置需要的数据啊,像对象里或者数组里的数据怎么办呢? ———— [图片] 如果只改变了对象里或者数组里的一部分数据,可以通过类似 array[2].message , a.b.c.d 这样的 数据路径 来进行「精准设置」。另外,现在自定义组件也支持 纯数据字段 了,只要在自定义组件的选项中设置好名为 pureDataPattern 的正则表达式, data 中匹配这个正则的字段将成为纯数据字段,例如,你可以用 /^_/ 来指定所有 开头的数据字段为纯数据字段。所有纯数据字段仅仅被记录在逻辑层的 this.data 中,而不会被发送到渲染层,也不参与任何界面渲染过程,节省了传输的时间,这样有助于提升页面更新性能。 [图片] ———— 小程序还有这样的功能,受教了。不过说来说去,我还是想在小程序里用我顺手的框架来开发,毕竟这样事半功倍嘛。我在网上搜索了一下,发现现在有很多支持用 Web 框架做小程序开发的框架,但好像都是将模板编译成 WXML,最终由小程序来做渲染,但这样的方法好像兼容性也不是很好。我在想,我们能不能在逻辑层仿造一套 DOM 接口,然后在运行时将 DOM 调用适配成小程序调用? ———— [图片] 你的这个脑洞有一些意思。在逻辑层仿造一套 DOM 接口,直接维护一棵 DOM 树,这当然没问题。但是没有代理 DOM 接口,逻辑层的 DOM 树没法反映到渲染层,因为渲染层具体会出现什么样的组件,是运行时才能知道的,这不就没法生成静态模板了? [图片] ———— 静态模板确实是没法生成了,但我看到小程序的框架支持自定义组件,我是不是可以做一个通用的自定义组件,让它根据传入的参数不同,变成不同的小程序内置组件。而且自定义组件还支持在自己的模板中引用自己,那么我只需要一个这个通用组件,然后从逻辑层用代码去控制当前组件应该渲染成什么内置组件,再根据它是否有子节点去递归引用自己进行渲染就可以了。你看这样可行吗? [图片] ———— [图片] 这样的做法确实可行,而且微信官方已经按照这个思路推出小程序和 Web 端同构的解决方案 Kbone 了。Kbone 的原理就像你刚才说的那样,它提供一个 Webpack 插件,将项目编译成小程序项目;同时提供两个 npm 包,分别提供 DOM 接口模拟和你说的那个通用的自定义组件作为运行时依赖。要不你赶紧试试? [图片] ———— 还有这么好的事,那我终于可以用我喜欢的框架开发小程序了!这么好的框架,为什么不直接内置到小程序的基础库里呀? ———— [图片] 因为这样的功能完全可以用现在已有的基础库功能实现出来呀。Kbone 现在是 npm 包的形式,使得它的功能、问题修复可以随着自己的版本来发布,不需要依赖于基础库的更新和覆盖率,不是挺好的吗? [图片] ———— 好是好,但我担心的是代码包大小限制的问题。除了我们已经写好的业务逻辑之外,现在还得加上 Kbone,会不会装不下呀? ———— [图片] 原来你是担心这个呀,放心,Kbone 现在已经可以在 扩展库 里一键搞定啦。扩展库是帮我们解决依赖的全新功能,只要在配置项中指定 Kbone 扩展库,就相当于引入了 Kbone 相关的最新版本的 npm 包,这样就不占用小程序的代码包体积了,快试试吧! [图片] ———— 哇,那可太爽了,马上就搞起! ———— [图片] 如果使用Kbone的过程中遇到问题,还可以到PC端 Kbone社区主页 发帖交流,上面这个框架的官方开发人员会和大家一起互动哦!
2022-06-24 - 你想知道的Kbone适配
本文主要介绍了 Kbone 接入过程可能会遇到的情况,包括请求、DOM/BOM、全局变量、样式、第三方UI库、环境区分。 Kbone 推出已有一段时间了,使用 Kbone 的你有没有遇到一些问题呢? 今天小编带大家来探一探 Kbone 接入过程中你可能会遇到的情况。 请求 对小程序了解的同学应该都知道,小程序的请求使用的是 wx.request,而在 Web 中,使用的是 XMLHttpRequest,那用 Kbone 要怎么处理呢? 简单~直接使用 XMLHttpRequest (公测中)。 当然,如果你想做一些个性化的处理,也可以自己实现 adapter。 DOM/BOM 为了更好地适配小程序端接口,Kbone 在原有的 DOM/BOM 之上进行了扩展,当然,这些适配也不是完全的,比如 getBoundingClientRect 在小程序中只能通过异步的方式实现。或者是对于 Kbone 没有实现的接口,你可以通过 扩展 API 来适配~ [图片] 全局变量 Web 开发中,我们使用 window 的方法都是直接访问的,因为 window 是顶级作用域,但是在小程序中却不是,所以直接访问是会报错的。 为了解决这个问题,Kbone 允许注入全局变量,这里通过 generate.globalVars 来实现: // mp-webpack-plugin 配置 { generate: { globalVars: [ ['TEST_VAR_STRING', '\'miniprogram\''], ['TEST_VAR_NUMBER', '123'], ['TEST_VAR_BOOL', 'true'], ['TEST_VAR_FUNCTION', 'function() {return \'I am function\'}'], ['TEST_VAR_OTHERS', 'window.document'] ], }, // 其他配置... } 样式 开发页面中,样式必不可少。由于 Web 与小程序标签的差异,Kbone 在转化过程中会将标签选择器转换为类选择器,比如: // Web span {} // 小程序 .h5-span {} 这里可能会带来选择器的权重被提升,所以依赖选择器权重这里需要手动调整一下。 Tips:小程序不支持 ~ 选择器 第三方UI库 目前,第三方 UI 库存在兼容的问题,有些接口无法兼容,比如 getComputedStyle、getBoundingClientRect 等接口。所以,Kbone 推出 Kbone-ui 来解决兼容问题。 [图片] 环境区分 虽然是多端适配,但是总会有一些情况是要区分处理的,比如小程序有 map 组件可以使用,而 Web 端没有,这个时候需要我们从代码层面进行适配处理。 对于开发者来说,我们可以通过 webpack 注入一个环境变量: // webpack.mp.config.js module.exports = { plugins: [ new webpack.DefinePlugin({ 'process.env.isMiniprogram': true, }), // ... other options ], // ... other options } 后续在业务代码中,就可以通过 process.env.isMiniprogram 来判断是否在小程序环境: if (process.env.isMiniprogram) { console.log('in miniprogram') } else { console.log('in web') } 关于 Kbone 你有什么使用问题或建议? 欢迎来到 #Kbone官方框架 社区主页发帖交流
2022-06-24 - 报名开启:云开发技术峰会-公益编程挑战赛
[图片][图片][图片][图片]
2022-03-08 - 报告微信公告的小bug
第一个常用主页列表排版不对,第二个文本无换行 [图片][图片]
2022-01-26 - 小程序安全检测上线公告
为进一步提升小程序的安全性和用户体验,目前平台将对提审的小程序进行安全检测,以便能及时帮助开发者发现小程序可能存在的安全漏洞。 一、背景介绍 小程序在开发过程中若存在安全漏洞的情况,如敏感数据篡改、拖库信息泄露、WEB攻击等,容易造成小程序的安全隐患,可能带来代码易被反编译、核心业务逻辑被破译、算法易被二次打包等风险。因此,平台将对提审的小程序进行安全检测,以协助开发者提升小程序服务的安全性,同时开发者也应加强自身小程序安全漏洞监测能力,保证可及时消除潜在的安全风险。 二、审核过程 安全检测过程中,平台会模拟真实业务场景,向提审小程序的后台发送服务请求,服务器会收到来自平台(显示为:Tencent Security Team,请求IP为106.55.202.118;113.96.223.69;125.39.132.125;43.139.209.119)的请求。该请求均以较低速率进行,正常情况下不会影响小程序的正常服务。若确实出现了影响小程序正常业务的特殊情况,如用户无法进行小程序的正常访问,开发者可基于自身业务情况,对相应请求加以限频,如有其他疑问,欢迎随时通过官方社区进行反馈。 三、审核结果 安全检测的结果是小程序审核的重要参考。若小程序在安全检测中被检测到存在安全漏洞,该小程序的审核将不予通过。开发者可根据扫描报告中的修改指引,对安全漏洞进行相应修复后,再重新进行提审。 其他常见问题 Q1:可以选择不进行安全检测吗,是否会影响小程序代码提审结果? A1:安全检测是小程序审核的环节之一,所有提审的小程序均需进行,若检测中发现安全漏洞或小程序故意采取措施规避检测,该小程序的审核将不予通过。 Q2:若在小程序代码审核已结束或审核已撤销的情况下,可以停止安全检测吗? A2:若在小程序代码审核已结束的情况下,平台将持续进行未完成的安全检测直至完成,如有需要,开发者可通过平台提供的相应链接(在【小程序管理后台 → 通知中心】查看站内信即可)自行中止安全检测;若在小程序审核已撤销的情况下,平台将自动中止未完成的安全检测。 附表:安全检测内容详情 [图片]
2024-03-08 - 云开发实战教程
用云开发来做一个小程序的功能与实战教程,讲解核心能力如何用云开发实现,例如:用户管理、小程序码、短信应用、分享卡片等。
2022-03-28 - 一个小程序最多同时开多少个直播间?小程序直播组件直播间的直播时长是否有限制?
同一个小程序最多可以支持50个直播间同时直播,每天的直播上限也是50场。每个直播间不能直播超过12小时。
2020-04-17