当前位置: 首页 > 工具软件 > JFinal Weixin > 使用案例 >

基于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中。



 类似资料: