基于微信公众号的功能开发,是很多企业对外宣传推广的必要手段,企业的公众号就像是企业的一个微网站一样,是企业对外的重要窗口,如何用 Java 实现微信公众号的接口开发,V 哥这里将详细介绍。
微信公众平台是运营者通过公众号为微信用户提供资讯和服务的平台,而公众平台开放接口则是提供服务的基础,开发者在公众平台网站中创建公众号、获取接口权限后,可以通过阅读本接口文档来帮助开发。
为了识别用户,每个用户针对每个公众号会产生一个安全的OpenID,如果需要在多公众号、移动应用之间做用户共通,则需前往微信开放平台,将这些公众号和应用绑定到一个开放平台账号下,绑定后,一个用户虽然对多个公众号和应用有多个不同的OpenID,但他对所有这些同一开放平台账号下的公众号和应用,只有一个UnionID,可以在用户管理 - 获取用户基本信息(UnionID机制)文档了解详情。
请开发者注意:
-
微信公众平台开发是指为微信公众号进行业务开发,为移动应用、PC端网站、公众号第三方平台(为各行各业公众号运营者提供服务)的开发,请前往微信开放平台接入。
-
在申请到认证公众号之前,你可以先通过测试号申请系统,快速申请一个接口测试号,立即开始接口测试开发。
-
在开发过程中,可以使用接口调试工具来在线调试某些接口。
-
每个接口都有每日接口调用频次限制,可以在公众平台官网 - 开发者中心处查看具体频次。
-
在开发出现问题时,可以通过接口调用的返回码,以及报警排查指引(在公众平台官网 - 开发者中心处可以设置接口报警),来发现和解决问题。
-
公众平台以access_token为接口调用凭据,来调用接口,所有接口的调用需要先获取access_token,access_token在2小时内有效,过期需要重新获取,但1天内获取次数有限,开发者需自行存储,详见获取接口调用凭据(access_token)文档。
公众号主要通过公众号消息会话和公众号内网页来为用户提供服务的,下面分别介绍这两种情况:
- 公众号消息会话
公众号是以微信用户的一个联系人形式存在的,消息会话是公众号与用户交互的基础。目前公众号内主要有这样几类消息服务的类型,分别用于不同的场景。
1)群发消息:公众号可以以一定频次(订阅号为每天1次,服务号为每月4次),向用户群发消息,包括文字消息、图文消息、图片、视频、语音等。
2)被动回复消息:在用户给公众号发消息后,微信服务器会将消息发到开发者预先在开发者中心设置的服务器地址(开发者需要进行消息真实性验证),公众号可以在5秒内做出回复,可以回复一个消息,也可以回复命令告诉微信服务器这条消息暂不回复。被动回复消息可以设置加密(在公众平台官网的开发者中心处设置,设置后,按照消息加解密文档来进行处理。其他3种消息的调用因为是 API 调用而不是对请求的返回,所以不需要加解密)。
3)客服消息:用户在公众号内发消息/触发特定行为后,公众号可以给用户发消息。
4)模板消息:在需要对用户发送服务通知(如刷卡提醒、服务预约成功通知等)时,公众号可以用特定内容模板,主动向用户发送消息。
- 公众号内网页
许多复杂的业务场景,需要通过网页形式来提供服务,这时需要用到:
1)网页授权获取用户基本信息:通过该接口,可以获取用户的基本信息(获取用户的 OpenID 是无需用户同意的,获取用户的基本信息则需用户同意)
2)微信JS-SDK:是开发者在网页上通过 JavaScript 代码使用微信原生功能的工具包,开发者可以使用它在网页上录制和播放微信语音、监听微信分享、上传手机本地图片、拍照等许多能力。
公众平台技术文档的目的是为了简明扼要的说明接口的使用,语句难免苦涩难懂,甚至对于不同的读者,有语意歧义。万事皆是入门难,对于刚入门的开发者讲,更是难上加难。
为了降低门槛,弥补不足,我们编写了《开发者指引》来讲解微信开放平台的基础常见功能,旨在帮助大家入门微信开放平台的开发者模式。
已熟知接口使用或有一定公众平台开发经验的开发者,请直接跳过本文。这篇文章不会给你带来厉害的编码技巧亦或接口的深层次讲解。
邮箱激活后,选择公众号类型。不同的公众号拥有不同的能力,详情请见wiki:公众号接口权限说明,当然,服务号、企业号需要一定的证件和相关资料填写,如果证件一时不能准备好,没关系,公众号其实已注册,下次可以根据此邮箱&密码登录再选择。
1) 公众平台官网登录之后,找到“基本配置”菜单栏
2) 填写配置 url填写:http://外网IP/wx 。外网 IP 请到腾讯云购买成功处查询。 http的端口号固定使用80,不可填写其他。 Token:自主设置,这个 token 与公众平台 wiki 中常提的access_token不是一回事。这个 token 只用于验证开发者服务器。
微信需要访问我们项目的web接口,在开发阶段可以把项目部署在公网能访问的云服务器上,也可以使用内网穿透工具来访问我们自己电脑上运行的测试接口。
这里我们使用natapp作为内网穿透工具。
-
首先在本站注册账号:natapp.cn/register
-
登录后,点击左边 购买隧道,免费/付费均可
- 根据需要选择隧道协议,这里以web演示,购买隧道
-
本机建立web服务,使用Ideal启动springboot项目,确保 http://127.0.0.1 可以访问,如localhost:8080
-
在 natapp.cn 根据本机操作系统下载对应的客户端
- 下载之后,解压至任意目录,得到natapp.exe (linux下无需解压,直接 wget)
- 取得authtoken 在网站后台,我的隧道处,可以看到刚才购买的隧道
点击复制,即可得到 authtoken 这个authtoken便是您的隧道登录凭证.如这里得到的authtoken为9ab6b9040a624f40
- 运行natapp .
windows下,直接双击natapp.exe 即可 。在Linux/Mac 下 需要先给执行权限
然后再运行: windows ,点击开始->运行->命令行提示符 后进入 natapp.exe的目录运行
linux ,同样给予可执行权限之后,运行
注意参数输入正确性,不要有多余的空格等!
- 运行成功,都可以得到如下界面:
开发者提交信息后,微信服务器将发送 GET 请求到填写的服务器地址 URL 上,GET请求携带参数如下表所示:
开发者通过检验 signature 对请求进行校验(下面有校验方式)。若确认此次 GET 请求来自微信服务器,请原样返回 echostr 参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
1)将token、timestamp、nonce三个参数进行字典序排序 2)将三个参数字符串拼接成一个字符串进行sha1加密 3)开发者获得加密后的字符串可与 signature 对比,标识该请求来源于微信
检验 signature 的Java示例代码:
当普通微信用户向公众账号发消息时,微信服务器将 POST 消息的 XML 数据包到开发者填写的 URL 上。
请注意:
-
关于重试的消息排重,推荐使用 msgid 排重。
-
微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。详情请见“发送消息 - 被动回复消息”。
-
如果开发者需要对用户消息在5秒内立即做出回应,即使用“发送消息 - 被动回复消息”接口向用户被动回复消息时,可以在
公众平台官网的开发者中心处设置消息加密。开启加密后,用户发来的消息和开发者回复的消息都会被加密(但开发者通过客服接口等 API 调用形式向用户发送消息,则不受影响)。关于消息加解密的详细说明,请见“发送消息 - 被动回复消息加解密说明”。 各消息类型的推送 XML 数据包结构如下:
当用户发送消息给公众号时(或某些特定的用户操作引发的事件推送时),会产生一个 POST 请求,开发者可以在响应包(Get)中返回特定 XML 结构,来对该消息进行响应(现支持回复文本、图片、图文、语音、视频、音乐)。严格来说,发送被动响应消息其实并不是一种接口,而是对微信服务器发过来消息的一次回复。
微信服务器在将用户的消息发给公众号的开发者服务器地址(开发者中心处配置)后,微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次,如果在调试中,发现用户无法收到响应的消息,可以检查是否消息处理超时。关于重试的消息排重,有 msgid 的消息推荐使用 msgid 排重。事件类型消息推荐使用FromUserName + CreateTime 排重。
将回复的消息XML内容封装为Java对象进行操作,更有利于项目开发。
- 引入依赖
- 编写接口工具类
- 处理消息结果
回复带图片和文字的消息,需要使用如下参数生成的xml:
相应的代码如下:
生成图文消息:
access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。
公众平台的 API 调用所需的access_token的使用及生成方式说明:
1)建议公众号开发者使用中控服务器统一获取和刷新access_token,其他业务逻辑服务器所使用的access_token均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致access_token覆盖而影响业务;
2)目前access_token的有效期通过返回的expires_in来传达,目前是7200秒之内的值。中控服务器需要根据这个有效时间提前去刷新新access_token。在刷新过程中,中控服务器可对外继续输出的老access_token,此时公众平台后台会保证在5分钟内,新老access_token都可用,这保证了第三方业务的平滑过渡;
3)access_token的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新access_token的接口,这样便于业务服务器在 API 调用获知access_token已超时的情况下,可以触发access_token的刷新流程。
- 创建HttpUtil
- 创建AccessToken类
- 创建TokenUtil
自定义菜单能够帮助公众号丰富界面,让用户更好更快地理解公众号的功能。开启自定义菜单后,公众号界面如图所示:
请注意:
-
自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。
-
一级菜单最多4个汉字,二级菜单最多8个汉字,多出来的部分将会以“...”代替。
-
创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号 profile 页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。
自定义菜单接口可实现多种类型按钮,如下:
-
click:点击推事件用户点击 click 类型按钮后,微信服务器会通过消息接口推送消息类型为 event 的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的 key 值,开发者可以通过自定义的 key 值与用户进行交互;
-
view:跳转 URL 用户点击 view 类型按钮后,微信客户端将会打开开发者在按钮中填写的网页URL,可与网页授权获取用户基本信息接口结合,获得用户基本信息。
-
scancode_push:扫码推事件用户点击按钮后,微信客户端将调起扫一扫工具,完成扫码操作后显示扫描结果(如果是URL,将进入URL),且会将扫码的结果传给开发者,开发者可以下发消息。
-
scancode_waitmsg:扫码推事件且弹出“消息接收中”提示框用户点击按钮后,微信客户端将调起扫一扫工具,完成扫码操作后,将扫码的结果传给开发者,同时收起扫一扫工具,然后弹出“消息接收中”提示框,随后可能会收到开发者下发的消息。
-
pic_sysphoto:弹出系统拍照发图用户点击按钮后,微信客户端将调起系统相机,完成拍照操作后,会将拍摄的相片发送给开发者,并推送事件给开发者,同时收起系统相机,随后可能会收到开发者下发的消息。
-
pic_photo_or_album:弹出拍照或者相册发图用户点击按钮后,微信客户端将弹出选择器供用户选择“拍照”或者“从手机相册选择”。用户选择后即走其他两种流程。
-
pic_weixin:弹出微信相册发图器用户点击按钮后,微信客户端将调起微信相册,完成选择操作后,将选择的相片发送给开发者的服务器,并推送事件给开发者,同时收起相册,随后可能会收到开发者下发的消息。
-
location_select:弹出地理位置选择器用户点击按钮后,微信客户端将调起地理位置选择工具,完成选择操作后,将选择的地理位置发送给开发者的服务器,同时收起位置选择工具,随后可能会收到开发者下发的消息。
-
media_id:下发消息(除文本消息)用户点击media_id类型按钮后,微信服务器会将开发者填写的永久素材 id 对应的素材下发给用户,永久素材类型可以是图片、音频、视频 、图文消息。请注意:永久素材 id 必须是在“素材管理/新增永久素材”接口上传后获得的合法id。
-
view_limited:跳转图文消息 URL 用户点击view_limited类型按钮后,微信客户端将打开开发者在按钮中填写的永久素材 id 对应的图文消息URL,永久素材类型只支持图文消息。请注意:永久素材 id 必须是在“素材管理/新增永久素材”接口上传后获得的合法id。
-
article_id:用户点击 article_id 类型按钮后,微信客户端将会以卡片形式,下发开发者在按钮中填写的图文消息
-
article_view_limited:类似 view_limited,但不使用 media_id 而使用 article_id
注意: 草稿接口灰度完成后,将不再支持图文信息类型的 media_id 和 view_limited,有需要的,请使用 article_id 和 article_view_limited 代替
请注意,3到8的所有事件,仅支持微信iPhone5.4.1以上版本,和Android5.4以上版本的微信用户,旧版本微信用户点击后将没有回应,开发者也不能正常接收到事件推送。9~12,是专门给第三方平台旗下未微信认证(具体而言,是资质认证未通过)的订阅号准备的事件类型,它们是没有事件推送的,能力相对受限,其他类型的公众号不必使用。
接口调用请求说明
http请求方式:POST(请使用 https 协议) api.weixin.qq.com/cgi-bin/men…
click和 view 的请求示例
其他新增按钮类型的请求示例
参数说明
返回结果
正确时的返回 JSON 数据包如下:
错误时的返回 JSON 数据包如下(示例为无效菜单名长度):
- 封装菜单类
- 实现自定义菜单
- 处理自定义菜单事件
使用百度AI服务,实现图片的文字识别功能
- 引入依赖
- 实现图片识别
模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息。
关于使用规则,请注意:
-
所有服务号都可以在功能->添加功能插件处看到申请模板消息功能的入口,但只有认证后的服务号才可以申请模板消息的使用权限并获得该权限;
-
需要选择公众账号服务所处的2个行业,每月可更改1次所选行业;
-
在所选择行业的模板库中选用已有的模板进行调用;
-
每个账号可以同时使用25个模板。
-
当前每个账号的模板消息的日调用上限为10万次,单个模板没有特殊限制。【2014年11月18日将接口调用频率从默认的日1万次提升为日10万次,可在 MP 登录后的开发者中心查看】。当账号粉丝数超过10W/100W/1000W时,模板消息的日调用上限会相应提升,以公众号 MP 后台开发者中心页面中标明的数字为准。
关于接口文档,请注意:
-
模板消息调用时主要需要模板 ID 和模板中各参数的赋值内容;
-
模板中参数内容必须以".DATA"结尾,否则视为保留字;
-
模板保留符号""。
1)设置行业
设置行业可在微信公众平台后台完成,每月可修改行业1次,帐号仅可使用所属行业中相关的模板,为方便第三方开发者,提供通过接口调用的方式来修改账号所属行业,具体如下:
接口调用请求说明
http请求方式: POST api.weixin.qq.com/cgi-bin/tem…
POST数据说明
POST数据示例如下:
参数说明
2)创建模版
在微信公众平台根据行业模版案例创建消息模版。
3)发送模版消息
接口调用请求说明
http请求方式: POST api.weixin.qq.com/cgi-bin/mes…
POST数据说明
POST数据示例如下:
参数说明
注:url和 miniprogram 都是非必填字段,若都不传则模板无跳转;若都传,会优先跳转至小程序。开发者可根据实际需要选择其中一种跳转方式即可。当用户的微信客户端版本不支持跳小程序时,将会跳转至url。
返回码说明
在调用模板消息接口后,会返回 JSON 数据包。正常时的返回 JSON 数据包示例:
使用效果
公众号经常有需要用到一些临时性的多媒体素材的场景,例如在使用接口特别是发送消息时,对多媒体文件、多媒体消息的获取和调用等操作,是通过media_id来进行的。素材管理接口对所有认证的订阅号和服务号开放。通过本接口,公众号可以新增临时素材(即上传临时多媒体文件)。
注意点:
1)临时素材media_id是可复用的。
2)媒体文件在微信后台保存时间为3天,即3天后media_id失效。
3)上传临时素材的格式、大小限制与公众平台官网一致。
图片(image): 10M,支持PNGJPEGJPGGIF格式
语音(voice):2M,播放长度不超过60s,支持AMRMP3格式
视频(video):10MB,支持MP4格式
缩略图(thumb):64KB,支持 JPG 格式
- 引入依赖
- HttpUtil中添加携带素材发送post请求的方法
- 新增临时素材
- 获取临时素材