- 小程序webview访问公众号文章提示非业务域名
排查方式如下 1:小程序和公众号需要进行绑定 2:需要是https请求 3:业务域名设置了不一定参数里就是业务域名的地址,若配置的基本都是公众号文章地址,这里的业务域名是不需要额外设置的 4:参数需要进行encode编码 分享案例 1:若遇到非业务域名问题,请先固定一篇文章进行测试,打印代码 https://mp.weixin.qq.com/s?__biz=xxxxxxxxxx==&mid=xxxxxxxxxx&idx=1&sn=xxxxxxxxxxxx&chksm=c0457762f732fe745f1bf8b1f99fa7a535335772eb6a104c1cf026ea063e16ec157465894b52&token=246279511&lang=zh_CN#rd 2:打开代码片段,放入打印出来的代码,编译查看是否提示参数错误 [图片] 3:把打印出来的代码进行encodeURIComponent转码 https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzkwMDE4MzU5OQ%3D%3D%26mid%3D2247504930%26idx%3D1%26sn%3D8d98cf8616cf11134620508082bdf1eb%26chksm%3Dc0457762f732fe745f1bf8b1f99fa7axxxxxxxxxeb6a104c1cf026ea063e16ec157465894b52%26token%xxxxxxxxxxxxx%26lang%3Dzh_CN%23rd 4:开发者工具-->添加编译模式-->启动参数-->url=encodeURIComponent转码后的请求,然后编译下 [图片] 附上事例中的代码片段:https://developers.weixin.qq.com/s/CdlD8vmP7AxR 欢迎社区开发者留下自己解决非业务域名报错的步骤 !!!
2022-03-04 - 手把手教你备案微信小程序(非个人主体备案)
备案材料准备 在提交备案前,请务必提前准备好备案所需材料,以免由于材料更新问题,导致备案需延期提交。下面将会带大家详细了解备案材料的要求,这样后续在提交时就能避免因为材料问题而导致失败。 材料示例及注意事项 [图片] 注:所有上传材料大小应不超过2M,分辨率不低于720* 1280 ,仅支持JPG、JPEG、PNG 格式 若想查看更多小程序备案材料示例,详情可查看文档 备案信息填写 备案材料准备好后,就可以前往【小程序管理后台-设置-小程序备案】提交备案申请了。下面将会详细教大家如何进行备案信息的填写,一共分为五个部分:主办单位信息填写、主体负责人信息填写、小程序信息填写、小程序管理员信息填写和上传其他信息材料。 1.主办单位信息填写 [图片] [图片] 填写说明 常见报错/问题 解决方案 ①选择地区:选择与证件地址相一致的省市区信息 该主体已在XX完成备案,请修改备案省份或注销备案主体重新备案 请核实该主体是否有在其他省份备案过,由于同主体在所有平台的备案省份必须保持一致,需修改备案省份或注销备案主体重新备案 ②主办者性质:默认与小程序主体认证信息相一致 / / ③证件类型:默认与小程序主体认证信息相一致 / / ④上传证件:按要求提供最新版证件 营业执照有效期不足 请联系工商部门更新证件有效期 ⑤企业名称:填写证件相对应名称信息 主办者与小程序主体不一致 请核实填写企业名称是否与小程序主体名称、上传营业执照名称相一致 ⑤企业名称:填写证件相对应名称信息 营业执照名称为空或者* 号 请联系工商部门更新企业名称信息 ⑥证件住所:填写证件相对应经营场所信息 【主体证件住所】工商数据对比不通过 请参考文档进行排查 ⑦证件号码:填写证件相对应统一社会信用代码信息 未查询到企业信息,请检查主体证件号是否有误 请核实填写的是否为统一社会信用代码,若无,请联系工商部门更新证件信息,不能填写其他如工商注册号等 ⑧通讯地址:填写当前主体所在的实际通讯地址(无需填写省、市、区) 通讯地址未能精确到门牌号 若无具体门牌号,需要在备注中说明情况 ⑨备注(选填):针对主体信息进行补充说明,如有可填写 / / 注:若为新建企业或近期有做信息变更,可能会存在企业工商数据更新延迟的情况,建议过段时间(5~15个工作日)再进行重试,否则无法正常发起验证流程。 2.主体负责人信息填写 [图片] 填写说明 常见报错/问题 解决方案 ①证件类型:选择主体负责人证件类型信息 / / ②上传证件:按要求提供最新版证件 / / ③负责人名称:通过上传证件自动识别,有误可自行修改 主体负责人与法定代表人不一致,且备案所在地不支持法定代表人授权 请核实填写的主体负责人是否为法人,需与营业执照信息一致,由于所属地区不支持授权,只能填写法人信息 ④负责人证件号:通过上传证件自动识别,有误可自行修改 【主体负责人证件号码】企业工商四要素核验失败 请核实填写的主体负责人名称、证件号信息是否正确 ⑤证件有效期:通过上传证件自动识别,有误可自行修改 / / ⑥手机号:主体负责人手机号码 【主体负责人手机号码】不允许被多人使用 请核实填写的手机号是否为其他人的信息,仅在同一主体下,同一个人允许为多个小程序备案,可提交一致的手机号、应急手机号及邮箱信息,否则不能出现个人信息混用的情况 ⑦验证码:主体负责人手机号码收到的对应验证码 验证码不正确 请核实验证码是否已失效,验证码有效期为10分钟 ⑧应急手机号:主体负责人的应急电话 【主体负责人应急联系方式】不允许被多人使用 请核实填写的应急手机号是否为其他人的信息,仅在同一主体下,同一个人允许为多个小程序备案,可提交一致的手机号、应急手机号及邮箱信息,否则不能出现个人信息混用的情况 ⑨邮箱地址:主体负责人的电子邮箱 / / 3.小程序信息填写 [图片] 填写说明 常见报错/问题 解决方案 ①服务内容标识:根据小程序实际运营内容选择合适的即可 小程序服务内容类型数目不能超过5个 服务内容标识是通信管局对各个行业的分类,平台部分行业类目与管局行业类目名称不完全不一致,建议根据备案小程序实际运营内容尽可能选择对应的服务内容标识,最多选择5个。 ②互联网信息服务前置审批项:根据小程序实际运营内容判断是否需要进行前置审批 如从事XXX业务,请上传前置审批文件 小程序实际运营内容涉及前置审批项,需上传对应的审批文件 ②互联网信息服务前置审批项:根据小程序实际运营内容判断是否需要进行前置审批 前置审批项必须选择“以上都不涉及” 小程序实际运营内容不涉及前置审批项,需要选择"以上都不涉及” ③备注(必填):具体描述小程序实际经营内容,主要服务内容 请在小程序备注按格式填写 请核实是否有根据备注格式进行填写,仅自行补充带星号内容即可。 4.小程序管理员信息填写 [图片] 填写说明 常见报错/问题 解决方案 ①证件类型:选择小程序负责人证件类型信息(目前仅支持身份证) / / ②上传证件:按要求提供最新版证件(目前仅支持身份证) / / ③负责人名称:通过上传证件自动识别,有误可自行修改 【小程序负责人姓名】负责人与小程序管理员不一致 请核实小程序是否未完善管理员实名信息,需参考指引文档进行补充 ④负责人证件号:通过上传证件自动识别,有误可自行修改 【小程序负责人证件号码】负责人与小程序管理员不一致 请核实小程序是否未完善管理员实名信息,需参考指引文档进行补充 ⑤证件有效期:通过上传证件自动识别,有误可自行修改 / / ⑥手机号:小程序负责人手机号码 【小程序负责人手机号码】不允许被多人使用 请核实填写的手机号是否为其他人的信息,仅在同一主体下,同一个人允许为多个小程序备案,可提交一致的手机号、应急手机号及邮箱信息,否则不能出现个人信息混用的情况 ⑦验证码:小程序负责人手机号码收到的对应验证码 验证码不正确 请核实验证码是否已失效,验证码有效期为10分钟 ⑧应急手机号:小程序负责人的应急电话 【小程序负责人应急联系方式】不允许被多人使用 请核实填写的应急手机号是否为其他人的信息,仅在同一主体下,同一个人允许为多个小程序备案,可提交一致的手机号、应急手机号及邮箱信息,否则不能出现个人信息混用的情况 ⑨邮箱地址:小程序负责人的电子邮箱 / / ⑩负责人人脸核身:小程序管理员(小程序负责人)需使用微信APP扫码,完成人脸核身 当前场景仅支持居民身份证 核实小程序管理员证件是否为大陆居民身份证,目前港澳台管理员无法进行人脸核身,建议先更换小程序管理员为中国大陆地区的人员,作为备案小程序负责人。 5.上传其他信息材料 [图片] 填写说明 常见报错/问题 解决方案 互联网信息服务承诺书:1. 广东地区:下载页面提供的模版文件,填写完整后上传提交;2. 非广东地区:点击阅读确认后提交 承诺书需加盖公章,但个体户没有公章 若个体工商户无公章,需要主体负责人手写日期+签名+盖手印+身份证号码,同时请在主体备注处备注“个体工商户无公章”。注:江苏、宁夏、福建地区,须刻章后提交备案,不接受负责人手印。 以上信息都填写完毕,就可点击提交,后续的备案审核流程可参考: [图片] 如有其他相关疑问,欢迎随时参与社区讨论。
2024-05-28 - 微信法定代表人扫脸验证失败
平台是直接拉取工商局的数据,工商数据未更新则无法正常发起验证流程,需要等15个工作日再试试。另,开发者可在该网站查询主体的更新信息http://www.gsxt.gov.cn/corp-query-homepage.html(建议开发者先核实下主体名称是否填写有误) 法定代表人扫脸验证失败一般是什么原因? 1:建议重新核查信息,确保账号主体信息及法人信息提交无误。如确认无误,还是审核失败,是因未在工商数据中查询到您提交法人的相关信息,无法核查,故审核失败。 如贵方是新建企业,或近期有做信息变更,企业工商数据更新可能有延迟,建议您过段时间(5~15工作日)再试。期间不支持加急 2:营业执照中主体名称为空或者*号,如何验证? 个体户主体名称为空或者*号,主体名称请填写个体户+法人姓名(比如:个体户张三)提交验证。 3:法定代表人不是大陆居民,如何验证? 如果法定代表人身份证件不是中国大陆地区居民身份证,目前暂时无法完成验证,还请谅解。 4:如果是新注册的企业,或近期有做企业信息变更,验证失败如何处理? 企业工商数据更新可能有延迟,建议过5~15工作日后再试试 5:个体工商户名称/企业名称和统一社会信用代码填写不正确,如有填写了错别字、错漏字,都会导致无法识别通过。 举例1:统一社会信用代码留意数字0和字母O、Q的区别,数字1和字母I的区别。 举例2:主体名称有括号的,留意括号前后是否有空格; 举例3:营业执照主体名称为xxxx(个体工商户),后面括号内容也要填写完整。留意名称不要有错别字。 6:以及非企业类型不支持法人验证,以及若企业为合伙企业,法人为多个人或为执行事务合伙人xxx公司的,不支持法人验证 7:不支持用其他人实名的微信扫码验证。目前仅支持中国内地法人验证,非内地法人暂无法进行法人验证 8:注册页面提示“提交的法定代表人信息验证失败次数太多,请尝试其他方式进行注册”? 同一邮箱申请公众帐号,选择法人验证方式提交注册只有3次机会,若已达到次数上限,请选择支付验证或微信认证方式继续注册,若依旧要申请法人验证方式,建议更换邮箱注册。 温馨提示:若是新办理的营业执照或近期变更过企业信息,数据更新可能有延迟建议过5-15天后再申请。若是个体工商户营业执照没有名称,不支持选择法人验证申请,建议选择其他验证方式申请。 如果按照以上方式排查仍然无法解决问题,可通过微信公众号“腾讯客服”进行咨询。
2024-07-01 - 小程序备案-工信部校验短信是发小程序负责人手机里吗?还是发送到主体负责人手机里?
需根据备案小程序实际备案类型来验证相应负责人。短信核验时效说明: 最大核验次数为5次,有效验证时间为24小时,超过验证次数、超时或验证失败备案请将被系统驳回;提交管局后,若超过12小时还未验证,但未超过24时,工信部系统将重发一次短信,需在有效验证时间内完成验证。[图片]
2024-03-22 - 微信公众号部分相关客服(可转人工)
微信公众平台-小程序代码审核咨询微信公众平台-监管相关咨询微信公众平台-名称审核咨询公众号帐号审核-高危open官网咨询客服小程序交易组件第三方代创建小程序咨询MP客服消息规则调整反馈入口公众号作者小程序注册公众号客服消息调整视频号直播官方客服微信公众平台微信公众平台客服公众号账号审核-低质公众号账号审核-诱导公众号申诉咨询微信公众平台-公众号业务咨询发货信息管理客服小程序订单中心页Path设置审核订单发货管理客服小程序客服咨询模板消息问题咨询小程序隐私保护咨询付费管理-客服咨询模板消息枚举值审核咨询公众号营销内容咨询微信公众平台-小程序类目审核咨询小程序备案-客服咨询小程序年费咨询服务商采购-客服咨询公众号
2023-11-02 - 关于申请小程序地理位置相关接口的规范
随着小程序生态的发展,越来越多小程序开发者会通过官方接口来给用户提供便捷的服务。如何在提供良好的体验时又能保障用户合法权益,如何正确的进行相关接口准入申请?本文将会从以下方面进行详细说明。 一、可通过相应接口准入申请的小程序 对象:自身已有地理位置相关使用场景或需地理位置相关场景完善服务内容的小程序 申请wx.getLocation接口参考案例1)含有交通服务类目,同时含有代驾服务、租车网点查询服务、查询附近车辆服务、城市共享交通服务等 [图片] [图片] 2)含有餐饮-点餐平台、餐饮-外卖平台类目、餐饮-餐饮服务场所/餐饮服务管理企业,并涉及实际送餐场景 [图片] [图片] 3)含有工具-信息查询、工具-办公、工具-设备管理类目,并涉及与地理位置相关的打卡服务业务,如智能门禁、智能穿戴设备等 [图片] 4)含有汽车服务-维修保养、汽车服务-汽车用品、汽车服务-汽车经销商/4S店、汽车服务-汽车厂商、汽车服务-汽车预售、汽车服务-二手车类目,涉及提供汽车售卖、维保洗美服务、查找附近的维修点/洗车网点等导航服务 [图片][图片] 5)含有电商平台/商家自营类目,涉及提供售卖商品线下发货、收货服务、线下商超导览、导航服务 [图片] 6)含有金融-银行、金融-非金融机构自营小额贷款/融资担保/商业保理类目,涉及银行小程序提供线下网点预约、基于地理位置取号并现场报到、附近网点导航等服 [图片] 7)含有电商平台/商家自营类目,涉及提供售卖商品非即刻交易线下发货、收货服务,比如线下跑腿收货、社区团购线下自提点收货等服务场景 [图片] [图片] 申请wx.onLocationChange接口参考案例1)含有交通服务类目,同时含有代驾服务、城市共享交通服务等 [图片] 2)含有生活服务类目,同时含有线下跑腿、开锁服务、其他上门作业等实际服务内容 [图片] 3)含有旅游-景区服务、旅游-住宿服务,涉及提供景区导航、导览服务、酒店导航服务 [图片] 二、无法通过相关接口准入申请的小程序 1)开发者因涉及营销活动,希望申请wx.getLocation接口便于帮助用户定位所在位置,但根据服务内容可知当前仅需获取用户所在城市/地区,无需通过wx.getLocation获取详细的经纬度定位,使用wx.getFuzzyLocation、wx.chooseLocation或wx.choosePoi接口实现上述场景 [图片] 2)开发者因涉及提供外卖平台服务,希望申请wx.onLocationchange接口监听用户实时地理位置运动轨迹,但根据服务内容可知当前外卖平台服务仅需要获取用户外卖收货地址,并不展示派送员实时位置,无需通过wx.onLocationchange获取用户的实时运动轨迹,使用wx.getFuzzyLocation、wx.chooseLocation或wx.choosePoi接口实现上述场景 [图片] 3) 开发者因涉及提供新闻资讯服务,希望申请wx.onLocationchange接口监听用户实时地理位置运动轨迹,但小程序内未含有相关使用场景,所以暂时不支持 [图片] 4)开发者因涉及线上商城发货服务,需用户提供收货地址,希望申请wx.getLocation接口获取用户当前详细的实时位置,如果需要获取用户的收货地址可以使用wx.chooseAdress接口一键导入。如果需要省去用户手动填写地址的流程,可以使用wx.chooseLocation或wx.choosePoi让用户自行选择当前地理位置,无需获取用户获取用户当前详细的实时位置。 [图片] 5)房地产、餐饮、商家自营等小程序,希望申请wx.getLocation接口获取用户当前实时位置信息,为用户展示附近、周边门店信息,提供推荐营销服务,且小程序内未提供线下门店导航服务,仅在小程序内为用户提供附近、周边门店信息展示服务,该场景不支持使用wx.getLocation、wx.onLocationchange这类高精度位置接口,建议开发者使用wx.getFuzzylocation、wx.chooseLocation或wx.choosePoi实现上述场景。 [图片] 三、接口准入申请的步骤 1)登录微信公众平台:https://mp.weixin.qq.com,进入小程序后台「首页」,左侧导航栏点击「开发管理」模块 [图片] 2)「开发管理」模块下「接口设置」 [图片] 3)找到需要申请的地理位置接口点击「去开通」进入接口申请页面 [图片] 4)进入接口申请页面后,在接口「申请原因」中详细描述申请接口在小程序内的使用场景,或选择性提供小程序的图片视频或网页辅助审核,最后点击「提交申请」即完成该接口申请 [图片] 5)接口申请审核结果可通过「接口设置」模块的接口状态,或「通知中心」站内信进行查看 [图片] [图片]
03-13 - 小程序公众号干货运营之注销篇
各位亲,面对帐号注销是不是束手无策呢?帐号如何注销,怎么注销,注销需要提供什么信息内容呢?请仔细往下看看 小程序 关于小程序注销的条件,若未冻结的个人帐号和组织类帐号就不 一 一 细讲,详情请参腾讯客服文档:https://kf.qq.com/product/wx_xcx.html#hid=2826 1:小程序注销之政府无对公账户: 详细流程请参考:https://kf.qq.com/faq/190104YnQbYN190104RzaYba.html 政府的有一致主体是提供一致的主体证件和公章,如果有变更请提供4项材料:因机构改革、单位合并、撤一建一等情况,导致机构主体名称有变更,提供以下材料申请注销: 1、更名相关的红头文件(有鲜章); 2、主体名称变更情况说明书(加盖新主体公章); 3、变更后新主体的主体证件;(原件拍照或加盖公章的复印件) 4、注销申请函(加盖新主体公章); 2:小程序注销之个体工商户 若个体工商户存在对公账户,请使用对公账户小额打款注销 若个体工商户类型无对公账户注销小程序工单指引流程如下 工单所需材料 1、小程序绑定邮箱/原始ID: 2、主体证件材料(营业执照/组织机构代码证等): 3、小程序绑定的法人身份证原件正反面的清晰扫描件或照片: 4、小程序的注销书面申请,申请书必须加盖公章。(若个体户没有公章可支持法人手写签名) 附注:注销申请书模板(https://kf.qq.com/faq/200306R7N3mI200306I3aEBz.html) 材料提交链接:https://kf.qq.com/touch/bill/200306selfqaafe6c551.html(手机端打开) 3:小程序注销之帐号主体已注销 主体已注销小程序工单指引流程如下, 1、小程序绑定邮箱/原始ID: 2、主体注销证明: 3、小程序绑定的法人身份证原件正反面的清晰扫描件或照片: 4、小程序的注销书面申请,企业账号的申请必须有加盖公章的函件(公章被收的请法人手写签字)附注:注销申请书模板(https://kf.qq.com/faq/200306R7N3mI200306I3aEBz.html) 材料提交链接:https://kf.qq.com/touch/bill/200306selfqaafe6c551.html(手机端打开) 4:小程序注销之门店小程序 门店小程序依附于公众号,不支持单独注销,公众号注销门店小程序才支持注销 5:公众号正常运营,门店小程序如何释放昵称 如果需要释放该小店小程序昵称,发送邮件到“miniprogram@tencent.com”,标题格式【关于XXX名称释放请求】,需提供以下材料: 1、小程序帐号(原始ID); 2、绑定的管理员微信号; 3、小程序主体营业执照等主体证件; 4、小程序所有者的书面申请,申请书需加盖小程序主体公章;(个体户无公章:申请书需要加上法人签名); 邮件内容:需包含背景、释放请求原因。 6:复用公众号资质快速注册的小程序如何注销 复用资质申请的小程序是独立存在的,请按照正常流程注销即可 7:注册小程序选择微信认证,若未完成微信认证如何注销呢? 小程序30天未认证或认证失败且7天内未发起认证不会释放邮箱,但该邮箱支持重新注册小程序,会释放主体信息、管理员信息、昵称。 公众号 关于公众号若未冻结的个人帐号和组织类帐号就不一一细讲,详情请参考腾讯客服文档:https://kf.qq.com/product/weixinmp.html#hid=2267 1:公众号注销之政府无对公账户: 详细流程请参考:https://kf.qq.com/faq/190531qyuuiY190531BjyyEv.html 政府的有一致主体是提供一致的主体证件和公章,如果有变更请提供4项材料:因机构改革、单位合并、撤一建一等情况,导致机构主体名称有变更,提供以下材料申请注销: 1、更名相关的红头文件(有鲜章); 2、主体名称变更情况说明书(加盖新主体公章); 3、变更后新主体的主体证件;(原件拍照或加盖公章的复印件) 4、注销申请函(加盖新主体公章); 2:公众号注销之个体工商户 若个体工商户存在对公账户,请使用对公账户小额打款注销 若个体工商户类型无对公账户,请使用法人扫脸注销公众号 详情请参考:https://kf.qq.com/faq/220309bUvmIB220309BbAjMz.html 3:公众号注销之帐号主体已注销 主体已注销公众号工单指引流程如下, 1、公众号绑定邮箱/原始id/微信号: 2、主体注销证明: 3、公众号绑定的法人身份证原件正反面的清晰扫描件或照片: 4、公众号的注销书面申请,企业账号的申请必须有加盖公章的函件(公章被收的请法人手写签字) 附注:注销申请书模板(http://kf.qq.com/faq/171018R3IVBF171018INjUvA.html ) 材料提交链接:https://kf.qq.com/touch/bill/180227selfqa9ab6ac55.html(手机端打开) 4:未注册成功的帐号如何注销 若帐号当时没有走完注册流程且长期没有登录该帐号,到期会被系统注销。没有走完注册流程的帐号不占用个人信息,也不支持找回,建议重新注册 5:注册公众号选择微信认证,若未完成微信认证如何注销呢? 若公众号注册时选择微信认证,自注册日起30天内未进行认证(第30天仍在认证中不算),点击“重新提交材料”,帐号角色变为注册失败,不会释放帐号邮箱,但该邮箱支持重新注册公众号,会释放主体信息、管理员信息、昵称, 6:小程序公众号注销确认期 注销确认期的7天内每天会发送一次确认注销的通知,若管理员一直未点击确认注销则默认取消注销,注销失败。因此管理员请关注公众平台安全助手!!!
2022-04-08 - 小程序审核:名称规则调整及优化建议
微信小程序的开发者们在发布小程序之前,需要给每个小程序起好一个名称,设置好logo、简介及类目信息,然后才能进行代码提审。 这些帐号的基础信息是用户对一个小程序的初步认知,平台希望这些信息能够给予用户准确预期每个小程序的功能和内容,也希望每个小程序的名称是具有独特性的,减少误导、混淆用户理解的可能性。 因此有以下几点名称规则调整及优化建议,希望开发者可以了解并遵循,后续可能会在名称审核、代码审核或已发布运营时,收到平台的审核通知或建议修改通知。 l 微信小程序的名称建议是品牌、商标或具有辨识度的短词 在微信小程序发布后,用户会通过搜索、传播等场景使用小程序的功能和服务。选择品牌、商标或具有辨识度的短词作为小程序的名称,可以帮助用户快速建立与小程序的记忆与关系。 名称为“印象笔记”会比“笔记”能更好的让用户记忆和理解,并使用“印象”品牌词进行搜索或传播。 [图片] l 不能直接使用功能性描述、广义归纳类的词汇作为名称 功能性描述的词汇虽然可传达出小程序所要提供的相关功能,但直接使用此类词汇,缺乏显著性且不具有识别、区分小程序的作用。 如名称为“牙科”的帐号,用户能直接理解小程序的内容可能与“牙科”相关,但对这个小程序帐号是没有建立认知和关系的。 [图片] l 不能同时使用地域性词汇与广义归纳类词汇进行命名 使用“地域+广义归纳类”词汇进行命名,同样存在指向性过于宽泛的问题。 如以下案例, 名称包含的地域词:“四川”、归纳类词:“系统门窗”,并不会让用户对帐号的功能产生有效的预期。以下示例是不允许的: [图片] 但在政务民生类服务场景,“广州地铁”、“广州公积金”可以被用户理解并接受属于政府或相关机构提供的服务和资讯,因此“地域+广义归纳类”词汇可被政府民生场景使用。 l 不建议使用具有营销属性的词汇进行命名 营销属性词汇如:免费、促销、清仓、打折等,鉴于活动规则普遍附有限制条件,在名称中使用,通常带有过于夸大的表达效果,并非是小程序的核心功能和用户的全部认知,存在误导的可能性。以下示例是不允许的: [图片] l 商品销售类小程序,需要包含品牌名称,不直接使用产品分类进行命名 商品销售类小程序,若仅使用产品分类进行命名,无法建立易于记忆、易于传播的品牌形象。如名称为“女鞋男鞋女包批发生产”,用户并不会因“女鞋”“男鞋”“女包”就会进行选择,反而“品牌+女装”才是用户真正需要的。以下示例是不允许的。 [图片] l 不在名称中堆砌热门搜索关键词 名称中堆砌多个关键词,过于冗长的热门搜索关键词堆砌名称无法建立品牌记忆,目的普遍是在搜索结果上获得更多的曝光。以下示例是不允许的: [图片] 结语 此次名称规则的调整和优化建议,平台希望开发者们能相应地调整自己的小程序名称。如未满足名称规范,平台会在后续的小程序名称设置、名称审核、代码审核流程进行规则提示和修改要求。并会在搜索场景优化需求基础上,对无辨识度的帐号名称进行搜索策略调整。 微信小程序完整的名称规则可具体参照《微信小程序平台运营规范》2. 基本信息规范,除以上规则与示例之外,当然还包括了不得使用违法违规的名称、不得使用侵权他人的品牌词进行命名、在命中敏感类目如医疗词时提交主体资质等规则。 平台希望小程序名称的优化调整,可以使得每个被开发者精心创造出来的小程序都能让用户在使用时、搜索时、传播时逐渐接受并建立对产品品牌的认知。
2019-05-14 - 公众号运营:如何获得公众号平台推荐流量,有官方推荐运营规范。
今天开始公众号怎样获得流量开始明牌了,放到台面上,让所有运营者都了解清楚,只要你这样做,肯定会有流量,千万不要那样做,那样会没有推荐会违规等。鼓励写什么内容,哪些内容肯定会导致你没有流量写的一清二楚。多琢磨公众号推荐运营规范,会获得你想要的公众号流量答案。 微信公众号推荐运营规范 为提倡并鼓励创作者不断优化内容,提高创作质量,实现更高的曝光及影响力,微信面向创作者推出公众号信息内容「可选推荐」功能,我们在此作出如下说明: 1、 在图文编辑过程中,创作者可选择是否允许内容被推荐,该推荐功能所生效的场景为:订阅号消息列表-看一看;文章页底部推荐;发现页-看一看入口推荐。 2、 创作者允许内容被推荐时,请注意,这并非表示该内容将会被成功推荐。不符合推荐运营规范和公众平台运营规范的内容将不会被推荐。建议在进行创作时,严格遵循相应规范,确保内容质量,以提高推荐的几率。 3、 转载和分组群发的内容将不会被推荐。 4、 文章发表后,创作者可以在发表记录中手动取消文章被推荐的机会。不过,我们需要提醒你,一旦创作者选择不允许平台推荐,将无法针对该篇内容重新选择允许平台推荐。因此在做出关闭决定前,请充分权衡利弊。 5、 若你想了解你的文章是否已实际获得推荐,请进入微信公众号后台的“内容分析-单篇群发”页面。在此页面中,你可查看到关于文章推荐情况的详细数据。通过分析这些数据,你可以对你的文章推荐情况有一个较为准确的了解,为今后的创作提供参考。你可以关注数据变化,优化创作策略,提高文章质量及推荐可能性。 6、 为提高微信公众号的内容质量,营造良好的创作环境,我们对平台内的图文内容提出以下倡导和要求。 一、总则&价值观我们鼓励倡导的内容: 1、 以传递知识、分享经验和展示个人观点为主要目的,有价值、有深度的原创内容。 2、 提供给用户好的阅读体验精美的设计和排版的内容。 3、 使读者在轻松阅读中收获知识或思考的具有启发性、教育性或者娱乐性质的内容。 4、 金融、教育、医疗卫生、司法等专业人士发布的权威真实信息和专业知识。 我们不希望看到的内容: 1、 违反法律法规、违反社会主义核心价值观的内容。 2、 不实内容:例如通过捏造或扭曲事实的内容以吸引眼球博取流量的内容。 3、 违背公序良俗、违背科学的、不尊重他人的、令人极度不适等不良内容。 4、 仅以营销、广告为目的,缺乏实际价值的宣传和营销推广,甚至虚假宣传的内容。 5、 通过各种手段绕过平台检测、审核的内容。 二、运营规范创作者的行为或内容如涉嫌违反以下运营规范,一经发现,相应的内容将不被平台推荐,或被平台取消推荐,包括但不限于: 1、恶意使用1.1 危害平台安全、扰乱秩序的行为,如: 提供破坏产品生态和流程的服务,如指导用户绕过防沉迷系统;钻平台漏洞以赚取流量;假冒、仿冒、捏造政党、党政军机关、企事业单位、人民团体和社会组织以及国家(地区)、国际组织的名称、标识;假冒、仿冒、捏造捏造政党、党政军机关、企事业单位、人民团体和社会组织以及国家(地区)、国际组织的名称、新闻网站、报刊社、广播电视机构、通讯社等新闻媒体的名称、标识等,或擅自使用具有新闻属性的名称,发布相关新闻报道;其他破坏平台秩序,影响平台公平性、真实性或造成其他不利于生态健康发展的行为。1.2 恶意违规及对抗行为,如: 使用技术手段规避检测;恶意注册使用公众号,批量运营;添加无关标签以误导用户。 2、 侵权内容2.1 禁止侵犯他人合法权益的行为,例如: 发布、传播推广盗版内容、资源;通过在资料、内容中使用相近文字等来混淆大IP/品牌,误导用户认为其为版权方或授权方等正主,以实现不当目的。 3、 不实信息平台鼓励真实、原创内容,不倡导不实信息。本规范所称的不实信息,指没有相应事实基础,通过捏造或扭曲事实、隐瞒真相而产生的信息。包括但不限于: 偷换概念、断章取义,歪曲事件事实,可能会引发公众恐慌、扰乱社会秩序的标题和内容;在关注的社会热点或公众关心的事件、人物里编造或传播未证实的信息,以吸引点击增加流量或损害特定个人或群体的内容;对正常社会秩序和安全造成威胁的不实信息或传言;可能造成暴力行为的错误信息和无法证实的传言;利用新技术(如虚拟现实、aigc)制作、发布的虚假信息;未经考证的,无依据揣测的历史内容。 4、 违背公序良俗公序良俗通常是指公共秩序与善良风俗。公共秩序,是指政治、经济、文化等领域的基本秩序和根本理念,是与国家和社会整体利益相关的基础性原则、价值和秩序。善良风俗,是指基于社会主流道德观念的习俗,也可称为社会公共道德,是社会成员所普遍认可、遵循的道德准则。 违反公序良俗的内容及行为,包括但不限于: 4.1 恶搞重大自然灾害、意外事故、恐怖事件、战争等灾难场面,从而达到煽动情绪,引起对立的目的。 4.2 传播不良价值观,如: 宣扬流量至上,展示违背伦理道德的生活;宣扬浪费、攀比、误导消费、拜金主义等不正确价值观;实施或教唆“网络暴力”;鼓励PUA撩妹、撩汉等相关话题;煽动性别对立,性别歧视等。4.3 传播不文明行为:违反社会道德规范,展示、美化、宣扬不文明行为。 4.3 展示传播低级趣味,低俗擦边等文字、图片和视频,例如: 露出/聚焦敏感部位的图片以及敏感部位未打码的真人写真/艺术摄影等;标题突出身材特征和敏感部位,含有性器官/性行为/性暗示的描述词汇,或标题强调男女交往的暧昧动作或描述的行为具有擦边倾向av女优/男优、肉番等的文字介绍、图片描述人类性行为模式,绑缚与调教,施虐与受虐,支配与臣服的内容展示动物交配细节4.4 宣扬暴力、恶意谩骂、侮辱他人等的内容。 4.5 其他有悖于社会公德与善良风俗的内容。 5、 不良信息我们希望让用户看到真实、科学的内容;不科学的内容可能会给人身体健康财产安全造成危害。不良信息包括但不限于: 5.1 不规范医疗科普,包括但不限于: 科学性错误,如未经证实的养生、食膳、锻炼偏方秘方等;片面/夸大描述药品、商品、产品、服务等医疗功效;不符中医理论的内容,如宣传单味中药或药食同源食物治疗疾病。5.2 宣扬伪科学,包括但不限于: 无科学依据的食物相克、违背自然规律等内容;违背现有的大众认可的科学理论的内容宣扬封建迷信等内容。5.3 平台不倡导不友好的、可能会引起用户生理心理不适的内容,包括但不限于: 5.3.1 血腥暴力内容,例如: 死亡事故现场图以及人体受到物理伤害的展示图,如烧伤、血流不止等;有人体器官或脏器等的医学科普实例图,图片部分内容引人不适;图片使用鬼怪正脸且较大等直观惊悚形象,引起读者不适;动物撕咬进食或蛇虫等近距离特写、密集镜头,容易引人不适;5.3.2. 惊悚恐怖内容 恐怖灵异画面的图集、视频、音频内容;真实涉及恐怖因素刑侦案件描述;都市灵异事件讲述,民间悬疑故事;恐怖灵异悬疑的小说漫画游戏作品;5.3.3 煽动、夸大、误导类的标题,包括但不限于以下情况: 以浮夸的描述,煽动人群做/不做某行为的浮夸描述;标题故意隐藏关键信息或无中生有部分信息,以误导类的内容、描述,或者缺失、掩盖、歪曲事件具体信息和情况,使用户可能对时效性话题、事件产生错误理解或者不当关联的内容。5.3.4 平台不倡导可能降低用户体验的内容,包括但不限于: 简单拼凑的无意义无逻辑内容,如重复文字堆砌的内容题文无关:标题与正文内容/中心思想无关,或关联内容篇幅较小;视频内容异常,如画质模糊、内容不完整、音画不相关等;制作混剪、拼接、P图等可能误导或欺骗用户的内容;发布不完整内容、骚扰性动图、多个账号二维码或荐文链接,导流至个人联系方式、其他公众号、视频号或第三方平台;通过外链、公众号发送消息等方式,强制或诱导用户关注公众号,提供奖励(实物奖品、虚拟奖品等)。 6、 营销推广平台不鼓励仅以营销、广告为目的,缺乏实际价值的宣传和营销推广,甚至虚假宣传的内容;包括但不限于: 仅为组织宣传、商业推广广告的文章;以促进销售为主要目的的广告内容,包含折扣优惠的内容;强制或提供奖励诱导用户关注公众号。 三、其他1、 本运营规范是在《微信公众平台服务协议》 和《微信公众平台运营规范》基础上对推荐场景进行解释和说明。相关内容和举例旨在帮助公众号运营者更加清晰地理解和遵守推荐相关协议和规则,以便能够更加顺利地在微信公众平台被推荐。 2、 本运营规范为动态文档,我们会根据相关法律法规更新或产品运营的需要对其内容进行修改并更新,你可以及时查看以便获得最新信息。 我是立十,非官方人员💍公众号💍运营资深忠实粉丝,专注回答社区中关于公众号问题。
2023-08-07 - 微信搜一搜优化教程
一、如何让公众号文章获取更多搜索流量?https://mp.weixin.qq.com/s/v00sCcW0BKchxgkRf3_bwg 二、为什么微信公众号文章搜不到?https://mp.weixin.qq.com/s/FTNvYMAYvvgfg0qtH4QsGQ 三、昵称、描述、菜单,提升帐号流量需注意这3点!https://mp.weixin.qq.com/s/FElAvnGI7jx52gp7hSmb9g 四、保持帐号活跃,并提供稳定服务。https://mp.weixin.qq.com/s/wLYDghkTafpUn_N83VMGwQ 官方出品必是精品。
2023-01-13 - 违规案例:iOS虚拟支付
虚拟支付业务是指购买非实物商品的支付业务。比如:录制视频VIP会员、录制课程、录制音频等虚拟产品。在小程序生态中,基于苹果的运营规范,小程序内暂不支持iOS端的虚拟支付业务。 那究竟有哪些具体的虚拟支付业务,在iOS端是不支持的呢? 又该如何及时调整不合规的虚拟支付业务?不然,将面临怎样的处罚机制? 一起通过视频来了解一下。 [视频]
2021-11-17 - 『隐私设置』小程序如何设置隐私保护权限接口,防止线上登录失败,点击按钮没反应
很多用户突然遇到线上版本报错、登录失败、点击没有反应等等情况,其实都是由于最近隐私协议生效了的原因,需要按照以下步骤自行设置更新一下隐私协议,然后提交版本重新发版。 一、设置《小程序用户隐私保护指引》 开发者需登录小程序后台https://mp.weixin.qq.com/,在左侧菜单底部“设置”里找到 “服务内容声明“,在这里更新《用户隐私保护指引》。 注意:需要把用到的隐私接口都加上,提交后是需要审核的,通过才可以测试用,大约2-5个小时左右就会有结果,隐私接口可参考: https://developers.weixin.qq.com/miniprogram/dev/framework/user-privacy/miniprogram-intro.html [图片] [图片] 二、填写《小程序用户隐私保护指引》 [图片] 注意:上述第一条里需要把用到的隐私接口都加上才管用,点击没反应用不了都是因为缺了 提交后是需要审核的,大约2-5个小时左右就会有结果,隐私接口可参考: https://developers.weixin.qq.com/miniprogram/dev/framework/user-privacy/miniprogram-intro.html 审核通过后也不是立马生效的,会根据用户的使用情况慢慢覆盖所有用户,所以通过后耐心等待30分钟到1个小时之后再尝试,如果还不行,大概率配置的接口拉下了。 还有一点很重要,下边最后一条: 三、如要进行代码提审,需要勾选 “采集用户隐私” [图片] 很多人遇到隐私接口审核通过了,还是不能用的情况,一是需要等待1个小时左右覆盖到你才可以用,二是以下介绍的: 如果之前发版没有勾选这个《采集用户隐私》,即使隐私协议接口审核通过了,也是不能正常调用的,这时候需要你重新提交代码审核发布一版了,记得勾选这个采集用户隐私。 最好是隐私接口审核通过后,用开发者工具自己多测测,没问题再提交版本审核,开发者工具里“清除授权数据”就会重置隐私接口权限。
2023-11-04 - 已经注销的微信公众号,appid如下,现在要着急取消绑定已经注销的微信公众号绑定的第三方授权?
[图片]
2023-10-16 - 如何知道小程序人员的openid,想要获取改人员关注公众号的openid,进行公众号模板消息推送?
1.023 年 9 月 20 日起(以下简称 “生效期”),下发统一消息接口将被收回,原来使用的是小程序的openid ,给人员推送公众号模板消息,现在要换成公众号模板消息接口,进行推送。 2.想问一下,我如何通过现有的小程序openid 获取公众号的openid呢。获取有什么其他方案,能把两个openid进行统一呢 [图片] [图片]
2023-10-12 - 微信注销提示有小程序?到公众平台登入又没有?
我需要在注销一个微信小号,但是提示有小程序,到微信公众平台登入进去有说没有绑定小程序,请问官方这个小程序如何注销???[图片][图片][图片]
2023-03-30 - 小程序备案,审核通过了还能撤销不?
各位大神,A小程序管理员是B小程序的法人,现在B的小程序无法提审,提示(主体负责人证件号码不能为其他主体备案过),咋整呀,亲们[图片]
2023-09-13 - uniapp开发小程序接入隐私协议弹窗
全文使用Vue2语法 1.首先第一步开启隐私协议配置 manifest.json -> mp-weixin -> 增加__usePrivacyCheck__ [图片] 2.封装全局隐私协议弹窗组件 [图片] 直接贴代码(使用了原子类样式,看含义应该能看出样式布局,弹窗样式不固定各位自由发挥,这里就不贴全局原子类样式了,具体显示如下图) [图片] <template> <view v-if="showPrivacyAuthModel" class="kiwi-modal show animate-fade-in" @touchmove.stop.prevent="stopMove"> <view class="kiwi-dialog "> <view class="kiwi-bar bg-white justify-end"> <view class="content text-bold">{{ name }}</view> </view> <view class="padding-lr-50 padding-tb-20 bg-white"> <view class="text-left padding-bottom-10 text-aj text-indent"> 在你使用【{{ name }}】 服务之前,请仔细阅读<text class="text-blue" @click="ready"> 《{{ name }}隐私保护指引》</text>。如你同意《{{ name }}隐私保护指引》,请点击“同意”开始使用【{{ name }}】。 </view> </view> <view class="kiwi-bar bg-white border-top footer padding-tb-20" :class="showCancel ? 'flex-center-between double padding-lr-20' : 'flex-center-center '"> <button v-if="showCancel" class="kiwi-btn line-grey btn cancel" @click.stop="cancel"> 拒绝 </button> <button class="kiwi-btn bg-green btn confirm" id="agree-btn" open-type="agreePrivacyAuthorization" @agreeprivacyauthorization="confirm"> 同意 </button> </view> </view> </view> </template> <script> export default { name: 'privacy-auth-model', //隐私协议弹窗组件 props: { showCancel: { type: Boolean, default: true, }, }, data() { return { showPrivacyAuthModel:false, name: '小程序名称' } }, bus:{ //下方有全局事件委托插件源码 closePrivacyModel(){//全局事件委托,为了同时关闭其他页面弹出的隐私协议弹窗,例如同时打开的几个tab页面 this.showPrivacyAuthModel = false }, }, mounted() { this.onNeedPrivacyAuthorization() }, methods: { /** * @desc: 用户点击拒绝按钮 * @Author: wkiwi * @function: onNeedPrivacyAuthorization */ handleDisAgreePrivacyAuthorization() { this.showPrivacyAuthModel = false this.resolvePrivacyAuthorization&&this.resolvePrivacyAuthorization({ event: 'disagree' }) }, /** * @desc: 用户点击同意按钮 * @Author: wkiwi * @function: handleAgreePrivacyAuthorization */ handleAgreePrivacyAuthorization() { this.showPrivacyAuthModel = false this.resolvePrivacyAuthorization&&this.resolvePrivacyAuthorization({ buttonId: 'agree-btn', event: 'agree' }) this.$bus('closePrivacyModel') //关闭其他页面授权弹窗 //下方有全局事件委托插件源码 }, /** * @desc: 监听调用隐私API回调 * @Author: wkiwi * @function: onNeedPrivacyAuthorization */ onNeedPrivacyAuthorization(){ if(!wx.onNeedPrivacyAuthorization){ return } let _this = this wx.onNeedPrivacyAuthorization(resolve=>{ console.log('onNeedPrivacyAuthorization'); _this.showPrivacyAuthModel = true _this.resolvePrivacyAuthorization = resolve }) }, cancel () { this.handleDisAgreePrivacyAuthorization() console.log('cancel'); this.$emit('cancel')//组件外部事件预留 }, stopMove () { //遮罩层拦截页面滚动事件 return false }, confirm() { this.handleAgreePrivacyAuthorization() console.log('confirm'); this.$emit('confirm')//组件外部事件预留 }, ready(){ uni.openPrivacyContract({ success: () => {}, // 打开成功 fail: () => {}, // 打开失败 }) }, }, } </script> <style scoped lang="scss"> </style> 3.全局引入隐私协议插件与Bus事件委托 [图片] [图片] bus工具插件代码 import Vue from 'vue'; const bus = new Vue(); /** * 使用方式 * Vue.use(Bus) * this.$bus('eventName', id); * * bus: { * eventName(id) { * console.log(id); * } * } */ export default { install(Vue) { Vue.prototype.$bus = (type, ...args) => { bus.$emit(type, ...args); }; Vue.mixin({ beforeCreate() { const busOptions = this.$options.bus; if (busOptions) { this.$_bus = []; const addListeners = (map) => { for (const event in map) { const handler = map[event].bind(this); bus.$on(event, handler); this.$_bus.push({ event, handler }); } }; if (Array.isArray(busOptions)) { busOptions.forEach(addListeners); } else { addListeners(busOptions); } } }, beforeDestroy() { if (this.$_bus) { for (const listener of this.$_bus) { bus.$off(listener.event, listener.handler); } } } }); Vue.config.optionMergeStrategies.bus = (parent, child, vm) => { if (Array.isArray(parent)) { if (Array.isArray(child)) { return parent.concat(child); } else { parent.push(child); return parent; } } else if (Array.isArray(child)) { child.push(parent); return child; } else if (parent && child) { return [parent, child]; } else if (parent) { return parent; } return child; }; } }; 4.页面使用隐私协议插件 [图片] [图片] 此组件可以在页面主动触发显示隐私协议弹窗,也可以由组件内部的onNeedPrivacyAuthorization被动触发显示,多个tab页面引入显示时,若该页面引入了该组件,该页面调用隐私相关接口,将被动触发组件的显示,用户同意隐私协议时可同步关闭所有打开中的隐私协议弹窗组件。
2023-08-31 - 小程序隐私保护授权弹窗组件(Taro和原生版本)
【原生】https://github.com/hsuna/miniprogram-privacy-popup 【Taro】https://github.com/hsuna/taro-privacy-popup 隐私政策弹窗封装: 项目引入privacyPopup组件,在所有使用到隐私授权的页面引入privacyPopup即可,组件内部注册了onNeedPrivacyAuthorization,且通过队列的方式统一管理隐私授权的回调,无需开发者在页面做其他特殊的处理。. 在 page.wxml 中使用组件 针对Input的封装组件 由于Input无法触发onNeedPrivacyAuthorization,使用插槽的形式,通过getPrivacySetting获取用户隐私状态,在用户未同意的情况下,通过catch:touchstart拦截用户点击交互,使用wx.requirePrivacyAuthorize触发onNeedPrivacyAuthorization事件。. 在 page.wxml 中使用组件,并包裹触点区域
2023-09-03 - 适配新版获取昵称头像、隐私保护协议接口
蛮记录一下,虽然官方新版获取昵称、头像的api上线已久 目前的做法是封装了一个auth.js用来专门获取用户信息,想要实现的效果是 1、若用户没有授权过昵称、头像,则弹出授权弹窗 2、若用户有授权过,则直接返回昵称头像等其他用户信息 3、允许更新用户信息,也就是不管之前有没有授权过昵称头像,都会再次弹出授权弹窗 4、支持旧版api,主要是考虑到部分用户的微信客户端可能长期未更新,不支持新版api 另外也适配了最近的隐私接口功能。因为获取昵称组件是一个input,不会触发wx.onNeedPrivacyAuthorization,所以这里是给input加了一个catch:touchstart="requirePrivacyAuthorize",在requirePrivacyAuthorize里面调用wx.requirePrivacyAuthorize,从而触发wx.onNeedPrivacyAuthorization。具体代码可以看下improveUserProfile.wxml、improveUserProfile.js 主要代码如下,核心方法 authProcess: auth.js const api = require('/api.js'); const file = require("/file.js"); /** * 保存或者更新用户信息到云端 * @param userInfo * @returns {Promise<unknown>} * @private */ const _saveOrUpdateUserInfo = function (userInfo) { return new Promise((resolve, reject) => { api.router.callCloudUserCenterFunction("UserInfoHandler/saveOrUpdateUserInfo", userInfo, res => { console.log("保存用户信息到云端完毕=>", JSON.stringify(res)); resolve(res); }, res => { console.error("保存用户信息到云端失败=>", res); reject(); } ); }); }; /** * 发起后端请求前先获取用户信息 * 使用新版获取用户信息接口 * @param app * @param basePage * @param update 等于true时表示更新用户信息 * @returns {Promise<any>} */ const authProcess = function (app, basePage, update) { return new Promise(function (resolve, reject) { if (update) { console.log("更新用户信息,重新授权"); _getUserProfile(app, basePage).then(res => resolve(res)).catch(res => reject(res)); } else if (!app.globalData.userInfo.authEver) { console.log("没有用户授权信息,开始授权"); _getUserProfile(app, basePage).then(res => resolve(res)).catch(res => reject(res)); } else { console.log("用户有授权过,无需重新授权"); resolve(app.globalData.userInfo); } }); }; /** * 使用新版接口获取用户信息 * 兼容新版头像昵称填写能力 * @param app * @param basePage * @private */ const _getUserProfile = function (app, basePage) { return new Promise(function (resolve, reject) { const supportChooseAvatar = wx.canIUse('button.open-type.chooseAvatar'); if (supportChooseAvatar) { console.warn("支持头像昵称填写能力"); const improveUserProfile = basePage.improveUserProfile || basePage.selectComponent('#improveUserProfile'); const toast = basePage.toast || basePage.selectComponent('#toast'); if (!improveUserProfile) { console.error("完善用户资料组件缺失,无法继续"); reject("完善用户资料组件缺失"); } else if (!toast) { console.error("toast组件缺失,无法继续"); reject("toast组件缺失"); } else { improveUserProfile.show(({nickName, avatarUrl}) => { const {openid, avatarFileId: oldAvatarFileId} = app.globalData.userInfo; const targetPath = _getHeaderPath(openid); console.log("上传获取到的临时头像:", avatarUrl); toast.showLoadingToast({text: "开始上传头像"}); file.uploadCloudFile(targetPath, avatarUrl).then(fileId => { file.getTempFileURL(fileId).then(fileUrl => { toast.hideLoadingToast(); _getUserProfileCallback(app, basePage, { userInfo: { nickName, avatarUrl: fileUrl, avatarFileId: fileId } }).then(userInfo => resolve(userInfo)); if (oldAvatarFileId) { console.log("删除旧的云储存头像文件", oldAvatarFileId); file.deleteCloudFile([oldAvatarFileId]).then(); } }).catch(res => { toast.hideLoadingToast(); toast.showToast({text: "保存头像链接失败"}); reject("保存头像链接失败"); }) }).catch(res => { toast.hideLoadingToast(); toast.showToast({text: "头像上传失败"}); reject("头像上传失败"); }); file.onUploadProgressUpdate(progress => { toast.showLoadingToast({text: "上传了" + progress + "%"}); }); }, res => { console.log("用户拒绝授权信息:", res); reject(res); }); //reject("需要使用新api授权用户信息"); } } else { console.warn("不支持头像昵称填写能力"); api.getUserProfile( res => { _getUserProfileCallback(app, basePage, res).then(userInfo => resolve(userInfo)); }, res => { console.error("获取用户信息失败:", res); reject(res); } ); //reject("需要使用旧api授权用户信息"); } }); }; /** * 获取到用户信息的后续逻辑 * @param app * @param basePage * @param result * @returns {Promise<unknown>} * @private */ const _getUserProfileCallback = (app, basePage, result) => { return new Promise(function (resolve, reject) { console.log("获取用户信息结果:", JSON.stringify(result)); let {userInfo} = result; //authEver=true时后端做更新操作,false时新增操作 const {authEver} = app.globalData.userInfo || {}; userInfo = Object.assign(app.globalData.userInfo || {}, userInfo, {ready: true, authEver: true}); basePage.setData({ userInfo, }, () => { _saveOrUpdateUserInfo(Object.assign({}, userInfo, {authEver})).then(res => { console.log("用户信息保存完毕,更新后的用户信息:", res); const result = res.result; if (result.success) { userInfo = Object.assign(app.globalData.userInfo || {}, userInfo); basePage.setData({ userInfo, }); } resolve(userInfo); }).catch(res => reject()); }); }); } /** * 获取头像地址 * 不同项目可以自行调整 * @param openid * @returns {string} * @private */ const _getHeaderPath = (openid) => { return "images/" + openid + "/avatarUrl_" + new Date().getTime() + ".webp"; } module.exports = { setUserInfo2Data, authProcess }; 昵称、头像授权弹窗自定义组件 improveUserProfile.wxml <view class="container" wx:if="{{show}}"> <view class="cover {{showCoverAnimation?'cover-fade-in':''}}" catch:touchmove="return"></view> <view class="improve-box {{showBoxAnimation?'slade-in':''}} {{device.isPhoneX? 'phx_68':''}}" catch:touchmove="return"> <view class="title flex-start-horizontal"> <view class="logo"> <image class="icon" src="xxxx"></image> </view> <view class="mini-name">恋爱小清单 申请</view> </view> <view class="tips"> <view class="tip">获取你的昵称、头像</view> <view class="use-for">用于个人中心、共享清单、恋人圈以及分享时展示</view> </view> <form catchsubmit="saveUserInfo"> <view class="info-item flex-center"> <view class="label">头像</view> <view class="input-content flex-full more"> <button class="reset-btn flex-column-left" style="height:100%" open-type="chooseAvatar" bind:chooseavatar="onChooseAvatar"> <view class="choose-avatar before" wx:if="{{!avatarUrl}}"> <image class="icon" src="/images/me/choose-avatar.png"></image> </view> <image class="choose-avatar after" src="{{avatarUrl}}" wx:else></image> </button> </view> </view> <view class="info-item flex-center no-border"> <view class="label">昵称</view> <input class="input-content flex-full more" model:value="{{nickName}}" type="nickname" placeholder="输入昵称" placeholder-class="edit-placeholder" focus="{{nickNameFocus}}" always-embed="{{false}}" adjust-position="{{true}}" hold-keyboard="{{false}}" name="nickName" catch:touchstart="requirePrivacyAuthorize"></input> </view> <view class="buttons flex-center"> <button class="cancel reset-btn" form-type="reset" bindtap="close">拒绝</button> <button class="save reset-btn" form-type="submit">保存</button> </view> <!--隐藏参数区域开始--> <input disabled style="display:none;" name="avatarUrl" value="{{avatarUrl}}"></input> <!--隐藏参数区域结束--> </form> </view> </view> <!--toast--> <toast id="toast"></toast> improveUserProfile.wxss @import "/app.wxss"; .cover{ background-color: #111; opacity: 0; position: fixed; left: 0; top: 0; right: 0; bottom: 0; z-index: 5000; transition: opacity .3s; } .improve-box{ position: fixed; left: 0rpx; right: 0rpx; bottom: 0rpx; z-index: 5100; background-color: #fff; box-sizing: border-box; padding-top: 60rpx; padding-left: 50rpx; padding-right: 50rpx; border-radius: 30rpx 30rpx 0 0; transform: translateY(100%); transition: transform .3s, bottom .3s; } .cover-fade-in{ opacity: 0.7; } .slade-in{ transform: translateY(0); bottom: 0rpx; } .improve-box .title{ font-size: 32rpx; font-weight: 500; text-align: center; margin-bottom: 40rpx; color: #161616; } .improve-box .title .icon{ width: 46rpx; height: 46rpx; margin-right: 8rpx; vertical-align: bottom; border-radius: 50%; } .improve-box .title .mini-name{ /*margin-bottom: 2rpx;*/ } .improve-box .tips{ margin-bottom: 20rpx; } .improve-box .tips .tip{ color: #121212; font-size: 34rpx; font-weight: 500; margin-bottom: 12rpx; } .improve-box .tips .use-for{ color: #606266; font-size: 28rpx; margin-bottom: 20rpx; } .improve-box .info-item{ /*margin-bottom: 30rpx;*/ border-bottom: 1rpx solid #f0f0f0; } .improve-box .label{ margin-right: 40rpx; font-size: 32rpx; color: #404040; padding: 30rpx 0 30rpx; } .improve-box .choose-avatar.after{ width: 48rpx; height: 48rpx; display: block; border-radius: 10rpx; } .improve-box .choose-avatar.before{ background-color: #f0f0f0; width: 48rpx; height: 48rpx; display: block; border-radius: 10rpx; padding: 8rpx; box-sizing: border-box; } .improve-box .choose-avatar.before .icon{ width: 100%; height: 100%; display: block; } .improve-box .input-content{ width: 100%; font-size: 32rpx; min-height: 80rpx; height: 80rpx; line-height: 80rpx; border-radius: 10rpx; padding-left: 20rpx; box-sizing: border-box; /*border-bottom: 1rpx solid #dcdee1;*/ position: relative; padding-right: 30rpx; } .edit-placeholder{ color: #c7c7cc; font-size: 32rpx; } .improve-box .buttons{ margin-bottom: 40rpx; margin-top: 50rpx; text-align: center; font-size: 34rpx; font-weight: 550; } .improve-box .buttons .save{ width: 220rpx !important; height: 90rpx; line-height: 90rpx; border-radius: 14rpx; color: #fff; /*background:#fff linear-gradient(90deg,rgba(246, 120, 121,.9) 10%, rgb(246, 120, 121));*/ background-color: #07c160; margin-left: -50rpx; } .improve-box .buttons .cancel{ width: 220rpx !important; height: 90rpx; line-height: 90rpx; border-radius: 14rpx; color: #07c160; background-color: #F2F2F2; } .more:after{ content: " "; transform: rotate(45deg); height: 14rpx; width: 14rpx; border-width: 2rpx 2rpx 0 0; border-color: #b2b2b2; border-style: solid; position: absolute; margin-top: -8rpx; right: 4rpx; top: 50%; transition: transform .3s; } improveUserProfile.js //获取应用实例 const app = getApp(); const api = require('../../utils/api.js'); const tabbar = require('../../utils/tabbar.js'); Component({ /** * 组件的属性列表 */ properties: {}, /** * 组件的初始数据 */ data: { show: false, showCoverAnimation: false,//显示类别选择窗口动画 showBoxAnimation: false,//显示类别选择窗口动画 avatarUrl: "", nickNameFocus: false, }, attached() { this.toast = this.selectComponent('#toast'); }, observers: { 'show': function (show) { if (!show) { console.log("获取用户昵称头像弹窗关闭,昵称输入框状态复位"); this.setData({ nickNameFocus: false }) } } }, /** * 组件的方法列表 */ methods: { show(successCallback, failCallback) { const device = app.getSystemInfo(); this.setData({ show: true, device, successCallback, failCallback }, () => { this.setData({ showCoverAnimation: true, showBoxAnimation: true }); }) tabbar.hideTab(this); }, hide() { this.setData({ showCoverAnimation: false, showBoxAnimation: false }, () => { const that = this; setTimeout(function () { that.setData({ show: false }) tabbar.showTab(that); }, 300) }) }, close() { const {failCallback} = this.data; typeof failCallback == 'function' && failCallback("用户拒绝授权"); this.hide(); }, onChooseAvatar(e) { console.log("选择头像:", e); const {avatarUrl} = e.detail; this.setData({ avatarUrl }) }, /** * 模拟隐私接口调用,并触发隐私弹窗逻辑 */ requirePrivacyAuthorize() { if (wx.requirePrivacyAuthorize) { console.warn("当前基础库支持api wx.requirePrivacyAuthorize"); wx.requirePrivacyAuthorize({ success: res => { console.log('用户同意了隐私协议 或 无需用户同意隐私协议'); //用户同意隐私协议后给昵称输入框聚焦 this.setData({ nickNameFocus: true }) }, fail: res => { console.log('用户拒绝了隐私协议'); } }) } else { console.warn("当前基础库不支持api wx.requirePrivacyAuthorize"); this.setData({ nickNameFocus: true }) } }, saveUserInfo(e) { console.log("保存用户资料:", e); const {nickName, avatarUrl} = e.detail.value; if (!avatarUrl) { this.toast.showToast({text: "请选择头像"}); return; } if (!nickName) { this.toast.showToast({text: "请输入昵称"}); return; } const {successCallback} = this.data; typeof successCallback == 'function' && successCallback({nickName, avatarUrl}); this.hide(); } } }); 弹窗效果 [图片]
2023-08-30