- 关于视频号小店购买方服务市场应用自动授权关联三方平台的逻辑有个大BUG?
问题描述: 我团队在视频号小店的服务市场上架A应用并在应用详情关联三方平台T视频号小店S在后台购买A应用后会自动将权限集授权给三方平台T在公众号安全助手中可以取消授权,这时则无法再次发起授权,导致业务无法正常进行[图片] [图片][图片] 附加疑问一: 如下图所示,近期是否开放其他授权方式? [图片] 截图页面地址: https://developers.weixin.qq.com/doc/oplatform/service_market/provider_guideline/enter_guideline/sph_enter_guideline.html 附加疑问二: 是否会在截图的接口中开放“视频号小店”的auth_type? [图片] 截图页面地址: https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/Before_Develop/Authorization_Process_Technical_Description.html
2023-10-19 - 视频号小店-常见问题汇总
一、视频号小店是什么? 1.1 视频号小店是什么?● 视频号小店是微信视频号团队为商家提供商品信息展示、商品交易等产品能力的技术服务,全方位支持商家在视频号场景内开店经营。 二、如何开通视频号小店?2.1 开通流程包括哪些?● 「视频号小店开店」—「选择企业/个体工商户类型」 —「完成开张任务」—「开店成功」 ● 详情开通流程【视频号小店教程】企业&个体工商户 - 开店指引(对外)点击查看。 2.2 没有营业执照可以开通视频号小店吗?● 目前视频号小店系统仅支持企业&个体户申请资质入驻,故营业执照是必须提交的资质材料。 2.3 开通视频号小店有数量限制吗?● 一个视频号只能申请一个视频号小店。 2.4 视频号小店支持注销吗? ● 开店完成后暂不支持注销,开店完成前可以注销。 三、如何登陆视频号小店?3.1 视频号小店怎么登陆? ● 「电脑浏览器打开https://channels.weixin.qq.com/shop 」> 「打开微信」> 「扫码二维码」 3.2 可以支持手机登陆视频号小店管理后台吗?● 已实现双端互通,支持网页端、移动端登陆及管理。 3.3 谁可以扫码登陆视频号小店?● 注册视频号小店的微信号、超级管理员、添加的其他管理人员。 四、开店任务常见问题4.1 主体信息4.1.1 营业执照信息审核不通过怎么办?● 请根据营业执照驳回原因,仔细核对填写的相关信息是否准确。保证:营业执照证书未过期、清晰可见。 ● 一个营业执照支持开5家店铺,超过该数量会驳回。 4.1.2 商户简称怎么填?● 商户简称会在支付完成页向买家展示,填写商户名称即可。 4.2 超级管理员信息4.2.1 超级管理员要填谁?● 超级管理员信息需要填写注册微信号时的身份信息。 ● 视频号小店超级管理员和视频号管理员也必须是同一个人。 4.2.2 超级管理员可以更换吗?● 视频号小店已上线更换超级管理员的功能,按照路径可以进行更换新的超级管理员,原管理员的帐号会与小店解除绑定关系,谢谢。 路径: 登录视频号小店后台-店铺管理-基础信息-小店超级管理员-右上角修改。 4.2.3 填写超级管理员的时候要注意什么?● 填写超级管理员信息时,务必注意填写真实姓名、身份证号,否则无法完成校验。 4.2.4 视频号小店可以多人管理吗?怎么进行多人管理?● 企业店支持多人管理。在“店铺管理-成员管理”中,添加岗位和关联成员即可,可以添加不同岗位,设置岗位权限。 4.3 验证账户4.3.1 怎么验证账户?● 验证账户有两种方法,任选其一即可。 (1)法人验证:使用法人微信号扫描二维码即可验证成功。 (2)汇款验证:根据页面提示小额打款至指定账户,验证成功后,打款金额会原路退回。 4.3.2 验证账户有有效期吗?● 若30天内一直未完成验证,将自动驳回申请单。若未超过30天,申请单被审核驳回,可再次提交申请单,完成账户验证流程。 4.4 店铺运营4.4.1 视频号小店后台怎么使用?● 视频号小店店铺运营详情可以查看:【视频号小店教程】企业&个体工商户 - 店铺运营(对外) 4.5 商户号 4.5.1 注册视频号小店是否需要新开一个商户号?能否绑定原有的微信小商店的商户号? ● 需要新开一个新的商户号。 五、视频号小店怎么申请类目资质?5.1 类目资质要求及申请指引5.1.1 开放类目范围共开放超过2000个类目,一级类目包括:宠物生活、厨具、家用电器、手机通讯、数码、电脑&办公、服饰内衣、鞋靴、个人护理、母婴、美妆护肤、家纺、家居日用、家具、家庭清洁&纸品、家装建材、工业品、汽车用品、玩具乐器、运动户外、箱包皮具、酒类、食品饮料、钟表、农资园艺、生鲜、二手、生活服务、图书、艺术品、教育培训。 详细类目开放范围请点击链接查看:开放类目公告 5.1.2 类目资质要求详情请查看【视频号橱窗】管理规则合集(可对外) 中 3.1 店铺与类目开放板块的规则。 5.1.3 类目资质申请指引详细类目资质申请指引请查看: 视频号小店-商家指南-「类目资质」开通指引(对外) 六、视频号小店结算规则 6.1 结算费用 ● 交易手续费以商品实际订单成交金额为基数计算,腾讯目前未收取费用,财付通将按照《微信支付服务协议》收取商品订单实际成交金额0.6%的交易手续费。 6.2 货款结算周期及提现方式● 商家接入微信视频号小店后,将通过财付通提供的微信支付功能开通一个新的微信支付商户号。商家可在商户号后台进行资金管理,也可直接在视频号小店商家后台进行账单查询和资金提现。 详情的结算规则请查看:视频号小店结算规则 七、视频号小店商品如何关联上视频号橱窗? ● 详细流程请点击:如何在视频号的直播和短视频上架视频号小店商品?
2023-02-24 - 云调用subscribeMessage.send出现如下问题如何解决?
一、云调用错误如下: Error: errCode: -501007 invalid parameters | errMsg: subscribeMessage.send:fail missing wxCloudApiToken 二、附源码: async function batchSend(event) { const { messages } = event console.info({event: JSON.stringify(event)}) console.info('处理订阅消息', messages.length) // 循环消息列表 const sendPromises = messages.map(async message => { let { touser, page, data, templateId } = message // 发送订阅消息 await cloud.openapi.subscribeMessage.send({ touser, templateId, page, data, }) }); await Promise.all(sendPromises) } 三、现象描述: 直接云端测试云函数5 次, 结果:失败、成功、失败、成功、成功。一旦出错后,会一直报上述错误。需要调用其他云调用成功一次,才可以恢复。恢复后又是间歇性失败。其他云调用,如“cloud.openapi.wxacode.getUnlimited”从不会失败。总结:这个问题已经追踪了两天了,仍然没有找到必现的规律,失败的概率很大,很容易复现。跟其他人说的miniprogram_statestring参数也无关,因为我一直没有传此参数,默认值为formal。
2021-03-25 - 调用云函数提示fail missing wxCloudApiToken
调用uniformMessage.send或者调用subscribeMessage.send返回errMsg: fail missing wxCloudApiToken 这个是指没有云调用的权限,需要在小程序端调用云函数或者使用定时触发器或者HTTP API 调用云函数。 请开发者确认云调用的场景是否准确,目前支持到的场景: 1. 小程序调用云函数 2. 云函数定时触发器 3. HTTP API 调用云函数
2021-11-30 - 你想在小程序里使用less嘛? (VScode版)
老规矩,直奔主题,三步走: Step 1: Ctrl+Shift+X 打开扩展 - 搜索 easy Less 并安装 Step 2: Ctrl+ 逗号 打开设置 - 搜索 easy Less config 并选择 点在setings.json中编辑 把下面配置粘贴进去(注意配置项间隔的逗号不要漏了) [代码]"less.compile": { // "compress": true, // 是否删除多余空白字符 // "sourceMap": true, // 是否创建文件目录树,true的话会自动生成一个 .css.map 文件 "outExt": ".wxss" // 输出文件的后缀,默认为.css } [代码] Step 3: 在你的wxml同级目录下新建一个 文件名.less 书写less语法的css并保存,同级目录下就会自动生成一个 文件名.wxss的文件 好了,这次分享到这里就结束了。如果你觉得对你有帮助,请给我点个赞并留言告诉我,让我为你开心下😊。
2019-04-30 - 云开发短信跳小程序(无代码版)教程
写在前面你可以通过视频演示的方式学习本教程,更加利于学习和理解。 [视频] 一、能力介绍境内非个人主体的认证的小程序,开通静态网站并后,可以免鉴权下发支持跳转到相应小程序的短信。短信中会包含支持在微信内或微信外打开的静态网站链接,用户打开页面后可一键跳转至你的小程序。 这个链接的网页在外部浏览器是通过 URL Scheme 的方式来拉起微信打开主体小程序的。 本教程将介绍如何操作开通CMS内容管理系统进而操作使用短信跳转小程序能力,全程无需写代码。 如果你想要进行自定义开发,可以参照自定义开发教程进行逐步实现。 二、操作步骤1.下载微信开发者工具访问微信公众平台工具下载页,按照自己的系统版本下载安装开发者工具。建议安装【开发版 Nightly Build】版本。 [图片] 2.打开开发者工具并登录安装完开发者工具后,打开工具会弹出二维码登录框。使用你目标小程序具有开发者权限的微信号扫码登录。 点击创建小程序+号,会有自动填写默认名称和目录,你可以直接默认,当然也可以自定义路径和名称;在APPID处填写你目标小程序的appid;后端服务选择【小程序·云开发】 [图片] 设置完毕后,点击新建,等待项目创建完成并全部加载完毕,最终效果如下: [图片] 3.开通云开发并创建环境如果你之前从未使用过云开发,点击左上角工具栏中的【云开发】按钮,会弹出一个窗口,显示如下: [图片] 此时只需要点击开通按钮,并在弹出提示框中同意【服务协议】,即可开通云开发。 注意这里的开通是创建一个新的腾讯云账号,如果你不想有太多的账号,可以选择通过已有的腾讯云账号开通,会绑定你目前的已有腾讯云账号,在统一管理和计费方面更加方便。 开通之后需要创建一个云开发环境,上一步同意之后会自动弹出创建窗口,效果如下: [图片] 这个时候,我们需要选择【按量付费:腾讯云账户扣款】,创建一个按量付费环境。 如果你之前已经使用过云开发了,建议可以创建一个新的环境。每一个微信小程序有两个免费环境,所以可以创建一个新的按量付费环境(有免费额度),或者2个环境转其中一个为按量付费环境(依然有免费额度)。 4.开通内容管理CMS我们创建一个按量计费环境之后,就进入这个环境的控制台了。我们只需要在顶部导航栏中选择【更多-内容管理】,进入内容管理开通页面,效果如下: [图片] 我们点击开通按钮,会弹出一个确认窗口,告诉我们是在环境中部署CMS应用,需要的资源。 [图片] 点击下一步后,会弹出管理员设置框,我们输入管理员的ID和密码即可。 [图片] 确定之后,内容管理就进入部署阶段,大约3分钟左右。完成之后效果如下: [图片] 我们只需要打开访问地址,通过浏览器进入内容管理平台,输入我们设置的密码就可以进入内容管理的主页了 [图片] 我们在上图所示页面,点击【创建新项目】,弹出创建项目信息框,随意输入名称和ID,比如在这里我们输入名称为「短信」,id为「SMS」 创建成功后会在我的项目中有对应名字的项目,如下图所示: [图片] 我们点击项目,进入项目的详情,如下图所示: [图片] 4.创建短信活动项目进入项目详情后,我们发现左侧栏会有【营销工具】,我们点击其中的营销活动 [图片] 在右上角点击【新建】按钮,创建一个新的活动,内容信息如下: 活动名:用来标记描述活动的名称。活动开启:是否开启活动,如果关闭活动,将不能通过页面拉起小程序。活动开闭时间:在开启时间内,才可以正常的拉起小程序。跳转中间页图片:建议海报,用于在跳转页中展示大图,可以不上传,会有默认样式。小程序跳转路径:已发布上线的小程序中页面路径,不填则默认首页。小程序跳转参数:附带路径的传入参数,一般配合小程序代码联动。我们创建一个活动后展示如上图所示 5.创建短信群发任务在左侧栏点击【群发短信】,进入群发短信页面,点击右上角新建群发,进入信息页。 [图片] 我们需要填写以下3个信息: 短信内容:实际发送时目标手机收到的短信内容,短信的前后缀无法自定义。手机号码包:发送的目标手机号,可以填写一个或多个手机号,用回车或者逗号分割。活动:选择刚才我们创建的活动。填写完毕后,我们点击【创建】按钮,系统会自动进行短信发送,此时我们便可以在目标手机号中收到短信了。 [图片] 在群发短信的页面列表中,可以查看短信的发送状态,以及每一个手机的接收情况。 6.测试短信跳转小程序点击短信的链接后,会跳转到浏览器打开链接,展示如下效果(左默认、右海报) [图片] 一般页面会自动拉起微信打开小程序,个别机型或浏览器有拦截会导致打开失败,需要手动点击按钮才可以打开。 7.投放外部平台短信的链接可以复制发布到其他外部平台。 8.查看短信监控图表打开微信开发者工具并登录,进入 云开发控制台 > 运营分析 > 监控图表 > 短信监控,即可查看短信监控曲线图、短信发送记录。 [图片] 总结短信发送能力的体验是每个有免费配额的环境首月100条,如有超过额度的需求可前往开发者工具-云开发控制台-对应按量付费环境-资源包-短信资源包,进行购买。如当前资源包无法满足需求也可通过云开发 工单 提交申请[图片]短信发送时间:8:00 - 22:00短信发送能力支持小程序和小游戏发送国内短信的号码是1069开头,尾数是运营商随机号的号码发送成功代表请求发送短信成功,短信异步下发,实际状态以运营商回执为准。没有发送成功的短信不计费,可用性参阅服务等级协议相同内容短信对同一个手机号,30 秒内发送短信条数不超过1条;对同一个手机号,1自然日内发送短信条数不超过10条CMS配置渠道投放、数据统计可参考官方文档
2021-04-07 - 使用云开发CMS能力实现简易商场
源码 点此领取 技术栈 云开发 CloudBase:云端一体化的 Serverless 后端服务解决方案。Taro:一套遵循 React 语法规范的 多端开发 解决方案开发工具 建议提前安装好 微信开发者工具Node LTS 版本VS Code 编辑器CloudBase VS Code 插件需求分析 只考虑基本的功能: 商品列表与下单:展示商品信息,创建订单订单列表:展示订单列表 资源准备 1. 在微信开发者工具中开通云开发,请选择按量付费 如果你的环境是预付费,请到设置中,将支付方式转换为按量付费 [图片] 2. 安装 CMS 系统 (1)更新到最新的 Nightly 版本工具,在工具顶部 Tab 栏中,点击「更多」-「内容管理」。 [图片] (2)点击开通,勾选同意协议后,点击确定。 [图片] (3)开通内容管理需要填写管理员账号,填写账号后,点击「确定」完成。 [图片] (4)开通拓展需要一定时间,请耐心等待。 (5)完成后,点击「更多」-「内容管理」,即可看到内容管理的入口和相关信息。点击访问地址,即可在弹出的窗口中进行内容管理的相关配置。 [图片] 3. 登录 CMS 系统,创建资源 CloudBase CMS 已经部署在当前环境下的静态网站托管中,访问地址的格式如下:云开发静态托管默认域名/部署路径,例如 https://envid.ap-shanghai.app.tcloudbase.com/tcb-cms/(结尾有 / 符号)。默认域名可以访问控制台查看。 打开 CloudBase CMS 后,你需要先登录,账号密码为安装时设置的管理员账号和密码。 在开始管理内容数据前,我们需要先创建一个项目。CloudBase CMS 使用项目划分不同类的内容,便于区分内容数据用途,进行权限管理。 首先,我们需要点击新建项目下方的创建新项目按钮,创建一个名为小商店,Id 为 shop 的项目。 [图片] 创建完项目后,点击项目卡片,进入项目的管理页面,我们会看到项目的欢迎页面。 [图片] 创建商品类型,管理商品信息 创建一个名称为商品的内容模型,数据库名为 goods,即将商品数据存储到 goods 数据集合中。如果新建内容的时候指定的集合不存在,CloudBase CMS 会自动新建集合。 [图片] 在创建完内容模型后,我们会得到一个空的内容模型。接下来,我们需要为商品添加商品名称,商品图片,价格,库存数量等字段。 为商品添加商品名称属性,因为商品名称通常是比较短的文字,所以我们可以选择单行字符串字段,点击右侧的单行字符串卡片,填写商品名称的字段信息。除了基本的名称,数据库字段名之外,我们还可以为此字段添加其他的限制,如最大长度,限制填写商品名称时的最大长度,创建商品时,是否必需填写商品等。 [图片] 类似的,我们可以创建数字类型的价格字段以及库存数量,图片类型的商品图片字段。在创建图片字段时,考虑到商品的图片可能有多张,我们可以打开允许多个内容按钮,表明可以上传多张图片。 [图片] 创建的 goods 数据库集合的结构如下: [图片] 同上,类似的创建一个名称为订单列表,数据库集合名为 order 的内容模型,来管理订单信息。创建的 order 数据库集合的结构如下: [图片] 添加一个商品 [图片] 创建项目 1、拉取模板 # 安装 taro cli 工具 npm install -g @tarojs/cli@2.2.7 # 拉取模板 git clone https://github.com/TencentCloudBase/cloudbase-minishop.git 使用微信开发者工具导入项目,进入 client 目录,安装依赖: npm i 项目目录 cloud/functions 包含写好的微信支付的两个云函数, pay 和接收支付消息推送的 pay-callback 云函数。使用时需使用微信开发者工具上传这两个云函数。 2、项目目录 . ├── client // 小程序源码 │ ├── config │ └── src │ ├── assets │ ├── components │ └── pages │ ├── index │ └── order-list └── cloud // 云开发相关源码 │ └── functions │ ├── pay │ └── pay-callback ├── cloudbaserc.json // 云开发配置 ├── project.config.json // 小程序配置 微信支付下单流程 1、小程序调用云函数,在云函数中调用统一下单接口,参数中带上接收异步支付结果的云函数名和其所在云环境 Id。 const cloud = require("wx-server-sdk"); const res = await cloud.cloudPay.unifiedOrder({ envId: '', subMchId: '', body: "商品名", totalFee: 100, outTradeNo: '订单号', spbillCreateIp: "127.0.0.1", functionName: "pay-callback" }); // 返回 res.payment 支付结果回调的云函数必须返回如下一个对象,否则会视为回调不成功,云函数会收到重复的支付回调。 { errcode: '', errmsg: '', } 2、统一下单接口返回的成功结果对象中有 payment 字段,该字段即是小程序端发起支付的接口(wx.requestPayment)所需的所有信息。 3、小程序端拿到云函数结果,调用 wx.requestPayemnt 发起支付 wx.requestPayment({ ...payment, success (res) { }, fail (res) { }tt })https://docs.cloudbase.net/ 4、支付完成后,在统一下单接口中配置的云函数将收到支付结果通知。 多端支持 - 跨平台 小程序Web 相关文献 云开发文档 云开发微信支付 支付接口
2021-09-10 - 云开发短信跳小程序(自定义开发版)教程
写在前面如果你想要自主开发,但没有云开发相关经验,可以采用演示视频来学习本教程: [视频] 一、能力介绍境内非个人主体的认证的小程序,开通静态网站后,可以免鉴权下发支持跳转到相应小程序的短信。短信中会包含支持在微信内或微信外打开的静态网站链接,用户打开页面后可一键跳转至你的小程序。 这个链接的网页在外部浏览器是通过 URL Scheme 的方式来拉起微信打开主体小程序的。 总之,短信跳转能力的实现分为两个步骤,「配置拉起网页」和「发送短信」。本教程将介绍如何执行操作完成短信跳转小程序的能力。 如果你想要无需写代码就能完成短信跳转小程序的能力,可以参照无代码版教程进行逐步实现。 二、操作指引1、网页创建首先我们需要构建一个基础的网页应用,在任何代码编辑器创建一个 html 文件,在教程这里命名为 index.html 在这个 html 文件中输入如下代码,并根据注释提示更换自己的信息: window.onload = function(){ window.web2weapp.init({ appId: 'wx999999', //替换为自己小程序的AppID gh_ID: 'gh_999999',//替换为自己小程序的原始ID env_ID: 'tcb-env',//替换小程序底下云开发环境ID function: { name:'openMini',//提供UrlScheme服务的云函数名称 data:{} //向这个云函数中传入的自定义参数 }, path: 'pages/index/index.html' //打开小程序时的路径 }) } 以上引入的 web2weapp.js 文件是教程封装的有关拉起微信小程序的极简应用,我们直接引用即可轻松使用。 如果你想进一步学习和修改其中的一些WEB展示信息,可以前往 github 获取源码并做修改。 有关于网页拉起小程序的更多信息可以访问官方文档 如果你只想体验短信跳转功能,在执行完上述文件创建操作后,继续以下步骤。 2、创建服务云函数在上面创建网页的过程中,需要填写一个UrlScheme服务云函数。这个云函数主要用来调用微信服务端能力,获取对应的Scheme信息返回给调用前端。 我们在示例中填写的是 openMini 这个命名的云函数。 我们前往微信开发者工具,定位对应的云开发环境,创建一个云函数,名称叫做 openMini 。 在云函数目录中 index.js 文件替换输入以下代码: const cloud = require('wx-server-sdk') cloud.init() exports.main = async (event, context) => { return cloud.openapi.urlscheme.generate({ jumpWxa: { path: '', // 打开小程序时访问路径,为空则会进入主页 query: '',// 可以使用 event 传入的数据制作特定参数,无需求则为空 }, isExpire: true, //是否到期失效,如果为true需要填写到期时间,默认false expire_time: Math.round(new Date().getTime()/1000) + 3600 //我们设置为当前时间3600秒后,也就是1小时后失效 //无需求可以去掉这两个参数(isExpire,expire_time) }) } 保存代码后,在 index.js 右键,选择增量更新文件即可更新成功。 接下来,我们需要开启云函数的未登录访问权限。进入小程序云开发控制台,转到设置-权限设置,找到下方未登录,选择上几步我们统一操作的那个云开发环境(注意:第一步配置的云开发环境和云函数所在的环境,还有此步操作的环境要一致),勾选打开未登录 [图片] 接下来,前往云函数控制台,点击云函数权限,安全规则最后的修改,在弹出框中按如下配置: [图片] 3、本地测试我们在本地浏览器打开第一步创建的 index.html ;唤出控制台,如果效果如下图则证明成功! 需要注意,此处本地打开需要时HTTP协议,建议使用live server等扩展打开。不要直接在资源管理器打开到浏览器,会有跨域的问题! [图片] 4、上传本地创建好的 index.html 至静态网站托管将本地创建好的 index.html 上传至静态网站托管,在这里静态托管需要是小程序本身的云开发环境里的静态托管。 如果你上传至其他静态托管或者是服务器,你仍然可以使用外部浏览器拉起小程序的能力,但会丧失在微信浏览器用开放标签拉起小程序的功能,也不会享受到云开发短信发送跳转链接的能力。 如果你的目标小程序底下有多个云开发环境,则不需要保证云函数和静态托管在一个环境中,无所谓。 比如你有A、B两个环境,A部署了上述的云函数,但是把 index.html 部署到B的环境静态托管中了,这个是没问题的,符合各项能力要求。只需要保证第一步 index.html 网页中的云开发环境配置是云函数所在环境即可。 部署成功后,你便可以访问静态托管的所在地址了,可以通过手机外部浏览器以及微信内部浏览器测试打开小程序的能力了。 5、短信发送云函数的配置在上面创建 openMini 云函数的环境中再来一个云函数,名字叫 sendsms 。 在此云函数 index.js 中配置如下代码: const cloud = require('wx-server-sdk') cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV, }) exports.main = async (event, context) => { try { const config = { env: event.env, content: event.content ? event.content : '发布了短信跳转小程序的新能力', path: event.path, phoneNumberList: event.number } const result = await cloud.openapi.cloudbase.sendSms(config) return result } catch (err) { return err } } 保存代码后,在 index.js 右键,选择增量更新文件即可更新成功。 6、测试短信发送能力在小程序代码中,在 app.js 初始化云开发后,调用云函数,示例代码如下: App({ onLaunch: function () { wx.cloud.init({ env:"tcb-env", //短信云函数所在环境ID traceUser: true }) wx.cloud.callFunction({ name:'sendsms', data:{ "env": "tcb-env",//网页上传的静态托管的环境ID "path":"/index.html",//上传的网页相对根目录的地址,如果是根目录则为/index.html "number":[ "+8616599997777" //你要发送短信的目标手机,前面需要添加「+86」 ] },success(res){ console.log(res) } }) } }) 重新编译运行后,在控制台中看到如下输出,即为测试成功: [图片] 你会在发送的目标手机中收到短信,因为短信中包含「退订回复T」字段,可能会触发手机的自动拦截机制,需要手动在拦截短信中查看。 需要注意:你可以把短信云函数和URLScheme云函数分别放置在不同云开发环境中,但必须保证所放置的云开发环境属于你操作的小程序 另外,出于防止滥用考虑,短信发送的云调用能力需要真实小程序用户访问才可以生效,你不能使用云端测试、云开发JS-SDK以及其他非wx.cloud调用方式(微信侧WEB-SDK除外),会提示如下错误: [图片] 如果你想在其他处使用此能力,可以使用服务端API来做正常HTTP调用,具体访问官方文档 7、查看短信监控图表进入 云开发控制台 > 运营分析 > 监控图表 > 短信监控,即可查看短信监控曲线图、短信发送记录。 [图片] 三、总结短信跳转小程序核心是静态网站中配置的可跳转网页,外部浏览器通过URL Scheme 来实现的,这个方式不适用于微信浏览器,需要使用开放标签才可以URL Scheme的生成是云调用能力,需要是目标小程序的云开发环境的云函数中使用才可以。并且生成的URL Scheme只能是自己小程序的打开链接,不能是任意小程序(和开放标签的任意不一致)短信发送能力的体验是每个有免费配额的环境首月100条,如有超过额度的需求可前往开发者工具-云开发控制台-对应按量付费环境-资源包-短信资源包,进行购买。如当前资源包无法满足需求也可通过云开发 工单 提交申请[图片]短信发送也是云调用能力,需要真实小程序用户调用才可以正常触发,其他方式均报错返回参数错误,出于防止滥用考虑云函数和网页的放置可以不在同一个环境中,只需要保证所属小程序一致即可。(需要保证对应环境ID都能接通)如果你不需要短信能力,可以忽略最后两个步骤CMS配置渠道投放、数据统计可参考官方文档
2021-04-07 - 静态网站托管,用了自定义域名之后,wx.config签名失败,使用默认域名时正常?
在vue项目中想要使用<wx-open-launch-weapp>开放标签跳转小程序,采用的方法是静态网站托管,文档链接在下方 [图片] 截止到添加自定义域名这一步骤之前的问题都已解决。 目前的情况是:使用腾讯云默认域名访问网站时,该组件功能正常有效,这意味着之前的相关配置和使用方法等都是正确的。但由于了解到默认域名有较低的并发限制,不适合线上使用,故添加自定义域名做映射。域名映射完成后可以正常访问网站,但该组件初始化报错,标签按钮也不显示,开启debug后errMsg为"config: invalid signature"。 [图片] 试过了各种方式,小程序也对映射的域名添加了业务域名,问题仍未解决,麻烦帮忙看一下是什么问题导致的,谢谢🙏 静态网站托管文档链接:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/staticstorage/introduction.html
2020-11-10 - 云开发web页面公众号授权登录,真机checkLogin一直失败,开发者工具却可以成功?
授权地址: https://wechat.mklaus.cn 效果对比,开发者工具成功 [图片] 真机一直请求授权 [图片] 页面就一个html文件,没有其他。代码如下 ```html <html> <head><script src="https://res.wx.qq.com/open/js/cloudbase/1.1.0/cloud.js"></script></head> <body><p>hello world</p></body> <script> window.login = async function() { const checkLoginOptions = { provider: 'OfficialAccount', appid: 'wx1801955d58387cb4', } var urlSearch = new URLSearchParams(location.search) var accessToken = urlSearch.get('access_token') var refreshToken = urlSearch.get('refresh_token') if (urlSearch.get('oauthredirect') === '1') { checkLoginOptions.accessToken = accessToken checkLoginOptions.refreshToken = refreshToken } const result = await cloud.checkLogin(checkLoginOptions) if (result.errCode === 0 && result.loggedIn) { alert('login success') } else { try { cloud.startLogin({ provider: 'OfficialAccount', appid: 'wx1801955d58387cb4', scope: 'snsapi_base', redirectUri: 'https://wechat.mklaus.cn/' }) } catch (e) { console.error(`startLogin fail: ${e}`) } } } window.login() </script> </html> ```
2020-12-22 - 云托管 Cannot GET /__wx__/oauth 的问题依旧存在
目前云托管服务里动态服务提供页面目前已经支持,如果你的服务仍然表现是 Cannot GET /__wx__/oauth,可以重新部署更新一下服务,使策略生效。 这句对我来说没有生效过,在云托管中,我用flask和express都部署过.同样都是这个问题,Cannot GET /__wx__/oauth 搞了10年的开发,微信开发最累,文档烂,示例烂,各种bug提了一年都没人修. 外层环境直接占用 /__wx__/ 不给容器用不就行了,哪里有什么框架兼容不兼容的问题
2023-03-18 - 腾讯云函数使用注意事项,解决云函数重复多次调用问题
云开发过程中遇到过多次云函数自动重复调用问题,每隔10秒重复调用共9次,百思不得其解。后与售后技术人员沟通了解,云函数不支持异步操作,并有多种内部限制因素,最终都会导致触发云函数自动重试机制,导致云函数重复调用。 触发云函数重试几个因素如下: 1.云函数执行耗时代码,超过云函数运行时限会被认为超时,触发云函数自动重试。建议将耗时代码拆解分发给其他云函数多批次执行,非小程序调用云函数超时最长可以设置900s。 2.云函数执行结束后没有return,超过云函数运行时限会被认为超时,触发云函数自动重试。云函数最后一定要return,return前建议延时1秒,防止残余代码未完全执行结束而被中断return。 3.云函数不支持异步操作,云函数return后仍有异步代码持续执行,会被认为超时,触发云函数自动重试。通过new promise包裹+async/await将异步代码转为同步。 4.云函数代码报错导致触发云函数自动重试。云函数代码一定要包裹try catch。 5.回调函数和触发函数一定要在规定时间内return,超过时限会被认为超时,触发云函数自动重试。事件触发必须5s内return,微信云支付回调大概是3s左右。 6.尽量使用腾讯云web端进行测试,不要使用微信开发工具IDE云端测试,由于控制台缓存版本不好处理,可能会导致IDE云端测试触发重复调用。官方建议web端进行云端测试。 7.对于高并发易超时的负责业务逻辑,通过多级调用+延时调用云函数,降低每秒并发量和缩短代码执行耗时,减少云函数超时自动重试带来的数据重复、流量翻倍等问题同时缩小问题影响范围。 示例代码: /** * 使用 Promise 和 async/await 来实现线程睡眠的效果,需要在 Node.js 版本 7.6 或更高版本上运行。 * @param {*} ms 等待指定的毫秒数 */ function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } /** * 函数内部异步代码按顺序同步执行 */ async function does(){ try { for (let i = 0; i < 3; i++) { //异步代码同步执行 await new Promise((resolve,reject)=>{ setTimeout(() => { let msg = '成功,第' + i + '个同步代码,等3s'; console.log(msg) if(msg){ resolve(msg) }else{ reject('失败') } }, 3000); }) } //耗时代码,通过分发给其他云函数执行,防止云函数超时报错,触发重试机制 cloud.callFunction({ // 云函数名称 name: 'test', // 传给云函数的参数 data: { }, }) } catch (error) { console.error("出错了:" + error); } }; // 云函数入口函数 exports.main = async (event, context) => { try { //包裹try catch防止云函数报错,触发重试机制 await does() await sleep(1000); //延迟一秒结束,防止未完全执行结束而被立刻return console.log('入口函数结束') } catch (error) { console.error("出错了:" + error); } return //一定要return,否则云函数认为没有执行结束导致超时报错,触发重试机制 }
2023-10-01 - 最佳实践丨在云函数内使用 Redis 扩展
什么时候应该使用 Redis?Redis 的适用场景包括但不仅限于: 计数器:因为 Redis 操作是原子性的,通过原子递增或递减来做高并发用户的数据计数,比如点赞数、收藏数、分享数、商品抢购时的库存量、商品文章总数、评论数量等;排行榜:Redis 支持集合和有序集合的数据结构,且运行在内存中,因此可以存储一些类似于排行榜的数据,比如最近、最热、点击率最高、活跃度最高、评论最多等等的文章、商品、用户等;哈希表:用户粉丝列表、用户点赞列表、用户收藏列表、用户关注列表等;自动排序:存储时间戳,随着时间的变化,按照用户关注用户的最新动态列表等自动排序;会话缓存:使用 Redis 进行会话缓存,将 web session 存放在 Redis 中;全页缓存 FPC:可以将服务端渲染结果的缓存在 Redis 中;记录用户操作信息:用户是否点赞、用户是否收藏、用户是否分享等。安装 Redis 拓展1、安装扩展打开腾讯云控制台,进入到环境详情页面,点击左侧的「扩展应用」,进入到扩展能力详情页,并点击 Redis 拓展,安装拓展。 [图片] 2、创建 Redis 实例倘若安装中没有实例(即还没有购买 Redis 数据库,点击新建实例),倘若已经有实例的可以跳过,进入下一步。 [图片] 购买 Redis 数据库,创建实例,配备好私有网络。 [图片] 创建好实例后回到扩展选择刚刚创建(或者已有的)的实例: [图片] 点击完成创建: [图片] 看到有如下扩展即安装成功: [图片] 3、获取 Redis 信息创建好后查看拓展相关信息(在这里面我们便可以看到一起创建好的云函数啦): [图片] 在云函数中使用 Redis云函数内可以通过 Redis 客户端连接和操作 Redis 实例,推荐使用。 1、安装依赖首先进入到 Redis 的云函数目录中,然后执行命令 [代码]npm init -y[代码]初始化一个配置文件。 随后,执行 [代码]npm install --save redis[代码] 来安装相应的依赖。 安装完成后,云函数目录下将会出现 package.json 文件,内容类似以下: { "name": "redis", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "redis": "^3.0.2" } } 2、调用 Redis接下来可以在代码中调用 Redis 数据库了。 由于使用了云开发的 Redis 拓展,系统运行环境中会自动带上相应的配置,你可以直接使用相应的环境变量来链接 Redis 数据库。 'use strict'; const redis = require('redis') let client = redis.createClient({ host: process.env.HOST, port: process.env.PORT, // 需要填写真实的密码 password: 'xxx' }) exports.main = async (event, context, callback) => { let res = await new Promise((resolve, reject) => { client.get('test', function (err, reply) { if (err) { resolve({ err }) } resolve({ data: reply.toString() }) }) }) return { res } } 产品介绍云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为开发者提供高可用、自动弹性扩缩的后端云服务,包含计算、存储、托管等serverless化能力,可用于云端一体化开发多种端应用(小程序,公众号,Web 应用,Flutter 客户端等),帮助开发者统一构建和管理后端服务和云资源,避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。 开通云开发:https://console.cloud.tencent.com/tcb?tdl_anchor=techsite 产品文档:https://cloud.tencent.com/product/tcb?from=12763 技术文档:https://cloudbase.net?from=10004 技术交流群、最新资讯关注微信公众号【腾讯云云开发】
2021-05-11 - 使用云函数操作数据库如何达到乐观锁的功能?
在使用云函数对数据库进行更新一条记录时,想要达到mysql中类似乐观锁的功能。 举例场景如下:某活动奖品的数量为5,中奖人数不能超过奖品数量。 流程如下:先查询已经中奖人数为4,判断中奖数量4小于奖品数量5,则任然可以中奖,再更新中奖数量为5; 高并发下存在问题:若在查询中奖数量为4之后,已经有其他用户也中了奖,此时最新数据为5了,则此事务中更新为5的操作应当失败。 需要使用乐观锁,或者类似分布式锁来实现。请问云函数如何实现?
2022-11-07 - 云开发原子操作实现秒杀功能
直接上代码: DB.collection('product').where({ _id: productId, stock: _.gt(0)//库存大于0 }).update({ data: { stock: _.inc(-1),//库存减 1,原子操作inc。 luckers: _.addToSet(openid)//记录获奖者的openid } }).then(res => { //注意如何判断结果 if (res.stats.updated == 1) { console.log('获得奖品') } if (res.stats.updated == 0) { console.log('啥也没抢到') } })
2022-11-09 - 云开发云函数中使用Redis的最佳实践,包括五种常用数据结构和分布式全局锁
Redis因其拥有丰富的数据结构、基于单线程模型可以实现简易的分布式锁、单分片5w+ ops的超强性能等等特点,成为了大家处理高并发问题的最常用的缓存中间件。 那么云开发能不能使用Redis呢?答案是肯定的。 下面我介绍下云开发中Redis使用的最佳实践: 第一步、购买Redis,安装Redis扩展 参见官方文档:https://developers.weixin.qq.com/community/develop/article/doc/000a4446518488b6002c9fa3651813 吐槽一下,写这篇文章的原因之一就是上面的官方文档中的示例代码是在不堪入目,希望这篇文章能让小伙伴少踩些坑。 第二步、创建并部署测试云函数,配置云函数的网络环境 [图片] 第三步、编写代码 cache.js const Redis = require('ioredis') const redis = new Redis({ port: 6379, host: '1.1.1.1', family: 4, password: 'password', db: 0 }) exports.redis = redis /** * 加redis全局锁 * @param {锁的key} lockKey * @param {锁的值} lockValue * @param {持续时间,单位s} duration */ exports.lock = async function(lockKey, lockValue, duration) { const lockSuccess = await redis.set(lockKey, lockValue, 'EX', duration, 'NX') if (lockSuccess) { return true } else { return false } } /** * 解redis全局锁 * @param {锁的key} lockKey * @param {锁的值} lockValue */ exports.unlock = async function (lockKey, lockValue) { const existValue = await redis.get(lockKey) if (existValue == lockValue) { await redis.del(lockKey) } } 上面是操作redis的工具方法,可以打包放到云函数的层管理中,方便其他云函数引用。层管理使用方式参见官方文档:https://cloud.tencent.com/document/product/876/50940 index.js const cloud = require("wx-server-sdk") const cache = require('/opt/utils/cache.js') // 使用到了云函数的层管理 cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) global.cloud = cloud global.db = cloud.database() global._ = db.command global.$ = _.aggregate exports.main = async (event, context) => { context.callbackWaitsForEmptyEventLoop = false const wxContext = cloud.getWXContext() let appId = wxContext.APPID if (wxContext.FROM_APPID) { appId = wxContext.FROM_APPID } let unionId = wxContext.UNIONID if (wxContext.FROM_UNIONID) { unionId = wxContext.FROM_UNIONID } let openId = wxContext.OPENID if (wxContext.FROM_OPENID) { openId = wxContext.FROM_OPENID } // redis五种常用数据结构 // 字符串 await cache.redis.set('hello', 'world') // 无过期时间 await cache.redis.set('hello', 'world', 'EX', 60) // 过期时间60s let stringValue = await cache.redis.get('hello') console.log('string: ', stringValue) // hash await cache.redis.hset('hash', 'hello', 'world') let hashValue = await cache.redis.hget('hash', 'hello') console.log('hash: ', hashValue) // list await cache.redis.lpush('list', 'hello', 'world') let listList = await cache.redis.lrange('list', 0, -1) // 读取队列所有元素 await cache.redis.ltrim('list', 1, 0) // 清空队列 console.log('listList: ', listList) // set await cache.redis.sadd('set', 'hello', 'world') let setExist = await cache.redis.sismember('set', 'hello') // 检查元素是否在集合中 console.log('set: ', setExist) // zset await cache.redis.zadd('zset', 1, 'hello', 2, 'world') let zsetList = await cache.redis.zrange('zset', 0, -1, 'WITHSCORES') console.log('zsetList: ', zsetList) // redis实现分布式全局锁 // 加全局锁,锁的过期时间应根据实际业务调整 const createOrderLock = `createOrderLock:${unionId}` const ts = Date.now() if (!(await cache.lock(createOrderLock, ts, 3))) { return { code: 4, msg: '操作太频繁了' } } // 这边写全局互斥的业务逻辑代码 // 比如创建订单,一个用户同时只能并发创建一个订单 // 解全局锁 await cache.unlock(createOrderLock, ts) return { code: 0, data: {} } } 上面是测试云函数的入口文件,演示了redis五种常用数据结构和redis全局锁的使用方法。 最后还有个小tips,所有引用到cache.js的云函数需要安装ioredis的依赖,进入云函数目录,使用如下命令: npm install ioredis
2021-06-17 - 全网发布接入检查“发回API文本消息失败”?
[图片][图片]
2023-09-22 - 小程序正式版会显示vConsole?
发现一个问题,在访问小程序正式版时,发现出现了vConsole调戏器,操作步骤如下: 1、通过开发者工具(mac版,RC 1.06.2205231),预览,进入真机后,打开调试(即开发版显示vConsole调试器) 2、关掉当前小程序窗口,回到微信聊天主页 3、下拉计入小程序快捷窗口,选择对应的正式版小程序,到此发现vConsole调试器是打开的 注:再次回到开发版,关闭调试器后,再回到正式版,vConsole是关闭的,微信版本为:8.0.23,机型为iphone xr
2022-06-10