个人案例
- “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、搜一搜新增“小店”分类 截止文章更新,目前只支持根据关键词搜索到店铺,暂不支持搜索到商品 [图片] 持续更新中…
22小时前 - 开发工具基础库3.5.7页面使用openDocument后返回页面报错
[aiad error] unexpected page benchmark path: packageA/pages/chapter/attachments.html(env: Windows,mp,1.06.2407110; lib: 3.5.8) 开发工具调用openDocument成功在外部浏览器打开pdf文档,然后返回工具点击左上角返回上一页必报当前错误,并且无具体错误原因,经排查只有3.5.7和3.5.8会出现这个问题,3.5.6正常无错误 [图片]
2024-09-20 - iOS微信小程序虚拟支付解决方案
众所周知,在IOS微信小程序不支持虚拟支付,一直是困扰IOS开发者、运营最头疼的问题,主要原因是苹果不允许IOS微信上架这类产品。导致微信小程序的开发者在IOS上都不能支付虚拟商品,虚拟商品包含了虚拟课程、会员、虚拟书等。 那么针对这个问题,有什么解决方案呢?今天就这个问题,来分享一下关于个人在这方面的一点经验。 做虚拟开发支付,要弄明白为什么微信小程序不支持iOS进行虚拟支付,所谓的虚拟支付又是指的什么? 第一个问题很简单,如果微信小程序支持iOS虚拟支付,就会绕过苹果商店的应用支付方式,在苹果商店下载的APP进行支付,苹果商店会扣除一部分费用的,这样苹果就减少了一部分收入,这也是iOS系统中一个明确规定的条款。 第二个问题,虚拟支付是指包括银行卡支付、电话卡预付费、信用卡支付、网上支付、手机支付等各种非现金的支付方式。 对于知识付费的博主、知识店铺和企业影响来说,不支持iOS虚拟支付,自然就影响了收入。毕竟微信用户中iOS用户群体占比还是非常大的。 要规避这个问题,很多应用的解决方案是: 1、提供应用官方充值(支付)渠道,例如需要充值时,跳转到官网的充值网站,购买消费时,直接从个人的钱包中进行扣除。 [图片] 2、通过微信小程序客服助手,当用户进行支付时,默认跳转到客服助手聊天界面,系统会默认给用户发送一个支付链接,这种链接是一个公众号,或者是一个H5的链接。用户点击链接就可以正常下单,实则上和第一种方案是一样的逻辑。 [图片] 3、微信扫码支付,当用户进行支付时,直接弹出支付二维码,让用户扫码支付。这种逻辑仍然是一个H5的链接方式。
2024-11-28 - wx.authorize授权弹框总是比隐私弹框先弹起来,怎么办?
隐私组件内部已经使用了 lifetimes: { attached: function () { const closePopUp = () => { this.disPopUp() } privacyHandler = resolve => { privacyResolves.add(resolve) this.popUp() // 额外逻辑:当前页面的隐私弹窗弹起的时候,关掉其他页面的隐私弹窗 closeOtherPagePopUp(closePopUp) } closeOtherPagePopUpHooks.add(closePopUp) this.closePopUp = closePopUp }, detached: function () { closeOtherPagePopUpHooks.delete(this.closePopUp) } }, wx.authorize 永远比隐私弹框先弹出来,有遇到问题的吗?
2023-08-24 - 文娱-其他视频和文娱-视频广场指引说明
代码审核环节,将会对小程序运营的内容与所选类目是否相符进行核实,当小程序涉及视频播放、观看等服务,需要补充“文娱-其他视频”或“文娱-视频广场”类目或通过接入视频类目插件合规提审,否则代码审核环节将面临因类目不符被驳回情形。 一、视频类服务,你需要了解: [图片] 二、「其他视频」与「视频广场」案例解析: 1、【文娱-视频广场】:以视频为唯一载体展示的,集合多种类型视频内容 整改建议(2选1): (1)补充选择:【文娱-视频广场】类目 注意事项:该类目补充后首次提审需进入属地主管部门二次审核流程(报备详情),时长为7天,开发者需提前规划好提审时间 (2)移除视频播放、观看功能服务,包括但不限于移除前端、后台代码中所存在视频内容、分类标签等 【具体案例】 [图片] 2、【文娱-其他视频】:除视频外还有其他类型的信息展示形式,如下面案例,除“视频”外还有其他的资讯内容展示 整改建议(2选1): (1)补充【文娱-其他视频】类目或通过接入【文娱-其他视频】插件(插件详情);影视剧类型视频播放暂不支持使用插件视频, 附:插件添加流程:登录MP平台「设置-第三方设置-插件-添加插件-搜索视频插件」 注意事项:文娱-其他视频补充后首次提审需进入属地主管部门二次审核流程(报备详情),时长为7天,开发者需提前规划好提审时间 (2)移除视频功能服务内容,包括但不限于前端展示、后台代码移除视频内容、分类标签等 【具体案例】 [图片] 附:类目所需资质 [图片] 这是一份动态更新的文档,辅助开发者提前了解视频业务形态所需申请的类目,避免开发者因类目不符审核失败或因不了解涉上述类目需二次审核流程时长导致无法按期发布上线,开发者如有其他疑问,可以通过目前开放的咨询渠道反馈: 1、微信开放社区-交流专区-小程序发帖咨询-提出问题-运营相关问题 2、驳回站内信通知-客服咨询入口(MP代码审核客服入口正处于灰度开放中,若未获得灰度测试入口,开发者可前往社区发帖咨询) 我们会根据新出现的问题、相关法律法规更新或产品运营的需要及时对其内容进行修改并更新,制定新的规则,保证微信用户的体验。建议开发者反复查看以便获得最新信息,定期了解更新情况。
2022-05-18 - setData 如何强制刷新 image 的url?
后台服务端对每一个客服头像的保存都是唯一一个名字,如果用户修改头像,同一个客户后端返回的是一样的Url,这个时候怎样强制刷新界面的image显示新的图片?
2022-08-13 - getUserRiskRank 请求参数维护不正确,没法在服务端调用
https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/safety-control-capability/riskControl.getUserRiskRank.html [图片][图片] 请求示例的参数 和 请求参数里面维护的字段不一致 ,而且不管使用哪一个都会提示47001 数据格式不正确
2022-05-17 - 安全风控接口机刷用户openid返回61010如何解决?
https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/safety-control-capability/riskControl.getUserRiskRank.html 我们小程序投票后台记录的用户信息 很明显是机刷行为,这些机刷用户风控接口都返回61010(其他正常投票用户返回等级是没有问题的,返回的都是0或者1),目前自行测试是微信电脑端直接打开小程序投票会返回61010,如果用手机微信打开小程序后,在用电脑端微信投票会正常返回安全等级0; 接口采用实时调用,并且用户授权后才可以投票,小程序已经开通安全风控接口权限,请问哪里可能出问题? [图片] 【2023-01-13 00:57:46】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0a-1f790c0f-68c91d29', ) 【2023-01-13 00:57:46】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0a-24e51b45-30b3c8ea', ) 【2023-01-13 00:57:46】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0a-116a6c79-67c48d5c', ) 【2023-01-13 00:57:46】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0a-59f8ce26-5d15f1ab', ) 【2023-01-13 00:57:46】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0a-0dc1fe8d-2bd87ff5', ) 【2023-01-13 00:57:46】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0a-73c2a7f0-26bc32cd', ) 【2023-01-13 00:57:46】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0a-10096150-67afdb65', ) 【2023-01-13 00:57:46】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0a-0e338a0b-3fc1a3d5', ) 【2023-01-13 00:57:47】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0a-7fc83980-6a94c032', ) 【2023-01-13 00:57:47】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0b-6f34ad56-1aabe443', ) 【2023-01-13 00:57:47】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0b-001fd919-65838f4f', ) 【2023-01-13 00:57:47】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0b-216be5ad-4a4d759c', ) 【2023-01-13 00:57:47】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0b-144dd6ea-171d810c', ) 【2023-01-13 00:57:47】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0b-79b55193-7ad0a0c2', ) 【2023-01-13 00:57:47】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0b-34138537-04c27e61', ) 【2023-01-13 00:57:47】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0b-51409701-2958429a', ) 【2023-01-13 00:57:47】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0b-6c7476ac-52ad97dd', ) 【2023-01-13 00:57:47】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0b-701c0b41-046d21a4', ) 【2023-01-13 00:57:47】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0b-058e043c-29a9c996', ) 【2023-01-13 00:57:47】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0b-3add8f07-151f5a2e', ) 【2023-01-13 00:57:47】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0b-10f15ad3-4969a029', ) 【2023-01-13 00:57:48】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0b-5cf9a9cc-24962ea7', ) 【2023-01-13 00:57:48】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0b-3a065cb7-52e3d904', ) 【2023-01-13 00:57:48】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0b-2f38ea0a-20978423', ) 【2023-01-13 00:57:48】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0b-71e2ff05-64b3eec9', ) 【2023-01-13 00:57:48】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0c-65b4af7e-5f4ea67c', ) 【2023-01-13 00:57:48】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0c-27a5a650-597af626', ) 【2023-01-13 00:57:48】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0c-4a93a012-04464b7b', ) 【2023-01-13 00:57:48】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0c-7e73d89a-36bba02d', ) 【2023-01-13 00:57:48】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0c-4be913b9-07e0bc36', ) 【2023-01-13 00:57:48】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0c-3f034b55-15bf47ae', ) 【2023-01-13 00:57:48】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0c-3e3fd7a2-7e2a1cd7', ) 【2023-01-13 00:57:48】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0c-1006a8ef-25e742a8', ) 【2023-01-13 00:57:48】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0c-19529f3a-08fb101b', ) 【2023-01-13 00:57:48】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0c-2e422ace-7846aaba', ) 【2023-01-13 00:57:48】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0c-5d3831b5-66e9b7fe', ) 【2023-01-13 00:57:49】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0c-099f95e1-464cf4ff', ) 【2023-01-13 00:57:49】: array ( 'errcode' => 61010, 'errmsg' => 'code is expired rid: 63c03c0c-7bb27d9f-4c3920df', )
2023-01-13 - 现金红包与企业付款到零钱有什么区别?
功能概述 现金红包现金红包是一款定向资金发放的营销工具,支持接口发放、上传openid文件发放、配置营销规则“满额送”发放三种方式,用户在客户端领取到红包之后,所得金额进入微信钱包,可用于转账、支付或提取到银行卡。商户可以使用现金红包应用于商品促销、抽奖、企业内部福利、渠道分润等场景。 企业付款到零钱企业付款提供由商户直接付钱至用户微信零钱的能力,支持平台操作及接口调用两种方式。具有免费、快速到账、灵活、安全等优点。商户可以使用企业付款应用于费用报销、员工福利、用户奖励 金额设定规则[图片] [图片] 用户微信端触达区别现金红包触达形式现金红包以“服务通知”中的“模板消息”触达用户,用户需要点击领取,红包才会到达用户的微信零钱包,若24小时内未领取,红包将原路退回,活动名称、商家名称、祝福语字段可自定义修改,模板消息中的logo和名称(品牌推广助手)默认显示商户号关联的公众号昵称和头像。 [图片] [图片] 企业付款到零钱触达形式企业付款到零钱以“微信支付”通知触达用户,资金直接发放到用户的微信零钱包,付款备注可自定义,付款商家默认显示商户号对应的主体名称。 [图片] 欢迎评论区互动哦~ 若对您有帮助,可以给一个赞和关注鼓励么。
2022-11-05 - 【官方教程】利用SourceMap解析JS Error报错信息
一、背景 由于小程序源码是经过编译、打包等工程化转换后运行在微信环境中的,小程序云测服务 在跑测中检测到的JS Error报错信息时,只能给出实际运行时的代码信息,而非小程序开发代码,开发者排查和定位错误原因非常不方便。 以下图为例:堆栈第①行和第②行,出现[代码]app-services.js:行号,列号[代码]这种信息,表示这两行堆栈起源于业务代码错误,但仅根据这两行运行时错误信息无法定位到源码位置的,这时需要用 SourceMap文件 进行反解,才能定位到源码信息。 [图片] 二、获取小程序SourceMap文件 在获取SourceMap文件之前,需要明确以下注意事项: 云测服务提测的开发中版本出现的JSError无法解析。开发中版本实际上使用miniprogram-ci预览能力生成的版本,此时无法获取SourceMap文件,故无法解析代码堆栈若小程序源码没有任何变化,重新编译(上传)小程序后生成的SourceMap文件不会变化。所以在小程序设置体验版,或发布上线的操作,也不会改变SourceMap小程序SourceMap可以从以下途径获取 1、线上版本小程序,可以直接从微信公众平台后台下载SourMap文件 前往 We分析 登录后,进入左侧菜单栏[代码]性能分析/ JS分析[代码] ,点击下载线上SourceMap文件。 [图片] 2、在开发者工具上传代码后下载 在开发者工具上传代码后,会实时生成SourceMap文件,此时点击下载SourceMap文件并保存即可 [图片] 3、使用miniprogram-ci获取 miniprogram-ci工具可以获取最近上传版本的Sourcemap文件,详情可见接口文档:拉取最近上传版本的SourceMap 三、上传SourceMap文件到云测服务 云测服务支持手动上传SourceMap文件和接口自动上传Sourcemap文件 1、手动上传SourceMap文件 用户在提交测试前,先在云测平台[代码]项目管理/SourceMap管理[代码]页面,上传新的SourceMap文件以及对已上传的SourceMap文件进行管理操作。 上传后,后台会从SourceMap文件中提取出小程序版本、代码提交时间、代码提交备注等信息。提交测试后会根据提交小程序的MD5自动匹配对应的SourceMap进行反解。 [图片] 如果测试前未上传,而测试报告中又发现了JS Error,也可以在测试报告页面[代码]JS Error详情[代码]标签中进行上传或选择已有的SourceMap文件实时解析JS Error报错信息。 [图片] 2、使用接口上传SourceMap文件 用户也可以利用第三方接口,在获取到SourceMap后自动上传,具体可参考 第三方接口文档 四、结果展示 以开篇的JS Error为例,在上传对应小程序版本的SourceMap等待页面自动刷新后,JS Error反解后信息如下。可以看到反解后,可以直接定位到用户代码的行数,方便用户定位问题 [图片] 五、最佳实践 【最佳实践】这里我们推荐用户版本更新后,可以用使用 miniprogram-ci上传代码 ,并 获取到sourcemap信息 后,直接调用 第三方API 上传到云测服务,并提交云测任务,获取到结果后,反馈给开发同学。这样可以方便的和现有小程序打包发布的Devops流程相结合。 [图片]
2022-12-07 - 商家转账到零钱
商家转账到零钱 ~~~ 01、商家转账到零钱介绍商家转账到零钱是【企业付款到零钱】的升级版,目前已不支持【企业付款到零钱】产品的申请,但是已经申请的不影响使用,但是本次升级力度很大,所以升级改造不是一件简单的事情。这一点一定要注意。 02、商家转账到零钱如何开通https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter4_3_1.shtml [图片] 具体需要以下二个条件 1、商户号已入驻90日且截止今日回推30天商户号保持连续不间的交易。 2、登录微信支付商户平台-产品中心,开通商家转账到零钱。 https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter4_3_2.shtml [图片] 03、商家转账到零钱开发对接需要准备什么1)mchid,商户号id 2)在小程序内,绑定APPID及mchid 3)api证书 4)api v3秘钥 5)商户API证书」的「证书序列号」 每一件事都是必要的,不能少 https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter4_3_2.shtml [图片] 04、微信支付平台证书微信支付平台证书的下载是整个对接过程中最难的,所以拿出来单独讲下,其他技术细节有很多开源的项目开源参考,但是这个证书的生成我认为是比较卡人的 我在第一次对接的时候,在社区支付大佬(Memory姐)手把手教授的情况下,没有搞成功,M姐直接帮我下载好了,第二次对接才完整走通了 ~[图片] 商家转账到零钱 ~[图片] 05、参考资料1)官方文档 https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter4_3_1.shtml [图片] https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter4_3_1.shtml [图片] 2)开源项目 https://github.com/wechatpay-apiv3/wechatpay-php/blob/main/bin/README.md [图片] 3)贵人相助 06、总结商家转账到零钱功能的完成对于我的答题活动小程序而言无疑是重要的,让整个产品做到了答题-抽奖-发钱闭环,从而使整个小程序更完善了 在这里多谢Memory姐的帮助 额外唠叨两句,小程序红包这个产品是我刚开始首选的,后面各种限制才转到商家转账到零钱 相关截图 [图片] ~ [图片] ~
2022-07-11 - 商家转帐到零钱问题
无法将 JSON 输入源“/body/total_amount”映射到目标字段“转账总金额”中,此字段需要一个合法的 64 位有符号整数 [msg] => Array ( [code] => PARAM_ERROR [detail] => Array ( [location] => body [value] => 970 ) [message] => 无法将 JSON 输入源“/body/total_amount”映射到目标字段“转账总金额”中,此字段需要一个合法的 64 位有符号整数 ) 其它金额目前没有发现问题,就这个970提示这个错误,这个要怎么解决?
2022-10-10 - 关于微信原“企业付款到零钱”接口升级为“商家转账到零钱”的避坑指南,所有坑都在这里了
5月18日,微信发布了一则简短的通知,全文如下: [图片] 媒体界有句话叫:字越少,事越大。 这次升级,也造成了不小的影响。 主要影响简单来说就是:新开通的商户号,不再支持开通【企业付款到零钱】功能。显然,微信官方是想通过【商家转账到零钱】取代原来的【企业付款到零钱】。然而事实是,这两个完全是不同的产品,拥有不同的设计思路和理念,不能算是升级,因此并不能完全代替原有功能。 不仅不能代替原有功能,而且在我看来这次“升级”,完全就是在降级,开倒车。为什么这么说呢? 1、必须开通运营账户。【商家转账到零钱】强制从运营账户出资,所以你必须保证运营账户的余额充足。运营账户的资金从哪里来呢?需要人工充值进去,注意是人工,可以通过银行卡充值,也可以从基本账户转账到运营账户,但必须人工。额,这种设计就很奇葩了,人工智能大行其道的时代,人们在不断的追求自动化的时候,微信居然反其道而行之,变自动为手动,你必须安排专人每天转钱,还不能请假。我们作为用户真的需要这个所谓的运营账户吗?不,是微信需要。 2、需要人工确认支付。这个设计已经不能用奇葩来形容了。【商家转账到零钱】功能,其实只是生成一个订单,支付的时候还需要管理员输入密码+短信验证码才能最终支付,虽然可以设置免密支付的金额,低于这个金额可以不用管理员人工参与,但是这个免密金额最大只支持100元,聊胜于无。好了,自动再次变为手动,为什么?官方说法是:为了确保资金安全。为了安全,所以就加入人工参与,恩,这个脑回路真的清奇。回想一下,我们接入API的初衷是什么?不就是为了实现自动化,解放人力,回家陪老婆孩子吗?好了,现在需要24小时无时无刻地盯着手机,一次又一次的支付密码,无论你在洗澡,在吃饭,在看书,还是在约会。。。照这样下去也就没有什么女朋友了,不用约会了。 3、产品定位混乱。如果是升级就在原有基础上升级,让用户自主选择是否升级。如果是新产品,就完全隔离,互不影响。然而,现在的这个产品定位混乱,看起来像是新加的产品,但是其实只是原功能换了皮肤。很明显的一点是,对于【商家转账到零钱】设置的支付限额,与【企业付款到零钱】的限额根本就是同一个东西,两个会互相影响,这个真是个大大的坑。你本来想设置一个,结果意外的修改了另外一个。这么重要的提示,微信居然只用了一行浅色的小字显示,不仔细看根本发现不了。很容易就踩了大坑。而且更过分的是,如果你之前的额度比较大,开通此功能会重置你的限额,如果想恢复额度,不好意思,需要重新申请提额。有点请君入瓮的意思。[图片] 像这种关键提示,小字显示的问题,还不止这一处。比如,开通运营账户时的“一经开通无法关闭” : [图片] 产品经理这么设计,似乎是很怕你发现这一点,所以放在了最不起眼的地方。你如果去找他理论,说这么重要的提示你为什么不早说,他就拿出这个截图告诉你:我有提示,是你没有看到,这不怪我吧! 4、增加了接入难度。 文档、SDK、demo 聊胜于无。 微信支付V3接口是我见过的最烂的接口文档之一,足以让一个十年经验的老手,卡到怀疑自己这十年是否选错了职业。技术不过关的,还是不要轻易尝试了。 理想的文档应该是有介绍、有接入流程说明、有详细的参数说明、有详细的错误说明、有完善的闭环的SDK、有一看就懂的demo,调用者不需要关心你采用的什么设计思想、什么加密算法,只需要按照demo,参照文档改成自己的参数,运行一下,成功了。看看V3文档,看了一遍又一遍,还是无从下手。根本就是半成品,SDK缺失关键代码、demo只是个片段,跑不通,毫无参考价值。 整个接入过程就是,百度找示例,修改,调试,报错,再百度,再调试,报错,再百度。。。 5、增加了流程的复杂度。 原本一个接口就可以搞定的事情,现在需要两个接口:发起商家转账接口、转账查询接口,增加了流程的复杂度。而且,原先只需要记录一个商户端订单号就可以了,现在需要记录两个单号:批次单号、明细单号,因为后面的查询接口需要用到。 6、没有提前通知。这么巨大的改动,居然没有提前告知。只在升级的时候,发一个不痛不痒的公告。 总之,这个产品让人看不懂。新版本也并没有看出有任何优势。整体来说设计是失败的,不仅无法取代原有功能,而且更加的别扭,不够灵活,虽然【企业付款到零钱】功能也有问题,比如付款信息太少,不容易对账,但是很明显这个升级非但没有解决这些旧问题,反而制造了更多的新问题。希望微信的产品经理在设计产品的时候能够贴近用户,了解用户的真实需求,而不是在办公室里创造需求。否则,只能让广大用户失望,而转投到其他竞品的阵营里。
2022-06-29 - 签名计算有不同版本?
https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_4.shtml 中阐述参与签名的字段为4个 https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay4_0.shtml 中阐述参与签名的字段为5个 以哪个为准?
2022-12-18 - 数据库原子操作和事务讲解
使用更新指令(如 inc、mul、addToSet)可以对云数据库的一条记录和记录内的子文档(结合反范式化设计)进行原子操作,但是如果要跨多个记录或跨多个集合的原子操作时,就需要使用云数据库的事务能力。 12.6.1 更新指令的原子操作关系型数据库是很难做到通过一个语句对数据强制一致性的需求来表示的,只能依赖事务。但是云开发数据库由于可以反范式化设计内嵌子文档,以及更新指定可以对单个记录或同一个记录内的子文档进行原子操作,所以通常情况下,云开发数据库不必使用事务。 比如调整某个订单项目的数量之后,应该同时更新该订单的总费用,我们可以设计采用如下方式设计该集合,比如订单的集合为 order: { "_id": "2020030922100983", "userID": "124785", "total":117, "orders": [{ "item":"苹果", "price":15, "number":3 },{ "item":"火龙果", "price":18, "number":4 }] } 客户在下单的时候经常会调整订单内某个商品比如苹果的购买数量,而下单的总价又必须同步更新,不能购买数量减少了,但是总价不变,这两个操作必须同时进行,如果是使用关系型数据库,则需要先通过两次查询,更新完数据之后,再存储进数据库,这个很容易出现有的成功,有的没有成功的情况。但是云开发的数据库则可以借助于更新指令做到一条更新来实现两个数据同时成功或失败: db.collection("order") .doc("2020030922100983") .update({ data: { "orders.0.number": _.inc(1), total: _.inc(15), }, }); 这个操作只是在单个记录里进行,那要实现跨记录要进行原子操作呢?更新指令其实是可以做到事务仿真的,但是比较麻烦,这时就建议用事务了。 12.6.2 事务与 ACID事务就是一段数据库语句的批处理,但是这个批处理是一个 atom(原子),多个增删改的操作是绑定在一起的,不可分割,要么都执行,要么回滚(rollback)都不执行。比如银行转账,需要做到一个账户的钱汇出去了,那另外一个账户就一定会收到钱,不能钱汇出去了,但是钱没有到另外一个的账上;也就是要执行转账这个事务,会对 A 用户的账户数据和 B 用户的账户数据做增删改的处理,这两个处理必须一起成功一起失败。 1、ACID一般来说,事务是必须满足 4 个条件(ACID): Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性): 原子性:整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中一部分操作,一致性:事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行前后,数据库都必须处于一致性状态。换句话说,事务的执行结果必须是使数据库从一个一致性状态转变到另一个一致性状态。比如在执行事务前,A 用户账户有 50 元,B 用户账户有 150 元;执行 B 转给 A 50 元事务后,两个用户账户总和还是 200 元。隔离性:事务的隔离性是指在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间事务之间,互不干扰。比如在线银行,同时转账的人虽然很多,但是不会出现影响 A 与 B 之间的转账;可靠性:即使发生系统崩溃或机器宕机等故障,只要数据库能够重新启动,那么一定能够将其恢复到事务成功结束时的状态,已提交事务的更新不会丢失。 2、云函数事务注意事项01不支持批量操作,只支持单记录操作 在事务中不支持批量操作(where 语句),只支持单记录操作(collection.doc, collection.add),这可以避免大量锁冲突、保证运行效率,并且大多数情况下,单记录操作足够满足需求,因为在事务中是可以对多个单个记录进行操作的,也就是可以比如说在一个事务中同时对集合 A 的记录 x 和 y 两个记录操作、又对集合 B 的记录 z 操作。 02云数据库采用的是快照隔离 对于两个并发执行的事务来说,如果涉及到操作同一条记录的时候,可能会发生问题。因为并发操作会带来数据的不一致性,包括脏读、不可重复读、幻读等。 脏读:指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据;不可重复读:在一个事务内两次读到的数据是不一样的,受到另一个事务修改后提交的影响,因此称为是不可重复读幻读:第一个事务对表进行读取,当第二个事务对表进行增加或删除操作事务提交后,第一个事务再次读取,会出现增加或减少行数的情况云开发的数据库系统的事务过程采用的是快照隔离(Snapshot isolation),可以避免并发操作带来数据不一致的问题。 事务期间,读操作返回的是对象的快照,而非实际数据事务期间,写操作会:1. 改变快照,保证接下来的读的一致性;2. 给对象加上事务锁事务锁:如果对象上存在事务锁,那么:1. 其它事务的写入会直接失败;2. 普通的更新操作会被阻塞,直到事务锁释放或者超时事务提交后,操作完毕的快照会被原子性地写入数据库中 12.6.3 事务操作的两套 API云开发数据库的事务提供两种操作风格的接口,一个是简易的、带有冲突自动重试的 runTransaction 接口,一个是流程自定义控制的 startTransaction 接口。通过 runTransaction 回调中获得的参数 transaction 或通过 startTransaction 获得的返回值 transaction,我们将其类比为 db 对象,只是在其上进行的操作将在事务内的快照完成,保证原子性。transaction 上提供的接口树形图一览: transaction |-- collection 获取集合引用 | |-- doc 获取记录引用 | | |-- get 获取记录内容 | | |-- update 更新记录内容 | | |-- set 替换记录内容 | | |-- remove 删除记录 | |-- add 新增记录 |-- rollback 终止事务并回滚 |-- commit 提交事务(仅在使用 startTransaction 时需调用) 1、通过 runTransaction 回调获得 transaction以下提供一个使用 runTransaction 接口的,两个账户之间进行转账的简易示例。事务执行函数由开发者传入,函数接收一个参数 transaction,其上提供 collection 方法和 rollback 方法。collection 方法用于取数据库集合记录引用进行操作,rollback 方法用于在不想继续执行事务时终止并回滚事务。 const cloud = require("wx-server-sdk"); cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV, }); const _ = db.command; exports.main = async (event) => { try { const result = await db.runTransaction(async (transaction) => { const aaaRes = await transaction.collection("account").doc("aaa").get(); const bbbRes = await transaction.collection("account").doc("bbb").get(); if (aaaRes.data && bbbRes.data) { const updateAAARes = await transaction .collection("account") .doc("aaa") .update({ data: { amount: _.inc(-10), }, }); const updateBBBRes = await transaction .collection("account") .doc("bbb") .update({ data: { amount: _.inc(10), }, }); console.log(`transaction succeeded`, result); return { aaaAccount: aaaRes.data.amount - 10, }; } else { await transaction.rollback(-100); } }); return { success: true, aaaAccount: result.aaaAccount, }; } catch (e) { console.error(`事务报错`, e); return { success: false, error: e, }; } }; 事务执行函数必须为 async 异步函数或返回 Promise 的函数,当事务执行函数返回时,SDK 会认为用户逻辑已完成,自动提交(commit)事务,因此务必确保用户事务逻辑完成后才在 async 异步函数中返回或 resolve Promise。 2、通过 startTransaction 获得 transactiondb.startTransaction(),开启一个新的事务,之后即可进行 CRUD 操作;db.startTransaction().transaction.commit(),提交事务保存数据,在提交之前事务中的变更的数据对外是不可见的;db.startTransaction().rollback(),事务终止并回滚事务,例如,一部分数据更新失败,对已修改过的数据也进行回滚。const cloud = require("wx-server-sdk"); cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV, }); const db = cloud.database({ throwOnNotFound: false, }); const _ = db.command; exports.main = async (event) => { try { const transaction = await db.startTransaction(); const aaaRes = await transaction.collection("account").doc("aaa").get(); const bbbRes = await transaction.collection("account").doc("bbb").get(); if (aaaRes.data && bbbRes.data) { const updateAAARes = await transaction .collection("account") .doc("aaa") .update({ data: { amount: _.inc(-10), }, }); const updateBBBRes = await transaction .collection("account") .doc("bbb") .update({ data: { amount: _.inc(10), }, }); await transaction.commit(); return { success: true, aaaAccount: aaaRes.data.amount - 10, }; } else { await transaction.rollback(); return { success: false, error: `rollback`, rollbackCode: -100, }; } } catch (e) { console.error(`事务报错`, e); } }; 也就是说对于多用户同时操作(主要是写)数据库的并发处理问题,我们不仅可以使用原子更新,还可以使用事务。其中原子更新主要用户操作单个记录内的字段或单个记录里内嵌的数组对象里的字段,而事务则主要是用于跨记录和跨集合的处理。
2021-09-10 - IOS端 当Promise与异步函数一起使用时 特定情况下永远不会settled
const app = getApp() function wait(delay) { return new Promise(resolve => setTimeout(resolve, delay)) } const requestAuth = async() => { return request(false) } async function request(auth = true) { await Promise.resolve() await wait(300); if (auth) { await requestAuth() } return true } Page({ onLoad() { request().then( () => { //在ios既不会执行到这里 也不会报错 wx.showModal({ title: '在ios上始终无法出现的modal', }) }, console.error ) }, })
2022-01-06 - 小程序登录、用户信息相关接口调整说明
公告更新时间: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 - Ai onnx 推理实践课程
AI ONNX推理实践课程旨在帮助学员掌握ONNX模型推理的基本应用和实践技巧,从而能够在小程序中使用人工智能模型。本课程适合对模型部署感兴趣的初学者、开发者及研究人员。
2024-07-22