一:准备工作
㈠ 微信开放平台相关
申请微信开放平台账号后,需前往微信开放平台,创建第三方平台,填写开发相关配置:
注意事项:
⑴ 授权发起页域名:为项目开发使用域名,调用公众号二维码授权页时,必须由本域名下页面发起,授权页会对调用它的页面请求信息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接口获取源文件,上传本平台文件资源服务器,转换成本平台域名下链接,可在页面正常展示。