接触微信公众帐号已两月时间期间陆续完善公众帐号xiaoqrobot外带着团队公司开发两企业应:普通类型公众帐号会议类型公众帐号3公众帐号开发目前微信公众台开放api算拟熟悉文消息图文消息音乐消息语音消息位置消息等全部菜单写微信公众帐号开发教程想法学技术验分享出帮助更需朋友希认识行朋友交流进步
面推出微信公众帐号开发系列连载教程做简单说明教程面定Java编程根底朋友算编程语言开始讲起考虑没时间精力〔班装修学车等〕二怕等编程语言讲完微信公众帐号发生变化样教程显点时没吸引力侧重点介绍容方面概会涉:
1〕前知识:微信公众帐号分类两种模式特点区开发模式配置等
2〕API中类消息〔已api进行封装成jar包时候会考虑分享出〕
3〕微信公众帐号开发中技巧〔换行通代码发送表情屏幕飘雪花表情接收识AndroidiOS表现致等等〕
4〕业务系统接方法〔链接短信等技术讲解会做定分析〕
5〕微信公众台常见功开发〔黄鸡样机话天气预报精确定位百度图音乐搜索语音识解析等〕
然具体写出容肯定止定会包含介绍容
知道久写完容然越快越会全力希正博文通微信关注xiaoqrobot者博客留言支持动力谢谢
开发xiaoqrobot学微信公众帐号开发api开放出类消息体验然现点杂烩意思拟实款生活娱乐帮手目前已370关注者周边搜索功定位拟准确〔解决纠偏问题精确十米范围〕时出门外搜美食ATM机厕超市等方便提供路线导航聊天唠嗑功开发面连载教程容会中抽取出面界面截图系列连载教程期朋友建议关注体验做方请提意见技术身外体验拟重视关注
2 微信公众帐号开发教程第2篇微信公众帐号类型〔普通会议〕
公众帐号企业公众帐号
记两月前微信官方开发群里问公众帐号企业公众帐号什区时候笑话没愿意告知许问题问太简单吧想定少朋友刚接触时搞清楚点实注册微信公众帐号时区分帐号企业帐号需填写注册资料样区仅仅帐号申请成功途区罢然注册公众帐号时确实类型选择选择帐号企业帐号什类型选择呢?正天想讲题请继续
注册时选择两种帐号类型
微信公众帐号注册步填写公众号信息〞选项选择类型〞二值供选择普通公众帐号类型〞公众会议帐号〞选择公众会议号〞时方会出现醒目红字提醒:会议号定时间限制公众帐号期法登录〞列图示
注册时底应该选择类型呢?需两种类型定解做出判断面通介绍公众会议帐号普通公众帐号区进行说明
公众帐号普通帐号区
注册公会会议帐号设置〞栏里会议号设置〞项列图示:
实会议帐号普通帐号区会议号设置〞里全部表达出区三点:
1〕效时间
普通帐号创立永久效会议帐号效期月月帐号失效帐号失效登录微信公众台时会提示该公众会议号已期法登录〞列图示:
帐号失效已关注会议帐号户继续时会提示该公众帐号已期法发消息〞果菜单权限会议帐号然通菜单获取信息帐号期菜单响应没禁止列图示:
图会议帐号期法通文获取消息点击菜单继续图中图文消息峰会概况〞点击菜单返回
2〕关注权限
普通帐号关注没权限限制会议帐号设置关注权限分两种:关注需通验证关注进行项设置时默认前者果设置需通验证关注点类似微信添加朋友时验证样里验证问题设置果设置验证消息类似询问户身份例请问您真实姓名什?〞勾选验证消息作备注名〞样辩认关注会议帐号
3〕参相互见
普通帐号关注者间见会议帐号关注者间相互见什意思呢?会议号设置里果勾选参相互见〞关注该会议帐号够帐号详细资料里项会者〞点击会显示关注该会议帐号微信号列表点击某参查详细资料申请加朋友等
会议帐号拟力功方便参加会议相互认识
三点会议帐号特点普通帐号区出会议帐号普通帐号功根底增加帐号效时间限制〔月〕关注权限关注者相互见三功
实微信目前会议帐号支持远远够方会议题时间点等会议常规属性设置支持会议通常会签互动投票等环节没表达更没考虑周期性会议希微信期版块支持力度更
3 微信公众帐号开发教程第3篇开发模式启接口配置
编辑模式开发模式
微信公众帐号申请成功想接收处理户请求必须高级功〞里进行配置点击高级功〞界面:
图中高级功包含两种模式:编辑模式开发模式两种模式互斥关系两种模式时开启两种模式什区呢?作开发员底开启种呢?
编辑模式:针非编程员信息发布类公众帐号开启该模式方便通界面配置定义菜单〞动回复消息〞
开发模式:针具备开发力开启该模式够微信公众台开放接口通编程方式实现定义菜单创立户消息接收处理响应种模式更加灵活建议开发力公司采该模式
启开发模式〔〕
微信公众帐号注册完成默认开启编辑模式该开启开发模式呢?操作步骤:
1〕点击进入编辑模式右角编辑模式开关开启〞切换关闭〞列图示:
2〕点击高级功进入开发模式右角开发模式开关关闭〞切换开启〞切换时会遇提示:
提示需先成开发者开启开发模式先点击列图示成开发者〞钮:
果提示资料全先补齐资料回继续操作需补全资料公众帐号头描述运营区
资料补全次点击成开发者〞时接口配置信息界面列图示:
里需填写URLToken两值URL指够接收处理微信效劳器发送GETPOST请求址已存现够浏览器访问址求先公众帐号台处理程序开发〔少应该完成GET请求处理〕部署公网效劳器Token面会详细说明
说完成接口配置需先完成微信效劳器GET请求处理? 什呢?微信公众台接口中定义具体请参考API文档消息接口消息接口指南中网址接入局部点进入
面写清楚实理解面说什OK编写相关代码已帮完成请继续
创立公众帐号台接口程序
创立Java Web工程新建够处理请求Servlet命名意里命名orgliufengcourseservletCoreServlet代码:
[java] view plaincopyprint
1 package orgliufengcourseservlet
2
3 import javaioIOException
4 import javaioPrintWriter
5
6 import javaxservletServletException
7 import javaxservlet Servlet
8 import javaxservlet ServletRequest
9 import javaxservlet ServletResponse
10
11 import orgliufengcourseutilSignUtil
12
13 **
14 * 核心请求处理类
15 *
16 * @author liufeng
17 * @date 20210518
18 *
19 public class CoreServlet extends Servlet {
20 private static final long serialVersionUID 4440739483644821986L
21
22 **
23 * 确认请求微信效劳器
24 *
25 public void doGet( ServletRequest request ServletResponse response) throws ServletException IOException {
26 微信加密签名
27 String signature requestgetParameter(signature)
28 时间戳
29 String timestamp requestgetParameter(timestamp)
30 机数
31 String nonce requestgetParameter(nonce)
32 机字符串
33 String echostr requestgetParameter(echostr)
34
35 PrintWriter out responsegetWriter()
36 通检验signature请求进行校验假设校验成功原样返回echostr表示接入成功否接入失败
37 if (SignUtilcheckSignature(signature timestamp nonce)) {
38 outprint(echostr)
39 }
40 outclose()
41 out null
42 }
43
44 **
45 * 处理微信效劳器发消息
46 *
47 public void doPost( ServletRequest request ServletResponse response) throws ServletException IOException {
48 TODO 消息接收处理响应
49 }
50
51 }
package orgliufengcourseservlet
import javaioIOException
import javaioPrintWriter
import javaxservletServletException
import javaxservlet Servlet
import javaxservlet ServletRequest
import javaxservlet ServletResponse
import orgliufengcourseutilSignUtil
**
* 核心请求处理类
*
* @author liufeng
* @date 20210518
*
public class CoreServlet extends Servlet {
private static final long serialVersionUID 4440739483644821986L
**
* 确认请求微信效劳器
*
public void doGet( ServletRequest request ServletResponse response) throws ServletException IOException {
微信加密签名
String signature requestgetParameter(signature)
时间戳
String timestamp requestgetParameter(timestamp)
机数
String nonce requestgetParameter(nonce)
机字符串
String echostr requestgetParameter(echostr)
PrintWriter out responsegetWriter()
通检验signature请求进行校验假设校验成功原样返回echostr表示接入成功否接入失败
if (SignUtilcheckSignature(signature timestamp nonce)) {
outprint(echostr)
}
outclose()
out null
}
**
* 处理微信效劳器发消息
*
public void doPost( ServletRequest request ServletResponse response) throws ServletException IOException {
TODO 消息接收处理响应
}
}
代码中完成doGet方法作正确认请求否微信效劳器doPost方法次讲容完成接口配置需doPost方法先空里
doGet方法中调orgliufengcourseutilSignUtilcheckSignature方法SignUtiljava实现:
[java] view plaincopyprint
1 package orgliufengcourseutil
2
3 import javasecurityMessageDigest
4 import javasecurityNoSuchAlgorithmException
5 import javautilArrays
6
7 **
8 * 请求校验工具类
9 *
10 * @author liufeng
11 * @date 20210518
12 *
13 public class SignUtil {
14 接口配置信息中Token致
15 private static String token weixinCourse
16
17 **
18 * 验证签名
19 *
20 * @param signature
21 * @param timestamp
22 * @param nonce
23 * @return
24 *
25 public static boolean checkSignature(String signature String timestamp String nonce) {
26 String[] arr new String[] { token timestamp nonce }
27 tokentimestampnonce三参数进行字典序排序
28 Arrayssort(arr)
29 StringBuilder content new StringBuilder()
30 for (int i 0 i < arrlength i++) {
31 contentappend(arr[i])
32 }
33 MessageDigest md null
34 String tmpStr null
35
36 try {
37 md MessageDigestgetInstance(SHA1)
38 三参数字符串拼接成字符串进行sha1加密
39 byte[] digest mddigest(contenttoString()getBytes())
40 tmpStr byteToStr(digest)
41 } catch (NoSuchAlgorithmException e) {
42 eprintStackTrace()
43 }
44
45 content null
46 sha1加密字符串signature标识该请求源微信
47 return tmpStr null tmpStrequals(signaturetoUpperCase()) false
48 }
49
50 **
51 * 字节数组转换十六进制字符串
52 *
53 * @param byteArray
54 * @return
55 *
56 private static String byteToStr(byte[] byteArray) {
57 String strDigest
58 for (int i 0 i < byteArraylength i++) {
59 strDigest + byteToHexStr(byteArray[i])
60 }
61 return strDigest
62 }
63
64 **
65 * 字节转换十六进制字符串
66 *
67 * @param mByte
68 * @return
69 *
70 private static String byteToHexStr(byte mByte) {
71 char[] Digit { '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' 'A' 'B' 'C' 'D' 'E' 'F' }
72 char[] tempArr new char[2]
73 tempArr[0] Digit[(mByte >>> 4) & 0X0F]
74 tempArr[1] Digit[mByte & 0X0F]
75
76 String s new String(tempArr)
77 return s
78 }
79 }
package orgliufengcourseutil
import javasecurityMessageDigest
import javasecurityNoSuchAlgorithmException
import javautilArrays
**
* 请求校验工具类
*
* @author liufeng
* @date 20210518
*
public class SignUtil {
接口配置信息中Token致
private static String token weixinCourse
**
* 验证签名
*
* @param signature
* @param timestamp
* @param nonce
* @return
*
public static boolean checkSignature(String signature String timestamp String nonce) {
String[] arr new String[] { token timestamp nonce }
tokentimestampnonce三参数进行字典序排序
Arrayssort(arr)
StringBuilder content new StringBuilder()
for (int i 0 i < arrlength i++) {
contentappend(arr[i])
}
MessageDigest md null
String tmpStr null
try {
md MessageDigestgetInstance(SHA1)
三参数字符串拼接成字符串进行sha1加密
byte[] digest mddigest(contenttoString()getBytes())
tmpStr byteToStr(digest)
} catch (NoSuchAlgorithmException e) {
eprintStackTrace()
}
content null
sha1加密字符串signature标识该请求源微信
return tmpStr null tmpStrequals(signaturetoUpperCase()) false
}
**
* 字节数组转换十六进制字符串
*
* @param byteArray
* @return
*
private static String byteToStr(byte[] byteArray) {
String strDigest
for (int i 0 i < byteArraylength i++) {
strDigest + byteToHexStr(byteArray[i])
}
return strDigest
}
**
* 字节转换十六进制字符串
*
* @param mByte
* @return
*
private static String byteToHexStr(byte mByte) {
char[] Digit { '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' 'A' 'B' 'C' 'D' 'E' 'F' }
char[] tempArr new char[2]
tempArr[0] Digit[(mByte >>> 4) & 0X0F]
tempArr[1] Digit[mByte & 0X0F]
String s new String(tempArr)
return s
}
}
里唯需注意SignUtil类中成员变量token里赋予什值接口配置信息中Token填写什值两边保持致没求建议工程名称公司名称缩写等里工程名称weixinCourse
webxml中CoreServlet配置webxml中配置代码:
[html] view plaincopyprint
1
2
4 xsischemaLocation javasun xmlnsjavaee
5 javasun xmlnsjavaeewebapp_2_5xsd>
6
7
8
9 orgliufengcourseservletCoreServlet
10
11
12
13 < urlpattern中配置coreServlet指定该Servlet访问路径 >
14
15
16
17
18
19
20
21
22
javasun xmlnsjavaeewebapp_2_5xsd>
orgliu
< urlpattern中配置coreServlet指定该Servlet访问路径 >
里编码完成简单接工程发布公网效劳器果没公网效劳器环境解BAESAE阿里云发布效劳器浏览器里访问CoreServlet果界面表示代码没问题:
啊代码报空指针异常说证明没问题?然直接址栏访问coreServlet相提交GET请求什参数没传验证时候然会报空指针异常
接coreServlet访问路径拷贝回微信公众台接入配置信息界面coreServlet访问路径粘贴URL中SignUtil类中指定token值weixinCourse填入Token中填写结果列图示:
写篇教程时候BAE环境果想学微信公众帐号开发没公网效劳器环境建议试试注册方便果问题交流
接着点击提交〞果程序写没问题URLToken填写正确页面方提交成功〞提示会次跳转开发模式设置界面够已成开发者〞提示列图示:
启开发模式〔〕
时候已成开发者百般周折啊哈哈里没完哦步工作开发模式开启右角开发模式开关关闭〞切换开启〞列图示:
里接口配置开发模式开启完成章节容讲里接章节讲接收处理响应微信效劳器转发户发送公众帐号消息完成CoreServlet中doPost方法编写
4 微信公众帐号开发教程第4篇消息消息处理工具封装
工欲善事必先利器篇容讲解微信公众台定义消息消息相关操作封装成工具类方面期里需明确消息实户发公众帐号消息先微信台接收然微信台会该消息转开发模式接口配置中指定URL址
微信公众台消息接口
接收微信台发送消息需先熟悉微信公众台API中消息接口局部点进入点击进入消息接口指南局部列图示:
图左侧微信公众台目前开放接口三种:消息接口通接口定义菜单接口通接口定义菜单接口测资格调测资格申请已关闭期某天微信会群众户开放吧没测资格户浪费时间两接口需消息接口
消息推送消息回复
面介绍消息接口消息接收响应需关注图中4 消息推送〞5 消息回复〞足够
先解接口中消息推送〞指什点击4 消息推送〞接口中消息推送〞指普通户公众帐号发消息时微信效劳器POST该消息填写URL〞里定义户够发送类型消息消息字段消息微信效劳器什方式转发公众帐号台
消息推送中定义会接收消息类型5种:文消息图片消息理位置消息链接消息事件推送实语音消息够接收具体语音文件〔需测资格够获取语音文件〕
接口中消息回复〞定义回复户消息类型消息字段消息格式微信公众台接口指南中样描述:
面说回复户消息5种目前开发模式回复消息3种:文消息音乐消息图文消息语音消息视频消息目前编辑模式
消息封装
接做消息推送〔请求〕消息回复〔响应〕中定义消息进行封装建立应Java类〔Java门面象编程语言封装起更方便〕面请求消息指消息推送中定义消息响应消息指消息回复中定义消息
请求消息基类
消息推送中定义消息字段提取出封装成基类公字段包括:ToUserName〔开发者微信号〕FromUserName〔发送方帐号OPEN_ID〕CreateTime〔消息创立时间〕MsgType〔消息类型〕MsgId〔消息ID〕封装基类orgliufengcoursemessagereqBaseMessage代码:
[java] view plaincopyprint
1 package orgliufengcoursemessagereq
2
3 **
4 * 消息基类〔普通户 > 公众帐号〕
5 *
6 * @author liufeng
7 * @date 20210519
8 *
9 public class BaseMessage {
10 开发者微信号
11 private String ToUserName
12 发送方帐号〔OpenID〕
13 private String FromUserName
14 消息创立时间 〔整型〕
15 private long CreateTime
16 消息类型〔textimagelocationlink〕
17 private String MsgType
18 消息id64位整型
19 private long MsgId
20
21 public String getToUserName() {
22 return ToUserName
23 }
24
25 public void setToUserName(String toUserName) {
26 ToUserName toUserName
27 }
28
29 public String getFromUserName() {
30 return FromUserName
31 }
32
33 public void setFromUserName(String fromUserName) {
34 FromUserName fromUserName
35 }
36
37 public long getCreateTime() {
38 return CreateTime
39 }
40
41 public void setCreateTime(long createTime) {
42 CreateTime createTime
43 }
44
45 public String getMsgType() {
46 return MsgType
47 }
48
49 public void setMsgType(String msgType) {
50 MsgType msgType
51 }
52
53 public long getMsgId() {
54 return MsgId
55 }
56
57 public void setMsgId(long msgId) {
58 MsgId msgId
59 }
60 }
package orgliufengcoursemessagereq
**
* 消息基类〔普通户 > 公众帐号〕
*
* @author liufeng
* @date 20210519
*
public class BaseMessage {
开发者微信号
private String ToUserName
发送方帐号〔OpenID〕
private String FromUserName
消息创立时间 〔整型〕
private long CreateTime
消息类型〔textimagelocationlink〕
private String MsgType
消息id64位整型
private long MsgId
public String getToUserName() {
return ToUserName
}
public void setToUserName(String toUserName) {
ToUserName toUserName
}
public String getFromUserName() {
return FromUserName
}
public void setFromUserName(String fromUserName) {
FromUserName fromUserName
}
public long getCreateTime() {
return CreateTime
}
public void setCreateTime(long createTime) {
CreateTime createTime
}
public String getMsgType() {
return MsgType
}
public void setMsgType(String msgType) {
MsgType msgType
}
public long getMsgId() {
return MsgId
}
public void setMsgId(long msgId) {
MsgId msgId
}
}
请求消息文消息
[java] view plaincopyprint
1 package orgliufengcoursemessagereq
2
3 **
4 * 文消息
5 *
6 * @author liufeng
7 * @date 20210519
8 *
9 public class TextMessage extends BaseMessage {
10 消息容
11 private String Content
12
13 public String getContent() {
14 return Content
15 }
16
17 public void setContent(String content) {
18 Content content
19 }
20 }
package orgliufengcoursemessagereq
**
* 文消息
*
* @author liufeng
* @date 20210519
*
public class TextMessage extends BaseMessage {
消息容
private String Content
public String getContent() {
return Content
}
public void setContent(String content) {
Content content
}
}
请求消息图片消息
[java] view plaincopyprint
1 package orgliufengcoursemessagereq
2
3 **
4 * 图片消息
5 *
6 * @author liufeng
7 * @date 20210519
8 *
9 public class ImageMessage extends BaseMessage {
10 图片链接
11 private String PicUrl
12
13 public String getPicUrl() {
14 return PicUrl
15 }
16
17 public void setPicUrl(String picUrl) {
18 PicUrl picUrl
19 }
20 }
package orgliufengcoursemessagereq
**
* 图片消息
*
* @author liufeng
* @date 20210519
*
public class ImageMessage extends BaseMessage {
图片链接
private String PicUrl
public String getPicUrl() {
return PicUrl
}
public void setPicUrl(String picUrl) {
PicUrl picUrl
}
}
请求消息理位置消息
[java] view plaincopyprint
1 package orgliufengcoursemessagereq
2
3 **
4 * 理位置消息
5 *
6 * @author liufeng
7 * @date 20210519
8 *
9 public class LocationMessage extends BaseMessage {
10 理位置维度
11 private String Location_X
12 理位置度
13 private String Location_Y
14 图缩放
15 private String Scale
16 理位置信息
17 private String Label
18
19 public String getLocation_X() {
20 return Location_X
21 }
22
23 public void setLocation_X(String location_X) {
24 Location_X location_X
25 }
26
27 public String getLocation_Y() {
28 return Location_Y
29 }
30
31 public void setLocation_Y(String location_Y) {
32 Location_Y location_Y
33 }
34
35 public String getScale() {
36 return Scale
37 }
38
39 public void setScale(String scale) {
40 Scale scale
41 }
42
43 public String getLabel() {
44 return Label
45 }
46
47 public void setLabel(String label) {
48 Label label
49 }
50 }
package orgliufengcoursemessagereq
**
* 理位置消息
*
* @author liufeng
* @date 20210519
*
public class LocationMessage extends BaseMessage {
理位置维度
private String Location_X
理位置度
private String Location_Y
图缩放
private String Scale
理位置信息
private String Label
public String getLocation_X() {
return Location_X
}
public void setLocation_X(String location_X) {
Location_X location_X
}
public String getLocation_Y() {
return Location_Y
}
public void setLocation_Y(String location_Y) {
Location_Y location_Y
}
public String getScale() {
return Scale
}
public void setScale(String scale) {
Scale scale
}
public String getLabel() {
return Label
}
public void setLabel(String label) {
Label label
}
}
请求消息链接消息
[java] view plaincopyprint
1 package orgliufengcoursemessagereq
2
3 **
4 * 链接消息
5 *
6 * @author liufeng
7 * @date 20210519
8 *
9 public class LinkMessage extends BaseMessage {
10 消息标题
11 private String Title
12 消息描述
13 private String Description
14 消息链接
15 private String Url
16
17 public String getTitle() {
18 return Title
19 }
20
21 public void setTitle(String title) {
22 Title title
23 }
24
25 public String getDescription() {
26 return Description
27 }
28
29 public void setDescription(String description) {
30 Description description
31 }
32
33 public String getUrl() {
34 return Url
35 }
36
37 public void setUrl(String url) {
38 Url url
39 }
40 }
package orgliufengcoursemessagereq
**
* 链接消息
*
* @author liufeng
* @date 20210519
*
public class LinkMessage extends BaseMessage {
消息标题
private String Title
消息描述
private String Description
消息链接
private String Url
public String getTitle() {
return Title
}
public void setTitle(String title) {
Title title
}
public String getDescription() {
return Description
}
public void setDescription(String description) {
Description description
}
public String getUrl() {
return Url
}
public void setUrl(String url) {
Url url
}
}
请求消息语音消息
[java] view plaincopyprint
1 package orgliufengcoursemessagereq
2
3 **
4 * 音频消息
5 *
6 * @author liufeng
7 * @date 20210519
8 *
9 public class VoiceMessage extends BaseMessage {
10 媒体ID
11 private String MediaId
12 语音格式
13 private String Format
14
15 public String getMediaId() {
16 return MediaId
17 }
18
19 public void setMediaId(String mediaId) {
20 MediaId mediaId
21 }
22
23 public String getFormat() {
24 return Format
25 }
26
27 public void setFormat(String format) {
28 Format format
29 }
30 }
package orgliufengcoursemessagereq
**
* 音频消息
*
* @author liufeng
* @date 20210519
*
public class VoiceMessage extends BaseMessage {
媒体ID
private String MediaId
语音格式
private String Format
public String getMediaId() {
return MediaId
}
public void setMediaId(String mediaId) {
MediaId mediaId
}
public String getFormat() {
return Format
}
public void setFormat(String format) {
Format format
}
}
响应消息基类
样消息回复中定义消息字段提取出封装成基类公字段包括:ToUserName〔接收方帐号户OPEN_ID〕FromUserName〔开发者微信号〕CreateTime〔消息创立时间〕MsgType〔消息类型〕FuncFlag〔消息星标标识〕封装基类orgliufengcoursemessagerespBaseMessage代码:
[java] view plaincopyprint
1 package orgliufengcoursemessageresp
2
3 **
4 * 消息基类〔公众帐号 > 普通户〕
5 *
6 * @author liufeng
7 * @date 20210519
8 *
9 public class BaseMessage {
10 接收方帐号〔收OpenID〕
11 private String ToUserName
12 开发者微信号
13 private String FromUserName
14 消息创立时间 〔整型〕
15 private long CreateTime
16 消息类型〔textmusicnews〕
17 private String MsgType
18 位0x0001标志时星标刚收消息
19 private int FuncFlag
20
21 public String getToUserName() {
22 return ToUserName
23 }
24
25 public void setToUserName(String toUserName) {
26 ToUserName toUserName
27 }
28
29 public String getFromUserName() {
30 return FromUserName
31 }
32
33 public void setFromUserName(String fromUserName) {
34 FromUserName fromUserName
35 }
36
37 public long getCreateTime() {
38 return CreateTime
39 }
40
41 public void setCreateTime(long createTime) {
42 CreateTime createTime
43 }
44
45 public String getMsgType() {
46 return MsgType
47 }
48
49 public void setMsgType(String msgType) {
50 MsgType msgType
51 }
52
53 public int getFuncFlag() {
54 return FuncFlag
55 }
56
57 public void setFuncFlag(int funcFlag) {
58 FuncFlag funcFlag
59 }
60 }
package orgliufengcoursemessageresp
**
* 消息基类〔公众帐号 > 普通户〕
*
* @author liufeng
* @date 20210519
*
public class BaseMessage {
接收方帐号〔收OpenID〕
private String ToUserName
开发者微信号
private String FromUserName
消息创立时间 〔整型〕
private long CreateTime
消息类型〔textmusicnews〕
private String MsgType
位0x0001标志时星标刚收消息
private int FuncFlag
public String getToUserName() {
return ToUserName
}
public void setToUserName(String toUserName) {
ToUserName toUserName
}
public String getFromUserName() {
return FromUserName
}
public void setFromUserName(String fromUserName) {
FromUserName fromUserName
}
public long getCreateTime() {
return CreateTime
}
public void setCreateTime(long createTime) {
CreateTime createTime
}
public String getMsgType() {
return MsgType
}
public void setMsgType(String msgType) {
MsgType msgType
}
public int getFuncFlag() {
return FuncFlag
}
public void setFuncFlag(int funcFlag) {
FuncFlag funcFlag
}
}
响应消息文消息
[java] view plaincopyprint
1 package orgliufengcoursemessageresp
2
3 **
4 * 文消息
5 *
6 * @author liufeng
7 * @date 20210519
8 *
9 public class TextMessage extends BaseMessage {
10 回复消息容
11 private String Content
12
13 public String getContent() {
14 return Content
15 }
16
17 public void setContent(String content) {
18 Content content
19 }
20 }
package orgliufengcoursemessageresp
**
* 文消息
*
* @author liufeng
* @date 20210519
*
public class TextMessage extends BaseMessage {
回复消息容
private String Content
public String getContent() {
return Content
}
public void setContent(String content) {
Content content
}
}
响应消息音乐消息
[java] view plaincopyprint
1 package orgliufengcoursemessageresp
2
3 **
4 * 音乐消息
5 *
6 * @author liufeng
7 * @date 20210519
8 *
9 public class MusicMessage extends BaseMessage {
10 音乐
11 private Music Music
12
13 public Music getMusic() {
14 return Music
15 }
16
17 public void setMusic(Music music) {
18 Music music
19 }
20 }
package orgliufengcoursemessageresp
**
* 音乐消息
*
* @author liufeng
* @date 20210519
*
public class MusicMessage extends BaseMessage {
音乐
private Music Music
public Music getMusic() {
return Music
}
public void setMusic(Music music) {
Music music
}
}
音乐消息中Music类定义
[java] view plaincopyprint
1 package orgliufengcoursemessageresp
2
3 **
4 * 音乐model
5 *
6 * @author liufeng
7 * @date 20210519
8 *
9 public class Music {
10 音乐名称
11 private String Title
12 音乐描述
13 private String Description
14 音乐链接
15 private String MusicUrl
16 高质量音乐链接WIFI环境优先该链接播放音乐
17 private String HQMusicUrl
18
19 public String getTitle() {
20 return Title
21 }
22
23 public void setTitle(String title) {
24 Title title
25 }
26
27 public String getDescription() {
28 return Description
29 }
30
31 public void setDescription(String description) {
32 Description description
33 }
34
35 public String getMusicUrl() {
36 return MusicUrl
37 }
38
39 public void setMusicUrl(String musicUrl) {
40 MusicUrl musicUrl
41 }
42
43 public String getHQMusicUrl() {
44 return HQMusicUrl
45 }
46
47 public void setHQMusicUrl(String musicUrl) {
48 HQMusicUrl musicUrl
49 }
50
51 }
package orgliufengcoursemessageresp
**
* 音乐model
*
* @author liufeng
* @date 20210519
*
public class Music {
音乐名称
private String Title
音乐描述
private String Description
音乐链接
private String MusicUrl
高质量音乐链接WIFI环境优先该链接播放音乐
private String HQMusicUrl
public String getTitle() {
return Title
}
public void setTitle(String title) {
Title title
}
public String getDescription() {
return Description
}
public void setDescription(String description) {
Description description
}
public String getMusicUrl() {
return MusicUrl
}
public void setMusicUrl(String musicUrl) {
MusicUrl musicUrl
}
public String getHQMusicUrl() {
return HQMusicUrl
}
public void setHQMusicUrl(String musicUrl) {
HQMusicUrl musicUrl
}
}
响应消息图文消息
[java] view plaincopyprint
1 package orgliufengcoursemessageresp
2
3 import javautilList
4
5 **
6 * 文消息
7 *
8 * @author liufeng
9 * @date 20210519
10 *
11 public class NewsMessage extends BaseMessage {
12 图文消息数限制10条
13 private int ArticleCount
14 条图文消息信息默认第item图
15 private List
16
17 public int getArticleCount() {
18 return ArticleCount
19 }
20
21 public void setArticleCount(int articleCount) {
22 ArticleCount articleCount
23 }
24
25 public List
26 return Articles
27 }
28
29 public void setArticles(List
30 Articles articles
31 }
32 }
package orgliufengcoursemessageresp
import javautilList
**
* 文消息
*
* @author liufeng
* @date 20210519
*
public class NewsMessage extends BaseMessage {
图文消息数限制10条
private int ArticleCount
条图文消息信息默认第item图
private List
public int getArticleCount() {
return ArticleCount
}
public void setArticleCount(int articleCount) {
ArticleCount articleCount
}
public List
return Articles
}
public void setArticles(List
Articles articles
}
}
图文消息中Article类定义
[java] view plaincopyprint
1 package orgliufengcoursemessageresp
2
3 **
4 * 图文model
5 *
6 * @author liufeng
7 * @date 20210519
8 *
9 public class Article {
10 图文消息名称
11 private String Title
12 图文消息描述
13 private String Description
14 图片链接支持JPGPNG格式较效果图640*320图80*80限制图片链接域名需开发者填写根资料中Url致
15 private String PicUrl
16 点击图文消息跳转链接
17 private String Url
18
19 public String getTitle() {
20 return Title
21 }
22
23 public void setTitle(String title) {
24 Title title
25 }
26
27 public String getDescription() {
28 return null Description Description
29 }
30
31 public void setDescription(String description) {
32 Description description
33 }
34
35 public String getPicUrl() {
36 return null PicUrl PicUrl
37 }
38
39 public void setPicUrl(String picUrl) {
40 PicUrl picUrl
41 }
42
43 public String getUrl() {
44 return null Url Url
45 }
46
47 public void setUrl(String url) {
48 Url url
49 }
50
51 }
package orgliufengcoursemessageresp
**
* 图文model
*
* @author liufeng
* @date 20210519
*
public class Article {
图文消息名称
private String Title
图文消息描述
private String Description
图片链接支持JPGPNG格式较效果图640*320图80*80限制图片链接域名需开发者填写根资料中Url致
private String PicUrl
点击图文消息跳转链接
private String Url
public String getTitle() {
return Title
}
public void setTitle(String title) {
Title title
}
public String getDescription() {
return null Description Description
}
public void setDescription(String description) {
Description description
}
public String getPicUrl() {
return null PicUrl PicUrl
}
public void setPicUrl(String picUrl) {
PicUrl picUrl
}
public String getUrl() {
return null Url Url
}
public void setUrl(String url) {
Url url
}
}
全部消息封装完成Eclipse工程中关消息局部结构应该列图保持致果致〔类名属性名称致〕请检查调整致面章节介绍微信开发中通类方法业务关工具类封装成jar包做微信工程需引入该jar包种工作做次
解析请求消息
接解决请求消息解析问题微信效劳器会户请求通doPost方法发送回忆章节已写doPost方法定义:
[java] view plaincopyprint
1 **
2 * 处理微信效劳器发消息
3 *
4 public void doPost( ServletRequest request ServletResponse response) throws ServletException IOException {
5 TODO 消息接收处理响应
6 }
**
* 处理微信效劳器发消息
*
public void doPost( ServletRequest request ServletResponse response) throws ServletException IOException {
TODO 消息接收处理响应
}
doPost方法两参数request中封装请求相关容request中取出微信效劳器发消息通response接收消息进行响应发送消息
解析请求消息问题转化request中微信效劳器发送xml格式消息里助开源框架dom4j解析xml〔里dom4j161jar〕然解析结果存入HashMap解析请求消息方法:
[java] view plaincopyprint
1 **
2 * 解析微信发请求〔XML〕
3 *
4 * @param request
5 * @return
6 * @throws Exception
7 *
8 @SuppressWarnings(unchecked)
9 public static Map
10 解析结果存储HashMap中
11 Map
12
13 request中取输入流
14 InputStream inputStream requestgetInputStream()
15 读取输入流
16 SAXReader reader new SAXReader()
17 Document document readerread(inputStream)
18 xml根元素
19 Element root documentgetRootElement()
20 根元素子节点
21 List
22
23 遍历子节点
24 for (Element e elementList)
25 mapput(egetName() egetText())
26
27 释放资源
28 inputStreamclose()
29 inputStream null
30
31 return map
32 }
**
* 解析微信发请求〔XML〕
*
* @param request
* @return
* @throws Exception
*
@SuppressWarnings(unchecked)
public static Map
解析结果存储HashMap中
Map
request中取输入流
InputStream inputStream requestgetInputStream()
读取输入流
SAXReader reader new SAXReader()
Document document readerread(inputStream)
xml根元素
Element root documentgetRootElement()
根元素子节点
List
遍历子节点
for (Element e elementList)
mapput(egetName() egetText())
释放资源
inputStreamclose()
inputStream null
return map
}
响应消息转换成xml返回?
先前已响应消息封装成Java类方便代码中请求接收成功处理完成该消息返回呢?里涉响应消息转换成xml返回问题里采开源框架xstream实现Java类xml转换〔里xstream131jar〕代码:
[java] view plaincopyprint
1 **
2 * 文消息象转换成xml
3 *
4 * @param textMessage 文消息象
5 * @return xml
6 *
7 public static String textMessageToXml(TextMessage textMessage) {
8 xstreamalias(xml textMessagegetClass())
9 return xstreamtoXML(textMessage)
10 }
11
12 **
13 * 音乐消息象转换成xml
14 *
15 * @param musicMessage 音乐消息象
16 * @return xml
17 *
18 public static String musicMessageToXml(MusicMessage musicMessage) {
19 xstreamalias(xml musicMessagegetClass())
20 return xstreamtoXML(musicMessage)
21 }
22
23 **
24 * 图文消息象转换成xml
25 *
26 * @param newsMessage 图文消息象
27 * @return xml
28 *
29 public static String newsMessageToXml(NewsMessage newsMessage) {
30 xstreamalias(xml newsMessagegetClass())
31 xstreamalias(item new Article()getClass())
32 return xstreamtoXML(newsMessage)
33 }
34
35 **
36 * 扩展xstream支持CDATA块
37 *
38 * @date 20210519
39 *
40 private static XStream xstream new XStream(new XppDriver() {
41 public HierarchicalStreamWriter createWriter(Writer out) {
42 return new PrettyPrintWriter(out) {
43 xml节点转换增加CDATA标记
44 boolean cdata true
45
46 @SuppressWarnings(unchecked)
47 public void startNode(String name Class clazz) {
48 superstartNode(name clazz)
49 }
50
51 protected void writeText(QuickWriter writer String text) {
52 if (cdata) {
53 writerwrite(<[CDATA[)
54 writerwrite(text)
55 writerwrite(]]>)
56 } else {
57 writerwrite(text)
58 }
59 }
60 }
61 }
62 })
**
* 文消息象转换成xml
*
* @param textMessage 文消息象
* @return xml
*
public static String textMessageToXml(TextMessage textMessage) {
xstreamalias(xml textMessagegetClass())
return xstreamtoXML(textMessage)
}
**
* 音乐消息象转换成xml
*
* @param musicMessage 音乐消息象
* @return xml
*
public static String musicMessageToXml(MusicMessage musicMessage) {
xstreamalias(xml musicMessagegetClass())
return xstreamtoXML(musicMessage)
}
**
* 图文消息象转换成xml
*
* @param newsMessage 图文消息象
* @return xml
*
public static String newsMessageToXml(NewsMessage newsMessage) {
xstreamalias(xml newsMessagegetClass())
xstreamalias(item new Article()getClass())
return xstreamtoXML(newsMessage)
}
**
* 扩展xstream支持CDATA块
*
* @date 20210519
*
private static XStream xstream new XStream(new XppDriver() {
public HierarchicalStreamWriter createWriter(Writer out) {
return new PrettyPrintWriter(out) {
xml节点转换增加CDATA标记
boolean cdata true
@SuppressWarnings(unchecked)
public void startNode(String name Class clazz) {
superstartNode(name clazz)
}
protected void writeText(QuickWriter writer String text) {
if (cdata) {
writerwrite(<[CDATA[)
writerwrite(text)
writerwrite(]]>)
} else {
writerwrite(text)
}
}
}
}
})
说明:xstream框架身支持CDATA块生成40~62行代码xtream做扩展支持生成xml元素值时添加CDATA块
消息处理工具封装
知道解析请求消息知道响应消息转化成xml接消息相关处理方法全部封装工具类MessageUtil中该类完整代码:
[java] view plaincopyprint
1 package orgliufengcourseutil
2
3 import javaioInputStream
4 import javaioWriter
5 import javautilHashMap
6 import javautilList
7 import javautilMap
8
9 import javaxservlet ServletRequest
10
11 import orgdom4jDocument
12 import orgdom4jElement
13 import orgdom4jioSAXReader
14 import orgliufengcoursemessagerespArticle
15 import orgliufengcoursemessagerespMusicMessage
16 import orgliufengcoursemessagerespNewsMessage
17 import orgliufengcoursemessagerespTextMessage
18
19 import comthoughtworksxstreamXStream
20 import comthoughtworksxstreamcoreutilQuickWriter
21 import comthoughtworksxstreamioHierarchicalStreamWriter
22 import comthoughtworksxstreamioxmlPrettyPrintWriter
23 import comthoughtworksxstreamioxmlXppDriver
24
25 **
26 * 消息工具类
27 *
28 * @author liufeng
29 * @date 20210519
30 *
31 public class MessageUtil {
32
33 **
34 * 返回消息类型:文
35 *
36 public static final String RESP_MESSAGE_TYPE_TEXT text
37
38 **
39 * 返回消息类型:音乐
40 *
41 public static final String RESP_MESSAGE_TYPE_MUSIC music
42
43 **
44 * 返回消息类型:图文
45 *
46 public static final String RESP_MESSAGE_TYPE_NEWS news
47
48 **
49 * 请求消息类型:文
50 *
51 public static final String REQ_MESSAGE_TYPE_TEXT text
52
53 **
54 * 请求消息类型:图片
55 *
56 public static final String REQ_MESSAGE_TYPE_IMAGE image
57
58 **
59 * 请求消息类型:链接
60 *
61 public static final String REQ_MESSAGE_TYPE_LINK link
62
63 **
64 * 请求消息类型:理位置
65 *
66 public static final String REQ_MESSAGE_TYPE_LOCATION location
67
68 **
69 * 请求消息类型:音频
70 *
71 public static final String REQ_MESSAGE_TYPE_VOICE voice
72
73 **
74 * 请求消息类型:推送
75 *
76 public static final String REQ_MESSAGE_TYPE_EVENT event
77
78 **
79 * 事件类型:subscribe(订阅)
80 *
81 public static final String EVENT_TYPE_SUBSCRIBE subscribe
82
83 **
84 * 事件类型:unsubscribe(取消订阅)
85 *
86 public static final String EVENT_TYPE_UNSUBSCRIBE unsubscribe
87
88 **
89 * 事件类型:CLICK(定义菜单点击事件)
90 *
91 public static final String EVENT_TYPE_CLICK CLICK
92
93 **
94 * 解析微信发请求〔XML〕
95 *
96 * @param request
97 * @return
98 * @throws Exception
99 *
100 @SuppressWarnings(unchecked)
101 public static Map
102 解析结果存储HashMap中
103 Map
104
105 request中取输入流
106 InputStream inputStream requestgetInputStream()
107 读取输入流
108 SAXReader reader new SAXReader()
109 Document document readerread(inputStream)
110 xml根元素
111 Element root documentgetRootElement()
112 根元素子节点
113 List
114
115 遍历子节点
116 for (Element e elementList)
117 mapput(egetName() egetText())
118
119 释放资源
120 inputStreamclose()
121 inputStream null
122
123 return map
124 }
125
126 **
127 * 文消息象转换成xml
128 *
129 * @param textMessage 文消息象
130 * @return xml
131 *
132 public static String textMessageToXml(TextMessage textMessage) {
133 xstreamalias(xml textMessagegetClass())
134 return xstreamtoXML(textMessage)
135 }
136
137 **
138 * 音乐消息象转换成xml
139 *
140 * @param musicMessage 音乐消息象
141 * @return xml
142 *
143 public static String musicMessageToXml(MusicMessage musicMessage) {
144 xstreamalias(xml musicMessagegetClass())
145 return xstreamtoXML(musicMessage)
146 }
147
148 **
149 * 图文消息象转换成xml
150 *
151 * @param newsMessage 图文消息象
152 * @return xml
153 *
154 public static String newsMessageToXml(NewsMessage newsMessage) {
155 xstreamalias(xml newsMessagegetClass())
156 xstreamalias(item new Article()getClass())
157 return xstreamtoXML(newsMessage)
158 }
159
160 **
161 * 扩展xstream支持CDATA块
162 *
163 * @date 20210519
164 *
165 private static XStream xstream new XStream(new XppDriver() {
166 public HierarchicalStreamWriter createWriter(Writer out) {
167 return new PrettyPrintWriter(out) {
168 xml节点转换增加CDATA标记
169 boolean cdata true
170
171 @SuppressWarnings(unchecked)
172 public void startNode(String name Class clazz) {
173 superstartNode(name clazz)
174 }
175
176 protected void writeText(QuickWriter writer String text) {
177 if (cdata) {
178 writerwrite(<[CDATA[)
179 writerwrite(text)
180 writerwrite(]]>)
181 } else {
182 writerwrite(text)
183 }
184 }
185 }
186 }
187 })
188 }
package orgliufengcourseutil
import javaioInputStream
import javaioWriter
import javautilHashMap
import javautilList
import javautilMap
import javaxservlet ServletRequest
import orgdom4jDocument
import orgdom4jElement
import orgdom4jioSAXReader
import orgliufengcoursemessagerespArticle
import orgliufengcoursemessagerespMusicMessage
import orgliufengcoursemessagerespNewsMessage
import orgliufengcoursemessagerespTextMessage
import comthoughtworksxstreamXStream
tilQuickWriter
import comthoughtworksxstreamioHierarchicalStreamWriter
import comthoughtworksxstreamioxmlPrettyPrintWriter
import comthoughtworksxstreamioxmlXppDriver
**
* 消息工具类
*
* @author liufeng
* @date 20210519
*
public class MessageUtil {
**
* 返回消息类型:文
*
public static final String RESP_MESSAGE_TYPE_TEXT text
**
* 返回消息类型:音乐
*
public static final String RESP_MESSAGE_TYPE_MUSIC music
**
* 返回消息类型:图文
*
public static final String RESP_MESSAGE_TYPE_NEWS news
**
* 请求消息类型:文
*
public static final String REQ_MESSAGE_TYPE_TEXT text
**
* 请求消息类型:图片
*
public static final String REQ_MESSAGE_TYPE_IMAGE image
**
* 请求消息类型:链接
*
public static final String REQ_MESSAGE_TYPE_LINK link
**
* 请求消息类型:理位置
*
public static final String REQ_MESSAGE_TYPE_LOCATION location
**
* 请求消息类型:音频
*
public static final String REQ_MESSAGE_TYPE_VOICE voice
**
* 请求消息类型:推送
*
public static final String REQ_MESSAGE_TYPE_EVENT event
**
* 事件类型:subscribe(订阅)
*
public static final String EVENT_TYPE_SUBSCRIBE subscribe
**
* 事件类型:unsubscribe(取消订阅)
*
public static final String EVENT_TYPE_UNSUBSCRIBE unsubscribe
**
* 事件类型:CLICK(定义菜单点击事件)
*
public static final String EVENT_TYPE_CLICK CLICK
**
* 解析微信发请求〔XML〕
*
* @param request
* @return
* @throws Exception
*
@SuppressWarnings(unchecked)
public static Map
解析结果存储HashMap中
Map
request中取输入流
InputStream inputStream requestgetInputStream()
读取输入流
SAXReader reader new SAXReader()
Document document readerread(inputStream)
xml根元素
Element root documentgetRootElement()
根元素子节点
List
遍历子节点
for (Element e elementList)
mapput(egetName() egetText())
释放资源
inputStreamclose()
inputStream null
return map
}
**
* 文消息象转换成xml
*
* @param textMessage 文消息象
* @return xml
*
public static String textMessageToXml(TextMessage textMessage) {
xstreamalias(xml textMessagegetClass())
return xstreamtoXML(textMessage)
}
**
* 音乐消息象转换成xml
*
* @param musicMessage 音乐消息象
* @return xml
*
public static String musicMessageToXml(MusicMessage musicMessage) {
xstreamalias(xml musicMessagegetClass())
return xstreamtoXML(musicMessage)
}
**
* 图文消息象转换成xml
*
* @param newsMessage 图文消息象
* @return xml
*
public static String newsMessageToXml(NewsMessage newsMessage) {
xstreamalias(xml newsMessagegetClass())
xstreamalias(item new Article()getClass())
return xstreamtoXML(newsMessage)
}
**
* 扩展xstream支持CDATA块
*
* @date 20210519
*
private static XStream xstream new XStream(new XppDriver() {
public HierarchicalStreamWriter createWriter(Writer out) {
return new PrettyPrintWriter(out) {
xml节点转换增加CDATA标记
boolean cdata true
@SuppressWarnings(unchecked)
public void startNode(String name Class clazz) {
superstartNode(name clazz)
}
protected void writeText(QuickWriter writer String text) {
if (cdata) {
writerwrite(<[CDATA[)
writerwrite(text)
writerwrite(]]>)
} else {
writerwrite(text)
}
}
}
}
})
}
OK里关消息消息处理工具封装讲里实请求消息响应消息建立应Java类xml消息进行解析响应消息Java象转换成xml篇讲会介绍利面封装工具识户发送消息类型做出正确响应
5 微信公众帐号开发教程第5篇种消息接收响应
年读技术典图书题奖征文 专访李铁军:医生金山首席安专家转变 独二职位:开源社区理
[029] 微信公众帐号开发教程第5篇种消息接收响应
分类: 微信公众台 20210521 1356 7197阅读 评(67) 收藏 举报
微信公众台开发Java事件推送消息关注定义菜单
前篇文章里已微信公众台接口中消息相关操作进行封装章节介绍接收微信效劳器发送消息做出响应
明确接收消息
微信公众台接口消息指南中解户公众帐号发消息时微信效劳器会消息通POST方式提交接口配置信息中填写URL需URL指请求处理类CoreServletdoPost方法中接收消息处理消息响应消息
接收处理响应消息
面先已写CoreServlet完整代码:
[java] view plaincopyprint
1 package orgliufengcourseservlet
2
3 import javaioIOException
4 import javaioPrintWriter
5
6 import javaxservletServletException
7 import javaxservlet Servlet
8 import javaxservlet ServletRequest
9 import javaxservlet ServletResponse
10
11 import orgliufengcourseserviceCoreService
12 import orgliufengcourseutilSignUtil
13
14 **
15 * 核心请求处理类
16 *
17 * @author liufeng
18 * @date 20210518
19 *
20 public class CoreServlet extends Servlet {
21 private static final long serialVersionUID 4440739483644821986L
22
23 **
24 * 确认请求微信效劳器
25 *
26 public void doGet( ServletRequest request ServletResponse response) throws ServletException IOException {
27 微信加密签名
28 String signature requestgetParameter(signature)
29 时间戳
30 String timestamp requestgetParameter(timestamp)
31 机数
32 String nonce requestgetParameter(nonce)
33 机字符串
34 String echostr requestgetParameter(echostr)
35
36 PrintWriter out responsegetWriter()
37 通检验signature请求进行校验假设校验成功原样返回echostr表示接入成功否接入失败
38 if (SignUtilcheckSignature(signature timestamp nonce)) {
39 outprint(echostr)
40 }
41 outclose()
42 out null
43 }
44
45 **
46 * 处理微信效劳器发消息
47 *
48 public void doPost( ServletRequest request ServletResponse response) throws ServletException IOException {
49 请求响应编码均设置UTF8〔防止中文乱码〕
50 requestsetCharacterEncoding(UTF8)
51 responsesetCharacterEncoding(UTF8)
52
53 调核心业务类接收消息处理消息
54 String respMessage CoreServiceprocessRequest(request)
55
56 响应消息
57 PrintWriter out responsegetWriter()
58 outprint(respMessage)
59 outclose()
60 }
61
62 }
package orgliufengcourseservlet
import javaioIOException
import javaioPrintWriter
import javaxservletServletException
import javaxservlet Servlet
import javaxservlet ServletRequest
import javaxservlet ServletResponse
import orgliufengcourseserviceCoreService
import orgliufengcourseutilSignUtil
**
* 核心请求处理类
*
* @author liufeng
* @date 20210518
*
public class CoreServlet extends Servlet {
private static final long serialVersionUID 4440739483644821986L
**
* 确认请求微信效劳器
*
public void doGet( ServletRequest request ServletResponse response) throws ServletException IOException {
微信加密签名
String signature requestgetParameter(signature)
时间戳
String timestamp requestgetParameter(timestamp)
机数
String nonce requestgetParameter(nonce)
机字符串
String echostr requestgetParameter(echostr)
PrintWriter out responsegetWriter()
通检验signature请求进行校验假设校验成功原样返回echostr表示接入成功否接入失败
if (SignUtilcheckSignature(signature timestamp nonce)) {
outprint(echostr)
}
outclose()
out null
}
**
* 处理微信效劳器发消息
*
public void doPost( ServletRequest request ServletResponse response) throws ServletException IOException {
请求响应编码均设置UTF8〔防止中文乱码〕
requestsetCharacterEncoding(UTF8)
responsesetCharacterEncoding(UTF8)
调核心业务类接收消息处理消息
String respMessage CoreServiceprocessRequest(request)
响应消息
PrintWriter out responsegetWriter()
outprint(respMessage)
outclose()
}
}
代码说明:
1〕第51行代码:微信效劳器POST消息时UTF8编码接收时样编码否中文会乱码
2〕第52行代码:响应消息〔回复消息户〕时编码方式设置UTF8原理
3〕第54行代码:调CoreService类processRequest方法接收处理消息处理结果
4〕第57~59行:调responsegetWriter()write()方法消息处理结果返回户
doPost方法实现通调CoreService类processRequest方法接收处理消息样做目解耦业务相关操作Servlet里处理完全交业务核心类CoreService做面CoreService类代码实现:
[java] view plaincopyprint
1 package orgliufengcourseservice
2
3 import javautilDate
4 import javautilMap
5 import javaxservlet ServletRequest
6 import orgliufengcoursemessagerespTextMessage
7 import orgliufengcourseutilMessageUtil
8
9 **
10 * 核心效劳类
11 *
12 * @author liufeng
13 * @date 20210520
14 *
15 public class CoreService {
16 **
17 * 处理微信发请求
18 *
19 * @param request
20 * @return
21 *
22 public static String processRequest( ServletRequest request) {
23 String respMessage null
24 try {
25 默认返回文消息容
26 String respContent 请求处理异常请稍候尝试
27
28 xml请求解析
29 Map
30
31 发送方帐号〔open_id〕
32 String fromUserName requestMapget(FromUserName)
33 公众帐号
34 String toUserName requestMapget(ToUserName)
35 消息类型
36 String msgType requestMapget(MsgType)
37
38 回复文消息
39 TextMessage textMessage new TextMessage()
40 textMessagesetToUserName(fromUserName)
41 textMessagesetFromUserName(toUserName)
42 textMessagesetCreateTime(new Date()getTime())
43 textMessagesetMsgType(MessageUtilRESP_MESSAGE_TYPE_TEXT)
44 textMessagesetFuncFlag(0)
45
46 文消息
47 if (msgTypeequals(MessageUtilREQ_MESSAGE_TYPE_TEXT)) {
48 respContent 您发送文消息
49 }
50 图片消息
51 else if (msgTypeequals(MessageUtilREQ_MESSAGE_TYPE_IMAGE)) {
52 respContent 您发送图片消息
53 }
54 理位置消息
55 else if (msgTypeequals(MessageUtilREQ_MESSAGE_TYPE_LOCATION)) {
56 respContent 您发送理位置消息
57 }
58 链接消息
59 else if (msgTypeequals(MessageUtilREQ_MESSAGE_TYPE_LINK)) {
60 respContent 您发送链接消息
61 }
62 音频消息
63 else if (msgTypeequals(MessageUtilREQ_MESSAGE_TYPE_VOICE)) {
64 respContent 您发送音频消息
65 }
66 事件推送
67 else if (msgTypeequals(MessageUtilREQ_MESSAGE_TYPE_EVENT)) {
68 事件类型
69 String eventType requestMapget(Event)
70 订阅
71 if (eventTypeequals(MessageUtilEVENT_TYPE_SUBSCRIBE)) {
72 respContent 谢谢您关注
73 }
74 取消订阅
75 else if (eventTypeequals(MessageUtilEVENT_TYPE_UNSUBSCRIBE)) {
76 TODO 取消订阅户收公众号发送消息需回复消息
77 }
78 定义菜单点击事件
79 else if (eventTypeequals(MessageUtilEVENT_TYPE_CLICK)) {
80 TODO 定义菜单权没开放暂处理该类消息
81 }
82 }
83
84 textMessagesetContent(respContent)
85 respMessage MessageUtiltextMessageToXml(textMessage)
86 } catch (Exception e) {
87 eprintStackTrace()
88 }
89
90 return respMessage
91 }
92 }
package orgliufengcourseservice
import javautilDate
import javautilMap
import javaxservlet ServletRequest
import orgliufengcoursemessagerespTextMessage
import orgliufengcourseutilMessageUtil
**
* 核心效劳类
*
* @author liufeng
* @date 20210520
*
public class CoreService {
**
* 处理微信发请求
*
* @param request
* @return
*
public static String processRequest( ServletRequest request) {
String respMessage null
try {
默认返回文消息容
String respContent 请求处理异常请稍候尝试
xml请求解析
Map
发送方帐号〔open_id〕
String fromUserName requestMapget(FromUserName)
公众帐号
String toUserName requestMapget(ToUserName)
消息类型
String msgType requestMapget(MsgType)
回复文消息
TextMessage textMessage new TextMessage()
textMessagesetToUserName(fromUserName)
textMessagesetFromUserName(toUserName)
textMessagesetCreateTime(new Date()getTime())
textMessagesetMsgType(MessageUtilRESP_MESSAGE_TYPE_TEXT)
textMessagesetFuncFlag(0)
文消息
if (msgTypeequals(MessageUtilREQ_MESSAGE_TYPE_TEXT)) {
respContent 您发送文消息
}
图片消息
else if (msgTypeequals(MessageUtilREQ_MESSAGE_TYPE_IMAGE)) {
respContent 您发送图片消息
}
理位置消息
else if (msgTypeequals(MessageUtilREQ_MESSAGE_TYPE_LOCATION)) {
respContent 您发送理位置消息
}
链接消息
else if (msgTypeequals(MessageUtilREQ_MESSAGE_TYPE_LINK)) {
respContent 您发送链接消息
}
音频消息
else if (msgTypeequals(MessageUtilREQ_MESSAGE_TYPE_VOICE)) {
respContent 您发送音频消息
}
事件推送
else if (msgTypeequals(MessageUtilREQ_MESSAGE_TYPE_EVENT)) {
事件类型
String eventType requestMapget(Event)
订阅
if (eventTypeequals(MessageUtilEVENT_TYPE_SUBSCRIBE)) {
respContent 谢谢您关注
}
取消订阅
else if (eventTypeequals(MessageUtilEVENT_TYPE_UNSUBSCRIBE)) {
TODO 取消订阅户收公众号发送消息需回复消息
}
定义菜单点击事件
else if (eventTypeequals(MessageUtilEVENT_TYPE_CLICK)) {
TODO 定义菜单权没开放暂处理该类消息
}
}
textMessagesetContent(respContent)
respMessage MessageUtiltextMessageToXml(textMessage)
} catch (Exception e) {
eprintStackTrace()
}
return respMessage
}
}
代码说明:
1〕第29行:调消息工具类MessageUtil解析微信发xml格式消息解析结果放HashMap里
2〕32~36行:HashMap中取出消息中字段
3〕394484行:组装返回文消息象
4〕47~82行:演示接收微信发送类型消息根MsgType判断属种类型消息
5〕85行:调消息工具类MessageUtil返回文消息象TextMessage转化成xml格式字符串
关事件推送〔关注取消关注菜单点击〕
消息类型判断文消息图片消息理位置消息链接消息语音消息拟理解刚接触朋友搞懂事件推送消息什者清楚该判断户关注消息专门事件推送列图官方消息接口文档中关事件推送说明:
里关心两参数:MsgTypeEventMsgTypeevent时表示条事件推送消息Event表示事件类型包括订阅取消订阅定义菜单点击事件说户关注公众帐号取消公众帐号关注公众帐号菜单微信效劳器会发送条MsgTypeevent消息具体条消息表示关注取消关注菜单点击事件需通Event值判断〔注意区分Eventevent〕
连载五篇教程总结
5篇讲解已开发模式启接口配置消息相关工具类封装消息接收响应全部讲解完贴完整源代码相信定Java根底朋友明白够通系列文章根掌握微信公众台开发相关技术知识面目前工程完整结构贴出方便家:
6 微信公众帐号开发教程第6篇文消息容长度限制揭秘
相信少朋友遇样问题:发送文消息容长时微信做响应底微信允许文消息长度少呢?该计算文长度呢?什反响微信似支持文消息长度1300呢?篇文章会彻底解家疑问
接口文档中消息长度限制2048
接口文档中写明确:回复消息容长度超2048字节什测试反响消息容长度1300字节时微信响应呢?想问题应该局部没搞清楚底该计算文字节数
正确计算文占字节数
计算文〔字符串〕占字节数家第想应该String类getBytes()方法该方法返回字符串应字节数组计算数组length够字符串占字节数例:
[java] view plaincopyprint
1 public static void main(String []args) {
2 运行结果:4
3 Systemoutprintln(柳峰getBytes()length)
4 }
public static void main(String []args) {
运行结果:4
Systemoutprintln(柳峰getBytes()length)
}
面例中计算两中文占字节数4汉字占2字节真样?实忽略问题:编码方式中文占字节数样底呢?面例子中没指定编码方式会操作系统默认编码方式先出三条结:
1〕果面例子运行默认编码方式ISO88591操作系统台计算结果2
2〕果面例子运行默认编码方式gb2312gbk操作系统台计算结果4
3〕果面例子运行默认编码方式utf8操作系统台计算结果6
果真样意味着StringgetBytes()方法系统台默认采gb2312gbk编码方式呢?例子:
[java] view plaincopyprint
1 public static void main(String []args) throws UnsupportedEncodingException {
2 运行结果:2
3 Systemoutprintln(柳峰getBytes(ISO88591)length)
4 运行结果:4
5 Systemoutprintln(柳峰getBytes(GB2312)length)
6 运行结果:4
7 Systemoutprintln(柳峰getBytes(GBK)length)
8 运行结果:6
9 ntln(柳峰getBytes(UTF8)length)
10 }
public static void main(String []args) throws UnsupportedEncodingException {
运行结果:2
Systemoutprintln(柳峰getBytes(ISO88591)length)
运行结果:4
Systemoutprintln(柳峰getBytes(GB2312)length)
运行结果:4
Systemoutprintln(柳峰getBytes(GBK)length)
运行结果:6
Systemoutprintln(柳峰getBytes(UTF8)length)
}
例子证明面出三条结呢?说采ISO88591编码方式时中英文占字节采GB2312GBK编码方式时中文占两字节采UTF8编码方式时中文占三字节
微信台采编码方式字符串占字节数计算
微信效劳器返回消息时该采什编码方式呢?然UTF8已doPost方法里采代码防止中文乱码:
[java] view plaincopyprint
1 请求响应编码均设置UTF8〔防止中文乱码〕
2 requestsetCharacterEncoding(UTF8)
3 responsesetCharacterEncoding(UTF8)
请求响应编码均设置UTF8〔防止中文乱码〕
requestsetCharacterEncoding(UTF8)
responsesetCharacterEncoding(UTF8)
验证说写例子测试:
[java] view plaincopyprint
1 private static String getMsgContent() {
2 StringBuffer buffer new StringBuffer()
3 行70汉字682汉字加1英文感慨号
4 bufferappend(知道什时候开始喜欢里夜里会里长美丽迷失想牵手走风风雨雨什困难陪)
5 bufferappend(知道什时候开始喜欢里夜里会里长美丽迷失想牵手走风风雨雨什困难陪)
6 bufferappend(知道什时候开始喜欢里夜里会里长美丽迷失想牵手走风风雨雨什困难陪)
7 bufferappend(知道什时候开始喜欢里夜里会里长美丽迷失想牵手走风风雨雨什困难陪)
8 bufferappend(知道什时候开始喜欢里夜里会里长美丽迷失想牵手走风风雨雨什困难陪)
9 bufferappend(知道什时候开始喜欢里夜里会里长美丽迷失想牵手走风风雨雨什困难陪)
10 bufferappend(知道什时候开始喜欢里夜里会里长美丽迷失想牵手走风风雨雨什困难陪)
11 bufferappend(知道什时候开始喜欢里夜里会里长美丽迷失想牵手走风风雨雨什困难陪)
12 bufferappend(知道什时候开始喜欢里夜里会里长美丽迷失想牵手走风风雨雨什困难陪)
13 bufferappend(知道什时候开始喜欢里夜里会里长美丽迷失想牵)
14 return buffertoString()
15 }
16
17 public static void main(String []args) throws Exception {
18 采gb2312编码方式时占1365字节
19 Systemoutprintln(getMsgContent()getBytes(gb2312)length)
20 采utf8编码方式时占2047字节
21 Systemoutprintln(getMsgContent()getBytes(utf8)length)
22 }
private static String getMsgContent() {
StringBuffer buffer new StringBuffer()
行70汉字682汉字加1英文感慨号
bufferappend(知道什时候开始喜欢里夜里会里长美丽迷失想牵手走风风雨雨什困难陪)
bufferappend(知道什时候开始喜欢里夜里会里长美丽迷失想牵手走风风雨雨什困难陪)
bufferappend(知道什时候开始喜欢里夜里会里长美丽迷失想牵手走风风雨雨什困难陪)
bufferappend(知道什时候开始喜欢里夜里会里长美丽迷失想牵手走风风雨雨什困难陪)
bufferappend(知道什时候开始喜欢里夜里会里长美丽迷失想牵手走风风雨雨什困难陪)
bufferappend(知道什时候开始喜欢里夜里会里长美丽迷失想牵手走风风雨雨什困难陪)
bufferappend(知道什时候开始喜欢里夜里会里长美丽迷失想牵手走风风雨雨什困难陪)
bufferappend(知道什时候开始喜欢里夜里会里长美丽迷失想牵手走风风雨雨什困难陪)
bufferappend(知道什时候开始喜欢里夜里会里长美丽迷失想牵手走风风雨雨什困难陪)
bufferappend(知道什时候开始喜欢里夜里会里长美丽迷失想牵)
return buffertoString()
}
public static void main(String []args) throws Exception {
采gb2312编码方式时占1365字节
Systemoutprintln(getMsgContent()getBytes(gb2312)length)
采utf8编码方式时占2047字节
Systemoutprintln(getMsgContent()getBytes(utf8)length)
}
getMsgContent()方法返回容正微信文消息长够支持采UTF8编码方式时文消息容支持2047字节微信公众台接口文档里说回复消息容长度超2048字节等2048字节行试着getMsgContent()方法里容加英文符号时候微信响应
时发现果采gb2312编码方式计算getMsgContent()方法返回文占字节数结果1365什朋友说微信文消息长度似支持1300字节接口文档中说2048字节实忽略编码方式简单String类getBytes()方法getBytes(utf8)方法计算占字节数
Java中utf8编码方式时占字节数计算方法封装
[java] view plaincopyprint
1 **
2 * 计算采utf8编码方式时字符串占字节数
3 *
4 * @param content
5 * @return
6 *
7 public static int getByteSize(String content) {
8 int size 0
9 if (null content) {
10 try {
11 汉字采utf8编码时占3字节
12 size contentgetBytes(utf8)length
13 } catch (UnsupportedEncodingException e) {
14 eprintStackTrace()
15 }
16 }
17 return size
18 }
**
* 计算采utf8编码方式时字符串占字节数
*
* @param content
* @return
*
public static int getByteSize(String content) {
int size 0
if (null content) {
try {
汉字采utf8编码时占3字节
size contentgetBytes(utf8)length
} catch (UnsupportedEncodingException e) {
eprintStackTrace()
}
}
return size
}
章节容讲里想家通篇文章学应该仅仅2047数字应该字符编码方式新认识
7 微信公众帐号开发教程第7篇文消息中换行符
篇文章介绍文消息中换行符处换行符
月然抽出时间写博客直认真答复家提出问题收回复关注答谢蛮成感觉做件事越越意义更加坚决继续写决心前面六篇文章讲解相信文章已掌握微信公众帐号根底开发知识〔基Java〕框架搭建API封装消息接收回复等接系列文章专注讲解公众帐号开发中技巧实功开发〔天气查询周边搜索机话等〕
换行处例
换行处非信息呈现更加整齐美观直观适文消息中换行符会感觉舒服清晰明面公众帐号xiaoqrobot菜单例合理换行符直观清爽呢?〔什?觉丑?呃算恋吧〕
试想果文菜单没换行符会长什样?
文消息中换行符?
微信公众帐号文消息中换行符然\n〞面通代码讲解xiaoqrobot文菜单实现?
[java] view plaincopyprint
1 **
2 * xiaoqrobot菜单
3 *
4 * @return
5 *
6 public static String getMainMenu() {
7 StringBuffer buffer new StringBuffer()
8 bufferappend(您q请回复数字选择效劳:)append(\n\n)
9 bufferappend(1 天气预报)append(\n)
10 bufferappend(2 公交查询)append(\n)
11 bufferappend(3 周边搜索)append(\n)
12 bufferappend(4 歌曲点播)append(\n)
13 bufferappend(5 典游戏)append(\n)
14 bufferappend(6 美女电台)append(\n)
15 bufferappend(7 脸识)append(\n)
16 bufferappend(8 聊天唠嗑)append(\n\n)
17 bufferappend(回复〞显示帮助菜单)
18 return buffertoString()
19 }
**
* xiaoqrobot菜单
*
* @return
*
public static String getMainMenu() {
StringBuffer buffer new StringBuffer()
bufferappend(您q请回复数字选择效劳:)append(\n\n)
bufferappend(1 天气预报)append(\n)
bufferappend(2 公交查询)append(\n)
bufferappend(3 周边搜索)append(\n)
bufferappend(4 歌曲点播)append(\n)
bufferappend(5 典游戏)append(\n)
bufferappend(6 美女电台)append(\n)
bufferappend(7 脸识)append(\n)
bufferappend(8 聊天唠嗑)append(\n\n)
bufferappend(回复〞显示帮助菜单)
return buffertoString()
}
样实现起简单呢?
1〕916行菜单项菜单项间换行符分隔
2〕第8行第16号末尾两换行符样菜单项容分隔开更层次感会舒服直观点
细心朋友已发现:截图周边搜索〞美女电台〞边礼物〞表情代码中没专门掉算面专门篇文章QQ表情发送处理接收讲清楚
细节决定成败
8 微信公众帐号开发教程第8篇文消息中网页超链接
文介绍网页超链接作文消息中网页超链接
网页超链接作
想熟悉HTML朋友超链接定会陌生天讨超链接中中种网页超链接HTML中标签某段文字链接网页例:
[html] view plaincopyprint
1 柳峰博客
柳峰博客
面段标准HTML代码实现网页超链接柳峰博客〞5字链接博客页URL柳峰博客〞5字时会翻开指网页
文消息中网页超链接
实知道文消息中网页超链接开发者100熟悉HTML特HTML中标签熟悉底微信公众帐号文消息中超链接什特处呢?什朋友问题栽头?先微信中两种错误超链接方法:
错误法1〔a标签href属性值未引号引起〕:
[html] view plaincopyprint
1 柳峰博客
柳峰博客
错误法2〔a标签href属性值单引号引起〕:
[html] view plaincopyprint
1 柳峰博客
柳峰博客
做Web开发时两种写法放微信公众帐号文消息中两种写法错误网页超链接会起作Android 会HTML代码原样显示出列图示:
Android 效果:
iPhone 效果:
出微信HTMLa标签属性值引号引起者单引号引起错误写法〔iPhonea标签属性href值单引号正常〕正确法a标签href属性值双引号引起代码:
[html] view plaincopyprint
1 柳峰博客
柳峰博客
样AndroidiPhone 正确显示超链接点击该超链接会微信置浏览器翻开
提示:测试微信公众帐号时 测试通认完全没问题目前微信公众帐号处AndroidiOS台表现致
9 微信公众帐号开发教程第9篇QQ表情发送接收
想家QQ表情定会陌生头极丰富聊天乐趣聊天简单文字表达够配喜怒哀乐等表达物心情图片文重点介绍容微信公众台QQ表情微信公众帐号开发模式发送QQ表情户识户发QQ表情
QQ表情代码表
首先需明确:QQ表情然呈现张张动态表情图片微信公众台消息接口中属文消息说户公众帐号发送QQ表情时公众帐号台程序接收消息类型MsgType值text面点理解面工作开展
QQ表情发送文消息呈现出表情图片QQ表情图片定会相应表情代码面已整理微信公众帐号中QQ表情代码表:
面列出105QQ表情表情出相应文字代码符号代码〔许两种法恰〕两种代码面马会讲
户公众帐号发送QQ表情
微信公众帐号时发送QQ表情想少会输入框旁边笑脸图片钮点击会弹出表情选择界面选择表情次QQ表情〞符号表情〞动画表情〞点击选择某QQ表情发现输入框中会显示该表情文字代码里中括号引起列图示:
实熟悉QQ表情文字代码时直接输入框中输入表情代码需弹出表情选择框列图示:
图出输入框中输入[呲牙]〞呲牙〞D〞三种代码作样发送呲牙QQ表情时候家回头文章开始QQ表情代码表明白回事
公众帐号户发送QQ表情
户公众帐号发送QQ表情样开发模式公众帐号样表情代码〔文字代码符号代码〕户回复QQ表情代码片段:
[java] view plaincopyprint
1 文消息
2 if (msgTypeequals(MessageUtilREQ_MESSAGE_TYPE_TEXT)) {
3 回复文消息
4 TextMessage textMessage new TextMessage()
5 textMessagesetToUserName(fromUserName)
6 textMessagesetFromUserName(toUserName)
7 textMessagesetCreateTime(new Date()getTime())
8 textMessagesetMsgType(MessageUtilRESP_MESSAGE_TYPE_TEXT)
9 textMessagesetFuncFlag(0)
10 textMessagesetContent([难] 难 ()
11
12 文消息象转换成xml字符串
13 respMessage MessageUtiltextMessageToXml(textMessage)
14 }
文消息
if (msgTypeequals(MessageUtilREQ_MESSAGE_TYPE_TEXT)) {
回复文消息
TextMessage textMessage new TextMessage()
textMessagesetToUserName(fromUserName)
textMessagesetFromUserName(toUserName)
textMessagesetCreateTime(new Date()getTime())
textMessagesetMsgType(MessageUtilRESP_MESSAGE_TYPE_TEXT)
textMessagesetFuncFlag(0)
textMessagesetContent([难] 难 ()
文消息象转换成xml字符串
respMessage MessageUtiltextMessageToXml(textMessage)
}
面代码片段作:判断发送消息类型果文消息〔MsgTypetext〕回复三难QQ表情户出户发公众帐号公众帐号发户QQ表情文字代码〔:[难] 难〕符号代码〔 (〕
公众帐号识户发送QQ表情
掌握发送QQ表情公众帐号识户发送QQ表情什意思呢?户公众帐号发送QQ表情台程序中接收会什值知道值QQ表情
实做简单测试方:接收文消息输出日志中〔log4j者Systemoutprint〕难发现:公众帐号发送QQ表情台程序中接收QQ表情符号代码
面简单封装方法通正表达式实现判断户发送否单QQ表情
[java] view plaincopyprint
1 **
2 * 判断否QQ表情
3 *
4 * @param content
5 * @return
6 *
7 public static boolean isQqFace(String content) {
8 boolean result false
9
10 判断QQ表情正表达式
11 String qqfaceRegex \\)|~|B|\\||8\\)|<||X|Z|'\\(|\\||@|P|D|O|\\(|\\+|b|Q|T|@P|@D|d|@o|g|\\|\\)||L|>|@|@f|S|\\|@x|@@|8|@||xx|bye|wipe|dig|handclap|&\\(|B\\)|<@|@>|O|>\\||P\\(|'\\||X\\)|\\*|@x|8\\*|pd|
12 Pattern p Pattern pile(qqfaceRegex)
13 Matcher m pmatcher(content)
14 if (mmatches()) {
15 result true
16 }
17 return result
18 }
**
* 判断否QQ表情
*
* @param content
* @return
*
public static boolean isQqFace(String content) {
boolean result false
判断QQ表情正表达式
String qqfaceRegex \\)|~|B|\\||8\\)|<||X|Z|'\\(|\\||@|P|D|O|\\(|\\+|b|Q|T|@P|@D|d|@o|g|\\|\\)||L|>|@|@f|S|\\|@x|@@|8|@||xx|bye|wipe|dig|handclap|&\\(|B\\)|<@|@>|O|>\\||P\\(|'\\||X\\)|\\*|@x|8\\*|pd|
Pattern p Pattern pile(qqfaceRegex)
Matcher m pmatcher(content)
if (mmatches()) {
result true
}
return result
}
面方法实现样简单功:户发什QQ表情公众帐号公众帐号回复什QQ表情户〔xiaoqrobot做〕实现代码:
[java] view plaincopyprint
1 文消息
2 if (msgTypeequals(MessageUtilREQ_MESSAGE_TYPE_TEXT)) {
3 文消息容
4 String content requestMapget(Content)
5
6 判断户发送否单QQ表情
7 if(XiaoqUtilisQqFace(content)) {
8 回复文消息
9 TextMessage textMessage new TextMessage()
10 textMessagesetToUserName(fromUserName)
11 textMessagesetFromUserName(toUserName)
12 textMessagesetCreateTime(new Date()getTime())
13 textMessagesetMsgType(MessageUtilRESP_MESSAGE_TYPE_TEXT)
14 textMessagesetFuncFlag(0)
15 户发什QQ表情返回什QQ表情
16 textMessagesetContent(content)
17
18 文消息象转换成xml字符串
19 respMessage MessageUtiltextMessageToXml(textMessage)
20 }
21 }
文消息
if (msgTypeequals(MessageUtilREQ_MESSAGE_TYPE_TEXT)) {
文消息容
String content requestMapget(Content)
判断户发送否单QQ表情
if(XiaoqUtilisQqFace(content)) {
回复文消息
TextMessage textMessage new TextMessage()
textMessagesetToUserName(fromUserName)
textMessagesetFromUserName(toUserName)
textMessagesetCreateTime(new Date()getTime())
textMessagesetMsgType(MessageUtilRESP_MESSAGE_TYPE_TEXT)
textMessagesetFuncFlag(0)
户发什QQ表情返回什QQ表情
textMessagesetContent(content)
文消息象转换成xml字符串
respMessage MessageUtiltextMessageToXml(textMessage)
}
}
关微信公众帐号中QQ表情介绍实希初学者简单拷贝贴出代码实现想功完事更希初学朋友够通文章学会种思考问题解决问题方法
10 微信公众帐号开发教程第10篇解析接口中消息创立时间CreateTime
微信公众台消息接口指南中出种类型消息定义中包含CreateTime参数表示消息创立时间列图示:
图消息接口指南中41文消息定义注意CreateTime描述:消息创立时间〔整型〕重点整型时间家熟悉类似yyyyMMdd HHmmss标准格式时间文想介绍微信消息接口中定义整型消息创立时间CreateTime含义CreateTime转换成熟悉时间格式
整型CreateTime含义
消息接口中定义消息创立时间CreateTime表示1970年1月1日0时0分0秒消息创立时间隔秒数注意间隔秒数毫秒数
整型CreateTime转换
Java中常会通面两种方式获取long类型时间先代码:
[java] view plaincopyprint
1 **
2 * 演示Java中常获取long类型时间两种方式
3 *
4 public static void main(String[] args) {
5 long longTime1 SystemcurrentTimeMillis()
6
7 Systemoutprintln(longTime1)
8
9 long longTime2 new javautilDate()getTime()
10
11 Systemoutprintln(longTime2)
12 }
**
* 演示Java中常获取long类型时间两种方式
*
public static void main(String[] args) {
long longTime1 SystemcurrentTimeMillis()
Systemoutprintln(longTime1)
long longTime2 new javautilDate()getTime()
Systemoutprintln(longTime2)
}
面两种获取long类型时间方法等价获取结果表示时时间距离1970年1月1日0时0分0秒0毫秒毫秒数注意里毫秒数里获取long类型时间转换成标准格式时间呢?方法:
[java] view plaincopyprint
1 **
2 * 演示Java中常获取long类型时间两种方式
3 *
4 public static void main(String[] args) {
5 前时间〔距离1970年1月1日0时0分0秒0毫秒毫秒数〕
6 long
7
8 String stdFormatTime formatTime(longTime)
9 输出:20210707 220903
10 Systemoutprintln(stdFormatTime)
11 }
12
13 **
14 * long类型时间转换成标准格式〔yyyyMMdd HHmmss〕
15 *
16 * @param longTime
17 * @return
18 *
19 public static String formatTime(long longTime) {
20 DateFormat format new SimpleDateFormat(yyyyMMdd HHmmss)
21 return formatformat(new Date(longTime))
22 }
**
* 演示Java中常获取long类型时间两种方式
*
public static void main(String[] args) {
前时间〔距离1970年1月1日0时0分0秒0毫秒毫秒数〕
String stdFormatTime formatTime(longTime)
输出:20210707 220903
Systemoutprintln(stdFormatTime)
}
**
* long类型时间转换成标准格式〔yyyyMMdd HHmmss〕
*
* @param longTime
* @return
*
public static String formatTime(long longTime) {
DateFormat format new SimpleDateFormat(yyyyMMdd HHmmss)
return formatformat(new Date(longTime))
}
面演示long类型时间转换成标准格式时间简单运SimpleDateFormat类拟懂回天题CreateTime转换成标准格式时间
微信消息接口中CreateTime表示距离1970年秒数SystemcurrentTimeMillis()表示距离1970年毫秒数间换算相:1秒1000毫秒CreateTime1000变成距离1970年毫秒数面formatTime()方法处理简单呢?
面单封装方法微信消息中整型消息创立时间CreateTime转换成标准格式时间:
[java] view plaincopyprint
1 **
2 * 微信消息中CreateTime转换成标准格式时间〔yyyyMMdd HHmmss〕
3 *
4 * @param createTime 消息创立时间
5 * @return
6 *
7 public static String formatTime(String createTime) {
8 微信传入CreateTime转换成long类型1000
9 long msgCreateTime LongparseLong(createTime) * 1000L
10 DateFormat format new SimpleDateFormat(yyyyMMdd HHmmss)
11 return formatformat(new Date(msgCreateTime))
12 }
11 微信公众帐号开发教程第11篇符号表情发送〔〕
题外话〔略〕
相信篇文章已家等太久弄玄虚吊家胃口写篇文章真需花太时间许篇文章花35分钟完学会掌握花23时时间完成许心写文章体会希家够相互体谅
说写东西太初级入门级东西吧成认众口难调难满足读者加新手4月前听说微信公众台词初学者谢谢方式鼓励会更加努力
第9篇文章介绍QQ表情发送接收朋友问发emoji表情〔微信符号表情〕写篇文章决心前网进行量搜索发现根没介绍方面文章微信公众帐号开发官方交流群里提问少知道该发送emoji表情天起揭开神秘面纱
文章概
文重点介绍微信公众帐号开发模式通程序代码户发送符号表情识户发送符号表情讲解留家点学思考空间家提示:户公众帐号发送符号表情实条文消息QQ表现样然文消息接收符号表情容印日志知道表情应文?呵呵然没简单文消息里需接收符号表情消息先做编码转换提示
认识符号表情
公众帐号交互界面窗口底部输入框旁边笑脸图片钮点击会弹出表情选择界面选择表情次QQ表情〞符号表情〞动画表情〞选择符号表情〞会列图示界面:
持出相QQ表情符号表情更加实什说呢?QQ表情脸部表情符号表情脸部表情外生活息息相关表情例:动物花朵树木电视 电脑吉球类交通工具等等果消息中符号表情会会显更加生动趣呢?
q机器中符号表情效果先两张图:
左边截图q机器菜单Q友圈文字旁边表情符号表情女男两朋友示意着Q友圈里结识更朋友想歪^_^右边截图脸识功指南里面相机〞鬼脸〞符号表情样更加趣味性呢?果纯文定会显太单调太枯燥
Emoji表情分类
Emoji表情种版包括UnifiedDoCoMoKDDISoftbankGoogle版表情代码样更恶: 操作系统甚操作系统版支持emoji表情样完美义者止步目前emoji表情保证终端正常
庆幸已超10余部终端测试emoji表情中包括iPhone 4SiPhone 5Android 22Android 40+Win8iPad2极终端显示出显示方格没什太影响放心
Emoji表情代码表Unified版
面介绍种版emoji表情通unicode编码表示换言版emoji表情应unicode编码值样篇文章先出Unified版emoji表情代码表列图示:
公众帐号户发送emoji表情
面已出emoji表情unified unicode代码表代码发送出应emoji表情呢?果简单QQ表情代码样直接文消息Content里写emoji表情代码定会原样显示
里需Java方法做转换处理方法代码:
[java] view plaincopyprint
1 **
2 * emoji表情转换(hex > utf16)
3 *
4 * @param hexEmoji
5 * @return
6 *
7 public static String emoji(int hexEmoji) {
8 return StringvalueOf(CharactertoChars(hexEmoji))
9 }
**
* emoji表情转换(hex > utf16)
*
* @param hexEmoji
* @return
*
public static String emoji(int hexEmoji) {
return StringvalueOf(CharactertoChars(hexEmoji))
}
方法说明:例行车〞unicode编码值U+1F6B2果程序代码中行车〞emoji表情需样:
[java] view plaincopyprint
1 String bike StringvalueOf(CharactertoChars(0x1F6B2))
String bike StringvalueOf(CharactertoChars(0x1F6B2))
实前面emoji()方法面行代码做简单封装现知道emoji表情代码吧实代码表中U+换0x调emoji方法进行转换转换结果放文消息Content中返回户会显示emoji表情
面出emoji表情完整例:
[java] view plaincopyprint
1 package orgliufengcourseservice
2
3 import javautilDate
4 import javautilMap
5
6 import javaxservlet ServletRequest
7
8 import orgliufengcoursemessagerespTextMessage
9 import orgliufengcourseutilMessageUtil
10
11 **
12 * 核心效劳类
13 *
14 * @author liufeng
15 * @date 20210520
16 *
17 public class CoreService {
18 **
19 * 处理微信发请求
20 *
21 * @param request
22 * @return
23 *
24 public static String processRequest( ServletRequest request) {
25 String respMessage null
26 try {
27 xml请求解析
28 Map
29
30 发送方帐号〔open_id〕
31 String fromUserName requestMapget(FromUserName)
32 公众帐号
33 String toUserName requestMapget(ToUserName)
34
35 回复文消息
36 TextMessage textMessage new TextMessage()
37 textMessagesetToUserName(fromUserName)
38 textMessagesetFromUserName(toUserName)
39 textMessagesetCreateTime(new Date()getTime())
40 textMessagesetMsgType(MessageUtilRESP_MESSAGE_TYPE_TEXT)
41 textMessagesetFuncFlag(0)
42 textMessagesetContent(行车 + emoji(0x1F6B2) + 男性 + emoji(0x1F6B9) + 钱袋 + emoji(0x1F4B0))
43 respMessage MessageUtiltextMessageToXml(textMessage)
44 } catch (Exception e) {
45 eprintStackTrace()
46 }
47
48 return respMessage
49 }
50
51 **
52 * emoji表情转换(hex > utf16)
53 *
54 * @param hexEmoji
55 * @return
56 *
57 public static String emoji(int hexEmoji) {
58 return StringvalueOf(CharactertoChars(hexEmoji))
59 }
60 }
package orgliufengcourseservice
import javautilDate
import javautilMap
import javaxservlet ServletRequest
import orgliufengcoursemessagerespTextMessage
import orgliufengcourseutilMessageUtil
**
* 核心效劳类
*
* @author liufeng
* @date 20210520
*
public class CoreService {
**
* 处理微信发请求
*
* @param request
* @return
*
public static String processRequest( ServletRequest request) {
String respMessage null
try {
xml请求解析
Map
发送方帐号〔open_id〕
String fromUserName requestMapget(FromUserName)
公众帐号
String toUserName requestMapget(ToUserName)
回复文消息
TextMessage textMessage new TextMessage()
textMessagesetToUserName(fromUserName)
textMessagesetFromUserName(toUserName)
textMessagesetCreateTime(new Date()getTime())
textMessagesetMsgType(MessageUtilRESP_MESSAGE_TYPE_TEXT)
textMessagesetFuncFlag(0)
textMessagesetContent(行车 + emoji(0x1F6B2) + 男性 + emoji(0x1F6B9) + 钱袋 + emoji(0x1F4B0))
respMessage MessageUtiltextMessageToXml(textMessage)
} catch (Exception e) {
eprintStackTrace()
}
return respMessage
}
**
* emoji表情转换(hex > utf16)
*
* @param hexEmoji
* @return
*
public static String emoji(int hexEmoji) {
return StringvalueOf(CharactertoChars(hexEmoji))
}
}
面代码作:户发送什类型消息返回包含三emoji表情文消息果明白CoreService类回事请查系列教程第5篇者需认真第42行代码知道样emoji表情代码放文消息Content中运行效果截图:
篇文章讲容结束关emoji表情讲解没结束什说呢?请仔细篇文章第二张截图q机器文菜单里面emoji表情文出emoji代码表里根找〔微信emoji表情代码表中完全致〕emoji表情发送呢请听回分解
12 微信公众帐号开发教程第12篇符号表情发送〔〕
引言文章概
第11篇文章出Unified版符号表情〔emoji表情〕代码表介绍微信公众帐号开发模式发送emoji表情文章结尾出卖关子:q机器中符号表情微信符号表情选择栏里根找篇文章出符号表情代码表〔Unified版〕中没表情发送呢?〞面两张图示符号表情情侣〞公汽车〞
文介绍容:1〕微信更符号表情〔发送微信符号表情选择栏中存emoji表情〕2〕出SoftBank版符号表情代码表3〕介绍演示发送SoftBank版符号表情家彻底玩转微信公众帐号emoji表情
微信更符号表情
先作微信户友微信公众帐号发送微信符号表情选择栏中没列出符号表情例:q机器中情侣〞公汽车〞两符号表情果想朋友微信聊天时该办呢?请先面两张截图:
出输入框中输入情侣〞全拼qinglv〞公汽车〞全拼gonggongqiche〞时输入法文提示列表中会动显示应符号表情样容易呢?类表情例:马桶厕取款机等
说明:笔者iPhone 4S 系统带输入法做测试果安卓者第三方输入法
Emoji表情代码表SoftBank版
篇文章讲emoji表情种版中包括UnifiedDoCoMoKDDISoftbankGoogle版表示符号表情Unicode代码相篇文章出SoftBank〔日软银集团〕版emoji表情代码表〔网般称SB Unicode指〕列图示:
公众帐号户发送SoftBank版符号表情
微信公众帐号开发模式发送SoftBank版符号表情发送Unified版符号表情简单直接符号表情应SoftBank Unicode值写程序代码中返回户需做处理
面出发送SoftBank版符号表情例代码:
[java] view plaincopyprint
1 package orgliufengcourseservice
2
3 import javautilDate
4 import javautilMap
5
6 import javaxservlet ServletRequest
7
8 import orgliufengcoursemessagerespTextMessage
9 import orgliufengcourseutilMessageUtil
10
11 **
12 * 核心效劳类
13 *
14 * @author liufeng
15 * @date 20210721
16 *
17 public class CoreService {
18 **
19 * 处理微信发请求
20 *
21 * @param request
22 * @return
23 *
24 public static String processRequest( ServletRequest request) {
25 String respMessage null
26 try {
27 xml请求解析
28 Map
29
30 发送方帐号〔open_id〕
31 String fromUserName requestMapget(FromUserName)
32 公众帐号
33 String toUserName requestMapget(ToUserName)
34
35 回复文消息
36 TextMessage textMessage new TextMessage()
37 textMessagesetToUserName(fromUserName)
38 textMessagesetFromUserName(toUserName)
39 textMessagesetCreateTime(new Date()getTime())
40 textMessagesetMsgType(MessageUtilRESP_MESSAGE_TYPE_TEXT)
41 textMessagesetFuncFlag(0)
42 textMessagesetContent(行车\ue136 男\ue138 钱袋\ue12f 情侣\ue428 公汽车\ue159)
43 respMessage MessageUtiltextMessageToXml(textMessage)
44 } catch (Exception e) {
45 eprintStackTrace()
46 }
47
48 return respMessage
49 }
50 }
package orgliufengcourseservice
import javautilDate
import javautilMap
import javaxservlet ServletRequest
import orgliufengcoursemessagerespTextMessage
import orgliufengcourseutilMessageUtil
**
* 核心效劳类
*
* @author liufeng
* @date 20210721
*
public class CoreService {
**
* 处理微信发请求
*
* @param request
* @return
*
public static String processRequest( ServletRequest request) {
String respMessage null
try {
xml请求解析
Map
发送方帐号〔open_id〕
String fromUserName requestMapget(FromUserName)
公众帐号
String toUserName requestMapget(ToUserName)
回复文消息
TextMessage textMessage new TextMessage()
textMessagesetToUserName(fromUserName)
textMessagesetFromUserName(toUserName)
textMessagesetCreateTime(new Date()getTime())
textMessagesetMsgType(MessageUtilRESP_MESSAGE_TYPE_TEXT)
textMessagesetFuncFlag(0)
textMessagesetContent(行车\ue136 男\ue138 钱袋\ue12f 情侣\ue428 公汽车\ue159)
respMessage MessageUtiltextMessageToXml(textMessage)
} catch (Exception e) {
eprintStackTrace()
}
return respMessage
}
}
面代码作:户发送什类型消息返回包含5emoji表情文消息果明白CoreService类回事请查系列教程第5篇者需认真第42行代码知道样SoftBank版emoji表情代码放文消息Content中运行效果截图:
说明:符号表情应Unified unicodeSoftbank unicode代码说情侣〞公汽车〞类微信符号表情栏中找emoji表情通文方式发送应Unified unicode代码样篇文章讲方法发送类符号表情
关微信公众帐号户发送符号表情讲解结束相信朋友完教程已开始帐号中符号表情实更希家拷贝粘出Unified版SoftBank版符号表情代码表时解符号表情种版Unicode编码增补码相关知识断拓展知识面触类旁通样真正讲解知识变成做变应万变
13 微信公众帐号开发教程第13篇图文消息全攻略
引言容概
已位读者抱怨柳峰文消息作例提图文消息知道图文消息该〞吧错原根底API封装完框架搭建出文消息例家够猫画虎许绘画功底太差画出猫猫吧……
篇介绍微信公众帐号开发中图文消息图文消息种表现形式标题取名图文消息全攻略〞绝标题想时机家图文消息相关问题疑虑障碍全部掉
图文消息参数说明
通微信官方消息接口指南图文消息参数介绍列图示:
图中解:
1〕图文消息数限制10图中ArticleCount值〔图文消息数限制10条〕
2〕图文消息第条图文图片显示图图文图片显示图
3〕第条图文图片建议640*320图文图片建议80*80
解结合第4篇文章讲消息消息处理工具封装想回复图文消息户什难事
图文消息种表现形式
面直接通代码演示图文消息五种表现形式法源代码:
[java] view plaincopyprint
1 package orgliufengcourseservice
2
3 import javautilArrayList
4 import javautilDate
5 import javautilList
6 import javautilMap
7
8 import javaxservlet ServletRequest
9
10 import orgliufengcoursemessagerespArticle
11 import orgliufengcoursemessagerespNewsMessage
12 import orgliufengcoursemessagerespTextMessage
13 import orgliufengcourseutilMessageUtil
14
15 **
16 * 核心效劳类
17 *
18 * @author liufeng
19 * @date 20210725
20 *
21 public class CoreService {
22 **
23 * 处理微信发请求
24 *
25 * @param request
26 * @return
27 *
28 public static String processRequest( ServletRequest request) {
29 String respMessage null
30 try {
31 xml请求解析
32 Map
33
34 发送方帐号〔open_id〕
35 String fromUserName requestMapget(FromUserName)
36 公众帐号
37 String toUserName requestMapget(ToUserName)
38 消息类型
39 String msgType requestMapget(MsgType)
40
41 默认回复文消息
42 TextMessage textMessage new TextMessage()
43 textMessagesetToUserName(fromUserName)
44 textMessagesetFromUserName(toUserName)
45 textMessagesetCreateTime(new Date()getTime())
46 textMessagesetMsgType(MessageUtilRESP_MESSAGE_TYPE_TEXT)
47 textMessagesetFuncFlag(0)
48 href属性值必须双引号引起字符串身双引号突转义
49 textMessagesetContent(欢送访问柳峰博客)
50 文消息象转换成xml字符串
51 respMessage MessageUtiltextMessageToXml(textMessage)
52
53 文消息
54 if (msgTypeequals(MessageUtilREQ_MESSAGE_TYPE_TEXT)) {
55 接收户发送文消息容
56 String content requestMapget(Content)
57
58 创立图文消息
59 NewsMessage newsMessage new NewsMessage()
60 newsMessagesetToUserName(fromUserName)
61 newsMessagesetFromUserName(toUserName)
62 newsMessagesetCreateTime(new Date()getTime())
63 newsMessagesetMsgType(MessageUtilRESP_MESSAGE_TYPE_NEWS)
64 newsMessagesetFuncFlag(0)
65
66 List
67 单图文消息
68 if (1equals(content)) {
69 Article article new Article()
70 articlesetTitle(微信公众帐号开发教程Java版)
71 articlesetDescription(柳峰80微信公众帐号开发验4月帮助初学者入门特推出系列教程希时机认识更行)
72 articlesetPicUrl( 0xiaoqrobotduapp imagesavatar_liufengjpg)
73 articlesetUrl( blogcsdnnetlyq8479)
74 articleListadd(article)
75 设置图文消息数
76 newsMessagesetArticleCount(articleListsize())
77 设置图文消息包含图文集合
78 newsMessagesetArticles(articleList)
79 图文消息象转换成xml字符串
80 respMessage MessageUtilnewsMessageToXml(newsMessage)
81 }
82 单图文消息含图片
83 else if (2equals(content)) {
84 Article article new Article()
85 articlesetTitle(微信公众帐号开发教程Java版)
86 图文消息中QQ表情符号表情
87 articlesetDescription(柳峰80 + emoji(0x1F6B9)
88 + 微信公众帐号开发验4月帮助初学者入门特推出系列连载教程希时机认识更行\n\n目前已推出教程12篇包括接口配置消息封装框架搭建QQ表情发送符号表情发送等\n\n期方案推出实功开发讲解例:天气预报周边搜索聊天功等)
89 图片置空
90 articlesetPicUrl()
91 articlesetUrl( blogcsdnnetlyq8479)
92 articleListadd(article)
93 newsMessagesetArticleCount(articleListsize())
94 newsMessagesetArticles(articleList)
95 respMessage MessageUtilnewsMessageToXml(newsMessage)
96 }
97 图文消息
98 else if (3equals(content)) {
99 Article article1 new Article()
100 article1setTitle(微信公众帐号开发教程\n引言)
101 article1setDescription()
102 article1setPicUrl( 0xiaoqrobotduapp imagesavatar_liufengjpg)
103 article1setUrl( blogcsdnnetlyq8479articledetails8937622)
104
105 Article article2 new Article()
106 article2setTitle(第2篇\n微信公众帐号类型)
107 article2setDescription()
108 article2setPicUrl( avatarcsdnnet14A1_lyq8479jpg)
109 article2setUrl( blogcsdnnetlyq8479articledetails8941577)
110
111 Article article3 new Article()
112 article3setTitle(第3篇\n开发模式启接口配置)
113 article3setDescription()
114 article3setPicUrl( avatarcsdnnet14A1_lyq8479jpg)
115 article3setUrl( blogcsdnnetlyq8479articledetails8944988)
116
117 articleListadd(article1)
118 articleListadd(article2)
119 articleListadd(article3)
120 newsMessagesetArticleCount(articleListsize())
121 newsMessagesetArticles(articleList)
122 respMessage MessageUtilnewsMessageToXml(newsMessage)
123 }
124 图文消息首条消息含图片
125 else if (4equals(content)) {
126 Article article1 new Article()
127 article1setTitle(微信公众帐号开发教程Java版)
128 article1setDescription()
129 图片置空
130 article1setPicUrl()
131 article1setUrl( blogcsdnnetlyq8479)
132
133 Article article2 new Article()
134 article2setTitle(第4篇\n消息消息处理工具封装)
135 article2setDescription()
136 article2setPicUrl( avatarcsdnnet14A1_lyq8479jpg)
137 article2setUrl( blogcsdnnetlyq8479articledetails8949088)
138
139 Article article3 new Article()
140 article3setTitle(第5篇\n种消息接收响应)
141 article3setDescription()
142 article3setPicUrl( avatarcsdnnet14A1_lyq8479jpg)
143 article3setUrl( blogcsdnnetlyq8479articledetails8952173)
144
145 Article article4 new Article()
146 article4setTitle(第6篇\n文消息容长度限制揭秘)
147 article4setDescription()
148 article4setPicUrl( avatarcsdnnet14A1_lyq8479jpg)
149 article4setUrl( blogcsdnnetlyq8479articledetails8967824)
150
151 articleListadd(article1)
152 articleListadd(article2)
153 articleListadd(article3)
154 articleListadd(article4)
155 newsMessagesetArticleCount(articleListsize())
156 newsMessagesetArticles(articleList)
157 respMessage MessageUtilnewsMessageToXml(newsMessage)
158 }
159 图文消息条消息含图片
160 else if (5equals(content)) {
161 Article article1 new Article()
162 article1setTitle(第7篇\n文消息中换行符)
163 article1setDescription()
164 article1setPicUrl( 0xiaoqrobotduapp imagesavatar_liufengjpg)
165 article1setUrl( blogcsdnnetlyq8479articledetails9141467)
166
167 Article article2 new Article()
168 article2setTitle(第8篇\n文消息中网页超链接)
169 article2setDescription()
170 article2setPicUrl( avatarcsdnnet14A1_lyq8479jpg)
171 article2setUrl( blogcsdnnetlyq8479articledetails9157455)
172
173 Article article3 new Article()
174 article3setTitle(果觉文章帮助请通博客留言关注微信公众帐号xiaoqrobot支持柳峰)
175 article3setDescription()
176 图片置空
177 article3setPicUrl()
178 article3setUrl( blogcsdnnetlyq8479)
179
180 articleListadd(article1)
181 articleListadd(article2)
182 articleListadd(article3)
183 newsMessagesetArticleCount(articleListsize())
184 newsMessagesetArticles(articleList)
185 respMessage MessageUtilnewsMessageToXml(newsMessage)
186 }
187 }
188 } catch (Exception e) {
189 eprintStackTrace()
190 }
191 return respMessage
192 }
193
194 **
195 * emoji表情转换(hex > utf16)
196 *
197 * @param hexEmoji
198 * @return
199 *
200 public static String emoji(int hexEmoji) {
201 return StringvalueOf(CharactertoChars(hexEmoji))
202 }
203 }
package orgliufengcourseservice
import javautilArrayList
import javautilDate
import javautilList
import javautilMap
import javaxservlet ServletRequest
import orgliufengcoursemessagerespArticle
import orgliufengcoursemessagerespNewsMessage
import orgliufengcoursemessagerespTextMessage
import orgliufengcourseutilMessageUtil
**
* 核心效劳类
*
* @author liufeng
* @date 20210725
*
public class CoreService {
**
* 处理微信发请求
*
* @param request
* @return
*
public static String processRequest( ServletRequest request) {
String respMessage null
try {
xml请求解析
Map
发送方帐号〔open_id〕
String fromUserName requestMapget(FromUserName)
公众帐号
String toUserName requestMapget(ToUserName)
消息类型
String msgType requestMapget(MsgType)
默认回复文消息
TextMessage textMessage new TextMessage()
textMessagesetToUserName(fromUserName)
textMessagesetFromUserName(toUserName)
textMessagesetCreateTime(new Date()getTime())
textMessagesetMsgType(MessageUtilRESP_MESSAGE_TYPE_TEXT)
textMessagesetFuncFlag(0)
href属性值必须双引号引起字符串身双引号突转义
textMessagesetContent(欢送访问柳峰博客)
文消息象转换成xml字符串
respMessage MessageUtiltextMessageToXml(textMessage)
文消息
if (msgTypeequals(MessageUtilREQ_MESSAGE_TYPE_TEXT)) {
接收户发送文消息容
String content requestMapget(Content)
创立图文消息
NewsMessage newsMessage new NewsMessage()
newsMessagesetToUserName(fromUserName)
newsMessagesetFromUserName(toUserName)
newsMessagesetCreateTime(new Date()getTime())
newsMessagesetMsgType(MessageUtilRESP_MESSAGE_TYPE_NEWS)
newsMessagesetFuncFlag(0)
List
单图文消息
if (1equals(content)) {
Article article new Article()
articlesetTitle(微信公众帐号开发教程Java版)
articlesetDescription(柳峰80微信公众帐号开发验4月帮助初学者入门特推出系列教程希时机认识更行)
articlesetPicUrl( 0xiaoqrobotduapp imagesavatar_liufengjpg)
articlesetUrl( blogcsdnnetlyq8479)
articleListadd(article)
设置图文消息数
newsMessagesetArticleCount(articleListsize())
设置图文消息包含图文集合
newsMessagesetArticles(articleList)
图文消息象转换成xml字符串
respMessage MessageUtilnewsMessageToXml(newsMessage)
}
单图文消息含图片
else if (2equals(content)) {
Article article new Article()
articlesetTitle(微信公众帐号开发教程Java版)
图文消息中QQ表情符号表情
articlesetDescription(柳峰80 + emoji(0x1F6B9)
+ 微信公众帐号开发验4月帮助初学者入门特推出系列连载教程希时机认识更行\n\n目前已推出教程12篇包括接口配置消息封装框架搭建QQ表情发送符号表情发送等\n\n期方案推出实功开发讲解例:天气预报周边搜索聊天功等)
图片置空
articlesetPicUrl()
articlesetUrl( blogcsdnnetlyq8479)
articleListadd(article)
newsMessagesetArticleCount(articleListsize())
newsMessagesetArticles(articleList)
respMessage MessageUtilnewsMessageToXml(newsMessage)
}
图文消息
else if (3equals(content)) {
Article article1 new Article()
article1setTitle(微信公众帐号开发教程\n引言)
article1setDescription()
article1setPicUrl( 0xiaoqrobotduapp imagesavatar_liufengjpg)
article1setUrl( blogcsdnnetlyq8479articledetails8937622)
Article article2 new Article()
article2setTitle(第2篇\n微信公众帐号类型)
article2setDescription()
article2setPicUrl( avatarcsdnnet14A1_lyq8479jpg)
article2setUrl( blogcsdnnetlyq8479articledetails8941577)
Article article3 new Article()
article3setTitle(第3篇\n开发模式启接口配置)
article3setDescription()
article3setPicUrl( avatarcsdnnet14A1_lyq8479jpg)
article3setUrl( blogcsdnnetlyq8479articledetails8944988)
articleListadd(article1)
articleListadd(article2)
articleListadd(article3)
newsMessagesetArticleCount(articleListsize())
newsMessagesetArticles(articleList)
respMessage MessageUtilnewsMessageToXml(newsMessage)
}
图文消息首条消息含图片
else if (4equals(content)) {
Article article1 new Article()
article1setTitle(微信公众帐号开发教程Java版)
article1setDescription()
图片置空
article1setPicUrl()
article1setUrl( blogcsdnnetlyq8479)
Article article2 new Article()
article2setTitle(第4篇\n消息消息处理工具封装)
article2setDescription()
article2setPicUrl( avatarcsdnnet14A1_lyq8479jpg)
article2setUrl( blogcsdnnetlyq8479articledetails8949088)
Article article3 new Article()
article3setTitle(第5篇\n种消息接收响应)
article3setDescription()
article3setPicUrl( avatarcsdnnet14A1_lyq8479jpg)
article3setUrl( blogcsdnnetlyq8479articledetails8952173)
Article article4 new Article()
article4setTitle(第6篇\n文消息容长度限制揭秘)
article4setDescription()
article4setPicUrl( avatarcsdnnet14A1_lyq8479jpg)
article4setUrl( blogcsdnnetlyq8479articledetails8967824)
articleListadd(article1)
articleListadd(article2)
articleListadd(article3)
articleListadd(article4)
newsMessagesetArticleCount(articleListsize())
newsMessagesetArticles(articleList)
respMessage MessageUtilnewsMessageToXml(newsMessage)
}
图文消息条消息含图片
else if (5equals(content)) {
Article article1 new Article()
article1setTitle(第7篇\n文消息中换行符)
article1setDescription()
article1setPicUrl( 0xiaoqrobotduapp imagesavatar_liufengjpg)
article1setUrl( blogcsdnnetlyq8479articledetails9141467)
Article article2 new Article()
article2setTitle(第8篇\n文消息中网页超链接)
article2setDescription()
article2setPicUrl( avatarcsdnnet14A1_lyq8479jpg)
article2setUrl( blogcsdnnetlyq8479articledetails9157455)
Article article3 new Article()
article3setTitle(果觉文章帮助请通博客留言关注微信公众帐号xiaoqrobot支持柳峰)
article3setDescription()
图片置空
article3setPicUrl()
article3setUrl( blogcsdnnetlyq8479)
articleListadd(article1)
articleListadd(article2)
articleListadd(article3)
newsMessagesetArticleCount(articleListsize())
newsMessagesetArticles(articleList)
respMessage MessageUtilnewsMessageToXml(newsMessage)
}
}
} catch (Exception e) {
eprintStackTrace()
}
return respMessage
}
**
* emoji表情转换(hex > utf16)
*
* @param hexEmoji
* @return
*
public static String emoji(int hexEmoji) {
return StringvalueOf(CharactertoChars(hexEmoji))
}
}
果明白CoreService类放什位置该请查系列教程第5篇面代码实现功户发送数字15时分回复五种表现形式图文消息户:
a〕户发送1回复单图文消息参考代码68~81行运行效果:
b〕户发送2回复单图文消息含图片参考代码82~96行运行效果:
说明:图文消息标题描述包含QQ表情符号表情
c〕户发送3回复图文消息参考代码97~123行运行效果:
说明:图文消息描述会显示标题换行符显示更加美观
d〕户发送4回复图文消息首条消息含图片参考代码124~158行运行效果:
e〕户发送5回复图文消息条消息含图片参考代码159~186行运行效果:
出图文消息着丰富容样化表现形式希家够根特点实际需合理运
根实践验图文消息做总结:
1〕定图文消息Url属性赋值单图文图文者含图片图文会户点击果Url空户点击会翻开空白页面户体验非常差
2〕单图文描述会显示图文描述会显示
3〕图文消息标题描述中QQ表情符号表情合理运表情符号会消息更加生动
4〕图文消息标题描述中换行符合理换行符会容结构更加清晰
5〕图文消息标题描述中支持超文链接〔html标签〕技术实现连逻辑说通条图文消息位置点击调微信置浏览器翻开Url果标题描述里放超链接知道点击该翻开页面真搞懂什学问问题难道设计成图文?
6〕图文消息链接图片链接外部域名资源例中:柳峰头博文链接指CSDN网站资源网甚微信官方交流群里认图文消息UrlPicUrl外链知道谣言开始实践检验真理唯标准
7〕指定图片第条图文图片建议640*320图文图片建议80*80果图片太加载慢耗流量果图片太显示会拉伸失真难
8〕条图文消息图文建议控制14条样绝数终端屏够显示完户扫眼概解消息容样促户点击阅读
14 微信公众帐号开发教程第14篇定义菜单创立菜单事件响应
微信50发布
2021年8月5日伴着微信50 iPhone版发布公众台进行重更新包括:
1〕运营体组织选择成效劳号者订阅号
2〕效劳号申请定义菜单
3〕QQ登录公众号升级邮箱登录
4〕邮箱登录公众号修改登录邮箱
5〕编辑图文消息选填作者
6〕群发消息步腾讯微博
中家议属前两条关帐号类型定义菜单更新里做点补充说明:
1〕目前公众号类型分两种:效劳号订阅号8月5日台更新帐号默认订阅号次转换成效劳号时机
2〕效劳号面企业政府组织订阅号面媒体
3〕效劳号申请定义菜单订阅号申请
4〕效劳号月群发条消息订阅号天群发条消息
台更新纠结定义菜单天群发条消息兼想评
引言容概
微信50前定义菜单作种测资格少数公众帐号拥菜单出现企业弄菜单惜重金求购现批帐号订阅号转效劳号奔着定义菜单测试发现微信审核放松申请效劳号定义菜单根成功根填写资料真伪知道微信会会翻脸求补全企业资料会种孩颗糖吃哭感觉
定义菜单申请底该创立呢?天微信官方交流群博客留言里够少开发者发愁篇文章家解决难题
定义菜单创立步骤
1找AppIdAppSecret定义菜单申请成功高级功〞开发模式〞接口配置信息〞两项
2根AppIdAppSecret s get方式获取访问特殊接口必须证access_token
3根access_tokenjson格式菜单数通 s post方式提交
分析创立菜单难点
原创立菜单简单三步搞定?象放冰箱差呵呵然没简单步步底难里?
首先第1步肯定没问题成功申请定义菜单定AppIdAppSecret两值
第2步get方式获取access_token直接拼url放浏览器里执行access_token抛开编程方式实现说真方法显然家第二步没问题
第3步拼装json格式菜单数然繁锁点根没什问题官方例子猫画虎行问题定出现 s post提交
结:知道创立定义菜单朋友三种情况:
1〕根者没懂公众台API文档中关通接口〞定义菜单接口〞限制〞局部说明
2〕知道发起 S请求〔时 请求直接 UrlConnection轻松搞定 s请求复杂点〕
3〕知道通POST方式提交json格式菜单数
正文章知道属种者种情况妨留言说出做调查属种情况然篇文章相信定会弄明白
解读通接口文档证获取
先通接口文档简介局部列图示
通俗点讲段简介理解:公众台特殊接口定义菜单创立语音文件获取动发送消息等果开发者想通 请求访问特殊接口必须访问证access_token
该获取接口访问证access_token呢?继续
图中已表达清楚获取access_token通GET方式访问链接:
[java] view plaincopyprint
1 s
链接中三参数分grant_typeappidsecret根图中参数说明grant_type传固定值client_credentialappidsecret申请完定义菜单微信分配
请求发送成功微信效劳器会返回json串包含access_tokenexpires_in两元素中access_token终需证expires_in证效期单位秒7200秒2时意味着次访问特殊接口需重新获取次access_tokenaccess_token效期直
解读定义菜单接口文档
样先定义菜单接口简介局部列图示
图中够获取信息:
1〕证access_token菜单执行三种操作:创立查询删
2〕定义菜单目前支持click种事件户点击回复某种类型消息够实现点击菜单项直接翻开页面〔typeview未开放目前微生活〕
3〕微信客户端缓存原菜单创立会立微信显示出需24时测试菜单创立时通取消关注关注方式达立菜单目
继续关菜单创立介绍列图示
实址POST方式提交JSON格式菜单字符串
面关参数说明局部贴图说明重点说:
1〕定义菜单3x5结构菜单二级级菜单3级菜单5二级菜单项
2〕菜单项key值户点击某菜单项时微信会该菜单项key值事件推送方式发送台处理程序
关菜单查询创立提两接口频率非常般果需面提供思路难理解
解读API文档限制
伙伴张图开始疑惑:菜单限制次数户量越越时候根够啊清楚限制针接口调针开发者户数次数半点关系没
先获取证接口说吧限制天调200次记前面提access_token效期效期两时获取次access_token两时继续理想情况天24时需获取12次够?难道200次够?
菜单创立接口限制天调100次解释吧菜单创立次切换模式〔指编辑模式开发模式间切换〕调删接口菜单会永远存谁没事干天创立100次菜单算测试测10次8次足够吧?
菜单查询删接口限制解释止二接口没次算样需求天屡次调完全足够
封装通请求方法
读里默认家已掌握面讲关定义菜单理知识面进入代码实战讲解局部
先前解创立菜单需调二接口 s请求非 果封装通请求方法该方法少需具备力:
1〕支持 S请求
2〕支持GETPOST两种方式
3〕支持参数提交支持参数情况
s请求需证书信理器理器类需定义需实现X509TrustManager接口代码:
[java] view plaincopyprint
1 package orgliufengweixinutil
2
3 import javasecuritycertCertificateException
4 import javasecuritycertX509Certificate
5
6 import javaxnetsslX509TrustManager
7
8 **
9 * 证书信理器〔 s请求〕
10 *
11 * @author liufeng
12 * @date 20210808
13 *
14 public class MyX509TrustManager implements X509TrustManager {
15
16 public void checkClientTrusted(X509Certificate[] chain String authType) throws CertificateException {
17 }
18
19 public void checkServerTrusted(X509Certificate[] chain String authType) throws CertificateException {
20 }
21
22 public X509Certificate[] getAcceptedIssuers() {
23 return null
24 }
25 }
package orgliufengweixinutil
import javasecuritycertCertificateException
import javasecuritycertX509Certificate
import javaxnetsslX509TrustManager
**
* 证书信理器〔 s请求〕
*
* @author liufeng
* @date 20210808
*
public class MyX509TrustManager implements X509TrustManager {
public void checkClientTrusted(X509Certificate[] chain String authType) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain String authType) throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null
}
}
证书理器作信指定证书面代码意味着信证书否权威机构颁发
证书通 s请求方法难实现实现代码:
[java] view plaincopyprint
1 package orgliufengweixinutil
2
3 import javaioBufferedReader
4 import javaioInputStream
5 import javaioInputStreamReader
6 import javaioOutputStream
7 import javanetConnectException
8 import javanetURL
9
10 import javaxnetssl sURLConnection
11 import javaxnetsslSSLContext
12 import javaxnetsslSSLSocketFactory
13 import javaxnetsslTrustManager
14
15 import netsfjsonJSONObject
16
17 import orgslf4jLogger
18 import orgslf4jLoggerFactory
19
20 **
21 * 公众台通接口工具类
22 *
23 * @author liuyq
24 * @date 20210809
25 *
26 public class WeixinUtil {
27 private static Logger log LoggerFactorygetLogger(WeixinUtilclass)
28
29 **
30 * 发起 s请求获取结果
31 *
32 * @param requestUrl 请求址
33 * @param requestMethod 请求方式〔GETPOST〕
34 * @param outputStr 提交数
35 * @return JSONObject(通JSONObjectget(key)方式获取json象属性值)
36 *
37 public static JSONObject Request(String requestUrl String requestMethod String outputStr) {
38 JSONObject jsonObject null
39 StringBuffer buffer new StringBuffer()
40 try {
41 创立SSLContext象指定信理器初始化
42 TrustManager[] tm { new MyX509TrustManager() }
43 SSLContext sslContext SSLContextgetInstance(SSL SunJSSE)
44 sslContextinit(null tm new javasecuritySecureRandom())
45 述SSLContext象中SSLSocketFactory象
46 SSLSocketFactory ssf sslContextgetSocketFactory()
47
48 URL url new URL(requestUrl)
49 sURLConnection UrlConn ( sURLConnection) urlopenConnection()
50 UrlConnsetSSLSocketFactory(ssf)
51
52 UrlConnsetDoOutput(true)
53 UrlConnsetDoInput(true)
54 UrlConnsetUseCaches(false)
55 设置请求方式〔GETPOST〕
56 UrlConnsetRequestMethod(requestMethod)
57
58 if (GETequalsIgnoreCase(requestMethod))
59 UrlConnconnect()
60
61 数需提交时
62 if (null outputStr) {
63 OutputStream outputStream UrlConngetOutputStream()
64 注意编码格式防止中文乱码
65 outputStreamwrite(outputStrgetBytes(UTF8))
66 outputStreamclose()
67 }
68
69 返回输入流转换成字符串
70 InputStream inputStream UrlConngetInputStream()
71 InputStreamReader inputStreamReader new InputStreamReader(inputStream utf8)
72 BufferedReader bufferedReader new BufferedReader(inputStreamReader)
73
74 String str null
75 while ((str bufferedReaderreadLine()) null) {
76 bufferappend(str)
77 }
78 bufferedReaderclose()
79 inputStreamReaderclose()
80 释放资源
81 inputStreamclose()
82 inputStream null
83 UrlConndisconnect()
84 jsonObject JSONObjectfromObject(buffertoString())
85 } catch (ConnectException ce) {
86 logerror(Weixin server connection timed out)
87 } catch (Exception e) {
88 logerror( s request error{} e)
89 }
90 return jsonObject
91 }
92 }
package orgliufengweixinutil
import javaioBufferedReader
import javaioInputStream
import javaioInputStreamReader
import javaioOutputStream
import javanetConnectException
import javanetURL
import javaxnetssl sURLConnection
import javaxnetsslSSLContext
import javaxnetsslSSLSocketFactory
import javaxnetsslTrustManager
import netsfjsonJSONObject
import orgslf4jLogger
import orgslf4jLoggerFactory
**
* 公众台通接口工具类
*
* @author liuyq
* @date 20210809
*
public class WeixinUtil {
private static Logger log LoggerFactorygetLogger(WeixinUtilclass)
**
* 发起 s请求获取结果
*
* @param requestUrl 请求址
* @param requestMethod 请求方式〔GETPOST〕
* @param outputStr 提交数
* @return JSONObject(通JSONObjectget(key)方式获取json象属性值)
*
public static JSONObject Request(String requestUrl String requestMethod String outputStr) {
JSONObject jsonObject null
StringBuffer buffer new StringBuffer()
try {
创立SSLContext象指定信理器初始化
TrustManager[] tm { new MyX509TrustManager() }
SSLContext sslContext SSLContextgetInstance(SSL SunJSSE)
sslContextinit(null tm new javasecuritySecureRandom())
述SSLContext象中SSLSocketFactory象
SSLSocketFactory ssf sslContextgetSocketFactory()
URL url new URL(requestUrl)
sURLConnection UrlConn ( sURLConnection) urlopenConnection()
UrlConnsetSSLSocketFactory(ssf)
UrlConnsetDoOutput(true)
UrlConnsetDoInput(true)
UrlConnsetUseCaches(false)
设置请求方式〔GETPOST〕
UrlConnsetRequestMethod(requestMethod)
if (GETequalsIgnoreCase(requestMethod))
UrlConnconnect()
数需提交时
if (null outputStr) {
OutputStream outputStream UrlConngetOutputStream()
注意编码格式防止中文乱码
outputStreamwrite(outputStrgetBytes(UTF8))
outputStreamclose()
}
返回输入流转换成字符串
InputStream inputStream UrlConngetInputStream()
InputStreamReader inputStreamReader new InputStreamReader(inputStream utf8)
BufferedReader bufferedReader new BufferedReader(inputStreamReader)
String str null
while ((str bufferedReaderreadLine()) null) {
bufferappend(str)
}
bufferedReaderclose()
inputStreamReaderclose()
释放资源
inputStreamclose()
inputStream null
UrlConndisconnect()
jsonObject JSONObjectfromObject(buffertoString())
} catch (ConnectException ce) {
logerror(Weixin server connection timed out)
} catch (Exception e) {
logerror( s request error{} e)
}
return jsonObject
}
}
代码说明:
1〕41~50行:解决 s请求问题问题出里
2〕55~59行:兼容GETPOST两种方式
3〕61~67行:兼容数提交数提交两种情况相局部知道POST提交数
Pojo类封装
获取证创立菜单前需封装pojo会代码更美观条理
首先调获取证接口微信效劳器会返回json格式数:{access_tokenACCESS_TOKENexpires_in7200}封装AccessToken象象二属性:tokenexpiresIn代码:
[java] view plaincopyprint
1 package orgliufengweixinpojo
2
3 **
4 * 微信通接口证
5 *
6 * @author liufeng
7 * @date 20210808
8 *
9 public class AccessToken {
10 获取证
11 private String token
12 证效时间单位:秒
13 private int expiresIn
14
15 public String getToken() {
16 return token
17 }
18
19 public void setToken(String token) {
20 thistoken token
21 }
22
23 public int getExpiresIn() {
24 return expiresIn
25 }
26
27 public void setExpiresIn(int expiresIn) {
28 thisexpiresIn expiresIn
29 }
30 }
package orgliufengweixinpojo
**
* 微信通接口证
*
* @author liufeng
* @date 20210808
*
public class AccessToken {
获取证
private String token
证效时间单位:秒
private int expiresIn
public String getToken() {
return token
}
public void setToken(String token) {
thistoken token
}
public int getExpiresIn() {
return expiresIn
}
public void setExpiresIn(int expiresIn) {
thisexpiresIn expiresIn
}
}
接菜单结构封装采面象编程方式终提交json格式菜单数应该象直接转换程序代码中拼堆json数菜单结构封装公众台API文档中出段json格式菜单结构示:
[java] view plaincopyprint
1 {
2 button[
3 {
4 typeclick
5 name日歌曲
6 keyV1001_TODAY_MUSIC
7 }
8 {
9 typeclick
10 name歌手简介
11 keyV1001_TODAY_SINGER
12 }
13 {
14 name菜单
15 sub_button[
16 {
17 typeclick
18 namehello word
19 keyV1001_HELLO_WORLD
20 }
21 {
22 typeclick
23 name赞
24 keyV1001_GOOD
25 }]
26 }]
27 }
{
button[
{
typeclick
name日歌曲
keyV1001_TODAY_MUSIC
}
{
typeclick
name歌手简介
keyV1001_TODAY_SINGER
}
{
name菜单
sub_button[
{
typeclick
namehello word
keyV1001_HELLO_WORLD
}
{
typeclick
name赞
keyV1001_GOOD
}]
}]
}
首先菜单项基类级菜单二级菜单相属性name菜单项基类封装代码:
[java] view plaincopyprint
1 package orgliufengweixinpojo
2
3 **
4 * 钮基类
5 *
6 * @author liufeng
7 * @date 20210808
8 *
9 public class Button {
10 private String name
11
12 public String getName() {
13 return name
14 }
15
16 public void setName(String name) {
17 thisname name
18 }
19 }
package orgliufengweixinpojo
**
* 钮基类
*
* @author liufeng
* @date 20210808
*
public class Button {
private String name
public String getName() {
return name
}
public void setName(String name) {
thisname name
}
}
接着子菜单项封装里子菜单样定义:没子菜单菜单项二级菜单项含二级菜单级菜单类子菜单项定会包含三属性:typenamekey封装代码:
[java] view plaincopyprint
1 package orgliufengweixinpojo
2
3 **
4 * 普通钮〔子钮〕
5 *
6 * @author liufeng
7 * @date 20210808
8 *
9 public class CommonButton extends Button {
10 private String type
11 private String key
12
13 public String getType() {
14 return type
15 }
16
17 public void setType(String type) {
18 thistype type
19 }
20
21 public String getKey() {
22 return key
23 }
24
25 public void setKey(String key) {
26 thiskey key
27 }
28 }
package orgliufengweixinpojo
**
* 普通钮〔子钮〕
*
* @author liufeng
* @date 20210808
*
public class CommonButton extends Button {
private String type
private String key
public String getType() {
return type
}
public void setType(String type) {
thistype type
}
public String getKey() {
return key
}
public void setKey(String key) {
thiskey key
}
}
父菜单项封装父菜单项定义:包含二级菜单项级菜单类菜单项包含二属性:namesub_buttonsub_button子菜单项数组父菜单项封装代码:
[java] view plaincopyprint
1 package orgliufengweixinpojo
2
3 **
4 * 复杂钮〔父钮〕
5 *
6 * @author liufeng
7 * @date 20210808
8 *
9 public class ComplexButton extends Button {
10 private Button[] sub_button
11
12 public Button[] getSub_button() {
13 return sub_button
14 }
15
16 public void setSub_button(Button[] sub_button) {
17 thissub_button sub_button
18 }
19 }
package orgliufengweixinpojo
**
* 复杂钮〔父钮〕
*
* @author liufeng
* @date 20210808
*
public class ComplexButton extends Button {
private Button[] sub_button
public Button[] getSub_button() {
return sub_button
}
public void setSub_button(Button[] sub_button) {
thissub_button sub_button
}
}
整菜单象封装菜单象包含菜单项〔3〕菜单项子菜单项〔含二级菜单级菜单〕父菜单项〔包含二级菜单菜单项〕果明白面讲封装代码容易理解:
[java] view plaincopyprint
1 package orgliufengweixinpojo
2
3 **
4 * 菜单
5 *
6 * @author liufeng
7 * @date 20210808
8 *
9 public class Menu {
10 private Button[] button
11
12 public Button[] getButton() {
13 return button
14 }
15
16 public void setButton(Button[] button) {
17 thisbutton button
18 }
19 }
package orgliufengweixinpojo
**
* 菜单
*
* @author liufeng
* @date 20210808
*
public class Menu {
private Button[] button
public Button[] getButton() {
return button
}
public void setButton(Button[] button) {
thisbutton button
}
}
关POJO类封装介绍完
证access_token获取方法
继续先前通请求方法类WeixinUtiljava中参加代码获取接口访问证:
[java] view plaincopyprint
1 获取access_token接口址〔GET〕 限200〔次天〕
2 public final static String access_token_url sapiweixinqq cgibintokengrant_typeclient_credential&appidAPPID&secretAPPSECRET
3
4 **
5 * 获取access_token
6 *
7 * @param appid 证
8 * @param appsecret 密钥
9 * @return
10 *
11 public static AccessToken getAccessToken(String appid String appsecret) {
12 AccessToken accessToken null
13
14 String requestUrl access_token_urlreplace(APPID appid)replace(APPSECRET appsecret)
15 JSONObject jsonObject Request(requestUrl GET null)
16 果请求成功
17 if (null jsonObject) {
18 try {
19 accessToken new AccessToken()
20 accessTokensetToken(jsonObjectgetString(access_token))
21 accessTokensetExpiresIn(jsonObjectgetInt(expires_in))
22 } catch (JSONException e) {
23 accessToken null
24 获取token失败
25 logerror(获取token失败 errcode{} errmsg{} jsonObjectgetInt(errcode) jsonObjectgetString(errmsg))
26 }
27 }
28 return accessToken
29 }
获取access_token接口址〔GET〕 限200〔次天〕
public final static String access_token_url sapiweixinqq cgibintokengrant_typeclient_credential&appidAPPID&secretAPPSECRET
**
* 获取access_token
*
* @param appid 证
* @param appsecret 密钥
* @return
*
public static AccessToken getAccessToken(String appid String appsecret) {
AccessToken accessToken null
String requestUrl access_token_urlreplace(APPID appid)replace(APPSECRET appsecret)
JSONObject jsonObject Request(requestUrl GET null)
果请求成功
if (null jsonObject) {
try {
accessToken new AccessToken()
accessTokensetToken(jsonObjectgetString(access_token))
accessTokensetExpiresIn(jsonObjectgetInt(expires_in))
} catch (JSONException e) {
accessToken null
获取token失败
logerror(获取token失败 errcode{} errmsg{} jsonObjectgetInt(errcode) jsonObjectgetString(errmsg))
}
}
return accessToken
}
定义菜单创立方法
继续先前通请求方法类WeixinUtiljava中参加代码创立定义菜单:
[java] view plaincopyprint
1 菜单创立〔POST〕 限100〔次天〕
2 public static String menu_create_url sapiweixinqq cgibinmenucreateaccess_tokenACCESS_TOKEN
3
4 **
5 * 创立菜单
6 *
7 * @param menu 菜单实例
8 * @param accessToken 效access_token
9 * @return 0表示成功值表示失败
10 *
11 public static int createMenu(Menu menu String accessToken) {
12 int result 0
13
14 拼装创立菜单url
15 String url menu_create_urlreplace(ACCESS_TOKEN accessToken)
16 菜单象转换成json字符串
17 String jsonMenu JSONObjectfromObject(menu)toString()
18 调接口创立菜单
19 JSONObject jsonObject Request(url POST jsonMenu)
20
21 if (null jsonObject) {
22 if (0 jsonObjectgetInt(errcode)) {
23 result jsonObjectgetInt(errcode)
24 logerror(创立菜单失败 errcode{} errmsg{} jsonObjectgetInt(errcode) jsonObjectgetString(errmsg))
25 }
26 }
27
28 return result
29 }
菜单创立〔POST〕 限100〔次天〕
public static String menu_create_url sapiweixinqq cgibinmenucreateaccess_tokenACCESS_TOKEN
**
* 创立菜单
*
* @param menu 菜单实例
* @param accessToken 效access_token
* @return 0表示成功值表示失败
*
public static int createMenu(Menu menu String accessToken) {
int result 0
拼装创立菜单url
String url menu_create_urlreplace(ACCESS_TOKEN accessToken)
菜单象转换成json字符串
String jsonMenu JSONObjectfromObject(menu)toString()
调接口创立菜单
JSONObject jsonObject Request(url POST jsonMenu)
if (null jsonObject) {
if (0 jsonObjectgetInt(errcode)) {
result jsonObjectgetInt(errcode)
logerror(创立菜单失败 errcode{} errmsg{} jsonObjectgetInt(errcode) jsonObjectgetString(errmsg))
}
}
return result
}
调封装方法创立定义菜单
[java] view plaincopyprint
1 package orgliufengweixinmain
2
3 import orgliufengweixinpojoAccessToken
4 import orgliufengweixinpojoButton
5 import orgliufengweixinpojo monButton
6 import orgliufengweixinpojo plexButton
7 import orgliufengweixinpojoMenu
8 import orgliufengweixinutilWeixinUtil
9 import orgslf4jLogger
10 import orgslf4jLoggerFactory
11
12 **
13 * 菜单理器类
14 *
15 * @author liufeng
16 * @date 20210808
17 *
18 public class MenuManager {
19 private static Logger log LoggerFactorygetLogger(MenuManagerclass)
20
21 public static void main(String[] args) {
22 第三方户唯证
23 String appId 000000000000000000
24 第三方户唯证密钥
25 String appSecret 00000000000000000000000000000000
26
27 调接口获取access_token
28 AccessToken at WeixinUtilgetAccessToken(appId appSecret)
29
30 if (null at) {
31 调接口创立菜单
32 int result WeixinUtilcreateMenu(getMenu() atgetToken())
33
34 判断菜单创立结果
35 if (0 result)
36 loginfo(菜单创立成功)
37 else
38 loginfo(菜单创立失败错误码: + result)
39 }
40 }
41
42 **
43 * 组装菜单数
44 *
45 * @return
46 *
47 private static Menu getMenu() {
48 CommonButton btn11 new CommonButton()
49 btn11setName(天气预报)
50 btn11setType(click)
51 btn11setKey(11)
52
53 CommonButton btn12 new CommonButton()
54 btn12setName(公交查询)
55 btn12setType(click)
56 btn12setKey(12)
57
58 CommonButton btn13 new CommonButton()
59 btn13setName(周边搜索)
60 btn13setType(click)
61 btn13setKey(13)
62
63 CommonButton btn14 new CommonButton()
64 btn14setName(历史天)
65 btn14setType(click)
66 btn14setKey(14)
67
68 CommonButton btn21 new CommonButton()
69 btn21setName(歌曲点播)
70 btn21setType(click)
71 btn21setKey(21)
72
73 CommonButton btn22 new CommonButton()
74 btn22setName(典游戏)
75 btn22setType(click)
76 btn22setKey(22)
77
78 CommonButton btn23 new CommonButton()
79 btn23setName(美女电台)
80 btn23setType(click)
81 btn23setKey(23)
82
83 CommonButton btn24 new CommonButton()
84 btn24setName(脸识)
85 btn24setType(click)
86 btn24setKey(24)
87
88 CommonButton btn25 new CommonButton()
89 btn25setName(聊天唠嗑)
90 btn25setType(click)
91 btn25setKey(25)
92
93 CommonButton btn31 new CommonButton()
94 btn31setName(Q友圈)
95 btn31setType(click)
96 btn31setKey(31)
97
98 CommonButton btn32 new CommonButton()
99 btn32setName(电影排行榜)
100 btn32setType(click)
101 btn32setKey(32)
102
103 CommonButton btn33 new CommonButton()
104 btn33setName(幽默笑话)
105 btn33setType(click)
106 btn33setKey(33)
107
108 ComplexButton mainBtn1 new ComplexButton()
109 mainBtn1setName(生活助手)
110 mainBtn1setSub_button(new CommonButton[] { btn11 btn12 btn13 btn14 })
111
112 ComplexButton mainBtn2 new ComplexButton()
113 mainBtn2setName(休闲驿站)
114 mainBtn2setSub_button(new CommonButton[] { btn21 btn22 btn23 btn24 btn25 })
115
116 ComplexButton mainBtn3 new ComplexButton()
117 mainBtn3setName(更体验)
118 mainBtn3setSub_button(new CommonButton[] { btn31 btn32 btn33 })
119
120 **
121 * 公众号xiaoqrobot目前菜单结构级菜单二级菜单项
122 *
123 * 某级菜单没二级菜单情况menu该定义呢?
124 * 方第三级菜单项更体验〞直接幽默笑话〞menu应该样定义:
125 * menusetButton(new Button[] { mainBtn1 mainBtn2 btn33 })
126 *
127 Menu menu new Menu()
128 menusetButton(new Button[] { mainBtn1 mainBtn2 mainBtn3 })
129
130 return menu
131 }
132 }
package orgliufengweixinmain
import orgliufengweixinpojoAccessToken
import orgliufengweixinpojoButton
import orgliufengweixinpojo monButton
import orgliufengweixinpojo plexButton
import orgliufengweixinpojoMenu
import orgliufengweixinutilWeixinUtil
import orgslf4jLogger
import orgslf4jLoggerFactory
**
* 菜单理器类
*
* @author liufeng
* @date 20210808
*
public class MenuManager {
private static Logger log LoggerFactorygetLogger(MenuManagerclass)
public static void main(String[] args) {
第三方户唯证
String appId 000000000000000000
第三方户唯证密钥
String appSecret 00000000000000000000000000000000
调接口获取access_token
AccessToken at WeixinUtilgetAccessToken(appId appSecret)
if (null at) {
调接口创立菜单
int result WeixinUtilcreateMenu(getMenu() atgetToken())
判断菜单创立结果
if (0 result)
loginfo(菜单创立成功)
else
loginfo(菜单创立失败错误码: + result)
}
}
**
* 组装菜单数
*
* @return
*
private static Menu getMenu() {
CommonButton btn11 new CommonButton()
btn11setName(天气预报)
btn11setType(click)
btn11setKey(11)
CommonButton btn12 new CommonButton()
btn12setName(公交查询)
btn12setType(click)
btn12setKey(12)
CommonButton btn13 new CommonButton()
btn13setName(周边搜索)
btn13setType(click)
btn13setKey(13)
CommonButton btn14 new CommonButton()
btn14setName(历史天)
btn14setType(click)
btn14setKey(14)
CommonButton btn21 new CommonButton()
btn21setName(歌曲点播)
btn21setType(click)
btn21setKey(21)
CommonButton btn22 new CommonButton()
btn22setName(典游戏)
btn22setType(click)
btn22setKey(22)
CommonButton btn23 new CommonButton()
btn23setName(美女电台)
btn23setType(click)
btn23setKey(23)
CommonButton btn24 new CommonButton()
btn24setName(脸识)
btn24setType(click)
btn24setKey(24)
CommonButton btn25 new CommonButton()
btn25setName(聊天唠嗑)
btn25setType(click)
btn25setKey(25)
CommonButton btn31 new CommonButton()
btn31setName(Q友圈)
btn31setType(click)
btn31setKey(31)
CommonButton btn32 new CommonButton()
btn32setName(电影排行榜)
btn32setType(click)
btn32setKey(32)
CommonButton btn33 new CommonButton()
btn33setName(幽默笑话)
btn33setType(click)
btn33setKey(33)
ComplexButton mainBtn1 new ComplexButton()
mainBtn1setName(生活助手)
mainBtn1setSub_button(new CommonButton[] { btn11 btn12 btn13 btn14 })
ComplexButton mainBtn2 new ComplexButton()
mainBtn2setName(休闲驿站)
mainBtn2setSub_button(new CommonButton[] { btn21 btn22 btn23 btn24 btn25 })
ComplexButton mainBtn3 new ComplexButton()
mainBtn3setName(更体验)
mainBtn3setSub_button(new CommonButton[] { btn31 btn32 btn33 })
**
* 公众号xiaoqrobot目前菜单结构级菜单二级菜单项
*
* 某级菜单没二级菜单情况menu该定义呢?
* 方第三级菜单项更体验〞直接幽默笑话〞menu应该样定义:
* menusetButton(new Button[] { mainBtn1 mainBtn2 btn33 })
*
Menu menu new Menu()
menusetButton(new Button[] { mainBtn1 mainBtn2 mainBtn3 })
return menu
}
}
注意:运行代码时需appIdappSecret换成公众号
整工程结构
保证文章完整独立性读性新建Java Project〔Java web工程没太关系〕没前篇文章讲weixinCourse工程中添加代码果需读者实现菜单创立代码移已工程中
图中Java文件源代码文章中贴出进行说明图中jarJava开发中通jar包容易网载
工程中引入jar包分两类:
1〕第类json开发工具包Java象Json字符串间转换json开发工具包3jar:ezmorph106jarjsonlib223jdk13jarmorph111jar
2〕第二类slf4j日志工具包记录系统运行产生日志日志输出控制台文件中
整工程中唯没讲srclog4jproperties配置贴出方便家参考样完整工程源码log4jproperties文件容:
[java] view plaincopyprint
1 log4jrootLoggerinfoconsolefile
2
3 log4jappenderconsoleorgapachelog4jConsoleAppender
4 log4jappenderconsolelayoutorgapachelog4jPatternLayout
5 log4jappenderconsolelayoutConversionPattern[5p] mn
6
7 log4jappenderfileorgapachelog4jDailyRollingFileAppender
8 log4jappenderfileDatePattern''yyyyMMdd
9 log4jappenderfileFilelogsweixinmpmenulog
10 log4jappenderfileAppendtrue
11 log4jappenderfilelayoutorgapachelog4jPatternLayout
12 log4jappenderfilelayoutConversionPattern[5p] d 37c 3x mn
log4jrootLoggerinfoconsolefile
log4jappenderconsolelayoutConversionPattern[5p] mn
log4jappenderfileDatePattern''yyyyMMdd
log4jappenderfileFilelogsweixinmpmenulog
log4jappenderfileAppendtrue
log4jappenderfilelayoutConversionPattern[5p] d 37c 3x mn
响应菜单点击事件
定义菜单创立工作已完成该接收响应菜单点击事件呢说公众帐号台处理程序中识户点击菜单做出响应局部容实教程第5篇种消息接收响应中已讲解清楚
第篇教程weixinCourse工程中CoreService类改写接收响应菜单点击事件该类修改完整代码:
[java] view plaincopyprint
1 package orgliufengcourseservice
2
3 import javautilDate
4 import javautilMap
5
6 import javaxservlet ServletRequest
7
8 import orgliufengcoursemessagerespTextMessage
9 import orgliufengcourseutilMessageUtil
10
11 **
12 * 核心效劳类
13 *
14 * @author liufeng
15 * @date 20210520
16 *
17 public class CoreService {
18 **
19 * 处理微信发请求
20 *
21 * @param request
22 * @return
23 *
24 public static String processRequest( ServletRequest request) {
25 String respMessage null
26 try {
27 默认返回文消息容
28 String respContent 请求处理异常请稍候尝试
29
30 xml请求解析
31 Map
32
33 发送方帐号〔open_id〕
34 String fromUserName requestMapget(FromUserName)
35 公众帐号
36 String toUserName requestMapget(ToUserName)
37 消息类型
38 String msgType requestMapget(MsgType)
39
40 回复文消息
41 TextMessage textMessage new TextMessage()
42 textMessagesetToUserName(fromUserName)
43 textMessagesetFromUserName(toUserName)
44 textMessagesetCreateTime(new Date()getTime())
45 textMessagesetMsgType(MessageUtilRESP_MESSAGE_TYPE_TEXT)
46 textMessagesetFuncFlag(0)
47
48 文消息
49 if (msgTypeequals(MessageUtilREQ_MESSAGE_TYPE_TEXT)) {
50 respContent 您发送文消息
51 }
52 图片消息
53 else if (msgTypeequals(MessageUtilREQ_MESSAGE_TYPE_IMAGE)) {
54 respContent 您发送图片消息
55 }
56 理位置消息
57 else if (msgTypeequals(MessageUtilREQ_MESSAGE_TYPE_LOCATION)) {
58 respContent 您发送理位置消息
59 }
60 链接消息
61 else if (msgTypeequals(MessageUtilREQ_MESSAGE_TYPE_LINK)) {
62 respContent 您发送链接消息
63 }
64 音频消息
65 else if (msgTypeequals(MessageUtilREQ_MESSAGE_TYPE_VOICE)) {
66 respContent 您发送音频消息
67 }
68 事件推送
69 else if (msgTypeequals(MessageUtilREQ_MESSAGE_TYPE_EVENT)) {
70 事件类型
71 String eventType requestMapget(Event)
72 订阅
73 if (eventTypeequals(MessageUtilEVENT_TYPE_SUBSCRIBE)) {
74 respContent 谢谢您关注
75 }
76 取消订阅
77 else if (eventTypeequals(MessageUtilEVENT_TYPE_UNSUBSCRIBE)) {
78 TODO 取消订阅户收公众号发送消息需回复消息
79 }
80 定义菜单点击事件
81 else if (eventTypeequals(MessageUtilEVENT_TYPE_CLICK)) {
82 事件KEY值创立定义菜单时指定KEY值应
83 String eventKey requestMapget(EventKey)
84
85 if (eventKeyequals(11)) {
86 respContent 天气预报菜单项点击
87 } else if (eventKeyequals(12)) {
88 respContent 公交查询菜单项点击
89 } else if (eventKeyequals(13)) {
90 respContent 周边搜索菜单项点击
91 } else if (eventKeyequals(14)) {
92 respContent 历史天菜单项点击
93 } else if (eventKeyequals(21)) {
94 respContent 歌曲点播菜单项点击
95 } else if (eventKeyequals(22)) {
96 respContent 典游戏菜单项点击
97 } else if (eventKeyequals(23)) {
98 respContent 美女电台菜单项点击
99 } else if (eventKeyequals(24)) {
100 respContent 脸识菜单项点击
101 } else if (eventKeyequals(25)) {
102 respContent 聊天唠嗑菜单项点击
103 } else if (eventKeyequals(31)) {
104 respContent Q友圈菜单项点击
105 } else if (eventKeyequals(32)) {
106 respContent 电影排行榜菜单项点击
107 } else if (eventKeyequals(33)) {
108 respContent 幽默笑话菜单项点击
109 }
110 }
111 }
112
113 textMessagesetContent(respContent)
114 respMessage MessageUtiltextMessageToXml(textMessage)
115 } catch (Exception e) {
116 eprintStackTrace()
117 }
118
119 return respMessage
120 }
121 }
package orgliufengcourseservice
import javautilDate
import javautilMap
import javaxservlet ServletRequest
import orgliufengcoursemessagerespTextMessage
import orgliufengcourseutilMessageUtil
**
* 核心效劳类
*
* @author liufeng
* @date 20210520
*
public class CoreService {
**
* 处理微信发请求
*
* @param request
* @return
*
public static String processRequest( ServletRequest request) {
String respMessage null
try {
默认返回文消息容
String respContent 请求处理异常请稍候尝试
xml请求解析
Map
发送方帐号〔open_id〕
String fromUserName requestMapget(FromUserName)
公众帐号
String toUserName requestMapget(ToUserName)
消息类型
String msgType requestMapget(MsgType)
回复文消息
TextMessage textMessage new TextMessage()
textMessagesetToUserName(fromUserName)
textMessagesetFromUserName(toUserName)
textMessagesetCreateTime(new Date()getTime())
textMessagesetMsgType(MessageUtilRESP_MESSAGE_TYPE_TEXT)
textMessagesetFuncFlag(0)
文消息
if (msgTypeequals(MessageUtilREQ_MESSAGE_TYPE_TEXT)) {
respContent 您发送文消息
}
图片消息
else if (msgTypeequals(MessageUtilREQ_MESSAGE_TYPE_IMAGE)) {
respContent 您发送图片消息
}
理位置消息
else if (msgTypeequals(MessageUtilREQ_MESSAGE_TYPE_LOCATION)) {
respContent 您发送理位置消息
}
链接消息
else if (msgTypeequals(MessageUtilREQ_MESSAGE_TYPE_LINK)) {
respContent 您发送链接消息
}
音频消息
else if (msgTypeequals(MessageUtilREQ_MESSAGE_TYPE_VOICE)) {
respContent 您发送音频消息
}
事件推送
else if (msgTypeequals(MessageUtilREQ_MESSAGE_TYPE_EVENT)) {
事件类型
String eventType requestMapget(Event)
订阅
if (eventTypeequals(MessageUtilEVENT_TYPE_SUBSCRIBE)) {
respContent 谢谢您关注
}
取消订阅
else if (eventTypeequals(MessageUtilEVENT_TYPE_UNSUBSCRIBE)) {
TODO 取消订阅户收公众号发送消息需回复消息
}
定义菜单点击事件
else if (eventTypeequals(MessageUtilEVENT_TYPE_CLICK)) {
事件KEY值创立定义菜单时指定KEY值应
String eventKey requestMapget(EventKey)
if (eventKeyequals(11)) {
respContent 天气预报菜单项点击
} else if (eventKeyequals(12)) {
respContent 公交查询菜单项点击
} else if (eventKeyequals(13)) {
respContent 周边搜索菜单项点击
} else if (eventKeyequals(14)) {
respContent 历史天菜单项点击
} else if (eventKeyequals(21)) {
respContent 歌曲点播菜单项点击
} else if (eventKeyequals(22)) {
respContent 典游戏菜单项点击
} else if (eventKeyequals(23)) {
respContent 美女电台菜单项点击
} else if (eventKeyequals(24)) {
respContent 脸识菜单项点击
} else if (eventKeyequals(25)) {
respContent 聊天唠嗑菜单项点击
} else if (eventKeyequals(31)) {
respContent Q友圈菜单项点击
} else if (eventKeyequals(32)) {
respContent 电影排行榜菜单项点击
} else if (eventKeyequals(33)) {
respContent 幽默笑话菜单项点击
}
}
}
textMessagesetContent(respContent)
respMessage MessageUtiltextMessageToXml(textMessage)
} catch (Exception e) {
eprintStackTrace()
}
return respMessage
}
}
代码说明:
1〕第69行第81行两行代码说明判断菜单点击事件消息类型MsgTypeeventEventCLICK时表示定义菜单点击事件
2〕第83行判断具体点击菜单项根菜单key值判断
3〕第85~109行表示户点击某菜单项具体返回什消息做简单例统返回文消息读者根实际需灵活处理
总结
里关定义菜单创立菜单事件判断处理响应全部介绍完希文章拷贝代码果样完全花时间写篇文章直接工程放载区简单外网工具填入appidappsecret菜单结构提交创立菜单请慎appidappsecret旦告诉公众号菜单控制权手总会心出搞点事
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档