- 【简单高效】全面深度解析微信生态应用安全防护策略
作为开发者,最令我们头疼的可能并不是产品需求开发,而是在产品上线后出现的各种安全风险问题。 这些年,我们收到很多开发者提供的真实案例: 投票功能,本来要提供公平公正的投票服务,结果因为有人雇佣水军刷赞,造成投票严重不公平;发放活动优惠券,本来是刺激用户活跃的好活动,好不容易申请了经费,结果被羊毛党用非法手段拿走了90%,变价买卖。信息发布应用,访问人数很少但是服务器压力很大,因为每天会收到几十个爬虫的千万次请求。 ......这些案例一次次的发生,让我们产生了思考,到底哪个环节出问题了? 风险在哪里? 用户在使用小程序或H5应用时,业务请求从客户端发起,经过网络链路,到服务端;然后服务端根据请求处理事项并返回相应的内容,这是一个正常预期内的过程。 这里的客户端、网络链路、服务端,每一个部分都会成为被攻击的对象。我们一个个来盘点: 1. 客户端 小程序本身有代码加密插件,可以对上传的小程序代码混淆加密,并且从小程序发送的请求有明显的特征,只要服务端对应配置可以识别这些特征,攻击者破解和伪造的难度是非常高的。 但从诸多案例中我们发现,大部分攻击者不会直接从源码中破解请求体,而是使用模拟器、群控及设备农场的方式,通过外部辅助脚本或物理外挂的形式来去攻击。 比如“跳一跳”小游戏,很多玩家为了拿高分,不是去搞小游戏代码包伪造请求,而是直接搬上摄像头识别,通过距离识别,停顿秒数的计算,物理触发屏幕完成刷高分的成就。(网络搜一搜跳一跳外挂,八仙过海各显神通) [图片] 一般来说群控设备的解法要比直接破解代码包去伪造请求隐蔽的多,如果我们开发者只做了简单的 header 特征的识别,是很难抓到群控设备发出的请求的,从特征看,这些就是正常的手机直接点击完成的。 2. 网络链路 从客户端到服务端,一定是要经过本地网络和运营商网络,运营商网络直接做攻击行为的可能性很小,绝大部分的网络链路攻击都来源于本地网络。 攻击者通过对你正常的请求域名进行DNS污染,或通过代理你的网络,对客户端发出的请求做劫持和重放等,来达到TA的目的。 比如,因为开发者的逻辑失误,导致一个游戏道具的领取接口没有做校验和限制,发一个请求就领取一个道具,那么攻击者可以直接通过在链路上劫持并重放接口请求来刷道具。 除此之外还有很多很多,一半以上的攻击者目的都是为了自身,而不是去偷他人的数据,因为主观能动性,本地网络的链路劫持基本都能轻松完成。 3. 服务端 服务端是最容易被攻击的,并且大部分的攻击行为都是绕开客户端和网络链路(从客户端发来的链路),直接去搞服务端。这里列举一些常见的攻击手段: DDos攻击:分布式拒绝服务攻击,攻击者直接不择手段想把你的服务器打挂掉,从而影响你的正常业务。CC攻击:人海攻击手段,通过绑架大量肉鸡或者号召一大波人,直接把你服务端挤爆,让你无法服务正常的用户。BOT攻击:一般不会对你的服务器造成影响,只是通过后端接口缺陷,批量自动化获取你的业务信息,或者定时来获取你的信息,有部分是爬虫。黑客攻击手段:比如SQL注入、0day漏洞、加密凭证破解、网络阻塞攻击等,这些就不是用户抢道具这种的目标行为,而是有预谋的直接攻击你的基建。应该如何防范? 针对不同层面的攻击,我们应该有不同的防范方法,在这里我们给开发者整理了一些有效的方法: 1. 客户端 应用中尽量使用代码保护插件,对小程序代码进行混淆和加密,增加逆向工程的难度。应用中设置合理的操作频率限制和阈值警报,比如在页面打开后不允许立刻点击按钮,按钮加上防抖和节流。实现基于时间或挑战-响应的动态令牌机制,防止请求重放攻击。结合多维度信息(如硬件ID、网络特征、行为模式等)生成唯一标识,识别和追踪异常设备行为。接入用户行为分析监听,检测异常操作模式;比如跳一跳长时间有节奏的操作停顿,点击位置无变化,可以判定物理外挂。2. 网络链路 小程序强制使用HTTPS协议,但在其他客户端也应全面采用HTTPS协议,防止中间人攻击和数据窃听;另外有条件可以采取证书固定,防止SSL劫持。有能力的话,对每个请求进行签名,包含时间戳、nonce 等信息,服务端验证签名有效性。有条件可以进行双向认证,服务端也要对客户端证书做认证,确保通信双方身份。扩展使用 DNSSEC 或 HTTP-DNS 技术,防止DNS污染。3. 服务端 使用专业的DDoS防护服务器,实现流量清洗和智能负载均衡;另外应用层面要基于IP或者用户openid做访问频率限制。使用验证码或其他人机交互验证来辅助判断,比如关键接口滑动验证,或使用短信验证码确认。API层面要做细粒度的接口权限控制,对敏感接口应该有更严格的认证和授权机制。引入一些BOT检测机制,通过特征标记来识别和阻止自动化脚本;配合动态黑名单系统,自动封禁异常IP。部署WAF,防御常见的Web攻击,如SQL注入、XSS等;另外对服务器和后端服务软件的安全更新和补丁要及时处理。使用API网关,集中管理和监控API调用,将多个服务受攻击面缩减到一个,集中精力防护。 通过实现上述手段,我们能阻止绝大部分的安全攻击,但也对各位开发者提出了更高的要求;如果因为自身理解或者配置不当,很有可能会遗漏一些重要的点,造成防护失效,对业务服务造成损失。 那么有没有什么方法,能够让开发者简单操作就能实现上述所有防护手段,从而高效的处理的自己的业务开发呢? 微信做了什么? 微信官方团队,在去年就推出了集API网关、网络加速、请求加密、安全防护、流量管控于一体的「安全网关」,有一套完整的端到端的防护体系。从客户端到服务端,全面覆盖业务服务过程,为开发者提供简单、高效的保护和治理。 [图片] 「安全网关」的防护能力分链路层面、客户端层面、服务端层面,我们分别来看下几个层面的防护特点。 在链路层面上,实现了三层防护 第一层:请求进入网关的微信私有协议时,可以精准识别协议外挂、爬虫特征、模拟器攻击、黑灰产IP、DDos和CC攻击等各种异常请求,并及时拦截。第二层:经过第一层的初步清洗,在这一层会对伪造、篡改协议的请求进行清洗;同时结合用户请求频率、权限校验等风控能力拦截掉非法请求、越权请求、高频请求等;前两层的清洗已经拦截90%的异常流量,将剩余正常流量转发给业务源站。第三层:为了防止漏网之鱼,开发者可以选择接入第三层,网关会结合请求特征、设备信息、账号信息形成多维智能分析模型,对请求进行风险的判别,并将判别结果一同提交给业务源站,开发者可以参照或结合自己的数据,综合判断请求的合法性。开发者也可以授权网关直接对高风险的请求直接拦截,不转发给业务源站。在客户端层面,请求加密和风险识别 「安全网关」提供微信私有协议,二次封装,100%加密数据和接口,全程无明文数据传输,极大的提高外部抓包破解门槛。 并且「安全网关」支持在小程序、WEB、H5、APP等多端场景接入。尤其在微信小程序中,平台能在 wx.request 中直接转发请求到网关安全链路,无需开发者改代码;支持一键断连,恢复为普通请求链路。 [图片] 风险识别上,「安全网关」在微信小程序中推出「安全检测插件」,插件会根据设备环境、网络环境、用户行为、账号风险等多维度综合判断当前运行环境的可信情况,给出判断结果;开发者接入后可以在敏感业务前调用检测,检测通过才进行业务请求。 该扩展插件可以帮助开发者拦截群控、模拟器、设备农场等端场景的攻击行为,极大降低了游戏刷高分,集赞水军,自动羊毛党对正常业务的影响。 服务端层面提供信任参考 「安全网关」之所以称之为网关,是因为TA代理了所有客户端发送的请求,集中转发到开发者业务服务器中。在这个集中处理的过程中,实现了加密、加速、安全防护等多个效果。 作为服务端的开发者,我们在接入「安全网关」后,可以充分利用网关转发请求的附加信息,比如请求来源小程序appid、用户openid、用户unionid、用户风险标识等等,根据这些网关标记结合自身业务需求予以处理。 你可以在服务端对「安全网关」转发流量以外的其他流量设置限制访问,只接受「安全网关」的IP发过来的请求,将自己服务器隐藏在安全网关后面,更加安全;也可以设置其他更丰富化的防护策略,一切自由决定。 [图片] 如何接入安全网关? 目前网关控制台(请在 PC 端访问:https://dev.weixin.qq.com/console/gateway )已支持自助接入。 我们针对微信小程序提供一键接入方式,你可以无需任何代码改动和版本发布就可以体验。支持全量、URL灰度、用户灰度等策略,体验出现问题也支持一键断连。 针对其他客户端,如WEB、H5、PC端场景,也提供手动接入方案。 我们还推出了系列视频课程,全面讲解「安全网关」的各方面使用细节,让开发者上手更容易:微信网关系列课程 如果你有企业级版本(预期 >1000 QPS)的接入需求,请邮件联系我们专业对接:donut@tencent.com
2024-09-03 - 微信小程序代码如何加固反编译及后台接口防止别人乱调用
最近开发了一个小程序前端开发前端和后台花了1个多月时间开发,结果被人轻松的把微信小程序前端代码破解出来。而且完整一个字不差截图给我看了。 小程序是前后端都分离的,如果后端不作验证,别人把你的小程序前端扒了接口也暴露了,随便可以复制你的前端去换成自己appid上线后调你的接口。这显然是不安全的。 在想为什么微信官方不限制指定appid才能调用指定域名接口。这样接口才是安全的。 最后找了一圈,微信开发者工具里只能对前端代码进行混淆加固,只能做到这步,让人破解出来后 看不懂逻辑,但还是一样能破解出来。只能做到基础的保护作用。 微信小程序演示: [图片] 目前按官方想方法: 微信代码加固方法:打开微信开发者工具,在菜单栏选择"工具-插件-编辑器扩展"或"设置-扩展设置-编辑器扩展",找到 “代码加固” 点击"获取"进行安装。安装成功后,即可使用该插件功能。右键js文件加固。 [图片] 目前此方法只能是对js加固混淆,wxml 样式等没法加密,人家要偷还是一样能随便反编译出来。 请教大佬们微信小程序如何做好加密?微信官方有没有指定小程序访问接口?后端接口如何做安全防护,不给别人随便调用?否则别人知道你的api地址就可以随便用了
2024-05-29 - 企业微信自建小程序应用踩坑实践
最近开发了一个小程序接入企业微信的需求,企业微信的权限限制诸多,网上的完整示例又少之又少,因此踩了比较多坑,与大家分享。 坑1: 开发调试 在开发者工具中如果直接使用微信小程序模式,调用wx.qy接口会提示不存在,需要安装企业微信小程序模拟器插件 添加企业微信模拟器插件 [图片] [图片] 切换企业微信小程序模式 [图片] 注意:某些api模拟器也不支持,需要真机调试 打开多场景调试 用企业微信扫小程序开发码,开启多场景调试。开启之后,在附件栏、工具栏、会话、工作台等场景打开此小程序时,都将使用本次扫码的开发版小程序来运行。 [图片] 这个功能很好的解决了从其他入口无法进入开发版的问题,但开发调试的过程还是比较麻烦的 坑2: 企业微信端小程序登录流程和微信端小程序登录不同 一开始是想调用wx.qy.selectExternalContact获取外部联系人信息,本以为有现成的api可以解决很简单,但直接调用一直调不通,提示session过期,才看到这个api的调用前提: 调用前提: 必须先调用过wx.qy.login,且session_key未过期,开发者可调用checkSession 检查当前登录态 当前成员必须在应用的可见范围 [代码]wx.qy.login[代码]与[代码]wx.login[代码]的用法类似,但企微端的登录和微信端的登录是两套不通的流程 微信端小程序登录 [图片] 企微端小程序登录 [图片] 注: 企业微信端也是支持wx.login的,如只需使用wx.xx(微信端api)不需要走企业微信登录。 如需获取到当前企业微信用户在当前企业的员工身份信息、联系人信息等企业微信相关用户信息,则必须走企业微信登录流程。 坑3: access_token必须是与小程序关联的企业微信应用secret所获得 在调用jscode2session接口走登录流程的时候,一直提示没有权限,看了下接口的权限说明: 权限说明: access_token必须是与小程序关联的企业微信应用secret所获得。 如果没有开发过企业微信应用,可能会对这句话费解,这个概念如果没有从头看起很容易混淆。 一开始用的是企业微信本身的secrect不行,后来在论坛上查询相关帖子说是要用小程序的secrect,但要注意这里指的secrect并不是小程序本身的AppSecrect,而是在企业微信后台创建的关联了小程序的应用的secrect,可以在企业微信后台应用管理中点击查看,发送Secret到企业微信中查看。 secret是企业应用里面用于保障数据安全的“钥匙”,每一个应用都有一个独立的访问密钥。分为以下几种: 自建应用secret 基础应用secret 通讯录管理secret 外部联系人管理secret 建议开发前先阅读文档了解清楚这些基本概念:https://developer.work.weixin.qq.com/document/path/90665 坑4: 客户联系API权限 如果在调用客户管理相关API提示没有权限的话,先来看一下接口的权限说明: 权限说明: 企业需要使用客户联系secret或配置到可调用应用列表中的自建应用secret所获取的accesstoken来调用 第三方应用需具有“企业客户权限->客户基础信息”权限 第三方/自建应用只能获取到可见范围内的配置了客户联系功能的成员。 可以从以下方面排查: 获取accesstoken的secrect有没有用对 一种方法是可以直接使用客户联系secrect: [图片] 如果使用的是自建应用的secrect,还需要把当前应用配置到客户联系可调用列表: [图片] 获取客户联系的成员是否配置应用可见范围 [图片] 是否配置了客户联系功能权限: [图片] 可以感受到企业微信为了保护客户的隐私信息,做了很多的权限控制,有一套完善的权限体系: 应用可见范围 [图片] 应用调用 OpenApi 权限 大致的调用流程如下图所示: [图片] 坑5: 企业可信ip 当已经用正确的secrect获取到accesstoken后,接口又提示了报错: [代码]{ "errcode": 60020, "errmsg": "not allow to access from your ip, hint: [xxx], from ip: xx.xx.xx.xx,... } [代码] 需要在企业微信后台配置应用的可信ip,只有配置了可信ip,才能够调到企业微信的接口。 而在配置企业可信ip前,必须要先设置可信域名 或 设置接受消息服务器URL (即使你并不需要用到…) [图片] 设置可信域名需完成域名归属认证,即在域名根目录上传小程序校验文件 [图片] 配置完可信ip之后,终于能调通了。。。 总结 开始企业微信开发前先阅读官方文档开发指南,了解清楚基本概念、开发流程、配置方法,也便于后续阅读接口文档相关术语的理解。 开发者工具需安装企微插件用于调试部分企微api,对于工具无法模拟的场景需要真机开启多场景调试。 调用企业微信相关接口前,需仔细阅读接口的调用前提和权限说明。 调用openApi时,需要走企业微信内小程序登录流程、配置相关权限、配置企业可信ip。 不知道为啥接口调用失败可以使用错误码查询工具,在接口请求url里加上debug=1参数之后从接口返回的errmsg复制出hint值查询。
2023-09-25 - “UnionID关联”功能介绍及运营建议
产品简介:实现同一个用户在公众号、小程序、APP、官方网站等不同场景里的身份统一识别、信息同步和行为跟踪。 优势:唯一用户身份标识,打通会员信息和会员积分,打通多场景用户行为,支撑CRM和精准营销。 接入方式:需开发。 关键词:身份唯一识别、统一会员体系、CRM、精准营销。 01 UnionID机制说明 如果开发者拥有多个移动应用、网站应用、公众帐号及小程序,可通过 UnionID 来区分用户的唯一性。 因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的 UnionID 是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。 [图片] 02 典型使用场景及案例 1) 使用记录同步: 用户在多端的浏览记录、购买历史、收藏夹等信息可便捷同步,并提供个性化服务。 2)用户信息维护: 如会员卡积分、收货地址等信息,用户无需重新输入信息,降低使用成本,提升转化率。 如某服饰行业小程序,提供手机号一键快捷登录方式,可自动拉取用户在微信中的默认手机号码,避免再次填写。 [图片] 03 运营建议 1) 在必须用到登录信息的环节引导用户登录 在用户必须登录时才引导用户登录(如:购买前需要获取会员信息,用于同步积分数据),而不是用户一进入小程序就弹窗要求用户授权。如只需要在前端展示用户头像、昵称,无需要求用户授权,可直接展示。 2)清晰、准确地引导用户登录 在登录页面中,清晰、准确地告知用户当前操作是登录,说明获取登录信息的目的(如:用于同步会员积分数据等)。 3) 不强制用户必须登录后才能使用小程序服务 提供游客模式,不强制用户必须登录后才能进入小程序。如要求必须授权头像昵称等信息才能继续使用小程序,会导致某些用户放弃使用该小程序。 开发指引内容较长,建议使用电脑详细查阅。点击打开文档
2020-01-10 - 第三方消息推送插件使用指南
第三方消息推送插件使用指南 作为多端框架的开发者,我们除了可对接腾讯云的消息推送服务之外,亦可通过下方 2 种方式对接第三方的消息推送服务,本文以极光推送服务为例子。 1、自行开发多端插件进行对接;相关的插件 demo 代码已已开源,可下载参考。去下载 2、直接引用我已开发好的多端插件(插件 id 为 wxca742ba6781a54fd ),详细的使用指引可查看下方介绍。建议使用方式 1 ,因为这个插件本人并未在持续维护,所以建议自行下载源码的方式进行使用。 前置条件 需前往极光平台,开通极光消息推送服务并按照文档开通和配置相关信息 使用最新 SDK (务必是在2024.5.22之后的新版本的SDK) 一、iOS 对接指南 1. 配置插件 在微信开发者工具,前往[代码]project.miniapp.json[代码],点击右上角切换到 json 模式,然后按照将下方内容添加[代码]project.miniapp.json[代码] [代码]"mini-plugin": { "ios": [ { "open": true, "pluginId": "wxca742ba6781a54fd",// 这是插件id,不可修改 "pluginVersion": "1.0.0", "loadWhenStart": true, // 需设为true;表示为App启动即加载插件 "resourcePath": "pluginResources/wxca742ba6781a54fd.json"// 开发者需修改此处,即,需要把极光推送的key放入到json中,让插件读取注册极光SDK。路径为相对项目根路径的文件相对路径 }, ] [代码] 在小程序项目下创建pluginResources/wxca742ba6781a54fd.json,内容为如下。需要去极光推送创建。 [代码]{ "appKey": "8c6eexxxxxxxxxxxbee1",//此处需开发者修改为真正的key "channel": "App Store", "apsForProduction": false } [代码] 补充说明,以上的配置最终会用在极光的[代码]JPUSHService[代码]和[代码]setupWithOption[代码]接口.具体的值可以查看极光的接口文档。 [代码][JPUSHService setupWithOption:self.launchOptions appKey:appKey channel:channel apsForProduction:[apsForProduction boolValue] advertisingIdentifier:nil]; [代码] 更多补充:离线无法收到推送可查看https://go48pg.yuque.com/go48pg/pa41sm/wfgms8 2. iOS appex 的使用 如果有接入Notification Service Extension 的需求,需要添加如下的配置。 需要去苹果的后台申请一个新的 Bundle Id,要以主 Bundle Id 为前缀。 申请对应的开发版和分发版的 profile。然后分别配置在对应的 profilePath 和 distributeProfilePath 中 profile 的证书需要都使用主包 profile 的证书。 [代码]"mini-plugin": { "ios": [ { "open": true, "pluginId": "wxca742ba6781a54fd", "pluginVersion": "1.0.0", "loadWhenStart": true, "resourcePath": "pluginResources/wxca742ba6781a54fd.json", "appexProfiles": { "JPushNSE": { "enable": true, "bundleID": "com.xx.xx.service", "profilePath": "xxx/xxxxservice.mobileprovision",// 开发版的 profile "distributeProfilePath": "xxx/xxx/xxx.mobileprovision"// 分发版的profile } }, }, ], "android": [ ... ] } [代码] 3. js 调用 在添加插件以后,并编译到真机,就可以开始用js调用了 wx.miniapp.loadNativePlugin 加载插件,获取插件的js对象。 plugin.getCachedMsg 获取loadNativePlugin调用之前的消息。因为配置loadWhenStart 所以插件native侧其实早已初始化完毕。所以在监听回调之前的消息都被放到了缓存中。 这里只有调用了getCachedMsg,后续的消息才会往js侧发送。这里一定要先调用再监听消息。 plugin.onMiniPluginEvent 监听消息。回调的对象结构如下。 [代码]{ ios:{ type: '', data: {}, msg: '' } } [代码] type 的类型如下,具体表示的情况可以在极光文档中搜索 openSettingsForNotification willPresentNotification didReceiveNotificationResponse didReceiveRemoteNotification didFinishLaunchingWithOptions data的数据接口为 userInfo 具体的内容可以在极光文档中搜索userInfo NSDictionary * userInfo = notification.request.content.userInfo; myPlugin.registerPush 开启极光推送。调用以后就会弹出系统弹窗“xxx想要给你发送通知“。 回调返回对象。 [代码]{ "success": true, "token": "xxxx", "msg": "xxx" } [代码] myPlugin.setBadge 设置下标数字 具体调用可以参考如下 [代码]loadJIGUANGPlugin() { if (this.hasLoad) return this.hasLoad = true wx.miniapp.loadNativePlugin({ pluginId: "wxca742ba6781a54fd", success: (plugin) => { const msg = plugin.getCachedMsg(); console.log('getCachedMsg', msg) plugin.onMiniPluginEvent(this.onJiguangMsg) console.log('load plugin success', plugin) this.setData({ myPlugin: plugin }) }, fail: (e) => { console.log('load plugin fail', e) } }) }, onJiguangMsg(msg) { console.log(msg) }, onUsePlugin() { const { myPlugin } = this.data if (!myPlugin) { console.log('plugin is undefined') return } myPlugin.registerPush({}, (ret) => { console.log('registerPush ret:', ret) }) }, setBadge() { const { myPlugin } = this.data myPlugin.setBadge({ number: 10 }) }, clearBadge() { const { myPlugin } = this.data myPlugin.setBadge({ number: 0 }) }, [代码] 二、Android 对接指南 1. 配置插件 在微信开发者工具,前往[代码]project.miniapp.json[代码],点击右上角切换到 json 模式,然后按照将下方内容添加[代码]project.miniapp.json[代码] [代码]"mini-plugin": { "android": [ { "open": true, "pluginId": "wxca742ba6781a54fd",// 这是插件id,不可修改 "pluginVersion": "1.0.1" } ] } [代码] 2. 配置manifestPlaceholders 在[代码]mini-android[代码]新增一个 key[代码]manifestPlaceholders[代码],参考以下填写 请注意,插件目前集成了以下厂商:小米,oppo,vivo,荣耀,参数请参考极光的厂商通道参数申请指南 如果不需要厂商推送,则下面的对应厂商 key 保持默认的即可(请勿删除 key) [代码] "mini-android": { "manifestPlaceholders": { "JPUSH_PKGNAME": "你的包名", "JPUSH_APPKEY": "你的 appkey", "JPUSH_CHANNEL": "developer-default", "XIAOMI_APPKEY" : "MI-您的应用对应的小米的APPKEY", "XIAOMI_APPID" : "MI-您的应用对应的小米的APPID", "OPPO_APPKEY" : "OP-您的应用对应的OPPO的APPKEY", "OPPO_APPID" : "OP-您的应用对应的OPPO的APPID", "OPPO_APPSECRET": "OP-您的应用对应的OPPO的APPSECRET", "VIVO_APPKEY" : "您的应用对应的VIVO的APPKEY", "VIVO_APPID" : "您的应用对应的VIVO的APPID", "HONOR_APPID" : "您的应用对应的Honor的APP ID" } } [代码] 3. js调用 在添加插件以后,并编译到真机,就可以开始用js调用了 wx.miniapp.loadNativePlugin 加载插件,获取插件的js对象。 plugin.onMiniPluginEvent 监听消息。回调的对象结构如下。 [代码]{ android:{ type: '', data: {}, msg: '' } } [代码] 目前只有安卓type 只有[代码]onNotifyMessageArrived[代码](消息到达时) myPlugin.registerPush 开启极光推送。 targetsdkversion 33 及以上会需要系统授权。 回调返回对象。 [代码]{ "success": true, "token": "xxxx", "msg": "xxx" } [代码] 具体调用可以参考如下 [代码] loadJIGUANGPlugin() { const listener1 = (param) => { console.log('onMiniPluginEvent listener1', param) } // 注意,实际使用的时候,如果用户曾经同意过需要在 app.js/onLaunch 的时候注册 wx.miniapp.loadNativePlugin({ pluginId: miniAppPluginId, success: (plugin) => { console.log('load plugin success', plugin) const myPlugin = plugin this.setData({ myPlugin: plugin }) myPlugin.onMiniPluginEvent(listener1) // 注册 myPlugin.registerPush({}, (ret) => { console.log('myAsyncFuncwithCallback ret:', ret) }) }, fail: (e) => { console.log('load plugin fail', e) } }) }, [代码] 4. 监听用户点击消息 极光控制台发送消息时,配置 Android点击通知打开选择[代码]DeepLink[代码],也就是[代码]scheme[代码] [图片] 在 js 侧使用wx.miniapp.registOpenURL监听
2024-12-23 - 微信小程序中一次性消息订阅次数问题?
用体验版测试发现,在微信小程序中,通过wx.requestSubscribeMessage让用户订阅同一个一次性消息多次,则可以给用户发送和订阅次数相同数量的消息,请问目前的微信小程序一次性消息订阅的规则是这样的吗?官方文档中哪里有具体说明?我还没有找到。此外,如果目前规则确实如此,有什么接口可以查到当前用户订阅一次性消息的次数,即在不超过系统阈值的前提下,还可以给用户传送多少次一次性消息?
2024-04-25 - 【社交-笔记、社交-社区/论坛、社交-问答】类目修改指引说明
一、社交类服务,你需要了解: 1、审核流程: [图片] 2、内容安全审核机制: 小程序社交内容发布功能在进行内容安全验证时,若存在信息安全风险,需要尽快完善内容机制:①确保已接入内容安全API并要求所调用API可在小程序内任意发布的场景生效;②小程序内检测结果安全说明仅需提示用户所发布内容含违规信息即可;接口调用可参考:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/sec-check/security.msgSecCheck.html 二、【社交-笔记】、【社交-社区/论坛】和【社交-问答】案例解析: 1、【社交-笔记】:小程序服务内容涉及提供用户自行生成内容(文字、图片、音/视频)的记录、分享 整改建议(2选1): ①补充选择:【社交-笔记】类目 注意事项:该类目补充后首次提审需进入属地主管部门二次审核流程(报备详情),时长为7天,开发者需提前规划好提审时间 ②移除社交笔记相关功能,包括但不限于移除前端、后台代码中所存在的社交功能、社交标签等 【示例】 [图片] 2、【社交-社区/论坛】:小程序服务内容涉及提供用户自行生成内容的发布/分享/交流服务,或含【社区】等tab 整改建议(2选1): ①补充选择:【社交-社区/论坛】类目 注意事项:该类目补充后首次提审需进入属地主管部门二次审核流程(报备详情),时长为7天,开发者需提前规划好提审时间 ②移除社交论坛相关功能,包括但不限于移除前端、后台代码中所存在的社交功能、社区tab等 【示例1】:小程序涉及提供用户自行生成内容的发布/分享/交流服务,需补充选择:社交-社区/论坛类目。 [图片] 【示例2】:小程序涉及建群、拉群,需补充:社交-社区/论坛类目。 [图片] 3、【社交-问答】:涉及提供问答服务 整改建议(2选1): ①补充选择:【社交-问答】类目 注意事项:该类目补充后首次提审需进入属地主管部门二次审核流程(报备详情),时长为7天,开发者需提前规划好提审时间 ②移除社交问答功能,包括但不限于移除前端、后台代码中所存在的问答功能、社交标签等 【示例】 [图片] 附:类目所需资质 [图片] 这是一份动态更新的文档,辅助开发者提前了解社交相关的业务形态所需申请的类目,避免开发者因类目不符审核失败或因不了解涉上述类目需二次审核流程时长导致无法按期发布上线,开发者如有其他疑问,可以通过目前开放的咨询渠道反馈: 1、微信开放社区-交流专区-小程序发帖咨询-提出问题-运营相关问题 2、驳回站内信通知-客服咨询入口(MP代码审核客服入口正处于灰度开放中,若未获得灰度测试入口,开发者可前往社区发帖咨询) 我们会根据新出现的问题、相关法律法规更新或产品运营的需要及时对其内容进行修改并更新,制定新的规则,保证微信用户的体验。建议开发者反复查看以便获得最新信息,定期了解更新情况
2022-03-18 - “2024版微信小店”接入说明、指引及小程序相关开发接入指南(更新2025年4月28日,小程序内嵌微信小店优惠券)
写在最前面 之前曾写过“自定义交易组件相关接入指引”,广受好评,解决了很多开发者接入时遇到的问题,当然,其中也不乏一些喂不饱的白眼狼,得到便利还反咬一口,无耻至极,内容如有错误请指正,请文明交流! 本文会尽可能跟随官方功能迭代而更新内容 有问题可以跟帖回复,尽可能的给你解决(解决不了也没办法🤷♀️) 良言一句三冬暖,恶语伤人六月寒。 腾讯在2024年8月12日发布公告:腾讯计划自08月25日起,正式支持商家将视频号小店升级成微信小店。公告原文->点我查看 本文主要介绍24版的“微信小店”的升级内容及对接过程中各流程的注意事项与易错点(暂不包含新店开店流程),文档篇幅较长,如无需查看完整文档可以使用浏览器自带页面搜索功能进行关键字搜索(快捷键Ctrl+F )。 本文更新日志(后续会对本文变动内容进行标注) 2024.12.13 更新支持小程序跳转小店订单详情 2024.12.04 更新商品卡片样式自定义 2024.09.06 更新微信小店关联账号数量新规则 2024.08.27 小程序内嵌入商品跟佣问题修复 2024.08.26 更新客服、小程序内嵌入商品跟佣相关内容 2024.08.25 本文发布 1、“原视频号小店”升级“24版微信小店”后新增内容: 1.1 店铺管理新增“主页管理”入口 升级“微信小店”后,在管理后台->店铺管理会新增一个“主页管理”,相当于店铺有了一个首页,目前支持配置精选展示位、商品商品分类、主页背景图以及推荐商品排序 “小店”主页商品排序 调整店铺主页销售中商品的默认展示顺序,可以按照序号排序,数字越小越靠前;同时也支持对单个商品进行置顶或隐藏(图一为后台操作排序,图二圈中部分为对应排序展示) [图片] [图片] 注意事项及其他说明 最多可以置顶50个商品 后序置顶商品会在前序置顶前展示 “小店”主页商品分类 可以在主页创建分类并关联商品,当前支持2级分类 [图片] 注意事项及其他说明 1)分类目前只支持上移/下移排序,暂不支持置顶操作 2)单个分类不能超过10个汉字,支持emoji(这个好评) 3)一二级分类暂未测试到数量上限,不过不建议单个一级分类下配置二级分类过多,有可能会影响其他分类展示,尤其是该分类在第一位的时候 4)分类名称会有内容审核,敏感词及平台不允许发布的内容无法进行创建 5)一个商品是支持挂在多个分类下 主页背景图 可配置一张主页背景图,会按16:9比例展示在主页顶部(自己店铺上传的还在审核,先放官方示意图) [图片] 注意事项及其他说明 1)图片仅支持JPEG、JPG、PNG、BMP格式,大小不超过10M 2)背景图片需审核,带二维码、违反公序良序及其他违反法律法规的内容会被驳回 精选展示位 在主页店铺信息下展示推荐内容,目前支持配置展示商品、指定视频号视频、单篇公众号内容三种内容,样式目前只有大图和小图两种展示方式。 用户端展示商品内容示例-小图模式: [图片] 用户端展示视频号内容示例-小图模式 [图片] 用户端展示公众号内容示例-小图模式 [图片] 用户端展示商品内容示例-大图模式 [图片] 用户端展示视频号内容示例-大图模式 [图片] 用户端展示公众号内容示例-大图模式 [图片] 注意事项及其他说明 1)图片仅支持JPEG、JPG、PNG、BMP格式,测试图片可以超过10M(后续是否会改不清楚,不过图片过大加载是真的慢) 2)展示内容会根据展示内容拉取对应商品首图、视频号视频封面以及公众号文章封面,也可以自行上传图片,这里需要注意的点是即使你的图片在商品可以过审核,但在主页推荐不一定能过审核,两者审核尺度不同 3)小图模式至少配置3个展示位才可以保存,而大图模式配置1个展示位就可以,最多允许配置5个展示位 4)商品仅支持配置自己店铺内商品,视频号内容支持配置任意视频号博主任意公开视频,公众号内容支持选择任意公众号任意公开内容 5)无论大图模式还是小图模式,目前仅支持配置1:1的图片,后续是否优化暂不可知 1.2 客服由企业微信客服切换为小店客服 类似原小程序客服,可通过网页和手机端接收、处理客户咨询。目前已支持查询咨询客户下单信息,向咨询用户发送商品、订单消息,配置快捷短语等,基础功能可以满足大部分用户需求,终于可以不用再去付费买三方客服应用了,这个要👍。 注:这里截图不放自己店铺了,涉及用户隐私太多,图示为官方示意图 1.2 PC端: [图片] 1.2 移动端: [图片] 注意事项及其他说明 客服功能存量商户升级指引"->点我查看"(需升级为微信小店后操作) 1.3 新增店铺关联账号 关联账号可以直接售卖小店内的商品,目前支持关联5个视频号与5个公众号,分别可设置1个对外展示账号。 对外展示账号样式-示例图(目前不会显示视频号、公众号名称,只有入口) [图片] 注意事项及其他说明 1)对外展示账号可以进行修改,每种对外展示类型账号每年3次修改机会。 2)配置关联账号后,该账号可在视频号带货中心>橱窗管理中管理带货商品 3)关联账号详细说明及要求:“->点我查看” 4)如果在电脑上打开了客服网页版且在活跃中,当前手机上是不会重复接收到消息推送,预计9月份会有客服PC端和手机APP推出 5)若微信小店店铺开店满30天,且近30天内DSR均大于等于4.6分,关联账号数量可提升至视频号和公众号各10个。(2024.09.06更新) 2、小程序侧新增能力 2.1 小程序支持内嵌微信小店首页,展示小店首页,并进行跳转交易 store-home 开发文档地址:->点我直达 小程序嵌入微信小店首页组件样式 [图片] 注意事项及其他说明 1)基础库需要3.5.5,否则真机调试不显示,可以在开发者工具选择3.5.5版本进行推送 [图片] 2)支持任意升级微信小店后的任意微信小店APPID 3)内嵌入微信小店首页时会有一个“小店”文字显示在下方,可以通过下述方式屏蔽, .wx_store_home .wx_store_home_img_desc { display: none; } 4)第3点中的代码同时也支持屏蔽组件其他类型信息 wx_store_home_info wx_store_home_img_box wx_store_home_info_logo wx_store_home_img_box wx_store_home_info_title wx_store_home_info_title_text wx_store_home_info_history 2.2 小程序内嵌微信小店商品,展示小店商品,并进行跳转交易且支持小店优选联盟带货跟佣功能。 store-product 开发文档地址:->点我直达 小程序内嵌微信小店商品组件样式 [图片] 2024.12.04 新增支持自定义样式 custom-style ,支持自定义的样式有 键名 说明 允许自定义的属性 card 卡片样式 background-color title 标题样式 color price 价格样式 color buy-button 购买按钮样式 width、border-radius、color、background-color buy-button-disabled 购买按钮禁用态样式 width、border-radius、color、background-color 示例图: [图片] 注意事项及其他说明 1)基础库需要3.5.5,否则真机调试不显示 2)支持任意升级微信小店后的任意微信小店商品ID,这里需要使用微信小店商品id,不支持商户自定义商品ID 3)如果商品违规下架,内嵌商品会直接显示商品违规下架 4)商品组件也可以参考店铺主页代码,屏蔽对应组件内容信息 5)跟佣还未测试,稍后补充 2.2.1 小程序内嵌微信小店商品优选联盟带货跟佣 2024.08.26 14:00:00 目前带货跟佣测试不通,视频号助手API接口实际请求返回无“product_promotion_link”参数,接口返回参数“promotion_key”值类似“product_promotion_link”,疑似为“product_promotion_link”信息。 在小程序前端测试中,store-product组件包含“product_promotion_link”参数时,无法展示对应小店商品,改为“promotion_key”可以正常显示。 目前测试来看小程序侧并不会校验跟佣信息是否正确,建议自己开发测试时一定要慎重一下此处… 2024.08.27 17:30:00 跟佣测试成功,视频号助手API接口实际请求返回无“product_promotion_link”参数,接口返回参数“promotion_key”即为store-product组件的product_promotion_link参数。 注意:文档写的是product-promotion-link,实际应为product_promotion_link,如果使用product-promotion-link,在前端是不会展示对应商品的。 2.3 小程序跳转小店订单详情 wx.openStoreOrderDetail() 开发文档地址:->点我直达 测试暂未发现什么异常 2.4 小程序内嵌微信小店优惠券,展示小店优惠券,并进行跳转领取 store-coupon 开发文档地址:->点我直达 截图为默认样式 [图片] 支持自定义样式 custom-style,支持自定义的样式有 键名 说明 允许自定义的属性 card 卡片样式 background-color、width discount-fee 折扣金额样式 color coupon-type 优惠券类型样式 color condition-text 条件样式 color valid-time 有效时间样式 color coupon-button 按钮样式 border-radius、color、background-color coupon-text-disabled 优惠券状态样式 color 注意事项及其他说明 1)基础库需要3.8.3,否则真机调试不显示 2)coupon-id为后台或者API获取的优惠券ID,而不是文档写的“商品id” 3)目前只支持跳转领取,不支持API发放 3、搜一搜新增“小店”分类 截止文章更新,目前只支持根据关键词搜索到店铺,暂不支持搜索到商品 [图片] 持续更新中…
04-28 - 【纯小白】走通云托管本地调试开发的过程,持续补充~
window环境下,看微软巨硬的文档安装docker desktop~ https://learn.microsoft.com/zh-cn/windows/wsl/tutorials/wsl-containers -------------------------------------------------------------- 使用云托管在本地调试的具体操作问题与解决。如果你在使用云托管本地调试开发,面对同样的问题时,希望可用帮到你! 操作系统: WINDOW 10 项目模板:koa C盘至少留个5 G空间 前置工具准备: 安装vscode 、weixin-cloudbase 插件、node 12+、npm安装docker 众所周知 官方文档链接docker网站你是打不开的,除非... !哈哈, 需要找网上找找安装一下Docker desktop 拉取官方koa 服务版本,或者手动下载代码到文件夹,如果你打不开github , 可用安装一个win应用 Watt Toolkit 里面有免费的github 加速!安装微信云托管CLI 工具包 https://cloud.weixin.qq.com/cli/basics.html,运行迁移到云托管指令,并可用使用deploy 自动部署到云托管如果本地调试需要多个服务时,按照官方文档提示的需要打开配置文件所在的同层目录,例如我的: [图片] 我这里顶层目录wxcloud, 同层添加项目配置文件,里面指定当前需要运行的调试项目;services 目录里可以有多个服务项目文件夹! [图片] user 文件夹 - 是我拷贝的官方koa 服务模板,你可以在同层添加自己的CLI项目,运行前需要更改project.config.json 内的指定名称! 好了,走到这里是一堆的枯燥安装等待时间... 下面,开始整活! 一、Docker desktop 更换国内可用源! 打开docker desktop ----》 设置 ---------》Docker engine 配置文件中,添加: "registry-mirrors": [ "https://hub.uuuadc.top", "https://docker.anyhub.us.kg", "https://dockerhub.jobcher.com", "https://dockerhub.icu", "https://docker.ckyl.me", "https://docker.awsl9527.cn" ] 别找其他的啦,什么网易的、docker cn的源运行后都会报错!以上源配置后可用! 二、按照官方文档配置weixin cloudbase 插件属性,主要2个: appid 和 密匙(按照官方教程在云托管控制台 生成) 三、修改调试配置文件, 在根目录下.cloudbase\container\debug.json 中,添加数据库环境变量值! 否则,运行调试项目,会提示:sequelize 数据库连接不了,访问的地址是127.0.0.0 四、运行调试项目前,先启动VPC代理数据库服务: [图片] 如果用到wx 开放接口,同样需要开启相关代理。 五、启动Local container容器服务 经过好多秒后,启动成功!可以在终端看到: [图片] 一些熟悉的sequelize 执行的脚本,最后启动成功 监听80端口! 同样,docker desktop内也可以看到容器已启动: [图片] 这时,就可以容器右键,浏览器中打开,no wx auth [图片] 最终的效果, [图片] 这一刻!真舒服,折腾了一下午。测试点击 按钮【计数】,终端看处理, [图片] 请求正常完成!云托管控制台-MYSQL- 数据库管理, 打开DMC 登录自己的数据库,查看数据有变更~ 🤭
2024-07-09 - 使用 wx.cloud.callContainer 访问本地docker容器 的问题
先总结: 环境id要填线上环境id。 X-WX-SERVICE要填weixin cloudbase containers里的要调用的容器名称callContainer请求服务时,如果第一次请求服务报错了比如404之类的错误,接着用callContainer请求同一个接口,callContainer不会发起请求,而是给小程序前端直接返回 INVALID_PATH 的错误码和serviceName not exit的错误消息。在callContainer里加上apiVersion:2 的参数可以规避2次及以上的重复调用直接报INVALID_PATH的问题官方文档 https://developers.weixin.qq.com/miniprogram/dev/wxcloudrun/src/guide/debug/ 昨天callcontainer调本地的docker服务时,一直有问题调不通。最后排查出问题: 1.官方文档只提到X-WX-SERVICE要与容器名相同,一开始试了wx-cloudbase里的容器名称,发现有问题,一直报INVALID-PATH,envdbid无效,以为是X-WX-SERVICE填错了。 [图片] 后面改成docker ps 里names的名字,还是报错 [图片] 于是还想是不是环境id有问题。试了各种环境id等。 今天从官方微信群得知环境id是要填 云托管里的 线上环境id的,于是后试了下X-WX-SERVICE用wx-cloudbase的容器名称,这次发现第一次callcontainer调用本地容器日志显示是接受到请求的,但是后面又没有请求记录了。感觉这里面有问题。重新加载模拟器,又复现了问题。原来是callcontainer请求的接口,服务报了错误后,继续调用同一个接口时,callcontainer不会再向服务发送请求了,而是直接给小程序报”INVALID_PATH“的错误码,也是这个原因让我一直以为是X-WX-SERVICE填错了。 后面把参数改正确,就可以正常调用了 [图片]
2022-03-17 - 想做一个行业相关付费知识类的小程序,包括音视频,企业需要什么资质?
想做一个行业相关付费知识类的小程序,包括音视频,企业需要什么资质?
2023-05-10 - 小程序登录、用户信息相关接口调整说明
公告更新时间:2021年04月15日考虑到近期开发者对小程序登录、用户信息相关接口调整的相关反馈,为优化开发者调整接口的体验,回收wx.getUserInfo接口可获取用户授权的个人信息能力的截止时间由2021年4月13日调整至2021年4月28日24时。为优化用户的使用体验,平台将进行以下调整: 2021年2月23日起,若小程序已在微信开放平台进行绑定,则通过wx.login接口获取的登录凭证可直接换取unionID2021年4月28日24时后发布的小程序新版本,无法通过wx.getUserInfo与<button open-type="getUserInfo"/>获取用户个人信息(头像、昵称、性别与地区),将直接获取匿名数据(包括userInfo与encryptedData中的用户个人信息),获取加密后的openID与unionID数据的能力不做调整。此前发布的小程序版本不受影响,但如果要进行版本更新则需要进行适配。新增getUserProfile接口(基础库2.10.4版本开始支持),可获取用户头像、昵称、性别及地区信息,开发者每次通过该接口获取用户个人信息均需用户确认。具体接口文档:《getUserProfile接口文档》由于getUserProfile接口从2.10.4版本基础库开始支持(覆盖微信7.0.9以上版本),考虑到开发者在低版本中有获取用户头像昵称的诉求,对于未支持getUserProfile的情况下,开发者可继续使用getUserInfo能力。开发者可参考getUserProfile接口文档中的示例代码进行适配。请使用了wx.getUserInfo接口或<button open-type="getUserInfo"/>的开发者尽快适配。开发者工具1.05.2103022版本开始支持getUserProfile接口调试,开发者可下载该版本进行改造。 小游戏不受本次调整影响。 一、调整背景很多开发者在打开小程序时就通过组件方式唤起getUserInfo弹窗,如果用户点击拒绝,无法使用小程序,这种做法打断了用户正常使用小程序的流程,同时也不利于小程序获取新用户。 二、调整说明通过wx.login接口获取的登录凭证可直接换取unionID 若小程序已在微信开放平台进行绑定,原wx.login接口获取的登录凭证若需换取unionID需满足以下条件: 如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用2月23日后,开发者调用wx.login获取的登录凭证可以直接换取unionID,无需满足以上条件。 回收wx.getUserInfo接口可获取用户个人信息能力 4月28日24时后发布的新版本小程序,开发者调用wx.getUserInfo或<button open-type="getUserInfo"/>将不再弹出弹窗,直接返回匿名的用户个人信息,获取加密后的openID、unionID数据的能力不做调整。 具体变化如下表: [图片] 即wx.getUserInfo接口的返回参数不变,但开发者获取的userInfo为匿名信息。 [图片] 此外,针对scope.userInfo将做如下调整: 若开发者调用wx.authorize接口请求scope.userInfo授权,用户侧不会触发授权弹框,直接返回授权成功若开发者调用wx.getSetting接口请求用户的授权状态,会直接读取到scope.userInfo为true新增getUserProfile接口 若开发者需要获取用户的个人信息(头像、昵称、性别与地区),可以通过wx.getUserProfile接口进行获取,该接口从基础库2.10.4版本开始支持,该接口只返回用户个人信息,不包含用户身份标识符。该接口中desc属性(声明获取用户个人信息后的用途)后续会展示在弹窗中,请开发者谨慎填写。开发者每次通过该接口获取用户个人信息均需用户确认,请开发者妥善保管用户快速填写的头像昵称,避免重复弹窗。 插件用户信息功能页 插件申请获取用户头像昵称与用户身份标识符仍保留功能页的形式,不作调整。用户在用户信息功能页中授权之后,插件就可以直接调用 wx.login 和 wx.getUserInfo 。 三、最佳实践调整后,开发者如需获取用户身份标识符只需要调用wx.login接口即可。 开发者若需要在界面中展示用户的头像昵称信息,可以通过<open-data>组件进行渲染,该组件无需用户确认,可以在界面中直接展示。 在部分场景(如社交类小程序)中,开发者需要在获取用户的头像昵称信息,可调用wx.getUserProfile接口,开发者每次通过该接口均需用户确认,请开发者妥善处理调用接口的时机,避免过度弹出弹窗骚扰用户。 微信团队 2021年4月15日
2021-04-15 - 服务号订阅通知灰度测试
服务号模板消息能力的设计初衷,旨在帮助开发者实现及时通知,但存在一些问题,如: 1. 部分开发者在用户无预期的情况下,发送与用户无关的信息,对用户造成了骚扰。 2. 模板消息是用户触发后的通知消息,不支持营销类消息,不能满足部分业务需求。 为提升微信用户体验,我们开始灰度测试服务号订阅通知功能。 能力说明 开发者可在服务号图文消息、网页等场景设置订阅功能,用户自主订阅后,开发者可按需求下发一条对应的订阅通知。 [图片] 用户可在图文订阅通知 [图片] 用户可在网页订阅通知 灰度测试计划 服务号订阅通知功能即日上线,已认证的境内主体服务号可前往 MP 后台开通使用,详见说明。 1. 服务号订阅通知灰度测试期自2021年1月27日0:00至4月30日24:00,期间服务号模板消息可正常使用;灰度测试期结束后服务号订阅通知的策略将另行公布,届时以官方信息为准; 2. 开发者使用订阅通知功能时,需遵循运营规范,不可用奖励或其它形式强制用户订阅,不可下发与用户预期不符或违反国家法律法规的内容。具体可参考文档:《微信公众平台运营规范》 微信团队 2021年1月27日
2021-01-29 - 2020小程序云开发技术峰会——重新定义开发
[图片] [图片]
2020-11-18