基于jfinal-weixin-1.7的微信公众号开发代码分析
亢仰岳
2023-12-01
1、ApiConfig:存放Weixin服务号需要用到的各个参数。
token\appId\appSecret\encodingAesKey\messageEncrypt\构造方法+get+set
2、ApiConfigKit:将ApiConfig绑定到ThreadLocal的工具类,方便在当前线程的各个地方获取ApiConfig对象。
3、抽象类InMsg:接收消息
接收公共属性示例:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<xml>
代码实现:
toUserName\fromUserName\createTime\msgType:构造方法+get+set
实现类:
InTextMsg:
接收文本消息示例
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[this is a test]]></Content>
<MsgId>1234567890123456</MsgId>
</xml>
InImageMsg:
接收图片消息示例
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<PicUrl><![CDATA[this is a url]]></PicUrl>
<MediaId><![CDATA[media_id]]></MediaId>
<MsgId>1234567890123456</MsgId>
</xml>
InVoiceMsg:
接收语音消息示例
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1357290913</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
<MediaId><![CDATA[media_id]]></MediaId>
<Format><![CDATA[Format]]></Format>
<MsgId>1234567890123456</MsgId>
</xml>
实现类:
InSpeechRecognitionResults:
接收语音识别结果,与 InVoiceMsg 唯一的不同是多了一个 Recognition 标记
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1357290913</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
<MediaId><![CDATA[media_id]]></MediaId>
<Format><![CDATA[Format]]></Format>
<Recognition><![CDATA[腾讯微信团队]]></Recognition>
<MsgId>1234567890123456</MsgId>
</xml>
InVideoMsg:
接收视频消息示例
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1357290913</CreateTime>
<MsgType><![CDATA[video]]></MsgType>
<MediaId><![CDATA[media_id]]></MediaId>
<ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
<MsgId>1234567890123456</MsgId>
</xml>
InShortVideoMsg:
接收视频消息示例
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1357290913</CreateTime>
<MsgType><![CDATA[shortvideo]]></MsgType>
<MediaId><![CDATA[media_id]]></MediaId>
<ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
<MsgId>1234567890123456</MsgId>
</xml>
InLocationMsg:
接收地理位置消息示例
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1351776360</CreateTime>
<MsgType><![CDATA[location]]></MsgType>
<Location_X>23.134521</Location_X>
<Location_Y>113.358803</Location_Y>
<Scale>20</Scale>
<Label><![CDATA[位置信息]]></Label>
<MsgId>1234567890123456</MsgId>
</xml>
InLinkMsg:
接收链接消息示例
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1351776360</CreateTime>
<MsgType><![CDATA[link]]></MsgType>
<Title><![CDATA[公众平台官网链接]]></Title>
<Description><![CDATA[公众平台官网链接]]></Description>
<Url><![CDATA[url]]></Url>
<MsgId>1234567890123456</MsgId>
</xml>
EventInMsg:
实现类:
InCustomEvent:接入会话\转接会话\关闭会话
InFollowEvent:接收关注-取消关注事件\关注实测数据结果\取消关注实测数据结果
InLocationEvent:上报地理位置事件
InMassEvent:群发事件
InMenuEvent:自定义菜单事件
InQrCodeEvent:扫描带参数二维码事件
InTemplateMsgEvent:模版消息
InVerifyFailEvent:认证失败
InVerifySuccessEvent:认证成功
InPoiCheckNotifyEvent:
微信门店示例
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1408622107</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[poi_check_notify]]></Event>
<UniqId><![CDATA[123adb]]></UniqId>
<PoiId><![CDATA[123123]]></PoiId>
<Result><![CDATA[fail]]></Result>
<Msg><![CDATA[xxxxxx]]></Msg>
</xml>
InShakearoundUserShakeEvent:
摇一摇示例
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1433332012</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[ShakearoundUserShake]]></Event>
<ChosenBeacon>
<Uuid><![CDATA[uuid]]></Uuid>
<Major>major</Major>
<Minor>minor</Minor>
<Distance>0.057</Distance>
</ChosenBeacon>
<AroundBeacons>
<AroundBeacon>
<Uuid><![CDATA[uuid]]></Uuid>
<Major>major</Major>
<Minor>minor</Minor>
<Distance>166.816</Distance>
</AroundBeacon>
<AroundBeacon>
<Uuid><![CDATA[uuid]]></Uuid>
<Major>major</Major>
<Minor>minor</Minor>
<Distance>15.013</Distance>
</AroundBeacon>
</AroundBeacons>
</xml>
4、抽象类OutMsg:回复消息(toUserName与fromUserName两者相反、创建时间(int)(System.currentTimeMillis() / 1000))
接收公共属性示例:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<xml>
代码实现:
toUserName\fromUserName\createTime\msgType:构造方法+get+set
实现类:
OutCustomMsg:
转发多客服消息
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[transfer_customer_service]]></MsgType>
</xml>
OutTextMsg:
回复文本消息
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
</xml>
OutImageMsg:
回复图片消息
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<Image>
<MediaId><![CDATA[media_id]]></MediaId>
</Image>
</xml>
OutMusicMsg:
回复音乐消息
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[music]]></MsgType>
<Music>
<Title><![CDATA[TITLE]]></Title>
<Description><![CDATA[DESCRIPTION]]></Description>
<MusicUrl><![CDATA[MUSIC_Url]]></MusicUrl>
<HQMusicUrl><![CDATA[HQ_MUSIC_Url]]></HQMusicUrl>
<ThumbMediaId><![CDATA[media_id]]></ThumbMediaId>
</Music>
</xml>
OutNewsMsg:
回复图文消息
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>2</ArticleCount>
<Articles>
<item>
<Title><![CDATA[title1]]></Title>
<Description><![CDATA[description1]]></Description>
<PicUrl><![CDATA[picurl]]></PicUrl>
<Url><![CDATA[url]]></Url>
</item>
<item>
<Title><![CDATA[title]]></Title>
<Description><![CDATA[description]]></Description>
<PicUrl><![CDATA[picurl]]></PicUrl>
<Url><![CDATA[url]]></Url>
</item>
</Articles>
</xml>
OutVideoMsg:
回复视频消息
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[video]]></MsgType>
<Video>
<MediaId><![CDATA[media_id]]></MediaId>
<Title><![CDATA[title]]></Title>
<Description><![CDATA[description]]></Description>
</Video>
</xml>
OutVoiceMsg:
回复语音消息
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
<Voice>
<MediaId><![CDATA[media_id]]></MediaId>
</Voice>
</xml>
5、Freemarker:通过消息对象替换微信xml模板对应占位符构建xml字符串。
6、MsgInterceptor:
1、将配置对象设置到属于MsgController的本地线程。
2、根据echostr是否为空判断服务器配置请求。
3、对服务器配置请求参数(signature/timestamp/nonce)进行sha1加密并校验,若成功则原样返回echostr给微信服务器。
7、MsgController:接收微信服务器消息,自动解析成InMsg并分发到相应的处理方法。(公众号服务器调用唯一入口,即在开发者中心输入的URL必须要指向此)
1、具有获取配置对象的抽象方法。
2、使用HttpKit的readDate方法将微信消息xml转成字符串。判断是否加密并做对应处理。
3、使用InMsgParser的parse方法将xml字符串转成InMsg子对象。
4、通过instanceof关键字判断对象类型,调用相关方法,传入强转对象。
5、使用OutMsgXmlBuilder的build方法将回复微信的消息转成xml字符串,响应微信服务器。
8、ApiInterceptor:
1、将配置对象设置到属于ApiController的本地线程。
9、ApiController:
1、具有获取配置对象的抽象方法。
10、IAccessTokenCache接口:默认超时时间\get\set\remove
实现类:
DefaultAccessTokenCache:默认存储于内存中,重写get\set\remove操作容器ConcurrentHashMap。key:AppId,value:AccessToken
11、AccessToken:封装access_token
1、access_token\expires_in\errcode\errmsg\expiredTime
2、通过JsonUtils工具的parse方法将json字符串转换成Map集合。
3、通过expiredTime是否为null或小于当前时间、errcode不等于null来判断access_token是否可用。
4、实现RetryUtils异步重试工具类中ResultCheck回调结果检查接口。
12、AccessTokenApi:
1、从缓存中获取access_token,如果未取到或者access_token不可用则先异步更新再获取。
2、通过RetryUtils异步重试工具类根据重试次数实现强制更新access_token。
13、SnsAccessToken:封装网页授权access_token
14、SnsAccessTokenApi:
1、生成Authorize链接
2、生成网页二维码授权链接
3、通过code获取access_token
15、ApiResult:封装Api响应结果
1、将返回的json转换为Map,再key值将value转成相应类型。
2、根据error_code判断access_token是否无效决定是否调用AccessTokenApi的refreshAccessToken方法进行刷新。
16、MenuApi:公众号菜单Api
1、查询菜单(get)
2、创建菜单(post)
1、页面授权url:appid\redirect_uri\response_type\scope\state\#wechat_redirect
2、用户同意授权并跳转到redirect_uri会传递code参数
17、UserApi:用户管理Api
1、获取用户基本信息
2、获取用户列表
3、批量获取用户列表
4、设置备注名
18、TemplateData:模板消息数据对象
1、touser、template_id、url、topcolor、data
19、TemplateMsgApi:模板消息Api
1、发送模板消息
20、QrcodeApi:生成带参数的二维码Api
1、创建临时二维码
2、创建永久二维码
3、获取ticket二维码Url
21、ShorturlApi:将一条长链接转成短链接Api
1、支持http://、https://、weixin://格式的url
22、CustomServiceApi:多客服功能
1、获取客服聊天记录
2、添加客服账号
3、修改客服账号
4、删除客服账号
5、设置客服头像
6、获取所有客服账号
7、发送客服消息
发送文本消息、发送图片消息、发送语音回复、发送视频回复、发送音乐回复、发送图文回复、发送卡券
23、CallbackIpApi:获取微信服务器ip地址
24、GroupsApi:分组Api
1、创建分组,一个公众账号最多支持创建100个分组。
2、查看所有分组
3、通过OpenID查询其所在的GroupID
4、修改分组名
5、移动用户分组
6、批量移动用户分组
7、删除分组
25、DatacubeApi:数据统计接口
1、获取统计信息
用户分析数据、图文群发每日数据、图文群发总数据、图文统计数据、图文统计分时数据、图文分享转发数据、图文分享转发分时数据、消息发送概况数据、消息发送分时数据、消息发送周数据、消息发送月数据、消息发送分布数据、消息发送分布周数据、消息发送分布月数据、接口分析数据、接口分析分时数据。
26、MediaArticles:图文素材封装bean
27、MediaFile:多媒体文件封装bean
28、MediaApi:素材管理
1、多媒体格式:IMAGE、VOICE、VIDEO、THUMB、NEWS
2、上传临时素材
3、获取临时素材
4、新增永久素材
5、获取永久素材
6、删除永久素材
7、获取素材总数
8、获取素材列表
29、MessageApi:高级群发接口
1、根据分组进行群发
2、根据OpenID列表群发
3、预览接口
4、查看群发消息发送状态
5、删除群发,只能删除半个小时以内
30、PaymentApi:微信支付Api
1、交易枚举类型:JSAPI、NATIVE、APP、WAP
2、统一下单
3、根据微信订单号查询信息
4、根据商户订单号查询信息
5、关闭订单
6、申请退款
7、查询退款
8、根据微信订单号查询退款
9、根据商户订单号查询退款
10、根据商户退款单号查询退款
11、根据微信退款单号查询退款
31、JsTicket:jsticket返回封装
1、ticket\expires_in\errcode\errmsg\expiredTime
2、通过JsonUtils工具的parse方法将json字符串转换成Map集合。
3、通过expiredTime是否为null或小于当前时间、errcode等于null或等于0来判断jsticket是否可用。
32、JsTicketApi:卡券
1、JsApiType:jsapi(用于分享等js-api)、wx_card(用于卡券接口签名凭证api_ticket)
2、使用RetryUtils异常重试工具类获得jsapi_ticket,并缓存到AccessTokenCache中。