第三方平台代微信公众号开发

2023-11-18

第三方平台代微信公众号开发流程

一:准备工作

㈠ 微信开放平台相关

申请微信开放平台账号后,需前往微信开放平台,创建第三方平台,填写开发相关配置:

 

    1. 填写授权流程相关配置:

注意事项:

⑴ 授权发起页域名:为项目开发使用域名,调用公众号二维码授权页时,必须由本域名下页面发起,授权页会对调用它的页面请求信息Request Headers中的Referer内容进行校验,判断是否与微信第三方平台上填写的配置一致。
⑵  授权测试公众号列表:如未填写,在第三方平台扫码授权时,微信公众号无法获取公众号信息,微信小程序无法显示需要授权的小程序。

 

1.2 填写授权后实现业务相关配置:

注意事项:
⑴ 消息校验Token和消息加解密Key:消息推送、事件推送时,验证消息体的正确性,及对消息加解密,具体可见微信开放平台开发资源文档的消息加解密说明,可直接获取示例代码。
⑵ 公众号开发域名:校验文件需放到域名根目录下,①项目本地编译器启动,校验文件放到项目根目录下;②项目部署服务器启动,校验文件放到域名对应服务器的根目录下。所填写的域名必须有公网访问权限。

1.3 开发服务器IP白名单


服务器IP有内外网之分时,此处填写的为外网IP。可通过首次部署后,调用微信API查看返回日志信息获取。

1.4 全网发布

  第三方开发者在使用授权测试公众号列表中所填写的测试白名单中的公众号自行测试完成后,可以申请全网发布,并等待审核通过。审核通过后,第三方平台可以面向所有符合要求的公众号进行登录授权。
为了确保经过全网发布的第三方平台都是可用的,微信服务器会自动对提交全网发布的第三方平台进行基础消息逻辑检测,以确保第三方平台稳定。具体检测过程说明请见 【全网发布接入检测说明】

㈡ 服务器相关:


  2.1 服务器权限:

服务器访问有网关限制时,与微信服务器互访需做以下申请:

⑴ 申请访问微信服务器权限:
可根据微信公众号API文档,申请对域名api.weixin.qq.com,mp.weixin.qq.com的访问权限。

⑵ 申请微信服务器回访权限:
①可查看微信公众平台技术文档,获取微信服务器IP地址接口文档,通过该接口获得微信服务器IP地址列表或者IP网段信息,申请获取到的IP列表可回访通过

② 申请腾讯云服务器,将项目部署在其上。

2.2 服务器jar包升级:
  由于需要对微信消息加解密,使用JDK原有jar包,出现异常:
java.security.InvalidKeyException:illegal Key Size,解决方案在官方网站下载JCE无限制权限策略文件(JDK7的下载地址

  下载后解压,可以看到local_policy.jar和US_export_policy.jar以及readme.txt,如果安装了JRE,将两个jar文件放到%JRE_HOME%\lib\security目录下覆盖原来的文件;如果安装了JDK,将两个jar文件放到%JDK_HOME%\jre\lib\security目录下覆盖原来文件

二:授权流程

   公众平台第三方平台是为了让公众号或小程序运营者,在面向垂直行业需求时,可以一键授权给第三方平台(并且可以同时授权给多家第三方),通过第三方平台来完成业务,具体授权流程如图:

步骤1:第三方平台方获取预授权码(pre_auth_code)

获取预授权码,配置入调用授权二维码页面路径中。
步骤2:引入用户进入授权页

引导页面调起授权二维码页面,展示授权二维码。

步骤3:用户确认并同意登录授权给第三方平台方

授权用户使用微信客户端扫码后,点击同意授权。

步骤4:授权后回调URI,得到授权码(authorization_code)和过期时间

可通过回调URI设置使用第三方平台的授权用户信息,及获取公众号基础信息。

步骤5:利用授权码调用公众号或小程序的相关API

获取维护公众号或小程序接口调用的令牌authorizer_access_token。

三:公众号或小程序接口调用令牌维护

    授权用户一键授权公众号后,后续相关功能开发(即调用微信公众号API)均会使用接口调用令牌authorizer_access_token。根据微信技术文档上说明,此token是2小时刷新一次,开发者需要自行进行token的缓存,避免token的获取次数达到每日的限定额度,所以维护token的时效性至关重要。

以下为令牌维护的一种实现方案:
⑴ 用户进行一键授权公众号,通过授权信息及调用获取token API获取token。

⑵ 将token放入Redis缓存和保存MySQL数据库持久化,设置token缓存有效期为1.5h。

⑶ 通过定时任务,每5min判断一次缓存数据是否过期,未过期不处理,过期调用获取token API更新令牌。

⑷ 如果token缓存数据过期,有新的请求需要token,查询缓存无果,可从数据库获取,待下次定时到达时,判断缓存过期,重新调用获取token API获取,并补充入缓存和数据库。

示例图如下:

四:开发过程中遇到的问题

1.在接收到微信服务器消息及事件推送时,如何正确回复success?
    微信技术开发文档说明如下:代开发公众号服务器,在收到微信服务器消息及事件推送时,需在五秒内回复“success”或者“”(空串)假如服务器无法保证在五秒内处理回复,则必须回复“success”或者“”(空串),否则微信后台会发起三次重试。三次重试后,依旧没有及时回复任何内容,系统自动在粉丝会话界面出现错误提示“该公众号暂时无法提供服务,请稍后再试”。

①五秒内可回复:

 

②五秒内无法回复:

2.如何实现授权用户连续扫码授权?

调用授权二维码页面时,请求路径需要预授权码入参,微信技术文档显示,预授权码有效期10min。实际开发发现,如果同一预授权码,两个授权用户发起授权页扫码,先扫码确认的用户将先使用这个预授权码,导致后一用户将无法正常授权。解决方案:保证每次调起授权页的预授权码必须是新的

3.如何实现微信公众号群发剩余次数与微信公众MP后台保持一致?

    在用户使用第三方平台时,对于微信公众号的群发功能,既可能需要在第三方平台使用,也可能需要在微信公众MP后台使用。但是根据微信群发API文档,在公众平台网站上为服务号提供每月(自然月)4条的群发权限微信公众MP后台可展示群发剩余次数,次数用尽,群发按钮置灰,如何做到第三方平台群发剩余次数与微信公众MP后台保持同步?

    微信群发API文档显示,微信公众号群发有两种类型:①根据标签进行群发,②根据OpenID列表群发。微信公众MP后台,使用的是根据标签群发类型。在调用群发API接口时,提交群发消息给微信服务器成功后,会返回msg_id字段(消息发送任务的ID),群发消息结果以事件推送形式通知开发者服务器,推送的消息内容中亦含有msg_id字段,与提交结果返回的msg_id字段值一致。一旦公众号授权到第三方平台后,在微信公众MP后台发送的群发消息,群发消息结果也会以事件推送形式通知开发者服务器,内容也包含msg_id字段。

   解决方案:第三方平台群发功能使用根据标签群发类型,可以记录第三方平台公众号群发提交的msg_id与对应公众号的唯一标识,msg_id做为判断条件,计算第三方平台群发剩余次数,以便展示。

流程图:

4.如何实现同一篇图文消息,避免重复上传微信服务器?

    上传到微信服务器的图文消息,会作为永久素材展示在微信公众MP后台的素材库中,在使用同一篇图文消息,进行各类型消息发送时(群发消息,客服消息),必须保证只被上传一次。发送各类消息前,需将图文消息上传到微信永久素材,获取此条图文素材对应的media_id,然后使用media_id进行消息发送。即同一公众号号,同一篇图文,上传获取一次media_id(不同公众号对应同一篇图文,media_id不同)。

    解决方案:第三方平台创建图文消息保存时,对图文的标题、作者、摘要、内容、封面图片、原文地址字段做MD5加密,得到md5值,与图文id保存入素材表。上传图文获取到media_id后,将公众号唯一标识appid,图文id,md5值,media_id对应保存入中间表。待同一篇图文再次上传时,通过appid和图文id查询中间表,得到md5值,与上传图文的md5值对比,相同使用原有media_id,不相同重新上传获取media_id并更改中间表。

流程图:

 

5.上传图文素材时,如何准确的将图文内容中图片替换成微信域名下图片?

    在图文编辑阶段,用户很可能直接从某个网页直接复制一些可用的图文,复制的图文在本平台编辑器中回显时,由于编辑器兼容性问题,可能显示不正常。

   为了保证复制后的图文显示正常,在图文复制后,会将图文中的图片链接进行统一获取,上传本平台文件资源服务器,转换成本平台域名下的图片显示,并以字段储存。在调用微信上传图文素材是,可直接遍历字段中的链接,获取到微信域名下的链接后,替换图文中的原有路径。

6.如何在第三方平台页面展示微信服务器推送的图片、语音消息?

    图片:微信服务器推送用户发送的语音消息到第三方平台,推送的消息中包含PicUrl图片链接字段,此链接是微信域名下的链接,微信有做图片防盗处理,直接使用在第三方平台页面无法正常展示。用此字段的值,上传本平台文件资源服务器,转换成本平台域名下链接,可在页面正常展示

     语音:微信服务器推送用户发送的语音消息到第三方平台,推送的消息中包含MediaId语音消息媒体id字段,用此字段的值,调用微信获取临时素材API接口获取源文件,上传本平台文件资源服务器,转换成本平台域名下链接,可在页面正常展示

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第三方平台代微信公众号开发 的相关文章

  • 贝叶斯优化优化参数,以Kmeans为例

    文章目录 步骤一 构造黑盒目标函数 步骤二 确定取值空间 步骤三 构造贝叶斯优化器 全部代码 贝叶斯优化有几个步骤 构造黑盒目标函数 确定取值空间 构造贝叶斯优化器 下面以kmeans为例 步骤一 构造黑盒目标函数 这个函数主要是运行需要的
  • Git笔记

    一 安装Git Win10 直接到Git官网下载安装程序 按照默认选项安装即可 安装完成后 在开始菜单里找到Git gt Git Bash 打开弹出类似命令行的窗口 则说明Git安装成功 安装完成后还需要对Git进一步设置 在命令行输入 g
  • ubuntu18.04 git clone:Failed to connect to github.com port 443: Connection refused

    git clone问题记录 一 Failed to connect to github com port 443 Connection refused 1 问题 2 解决方法 3 参考博文 二 gnutls handshake failed
  • Golang并发安全和锁

    目录 场景 互斥锁 读写互斥锁 互斥锁 读写锁 Sync Once sync Map 定时器 场景 有时候在Go代码中可能会存在多个goroutine同时操作一个资源 临界区 这种情况会发生竞态问题 数据竞态 类比现实生活中的例子有十字路口
  • Go学习笔记 : cobra 包简介

    cobra 是 go 语言的一个库 可以用于编写命令行工具 通常我们可以看到git pull docker container start apt install 等等这样命令 都可以很容易用corba来实现 另外 go 语言是很容易编译成
  • c++ 写一个头文件声明类方法,然后用一个cpp来定义类方法,最后再写一个main.cpp来调用类方法,出现找不到函数问题

    问题场景 在做 剑指offer 的面试题7 用两个栈实现一个队列 作者给出的代码只有两个文件 一个头文件和一个cpp源文件 然而从程序设计的角度来看 应当将头文件中的声明留在头文件中 函数的实现应当写在cpp源文件中 写完代码后 运行然而出
  • 淘特app x-sign参数签名分析

    之前看见大佬说淘特app的风控比tb的要小很多 于是学习了下t特的签名分析 一 抓包分析 通过Charles抓包分析 分析请求参数 headers x sgext JAWowlF3DRjHdjoiU 2Flc38K43prxmuGa9Jv3
  • OpenGL纹理UV动画

    http www codesampler com oglsrc htm OpenGL纹理UV动画 分类 C OpenGL 随想 感想 2013 07 08 15 34 162人阅读 评论 0 收藏 举报 opengl 动画 UV动画 Ope
  • 解决前端websocket数据帧接收数据大小限制(数据分帧)问题

    websocket前后台出现问题解决方法 一开始通过限制后台返回数据帧以125字节分隔分段数据返回给前台 但调试时发现只要加上其他的一些信息返回json string很容易就会超过了125字节 于是在后台修改了这个限制大小为2048 但是这
  • react的条件渲染(或者组件渲染)五种方式 --开发基础总结

    1 使用if的方式判断是否渲染某个组件 function UserGreeting props return h1 Welcome back h1 function GuestGreeting props return h1 Please
  • [转]JDBC中日期时间的处理技巧

    Java中用类java util Date对日期 时间做了封装 此类提供了对年 月 日 时 分 秒 毫秒以及时区的控制方法 同时也提供一些工具方法 比如日期 时间的比较 前后判断等 java util Date中采用一个long型的数来保存
  • 关于Android Studio使用intent跳转到新的Activity出现not an enclosing class报错的解决办法

    目前遇到not an enclosing class这个问题两次 分别是犯了不同的错误 1 第一个参数输入错误 第一个参数应该是当前活动的上下文 也就是当前Activity的参数 例如我的当前Activity是MainActivity 要跳
  • LeetCode:283(Python)—— 移动零(简单)

    移动零 概述 给定一个数组 nums 编写一个函数将所有 0 移动到数组的末尾 同时保持非零元素的相对顺序 请注意 必须在不复制数组的情况下原地对数组进行操作 输入 nums 0 1 0 3 12 输出 1 3 12 0 0 输入 nums
  • 同样将AI装进“办公全家桶”,Microsoft 与 Google有何不同?

    继GPT 4发布之后 北美时间3月16日 微软在 The Future of Work With AI 大会上发布了Microsoft 365 Copilot 再次掀起一股科技圈浪潮 据介绍 Microsoft 365 Copilot是一种
  • C和C++结构体的区别

    C语言中的结构体只涉及到数据结构 而不涉及到算法 也就是说在C中数据结构和算法是分离的 换句话说就是C语言中的结构体只能定义成员变量 但是不能定义成员函数 然而在C 中既可以定义成员变量又可以定义成员函数 C 中的结构体和类体现了数据结构和
  • Linux系统shell脚本之检测两台服务器指定目录下的文件一致性

    Linux系统shell脚本之检测两台服务器指定目录下的文件一致性 一 脚本要求 二 脚本内容 三 测试设置 1 server1创建文件 2 server2创建文件 3 配置ssh免密 四 执行脚本 一 脚本要求 检测两台服务器指定目录下的
  • 安装 Debian10 提示缺少 bnx2/bnx2-mips-06-6.2.3.fw

    安装过程中报错 提示缺少文件 如果跳过 配置网络报错 安装好后网络是配置好的 但是插上网线状态一直是down 处理过程 下载firmware bnx2 20161130 5 deb8u1 all deb u盘拷贝到debian dpkg i
  • 【基础算法】简单了解一下常见的几种散列算法?

    简单了解一下常见的几种散列算法 如果觉得对你有帮助 能否点个赞或关个注 以示鼓励笔者呢 博客目录 先点这里 前提概念 好的哈希函数 MD5 与 SHA MD5 SHA 家族 CRC MurmurHash times31 33 times33
  • QML的基本使用:建立一个简单得窗口以及一些属性的基本使用

    QML得基本使用 建立一个简单得窗口弹出式对话框 QML的基本使用之有标题栏和无标题栏的区别 首先本人使用的Qt版本是6 3 2因为公司做项目就是用的这个版本所以如果你使用的版本不一样 请自行对代码进行转换 本人建议如果版本不一样 可以通过
  • HarmonyOS应用开发者高级认证练习题

    系列文章目录 HarmonyOS应用开发者基础认证练习题 HarmonyOS应用开发者高级认证练习题 文章目录 系列文章目录 前言 一 判断 二 单选 三 多选 前言 本文所有内容来源于个人进行HarmonyOS应用开发者系列认证的学习过程

随机推荐