- UNI-APP使用云开发跨全端开发实战讲解
UNI-APP 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉/淘宝)、快应用等多个平台。 本文为大家讲解如何采用云开发官方JS-SDK,接入云开发后端服务并支持UNI-APP全部端(不止于微信小程序) JS-SDK和UNI-APP适配器1.JS-SDK和适配器云开发官方提供的@cloudbase/js-sdk,主要用来做常规WEB、H5等应用(浏览器运行)的云开发资源调用,也是目前最为完善的客户端SDK。 目前市面上大部分的轻应用、小程序包括移动应用APP都是采用JS来作为开发语言的,所以我们可以对TA进行轻微改造,就可以轻松使用在各种平台中。 但是单独改造SDK包会有些许风险,比如在原SDK包升级时需要重新构造,就造成了无穷无尽的麻烦,改造成本相当大。 官方的产品小哥哥深知这种不适和痛苦,所以在@cloudbase/js-sdk 中提供一套完整的适配扩展方案,遵循此方案规范可开发对应平台的适配器,然后搭配 @cloudbase/js-sdk 和适配器实现平台的兼容性。 不了解的小伙伴肯定会有些茫然,我来用浅显的语言解释一下,就是@cloudbase/js-sdk 将底层的网络请求以及相关基础需求以接口的形式暴露出来,我们按照平台的特殊API来补充这些接口,sdk就可以根据这些补充的接口,无障碍的运行在平台中了。 如果我们想在UNI-APP中使用@cloudbase/js-sdk ,底层网络请求你需要来补充,因为sdk原本是适应浏览器的,TA不知道UNI-APP怎么对外发请求,所以你需要将uni.request 方法补充到TA暴露的接口中。补充完毕后,@cloudbase/js-sdk 就可以在UNI-APP中活泼的运行了。 我们将所有的uni方法全部补充到JS-SDK暴漏的接口中去,就形成了一个完整的适配器,我们将其成为uni-app适配器。 2.UNI-APP适配器UNI-APP的整体接口都是公开透明的,我们在开发UNI-APP时也都遵照同一套接口标准。所以小编已经将uni-app适配器制作完毕,大家只需要在使用时接入适配器就可以了。 我们在项目目录main.js中引入云开发JS-SDK,然后接入我们的UNI-APP适配器即可。 import cloudbase from '@cloudbase/js-sdk' import adapter from 'uni-app/adapter.js' cloudbase.useAdapters(adapter); cloudbase.init({ env: '',//云开发环境ID appSign: '',//凭证描述 appSecret: { appAccessKeyId: 1,//凭证版本 appAccessKey: ''//凭证 } }) 移动应用登录凭证云开发SDK在使用过程中,向云开发服务系统发送的请求都会需要验证请求来源的合法性。 我们常规 Web 通过验证安全域名,而由于 UNI-APP 并没有域名的概念,所以需要借助安全应用凭证区分请求来源是否合法。 登录云开发 CloudBase 控制台,在安全配置页面中的移动应用安全来源一栏:[图片] 点击“添加应用”按钮,输入应用标识:uni-app(也可以输入其他有标志性的名称),需要注意应用标识必须是能够标记应用唯一性的信息,比如微信小程序的 appId 、移动应用的包名等。[图片] 添加成功后会创建一个安全应用的信息,如下图所示:[图片] 我们需要保存一下上图中的版本(示例为1)、应用标识(示例为uni-app)、以及点击获取到的凭证(示例为demosecret) 在项目目录中,我们将main.js中的init部分补全 import cloudbase from '@cloudbase/js-sdk' import adapter from 'uni-app/adapter.js' cloudbase.useAdapters(adapter); cloudbase.init({ env: 'envid',//云开发环境ID,保证与你操作登录凭证一致 appSign: 'uni-app',//凭证描述 appSecret: { appAccessKeyId: 1,//凭证版本 appAccessKey: 'demosecret'//凭证 } }) 如此,你就可以正常的进行云开发的登录使用了。 需要注意以下4点: 你需要设置uni-app的各端安全域名为:request:tcb-api.tencentcloudapi.com、uploadFile:cos.ap-shanghai.myqcloud.com、download:按不同地域配置使用此种方法接入云开发是全端支持,并不会享有微信小程序生态的一些便利,微信小程序开发还是需要依赖正常请求调用过程(将云开发作为服务器来对待),但你可以判断wx来使用wx.cloud来兼容。使用云开发的匿名登录时,受各端实际情况影响,可能不能作为常久唯一登录id,需要根据自身业务建立统一账户体系,具体可使用自定义登录来进行。UNI-APP支持WEB网页端上线时,需要将网页域名配置到云开发安全域名中(防止WEB下载文件导致跨域)示例代码详解示例项目中已经基本构建了uni-app使用云开发的各种流程代码。 在页面中进行匿名登录: // index.vue import cloudbase from '@cloudbase/js-sdk' export default { data() { return { title: '登录中' } }, onLoad() { cloudbase.auth().anonymousAuthProvider().signIn().then(res => { this.title = '匿名登录成功' }).catch(err => { console.error(err) }) } } 调用云函数并收到返回结果: import cloudbase from '@cloudbase/js-sdk' export default { methods: { call: function() { cloudbase.callFunction({ name: "test", data: { a: 1 } }).then((res) => { console.log(res) }); } } } 操作数据库: import cloudbase from '@cloudbase/js-sdk' export default { methods: { database: function() { cloudbase.database().collection('test').get().then(res => { console.log(res) }) } } } 实时数据库监听: import cloudbase from '@cloudbase/js-sdk' export default { methods: { socket: function() { let ref = cloudbase.database().collection('test').where({}).watch({ onChange: (snapshot) => { console.log("收到snapshot", snapshot); }, onError: (error) => { console.log("收到error", error); } }); } } } 上传文件(框架限制,WEB端无法操作): import cloudbase from '@cloudbase/js-sdk' export default { methods: { upload: function() { uni.chooseImage({ count: 1, sizeType: ['original', 'compressed'], sourceType: ['album'], success: function(res) { console.log(res.tempFilePaths[0]) cloudbase.uploadFile({ cloudPath: "test-admin.png", filePath: res.tempFilePaths[0], onUploadProgress: function(progressEvent) { console.log(progressEvent); var percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total); } }).then((result) => { console.log(result) }); } }); } } } 下载文件(需要注意地域域名,配置安全域名): import cloudbase from '@cloudbase/js-sdk' export default { methods: { download: function() { cloudbase.downloadFile({ fileID: "cloud://demo-env-1293829/test-admin.png" }).then((res) => { console.log(res) }); } } } 部署步骤将项目下载后使用HBuilderX打开。按照获取移动安全凭证的指引,填写至mian.js相应处。打开目录命令行,npm i执行安装依赖。打开云开发控制台,开启匿名登录。新建一个默认的云函数,名称为test(逻辑内容直接返回event即可)新建一个数据库,名称为test(随便添加几个记录,设置权限为所有人可读)调整项目pages/index/index.vue中,21行代码,在登录成功后调用相应函数。以下是WEB端运行时展示:[图片] 关于uni-app适配器在util/adapter中,只进行了简单的测试,保证可用性,后续请关注官网获取最新适配器依赖此方法有别与uniCloud,是直接使用uni请求底层,依赖官方JS-SDK进行云开发服务的交互处理,在使用时注意区别。项目地址:https://github.com/AceZCY/UNI-for-CloudBase
2020-12-08 - 自定义交易组件postman测试脚本
README 基于此Postman-cn脚本完善了自定义交易组件当前已公开接口 好用记得点赞 导入方法 以下操作为MAC OS导入流程 1.打开postman,点击“Import” [图片] 2.点击“upload files” [图片] 3.选择下载好的json 脚本,点击“open” [图片] 4.点击“Import”进行导入 [图片] 配置方法 [图片] 脚本下载地址 下载地址:https://cloud.189.cn/web/share?code=IFVB7rzIBNZn(访问码:2ewk) 如下载地址失效请留言,看到后第一时间更新
2022-05-18 - 微盘spaceid相关问题?
怎么获取已经存在的空间的spaceid?我看文档里面是只有新建space才会返回spaceid,那已经存在的空间没法获取spaceid了吗
2021-01-08 - recyle-view关于滑动过快会跳动的问题【已找出原因】【没有复现也没有代码可以提供】
https://developers.weixin.qq.com/miniprogram/dev/extended/component-plus/recycle-view.html 4000条+信息的列表在开发者工具和安卓中快速滑动不会顶多会白一下屏,但不会抖动,而iOS会滑到一定距离会跳动,整个表自己动。(itemsize已经设置完全一致),然后去组件的代码把这句scroll-anchoring(只会在iOS生效的字段)去掉就没事了。所以是为什么呢?[图片]
2019-12-19 - 静态网站托管,用了自定义域名之后,wx.config签名失败,用腾讯云分配的默认裸域名时正常?
vue项目,在微信环境下使用<wx-open-launch-weapp>开放标签跳转小程序,使用的是腾讯云静态网站托管 自定义域名:https://ad-box.zjqykj.com/#/ 原始域名:https://blind-box-test-3gk52c8f2520aa73-1309766616.tcloudbaseapp.com/#/ 用自定义域名的时候报签名错误:config:invalid signature 这个问题有解么? ========================================================> 已解决,是自定义域名配置,之前的cname解析有点问题。在添加自定义域名后,用系统分配的那个带cdn的cname重新解析之后,可以正常跳转了~ [图片]
2022-02-28 - V3统一下单二次签名nodejs云函数简单代码
得到prepay_id后,小程序支付二次签名: function getPayment(prepay_id){ let wxContext = cloud.getWXContext() let appid = wxContext.APPID let package = 'prepay_id=' + prepay_id let timestamp = parseInt(Date.now() / 1000) + '' let nonce_str = Math.random().toString(36).substr(2, 15) return { appId: appid, nonceStr: nonce_str, package, signType: 'RSA', timeStamp: timestamp, paySign: getSign([appid, timestamp, nonce_str, package], key) } } function getSign(parts = [], key, str = '') { parts.forEach(v => str += v + '\n') return crypto.createSign('RSA-SHA256').update(str).sign(key, 'base64') }
2021-12-17 - 开源微信支付 v3 版 .Net SDK(支持 .NET Core / Framework,完整封装全部 v3 API)
基于 [代码]Flurl.Http[代码] 的微信支付 API v3 版 .NET SDK。 注意:本库仅支持 v3 版 API,如需 v2 版 API 请移步 SKIT.FlurlHttpClient.Wechat.TenpayV2。 [图片] [图片] [图片] [图片] [图片] GitHub 项目地址:https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat Gitee 项目地址:https://gitee.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat NuGet 项目地址:https://www.nuget.org/packages/SKIT.FlurlHttpClient.Wechat.TenpayV3 前言 目前网络上还没有基于微信支付 v3 版 API 完整封装的 .NET 客户端(大部分只提供了基础的如支付、退款一类 API 封装),遑论开源了;这都 2021 年了,官方本身提供的示例代码还只能运行在 .NET Framework on Windows 上;就连 RSA 签名这么基础的东西都没有人封装(确切的说是因为 RSA 有很多种分块模式和填充模式,网上能找到的往往只封装了其中一种,但却未必符合微信支付的要求)。 于是萌生了自己封装一个库的想法,打算解决这几个痛点,同时也是推广一下微软官方的 [代码]System.Text.Json[代码]。 特性 基于 [代码]Flurl.Http[代码],可与 [代码]IHttpClientFactory[代码] 集成。 支持 .NET Framework 4.6.1+、.NET Standard 2.0+、.NET Core 2.0+、.NET 5、.NET 6。 支持 Windows / Linux / macOS 多平台部署。 支持 [代码]System.Text.Json[代码](默认)和 [代码]Newtonsoft.Json[代码] 两种序列化方式。 异步式编程。 强类型接口模型。 支持拦截器功能。 完整、完善、完全的微信支付 API 封装,支持目前(截至 2021-12-01)微信支付提供的全部 v3 版 API。 支持直连商户、服务商两种模式。 请求时自动生成签名,无需开发者手动干预。 提供了微信支付所需的 RSA、AES、SHA-256 等算法工具类。 提供 SourceLink,方便项目无源码调试。 提供了生成 JS-SDK/APP 调起支付参数及签名、加密请求敏感数据、解析响应敏感数据、解析回调通知事件敏感数据等扩展方法。 基础用法 安装: [代码]# 通过 NuGet 安装 > Install-Package SKIT.FlurlHttpClient.Wechat.TenpayV3 # 通过 dotnet-tools 安装 > dotnet add package SKIT.FlurlHttpClient.Wechat.TenpayV3 [代码] 你也可通过 Visual Studio NuGet 管理器图形化界面安装(注意搜索时需勾选“包括预发行版”)。 初始化: [代码]using SKIT.FlurlHttpClient.Wechat; using SKIT.FlurlHttpClient.Wechat.TenpayV3; /* 平台证书管理器,具体用法请参见文档的高级技巧 */ var manager = new InMemoryCertificateManager(); /* 仅列出必须配置项。也包含一些诸如超时时间、UserAgent 等的配置项 */ var options = new WechatTenpayClientOptions() { MerchantId = "微信商户号", MerchantV3Secret = "微信商户 v3 API 密钥", MerchantCertificateSerialNumber = "微信商户证书序列号", MerchantCertificatePrivateKey = "-----BEGIN PRIVATE KEY-----微信商户证书私钥-----END PRIVATE KEY-----", PlatformCertificateManager = manager }; var client = new WechatTenpayClient(options); [代码] 请求 & 响应: [代码]using SKIT.FlurlHttpClient.Wechat.TenpayV3; using SKIT.FlurlHttpClient.Wechat.TenpayV3.Models; /* 以 JSAPI 统一下单接口为例 */ var request = new CreatePayTransactionJsapiRequest() { OutTradeNumber = "商户订单号", AppId = "微信 AppId", Description = "订单描述", ExpireTime = DateTimeOffset.Now.AddMinutes(15), NotifyUrl = "https://example.com", Amount = new Models.CreatePayTransactionJsapiRequest.Types.Amount() { Total = 100 }, Payer = new Models.CreatePayTransactionJsapiRequest.Types.Payer() { OpenId = "用户 OpenId" } }; var response = await client.ExecuteCreatePayTransactionJsapiAsync(request); if (response.IsSuccessful()) { Console.WriteLine("PrepayId:" + response.PrepayId); } else { Console.WriteLine("HTTP 状态:" + response.RawStatus); Console.WriteLine("错误代码:" + response.ErrorCode); Console.WriteLine("错误描述:" + response.ErrorMessage); } [代码] 验证响应签名: [代码]/* 一般情况下可以跳过验证响应的签名 */ bool valid = client.VerifyResponseSignature(response); [代码] 生成客户端 JS-SDK 调起支付所需参数: [代码]/* 字典结构,包含客户端 JS-SDK 调起支付所需的完整参数 */ var paramMap = client.GenerateParametersForJsapiPayRequest(request.AppId, response.PrepayId); [代码] 验签、解析并解密微信回调通知中的敏感信息: [代码]string callbackJson = "{ 微信商户平台发来的 JSON 格式的通知内容 }"; string callbackTimestamp = "微信回调通知中的 Wechatpay-Timestamp 标头"; string callbackNonce = "微信回调通知中的 Wechatpay-Nonce 标头"; string callbackSignature = "微信回调通知中的 Wechatpay-Signature 标头"; string callbackSerialNumber = "微信回调通知中的 Wechatpay-Serial 标头"; bool valid = client.VerifyEventSignature(callbackTimestamp, callbackNonce, callbackJson, callbackSignature, callbackSerialNumber); if (valid) { /* 将 JSON 反序列化得到通知对象 */ /* 你也可以将 WechatTenpayEvent 类型直接绑定到 MVC 模型上,这样就不再需要手动反序列化 */ var callbackModel = client.DeserializeEvent(callbackJson); if ("TRANSACTION.SUCCESS".Equals(callbackModel.EventType)) { /* 根据事件类型,解密得到支付通知敏感数据 */ var callbackResource = client.DecryptEventResource<Events.TransactionResource>(callbackModel); string outTradeNumber = callbackResource.OutTradeNumber; string transactionId = callbackResource.TransactionId; Console.WriteLine("订单 {0} 已完成支付,交易单号为 {1}", outTradeNumber, transactionId); } } [代码] 更多使用说明请阅读项目仓库中的开发文档。 项目仓库中还包含了一个示例项目,以供开发者快速掌握本库的使用方法。 高级技巧 点此查看完整文档。
2022-07-21 - 云开发云函数里跨账号环境调用云函数报错问题?
你好,我有同主体下的两个小程序A和B,每个小程序各自只创建了一个云环境,开发者工具里互相共享了云环境,各自环境里也创建了cloudbase_auth云函数,内容为官方文档里的最简易的版本。 在A和B的小程序端, 我调用另一方跨环境的云资源,都没有问题。 但在云函数端,想调用另一方跨环境的云资源,始终执行到cloud.init这一步的时候报错,这是云端测试的错误提示 Error: errCode: -501001 resource system error | errMsg: getCrossAccountToken:fail Environment not found, there is no default environment exists, please explicitly specify the environment\n 这是云函数最简易写法,完全参照官方文档跨账号环境一文报以上错误信息 [图片] ------------------------------------------------------------------------------------------------------------------------------ 还有一个奇怪问题,还是上面的小程序A和B跨账号环境调用相关,前几天我在调试这个问题时,另一个测试云函数里跨账号获取数据库是成功的,但同样的代码,放到今天下午云端测试执行,也是报上面红色字体的错误提示。 今天唯一的环境改动,是把A和B的互相共享解绑再重新共享。 曾经执行成功过的云函数cloud初始化相关代码如下: [图片] 这样的写法,在main函数里,执行 await c1.init() 不会报错,之后的操作能拿到对应环境里的数据库资源,但今天开始又报错了。 另外本地调试这个之前曾经成功执行过的云函数时,手动触发时,有以下错误提示 环境变量:默认环境 + 模拟:从小程序调用 / 环境变量:默认环境 + 模拟:从其他云函数调用 这两种组合报以下错误 [图片] 环境变量:指定云环境env(只有一个) + 模拟:从小程序调用 执行成功 [图片] 环境变量:指定云环境env(只有一个) + 模拟:从其他云函数调用 执行失败 [图片] -------------------------------------------------------------------------------------------------------------------- 问题总结: 云函数里跨账号环境调用,最简易的写法报错。小程序端却可以问题1解决后,跨账号环境共享下,小程序环境A里的一个云函数里能不能即拿到A里的数据库数据,又可以拿到小程序B里的数据库数据?微信开发者工具版本: Stable 1.05.2203070
2022-03-11 - 微信小商店带货,你必须要要知道的那些事儿
自从微信小商店支持带货之后,大家就可以上架了五花八门的产品,大多数人会屁颠屁颠的按照如下流程:打开小商店-带货-搜索商品-查看佣金-点击带货上架,然后开始朋友圈转发,视频号带货,公众号推送等。行水流水般的操作之后,心里美滋滋,坐等进账。然而多数人一顿操作猛如虎,结果会是0成单的凄惨局面。 [图片] 上面的操作路径问题出在哪里呢?对于大多数的小商店玩家来说,确实是很常规的操作的,但是这里面其实隐藏了很多必须要注意的细节。今天我会通过3个方面,教大家在带货选品上有更进一步的认知和提升(如果说的不对的地方也请指出),帮助你们更好的带货赚钱。 01带货平台的选择 目前小商店已经支持京东,拼多多,有赞,唯品会,当当,麦宝这6个渠道的带货了(暂时不支持淘宝,都懂的)。 [图片] 大家也都知道选对平台跟对人很重要,那这里带货的第一要素就是要选对平台。之前群里就有人问,卖货不就完事了吗,选一个优惠大,佣金高的产品等等。都懂的我就不说了,选平台要看其中一个重要的隐藏因素:就是锁客佣金政策。我先给大家分析下这6个平台的佣金政策。 1、京东 先看下图,这是京东对外的锁客佣金政策。 [图片] 我给大家解读下,首先这里面有两个概念: 同店订单:比如你的小商店里挂了京东小米旗舰店的商品A,用户通过你的链接点进去,直接购买了商品A或者小米旗舰店的任何商品,就是同店订单,你就可以锁定他15天,他在15天内,在京东买任何东西,你都可以获得佣金。 跨店订单:你在小商店里挂了小米旗舰店的商品A,用户通过你的链接进入京东,结果购买了松下旗舰店的商品,就是跨店订单,你可以锁定他24小时,24小时内,他只要在京东买东西,你都可以获得佣金。 同店优先级优于跨店:一个被你锁定为同店订单的用户,通过别人分享的店铺丙的商品C的链接去京东买了店铺丁的商品D,这时他并不会被别人锁走,这一单佣金依然是你的。 同一优先级下以后者为准:一个被你锁定为跨店订单的用户,又去下了个一个跨店订单,这时的跨店订单佣金就属于后一个人,而不属于你了。 所以只要你选择京东带货,如果你看上某个产品足够好,那就可以能提早锁定这个顾客,之后拿到佣金的概率会更好。 衍生阅读:如果你正在玩京东,需要微信小商店带货,可以开通京挑客,这样微信小商店也会抓取你的产品,具体如何开通可以加我微信私聊。 2、拼多多 先看下图,这是拼多多对外的锁客佣金政策 [图片] 先看这段话:在一段时间(app是24小时,h5是1个小时)访问多多进宝商品页面,这个意思是用户分享出的链接,你必须要在24小时内或者1个小时内点击商品并且到达商品详情页,才能建立师徒关系,也就是完成锁客(点击领券页面不会计算),如果超过这个时间,那么这个链接就失效了。然后访问链接之后,就会建立师徒关系,后续如果别人(你分享给的那个人)在15天内购买这个店的商品和店里的其他商品,也都会获取佣金,当然前提是这些商品都要开通多多进宝,否则即使顾客买了我们的产品,也还是没有佣金。 衍生阅读:如果你正在玩拼多多,需要微信小商店带货,可以开通多多进宝,这样微信小商店也会抓取你的产品,具体如何开通可以加我微信私聊。 3、当当网 先看下图,这是拼多多对外的锁客佣金政策 [图片] 反正找了好久,最终还是问了客服才找到当当网的锁客佣金政策,这里面有几个点需要注意: 1、自己分享的链接购买图书不计入佣金。 2、不论以什么方式分享,如果对方打开app下单是拿不到佣金的。 也就是微信小商店带货的时候,自己购买是拿不到佣金的,不能像其他淘客app那样所谓自用省钱分享赚钱。然后如果你分享的用户最终通过当当网app下单了也不计入佣金,我目测社区里面很多人反馈拿不到佣金,估摸着也是这个原因。 当当网目前主要是图书品类多,买书的时候还是挺划算的,其他的品类我觉得竞争力就不大了。 4、有赞 [图片] 佣金政策可以看最底下的那一行,用户点击有赞的链接之后,也是被锁定15天,只要15天内完成下单即都可以拿到佣金。因为有赞是单店,不会存在跨店订单的情况,所以如果产生了跨店佣金,是拿不到佣金的。 另外还有锁客先后的逻辑:A分享给B,C也分享给B,这个时候的订单佣金算谁的呢?目前这个是通过商家设置的:是否开启了抢客模式,开启了佣金就给C,没有开启佣金就给A。 另外关于自用省钱分享赚钱:有赞后台可以设置如果选择【默认与自己绑定客户关系】,即用户点击自己的推广链接购买商品,就会获取到对应的佣金;如果选择【不允许与自己绑定客户关系】,用户自己购买就不会有佣金。(注:一旦选择【默认与自己绑定客户关系】,客户成为分销员后会和自己绑定,之前分销员和该客户的客户关系会失效,邀请奖励会归属于分销员的上级) 5、唯品会 [图片] 唯品会的锁客政策也比较简单,锁客逻辑为1天,不像其他平台15天,所以如果有相同的产品建议选择锁客逻辑更久的其他平台。然后关于锁客先后的问题,也米有得到正面的回答,所以此处不表。不过一般是以促成交易的后者为准的。 6、麦宝很抱歉,不是很了解,也没有找到资料 [图片] 综上几个平台,不同平台的锁客逻辑不一样,所以很多从业者带货的时候会有针对的选择平台,另外不要只盯着返现比例,之前看到好多媒体文章拿一个单品的价格在不同的平台比对佣金,我觉得没有意义,因为商家在不同平台运营的策略不一样,销量跟着活动走,活动决定佣金,所以佣金是不停的变化的。 推荐阅读 视频号如何关联微信小商店带货赚钱? 微信公众号如何关联小商店带货? 再谈微信小商店&视频号赚钱的机会 刚刚,微信小商店删了啥?
2020-11-18 - 微信小程序 图片支持长按识别
https://developers.weixin.qq.com/miniprogram/dev/component/image.html image 组件设置 show-menu-by-longpress = true 就支持了
2021-09-18 - 云函数接收公众号消息推送
公众号的消息推送和处理,也可以云开发来做了,不需要搭建自己的服务器了。 具体步骤如下: 1、将小程序的云环境共享给公众号的appid。 操作如下:小程序开发工具--云开发--更多--环境共享--添加共享--添加公众号appid。共享成功; 2、配置公众号云开发 打开开发工具--回到初始页项目管理页--左则项目类型栏选择“公众号网页”--云开发--弹出框里填入公众号appid--进入云控制台 3、配置公众号消息推送 以公众号appid进入云控制台后--更多--环境共享--消息推送--添加消息推送--选择event--选择subscribe_and_unsubscribe--选择接收消息推送的云环境--选择接收消息推送的云函数--结束 4、配置完成,接收消息推送 在云函数里写处理消息推送的代码。 在云函数里: console.log(event)//获取消息包JSON数据 console.log(wxContext)//获取公众号用户的openid和unionid。 5、结束。
2021-10-21 - BackgroundAudioManager.playbackRate ios?
问下 BackgroundAudioManager.playbackRate 倍速 现在 在 ios 中可以直接生效吗? 我试了下ios 上设置倍速后 下一条音频播放才生效, this.globalData.audio = wx.getBackgroundAudioManager() this.globalData.audio.playbackRate = 2 如果我想 播放当前音频的时候 点击设置倍速后 就生效 要怎么弄呢?
2021-06-15 - 云开发云函数定时触发器讲解
任何可以产生事件,触发云函数执行的均可以被称为触发器,而定时触发器则是可以处理周期性的事情,比如时报、日报、周报等通知提醒,也可以处理倒计时任务,比如节假日、纪念日以及你可以指定一个具体时间的倒计时任务,除此之外,定时触发器还可以用来周期性处理一些定时任务。比如定期清理一些不必要的数据,定期更新集合内的数据。 13.5.1 定时触发器使用说明1、定时触发器的配置与部署配置了定时触发器的云函数,会在相应时间点被自动触发,云函数的返回结果不会返回给调用方。在对某个云函数使用定时触发器前,首先要保证该云函数在小程序端可以调用成功,更准确的说是能够在不传入参数的情况下在云开发控制台的云端测试能调试成功(小程序端调用有登录态)。 云函数目录里的 config.json 文件可以用来配置权限和定时触发器,如果你的云函数目录下面没有这个配置文件,可以自己创建一个,创建的结构目录如下: test //云函数目录 ├── config.json //权限和定时触发器等的配置文件 ├── index.js //云函数 ├── package.json //云函数的依赖管理 然后再来在配置文件 config.json 里进行类似如何格式的配置,config.json 严格遵循配置文件所要求的格式,比如数组最后一项不能有逗号[代码],[代码];配置文件里不能有注释等 triggers 字段是触发器数组,但是目前云函数只支持一个触发器,即数组只能填写一个,不可添加多个;name 是触发器的名字,最大支持 60 个字符,支持 a-z, A-Z, 0-9, - 和 _,必须以字母开头;type 为触发器类型,timer 是定时触发器config 是触发器的定时配置,里面为 cron 表达式(后面有介绍),cron 有七个必需字段,不能多也不能少(以下为每天早上 9 点到 12 点每隔 5 秒触发一次);{ "triggers": [ { "name": "tomylove", "type": "timer", "config": "*/5 * 9-12 * * * *" } ] } 当我们在修改触发器配置文件 config.json 后,首先鼠标右键 config.json 选择“云函数增量上传:更新文件”,然后再右键 config.json 选择“上传触发器”。这里的“云函数增量上传:更新文件”是让云函数端的触发器文件更新;而“上传触发器”则是让触发器开始生效执行。如果在云函数端的触发器没有更新的情况下就“上传触发器”来执行定时触发,文件可能没有更新,执行的还是旧的触发器内容。当我们想暂停或删除触发器时,可以右键选择“删除触发器”。 2、Cron 表达式语法Cron 表达式有七个必填字段,按空格分隔,既不能多写也不能少写,每一个字段都有它的含义对应着不同的时间点,表达式的取值都为整数且为时间制的范围(注意月在星期的前面): 第一位第二位第三位第四位第五位第六位第七位秒(0-59 )分钟(0-59)小时(0-23)日(1-31)月(1-12或三个字母的英文缩写)星期(0-6或三个字母的英文缩写)年(1970~2099 ) 下面是 cron 表达式的案例,以及我们需要了解一下 cron 表达式里的通配符以及直接写数字的含义: [代码],[代码],表示并集,在时间的表述里是“和”的意思,比如在“小时”字段中, [代码]1,2,3[代码]表示 1 点、2 点和 3 点;[代码]-[代码],指定范围的所有值,在时间的表述里是“到”的意思,比如在“日”字段中,[代码]1-15[代码]包含指定月份的 1 号到 15 号;[代码]*[代码],表示所有值,在时间的表述里是“每”的意思,比如在“小时”字段中,[代码]*[代码]表示每小时;[代码]/[代码],指定步长,在时间的表述里是“隔”的意思,比如在“秒”字段中,[代码]*/5[代码]表示每隔 5 秒;直接写数字,在时间的表述里是“第”(时间点)的意思,比如在“月”字段中,[代码]5[代码]表示每月的第 5 日;//表示每隔5秒触发一次, */5 * * * * * * //表示在每月的1日的凌晨2点触发 0 0 2 1 * * * //表示在周一到周五每天上午10:15触发 0 15 10 * * MON-FRI * //表示在每天上午10点,下午2点,4点触发 0 0 10,14,16 * * * * //表示在每天上午9点到下午5点内每半小时触发 0 */30 9-17 * * * * //表示在每个星期三中午12点触发 0 0 12 * * WED * 定时触发器的 Cron 语法没法实现每隔 90 秒钟或 90 分钟发送一次这样的效果,因为 90 秒超过了秒的时间制上限 60,而 cron 在跨位组合(比如 90 秒需要结合秒和分)上无法覆盖所有的时间;除此之外,云开发的触发器暂时不支持多个定时触发器的叠加;在 Cron 表达式中的“日”和“星期”字段同时指定值时,两者为“或”的关系,即两者的条件均生效;值得一提的是,尽管云函数的时区为 UTC+0 时区,但是定时触发器的时间还是北京时间。 13.5.2 用定时触发器调用云函数定时触发器的使用非常简单,使用开发者工具新建一个云函数比如 trigger,然后在 index.js 里输入以下代码: const cloud = require("wx-server-sdk"); cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV, }); exports.main = async (event, context) => { console.log(event); return event; }; 再在 trigger 云函数目录下的 config.json(如果没有这个文件,就创建一个),然后输入以下触发器,为了调试方便,我们可以每隔 5 秒触发一次: { "permissions": { "openapi": [ ] }, "triggers": [ { "name": "tomylove", "type": "timer", "config": "*/5 * * * * * *" } ] } 然后分别右键 index.js 和 config.json,选择“云函数增量上传:更新文件”,然后再来右键 config.json 选择“上传触发器”。云函数就会每隔 5 秒自动触发,相关的日志我们可以在开发者工具的云开发控制台以及腾讯云云开发网页控制台的云函数的日志里查看。 注意小程序端调用 trigger 云函数返回的 event 对象,和使用定时触发器返回的 event 对象的不同,用定时触发器触发云函数是获取不到 openId 的,同时这里有一个 Time 时间是时区为 UTC+0 的时间,比北京时间晚 8 个小时: //在小程序端调用trigger云函数之后返回的event对象 { "userInfo":{ "appId":"wxda99******7046", "openId":"oUL-m5F******buEDsn8" } } //使用定时触发器触发云函数之后返回的event对象 { "Message":"", "Time":"2020-06-11T11:43:35Z", "TriggerName":"tomylove", "Type":"timer", "userInfo":{ "appId":"wxda99********46" } } 13.5.3、定时触发器的应用定时触发器的应用非常广泛,以下仅举一些常用案例,并加以说明: 1、结合消息推送这里的消息推送不仅仅只是指订阅消息,还可以是统一服务消息、公众号的消息(可以用云函数开发微信公众号)、小程序内自己开发的通知(只是用户只有在打开小程序时才能看到)、Email 邮件等等。 比如用户订阅了日报、周报、月报等周期性的通知提醒或者我们需要给用户发送一些汇总信息,就可以固定写一个定时触发器,比如我们需要给指定用户发送工作周报,每周五晚上 17 点 30 分就定时从数据库获取数据发送消息,cron 表达式写法如下: * 30 17 * * FRI * 还可以用来处理一些倒计时(指定时间点)的任务,比如节假日、纪念日以及一些活动时间节点(定时触发器目前只能一个云函数配一个触发器,但是可以提前管理),比如我们希望在六一儿童节的早上 9 点调用云函数给指定用户群体发送消息: 0 0 9 1 6 * * 当然这样的具体时间点显得过于的不灵活,但是如果把时间与云开发数据库结合起来,灵活性就会大很多,比如在运营上每天早上 11 点是你们用户访问最多的时间点,你只需要写一个云函数,把所有的活动都在这个时间点来推送,让定时触发器每天这个时间点都触发,有活动(数据库里有数据)就会发消息,如果没有就不发(云函数调用一次的成本极低)。 如果是实时数据,我们还可以把定时触发器的频率调高,每 5 秒就触发一次,比如我们的数据库只要有最新的数据,就会发消息给指定用户。尽管不是完全的实时,但是 5 秒的频率和实时的差别也就不大了。你也可以根据情况,来调整触发器的频率,毕竟 5 秒和 1 分钟的频率给用户的体验差异并没有太大,但是成本却是 12 倍的关系。 可能你还希望在指定的时间段才触发云函数,比如你只希望在工作日、或者在早上 9 点到晚上 18 点才触发,在指定的时间段才触发既可以让触发更精准不扰民,也可以节约成本,比如下面的触发器就是工作日早上 9 点到 12 点和下午 14 点到 18 点这个时间段,每 5 秒触发一次。 */5 * 9-12,14-18 * MON,TUE,WED,THU,FRI * 从以上案例我们可以了解到,云函数的定时触发可以来自于 cron 表达式的配置,我们可以指定时间点时间段和频率来达到我们想要的效果,同时这个时间“也可以来自于数据库的配置”(伪装),意思是我们可以设置触发器的时间段或频率,如果数据库里有数据就发送,没有数据就不发送,这样就可以达到触发器在时间上的灵活性了。 2、实时获取数据有的时候我们的数据并不是来自于数据库,而是来自于第三方服务,比如前面介绍过的历史上的今天的 API,天气的 API,知乎日报的 API 等等,以及一些 webhook,这些 API 和第三方服务提供的是 json 格式的文件,API 的数据也会随时更新,但是它们更新了却并不会主动通知我们,这时我们可以使用定时触发器向这些 API 发起请求,如果数据出现更新,我们就可以将更新的数据存储到我们的数据库或者进行其他处理,比如企业微信的机器人等机器人通知服务就是如此。 当然定期获取的数据还可以是爬虫,比如我们可以定期抓取指定关键词的新闻或者指定网站的动态,当爬虫获取到了不同的数据的时候,就将最新的动态以机器人消息或者其他方式进行及时的处理。 也就是说,我们无法实时监听到第三方 API 或者网站数据的变动,但是可以用定时触发器来发起请求或者爬虫抓取数据,通过数据的变化来达到“实时”获取数据的目的。 3、自动化处理在数据库的设计里,我们就提到有时候需要对数据库里的数据进行定期的备份与删除等清理维护工作,比如超过一定时间的日志,具有很强时效性的活动数据,以及为了性能考虑而做的虚假删除(数据库性能与优化有介绍)等,毕竟数据库有一定的存储成本而且过多无用数据也会影响数据库的性能,我们可以写一个云函数用定时触发器来执行此类任务。 我们还可以在用户并发比较少的时间段(比如凌晨几点)来处理一些比较耗云函数、数据库性能的任务,比如图片的审核与裁剪、缩略等处理,用户评论是否包含敏感词汇(尽管经过安全处理,但是有时候我们还会设置特别的敏感词),数据的汇总,云存储里废弃文件的删除,用户信息是否完整等等。 也就是说,结合定时触发器,我们可以实现一些任务的自动化处理。 4、密集型任务分流我们知道云函数在处理一些复杂性的任务时是有一些限制的,一是执行时间的限制,建议在设置时执行时间一般不要超过 20s,最长不要超过 60s;二是并发的限制,云函数最大的并发为 1000;三是云函数在查询数据库时一次可以获取最多 1000 条的数据,面对这三个限制,我们应该如何处理密集型的任务呢,比如发送 100 万封邮件,导出几百万条数据到 Excel,发送十万级的订阅消息或消息等等,这个时候就可以使用到定时触发器来处理了。 借助于定时触发器,我们可以将需要耗时较长、对并发要求较高以及数据库请求等的任务进行分批处理,比如我们要给 100 万人发邮件:云函数发起数据库请求,一次只请求 1000 条未发送过邮件的用户(用 where 条件查询某个字段,比如[代码]status:false[代码]),然后将邮件发给 1000 个人(可以参考前面的邮件发送),发完邮件并对这 1000 条数据进行标记(比如使用更新指令将 status 改为 true),这样下次查询未发送过邮件的用户时,就不会重复发送了。通过定时触发器,每 2 秒执行一次发送任务,几十分钟就可以处理完任务。
2021-09-10 - wx.request包装成云函数格式,以便将来一键迁移。
将wx.request包装成云函数格式: 云函数的调用格式是:wx.cloud.callFunction({name:'login',data:{x:1,y:2}}).then() 仿云函数的调用格式是:app.callFunction({name:'login',data:{x:1,y:2}}).then() 两者一模一样。 在app.js里: url: 'https://xxx.com/applet/', callFunction: function(args) { return new Promise((resolve, reject) => { wx.request({ url: this.url + args.name, method: 'POST', data: { sessionid: this.getSessionid(),//换取openid ...args.data }, success: resolve, fail: reject }) }) }, page里index.js app.callFunction({name:'login',data:{x:1,y:2}}).then(res=>{console.log(res)}) 或者await: let res = await app.callFunction({name:'login',data:{x:1,y:2}}) console.log(res) 传统后台:nginx+nodejs+koa2+mongo nginx定义一条路由location:'https://xxx.com/applet/' koa定义一条路由router:'login' [图片]
2020-10-20 - 总结的一些血与泪的教训
云函数 云函数的上传流程 云函数必须先保存后上传,因为编译器不会在上传的时候自动保存。 保存的方法可以是CTRL+S或者是编译都可以,CTRL+SHIFT+S和编译是等效的;上传的方式可以是对文件的增量更新或者说部署云函数。主要是顺序必须先保存后上传。 云函数部署对于触发器并没有效果,触发器得单独上传(仍然需要先编译)。 如何知道云函数是否执行出错了 云开发→云函数→日志,读取日志,可以读取服务器返回的数据,所以云函数中最好用try{}catch(e){}结构,然后return JSON.stringify(e),当然你不这样也没问题,因为服务器会自动吧错误写进日志 云函数中console.log()的内容会写在日志的末尾。 当然,你也可以使用云函数的本地调试功能(来自Littlesnail大佬的分享),但是本地环境是缺少wx-server-sdk这个包的,需要自己用npm装,大家可以自行衡量。 如何知道云函数是否真正执行完了 之前一直在python平台的我根本没接触过node.js这种异步事件驱动的语言,被异步快整疯了 首先说结论,你得把所有返回Promise类型的方法都加上await关键字,并函数变为async类型。 所谓的Promise类型是指的一个虚的对象,他传递给某些函数后,对那些函数进行一个“保证”,保证过会会给那些函数数据。因此那些函数会先等着,等Promise返回数据后,提醒这些函数开始工作了,然后上一个工作完提醒下一个直到函数执行完。因为有些操作,比如数据库的读取是需要时间的,所以要是一直等着会阻塞整个线程。(node.js似乎是单线程的,这算是一直对多线程的补偿方案吧) Promise对象有三种状态。Pending,表示正在运行中;fulfilled,表示完成然后会自动提醒下一个函数;rejected,表示失败,当然如果你用try catch了就没事。 重点来了,对于async的云函数来说,执行到最后或者return就相当于结束了,然而这个时候如果函数内仍然有处于“保证中”(Pending)的Promise对象,云函数是不会等它执行完才返回的,它会直接返回。所以你必须加一个关键字,await,表示下面的语句都会等着这个异步操作完成再工作,也就是阻塞住。这样才能真正使得云函数完全执行完。 如何判断什么函数返回的是Promise对象,在开发者工具的console里面输入一下这个函数就行了,实在不行typeof。 PS:以前我曾经想过,如果吧云函数的async标签去掉,是否能实现不需要await也能正常运行呢,答案是,你想的美,去掉后人家该Promise还是Promise,不会给你变成现实(特朗普:恶意的zz隐喻,举报了)。所谓的async标签是指的我警告你我这玩意是异步的,你能用then,但是大多数情况你都不会去用then,所以,老老实实await吧。 你们就不要挣扎了,老老实实吧所有出现异步的位置都async和await吧 你标了async的函数,调用它的函数也得加async哦,而且调用的时候也得await 【async-await地狱】 小细节 云函数的运行环境中你不能获取到函数的信息,this.name,this.toString(),或者window.decodePathName都是undefine 数据库 为什么有时候数据库的get没用请确定你的权限是否有误,在 云开发控制台-数据库-权限设置 中可以调整,一般来说选第一个权限 为什么有时候数据库的update没用 首先当然是排查是不是因为在云函数中你却没有加await,数据库的几乎所有操作全是异步的,返回的基本都是Promise对象,另一点是小程序中的db.collection('seats')对象是动态对象,你不能这样写 db_seats=db.collection('seats') db_seats.where({}) 如果你在下面的语句继续用db_seats来直接对数据库做一些操作,相当于你创建了一个数据库的本地副本,你get()数据当然是有用的,但是可能不是最新的数据,但是你add()和update()都是没用的。你必须每次都用db.collection('xxx')来调用xxx数据库。 (实际上后来经过调查发现,add有时候是可以的,但是update保证每次都不行,不知道为啥) ————(以下为更新内容)———— 事实上还有一种更加广泛的错误 一定要注意,doc函数查到的是数据库的索引的_id字段,而不是_openid字段,你拿openid去doc一定找不到东西。 所以如果你一开始只有openid这个数据,那你最好先用where找到对应数据的_id,然后再doc它的id (为什么不直接where后接update?where返回的是一个数组,where接update相当于一次性修改一组数据,只有服务器端,也就是云函数有这个权限,小程序的前端只能先查询再修改) 数据库传入的数据 只有数据库的where(),update(),add(),传入的JSON数据中,只有data是必选属性,其他属性像是success,fail都是非必要的,如果你不用错误处理的话就不用加 then怎么用 数据库的then(),或者说所有的异步操作的then,你把函数放在then()里面表示到时间后完成某项操作,比如 //获取所有data const seats_list = await db.collection('seats').where({ used: true }) .get().then(res => { // return res.data console.log(res.data) }) 相当于吧收到的参数命名为res,然后等res异步返回后,会在=>{}里面处理一些只跟res有关的操作,这当然是有用的,但是问题在于then里面是一个闭包,你console.log当然是可以的,但是你要在里面用this.setData()就不行了,这个闭包的this可不是指的你这个外面的对象,他就是指的它点前面的对象,也就是get()后返回的对象。 所以想在外面用的话,正确操作是吧注释去掉,也就是return res或者return res.data,然后这样的话,外面的seats_list 就能被赋值为res或者res.data了,然后接下来的语句尽情对seats_list 操作,千万别忘了加await,否则你懂的。 WXML 为啥我的wx:if不管用 请注意一件事,那就是。。。WXML里面的任何函数部分,都是不能有空格的,比如这样写 点击选座位 点击选座位 点击选座位 点击选座位 点击选座位 无论你空格加在哪里,只要被""括起来,加空格都会使得wx:if失效,相信小伙伴们此时已经反应过来了,没错,这就是JS那个傻逼机制,非空字符串相当于true > Boolean(" ") > true 我猜wx:if的机制只是简单的做了下拆分,然后配对了下,并不能实际把它当程序运行(甚至可能正则都没用),所以如果遇到了它没拆成功的字符串,它就干脆暴力返回原字符串,当然被识别为true了。 整体 Js的所有变量都需要预先var数据库的Data和云函数的Data JS的Date()函数很迷,它返回的是tm一个String,当前时间的String,你必须用var new才能构造一个真正的Date对象而不是一个字符串,也就是按照下面方法使用,加注释的都是错误的用法。 var nowdate=new Date() // Date().getDate() // Date(一个Date对象).getDate() // Date(一个字符串).getDate() 另外就是无论你在哪调用这个函数,他创建的都是你调用端的时间,而不是云端的时间,就算你在云函数调用也一样,你电脑或者手机是几点他创建的就是几点,我都服了。 云端的时间只能用db.serverDate()来构建,但是问题在于db.serverDate()是tmd一个指令,他返回的不是一个Date,而是类似db.commend那种类型的东西,给传入服务器的data用。 //更新nowdate为服务器时间 await db.collection('seats').where().update({ data:{ nowdate:db.serverDate() } 也就是你平时用是没JB用的,你只能老老实实去用JS的Date方法请求世界时然后倒时区。 总结 以后想到了继续补充,欢迎大佬分享
2020-05-11 - 微信小商店购物组件服务商指引
为了进一步降低进入小程序生态经营和卖货的门槛,微信团队正式上线了微信小商店能力,该能力让更多中小微商家快速拥有一个小程序店铺,在微信内实现电商业务的自主经营。 微信小商店购物组件,是微信团队为商家及服务商提供的,可在其已有小程序中调用以实现快捷接入微信小程序交易标准化解决方案的组件能力。通过该组件可实现对小商店的定制化开发及更多拓展能力,并可降低服务商的开发运营成本。 如需以平台型服务商的身份为商家接入微信小商店购物组件,你需要完成以下步骤。 一、创建第三方平台,并选择平台型服务商。 平台型第三方平台申请和上线流程 二、添加对对应权限集,首次创建的第三方添加权限集后需进行全网发布 第三方平台权限说明 三、完成以上步骤后即可根据小商店购物组件文档进行调用。 购物组件接入文档 微信团队 2020年12月14日
2020-12-14 - 免费ICP备案攻略。不花1分钱拥有一台云服务器并顺利ICP备案。
写在前面: 大家不要将ICP证和ICP备案搞混了。 ICP证指的是【电信增值业务经营许可证】,这个资质需要企业主体至少100万注金,去工信部办理,比较难办理;社交-交友需要ICP证。 而ICP备案,【非经营性互联网信息服务备案核准】仅仅是指企业主体的域名备案,可以简单的按以下步骤免费办理成功,其他社交类目如社区、论坛、笔记等,只需要ICP备案即可。 1、在腾讯云注册一个账号并认证企业主体(不吹不黑,开发小程序当然首选腾讯云,好用)。http://www.qcloud.com/ 如果你是个人主体,就不要往下看了,没必要折腾了。 2、找到腾讯云免费活动页:https://cloud.tencent.com/act/free?from=10107 3、选择一款云服务器,180天免费试用。 云服务器申请成功后,它的使命就完成了,没用了,让它自生自灭吧。 在整个备案过程中,也不需要部署网站(域名都没有备案,哪来的网站?)。 [图片] 云服务器180天到期后,可以自己决定是否续费,每个月也才99元,促销期甚至更低,完全可以接受吧。 备案成功后,该服务器就没什么作用了,让它180天后自然欠费销毁得了。 服务器销毁后会有什么影响?答:没有任何影响。 但是。。。。。 你备案的域名最后还得指向一个网站,因为腾讯云会应工信部的要求定期检查网站是否合规,所以你还是要建一个简单的网站,(备案期间,可以暂时不管网站的事,等将来需要的时候再管理)。 至于有多简单,答,多简单都行。此时你可以在七牛、腾讯云、阿里云租点免费的对象存储空间,做个简单的网站。 4、在进行ICP备案之前,你需要在腾讯云注册你的域名地址,如果你已有域名,但不在腾讯云,建议先将要域名过户到腾讯云的账号上。 5、进入控制台,开始ICP备案,这个流程就不介绍了,因为完全一看就懂。而且现在使用备案小程序后,不需要幕布或现场拍照了,极其方便,大家跟着流程走就一点问题没有,有人脸识别和在线拍一段小视频。另外,大家可以随便作,随便填,填错或者填得不合适也不用怕,会有专门的备案客服打电话告诉你哪哪要改,还会告诉你应该怎么填才更容易通过工信部的审核,客服的态度好得发指。 仅说一点其中的几个小坑: a、人脸识别的时候,白色背景、白色背景、白色背景,笔者在人脸识别的时候,满世界找白墙,结果还被打回来重拍了3次。 b、网站用途一律写:公司官网,好通过工信部审核。 6、腾讯云提交资料到工信部审核。这是一个漫长的让人无语的等待,20-30天。笔者最近两次都是20天才过审;不要幻想会有可能提前完成审核,这是政府部门在审核,提前完成说明某政府人员的工作安排有问题,会犯错误的。 7、备案成功后,会有短信通知你,但是,你需要去工信部网站查询结果,并将结果切屏拷贝下来,因为小程序类目审核需要上传这张图片。http://beian.miit.gov.cn/publish/query/indexFirst.action [图片] 把上面这张图片保存好,小程序类目审核的时候需要上传。收到通知后,如果在这里查不到结果,也别急,据说需要24小时。 8、接下来是小程序上线审核。 因为ICP备案的小程序内容肯定涉及到社交,最后小程序上线时还要提交到工信部审核,还需要7天左右的时间,加上前面ICP备案的时间,加起来怎么也得30-40天。大家估计时间,别影响小程序上线。这7天也是政府部门在审核,不要幻想会提前。 9、计算一下时间: 腾讯云注册账号和认证:1-3天; 域名备案:腾讯云环节:1-3天; 域名备案:工信部环节:20-30天; 小程序添加服务类目:社交类目审核:1-3天; 小程序上线审核:腾讯环节:1-2天; 小程序上线审核:工信部环节:7+天; 总天数:30-40天; 10、节省时间的一些建议: 在开发小程序之前,就开始备案工作,小程序可以同时开发,相互不影响; 在开发完成之前一、两星期之内,先发布一版小程序,别管功能是不是完整,能通过审核就行,这样会有7天的等待类目审核的时间,这个时间里,小程序可以照常开发,不影响进度; 只要是社交类,基本需要有文字和图片安全检查功能,别忘了加上,别到时审核通过不了。 11、结束。 [图片]
2021-01-19 - 如何查找微信公众号主页并复制链接
随意复制该微信公众号的一篇文章链接在浏览器打开查看源代码 找到biz=*****编码,(全局搜一下__biz=)例如biz=MzAxMDE1MTk3Nw== https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzAxMDE1MTk3Nw== 将 biz= 后面的*****编码替换成你刚刚找到的编码,就可以获取到该公众号的主页链接啦。
2022-04-01