微信公众账号开发教程


    微信公众帐号接口开发

    接触微信公众帐号已两月时间期间陆续完善公众帐号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 3     xmlnsxsi w3org2001XMLSchemainstance  
    4     xsischemaLocation javasun xmlnsjavaee   
    5      javasun xmlnsjavaeewebapp_2_5xsd>  
    6       
    7         coreServlet  
    8           
    9             orgliufengcourseservletCoreServlet  
    10           
    11       
    12   
    13     < urlpattern中配置coreServlet指定该Servlet访问路径 >  
    14       
    15         coreServlet  
    16         coreServlet  
    17       
    18   
    19       
    20         indexjsp  
    21       
    22   

    xmlnsxsi w3org2001XMLSchemainstance

    javasun xmlnsjavaeewebapp_2_5xsd>

    coreServlet

    orgliu



    < urlpattern中配置coreServlet指定该Servlet访问路径 >

    coreServlet
    coreServlet



    indexjsp


    里编码完成简单接工程发布公网效劳器果没公网效劳器环境解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
     Articles  
    16   
    17     public int getArticleCount() {  
    18         return ArticleCount  
    19     }  
    20   
    21     public void setArticleCount(int articleCount) {  
    22         ArticleCount  articleCount  
    23     }  
    24   
    25     public List
     getArticles() {  
    26         return Articles  
    27     }  
    28   
    29     public void setArticles(List
     articles) {  
    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
    Articles

    public int getArticleCount() {
    return ArticleCount
    }

    public void setArticleCount(int articleCount) {
    ArticleCount articleCount
    }

    public List
    getArticles() {
    return Articles
    }

    public void setArticles(List
    articles) {
    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 parseXml( ServletRequest request) throws Exception {  
    10      解析结果存储HashMap中   
    11     Map map  new HashMap()  
    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 elementList  rootelements()  
    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 parseXml( ServletRequest request) throws Exception {
    解析结果存储HashMap中
    Map map new HashMap()

    request中取输入流
    InputStream inputStream requestgetInputStream()
    读取输入流
    SAXReader reader new SAXReader()
    Document document readerread(inputStream)
    xml根元素
    Element root documentgetRootElement()
    根元素子节点
    List elementList rootelements()

    遍历子节点
    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 parseXml( ServletRequest request) throws Exception {  
    102          解析结果存储HashMap中   
    103         Map map  new HashMap()  
    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 elementList  rootelements()  
    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 parseXml( ServletRequest request) throws Exception {
    解析结果存储HashMap中
    Map map new HashMap()

    request中取输入流
    InputStream inputStream requestgetInputStream()
    读取输入流
    SAXReader reader new SAXReader()
    Document document readerread(inputStream)
    xml根元素
    Element root documentgetRootElement()
    根元素子节点
    List elementList rootelements()

    遍历子节点
    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 requestMap  MessageUtilparseXml(request)  
    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 requestMap MessageUtilparseXml(request)

    发送方帐号〔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||beer|basketb|oo|coffee|eat|pig|rose|fade|showlove|heart|break|cake|li|bome|kn|footb|ladybug|shit|moon|sun|gift|hug|strong|weak|share|v|@\\)|jj|@@|bad|lvu|no|ok|love||jump|shake||circle|kotow|turn|skip|oY|#0|hiphot|kiss|<&|&>  
    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||beer|basketb|oo|coffee|eat|pig|rose|fade|showlove|heart|break|cake|li|bome|kn|footb|ladybug|shit|moon|sun|gift|hug|strong|weak|share|v|@\\)|jj|@@|bad|lvu|no|ok|love||jump|shake||circle|kotow|turn|skip|oY|#0|hiphot|kiss|<&|&>
    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 requestMap  MessageUtilparseXml(request)  
    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 requestMap MessageUtilparseXml(request)

    发送方帐号〔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 requestMap  MessageUtilparseXml(request)  
    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 requestMap MessageUtilparseXml(request)

    发送方帐号〔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 requestMap  MessageUtilparseXml(request)  
    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
     articleList  new ArrayList
    ()  
    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 requestMap MessageUtilparseXml(request)

    发送方帐号〔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
    articleList new ArrayList
    ()
    单图文消息
    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 requestMap  MessageUtilparseXml(request)  
    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 requestMap MessageUtilparseXml(request)

    发送方帐号〔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)户传

    《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
    该内容是文档的文本内容,更好的格式请下载文档

    相关文档

    如何增加微信公众账号的订阅

    如何增加微信公众账号的订阅包邮正版现货特价抢!微信,这么玩才赚钱 网络营销 微信营销 微信书籍 微信揭秘 7大价值 6大模式 9大功能 书籍 地址:http://url.cn/LTyYZM 电...

    10年前   
    741    0

    未来微信公众账号将由五类组成

    未来微信公众账号将由五类组成包邮正版现货特价抢!微信,这么玩才赚钱 网络营销 微信营销 微信书籍 微信揭秘 7大价值 6大模式 9大功能 书籍 地址:http://url.cn/LTyYZM ...

    10年前   
    610    0

    公众账号微信营销策划方案

     XXXXXXXXX微信营销策划方案包邮正版现货特价抢!微信,这么玩才赚钱 网络营销 微信营销 微信书籍 微信揭秘 7大价值 6大模式 9大功能 书籍 地址:http://url.cn/...

    11年前   
    745    0

    未来微信公众账号将由五类组成

    未来微信公众账号将由五类组成目前的主流用户和运营方式微信公众平台处于公测阶段,开通、特别是通过认证的账号以科技媒体和微博大号为主。他们的微信账号运营主要是向用户推送一些精选内容。值得注意的是,...

    11年前   
    662    0

    微信账号运营及推广方案

    微信账号运营及推广方案一、微信营销推广目的:1、通过点对面,一对多,全封闭无干扰营销手段增强该店的传播速度;2、拓宽会员推广渠道,挖掘高端旅游潜在客户,以便成为该店忠实客户;加强与顾客之间的互...

    12年前   
    1014    0

    微信公众号开通文案

    微信公众号开通文案微信公众号文案怎么写?一些从事微信公众号推广文案撰写的人都是从看别人的范文学期,要把微信公众号文案写好策划的具体内容很重要,那么微信公众号推广文案需要注意的问题有哪些?一、撰...

    1年前   
    525    0

    微信公众平台建设合同

     受甲方委托,乙方为甲方建立自己的微信公众平台,双方就有关事项达成协议,其条款如下:

    6年前   
    2335    0

    微信公众号及小程序定制化开发协议

    微信公众号及小程序定制化开发协议客户方(以下简称甲方): __________________________ ...

    2年前   
    828    0

    微信公众平台新玩法:十二种微信的推广方法

    微信公众平台新玩法:十二种微信的推广方法众所周知,由于微信公众平台是无法在手机上登陆,也无法主动添加好友的,所以在微信推广起来比较困难。只能通过不同的其他推广方式来增加微信的曝光度,但很多朋友...

    12年前   
    984    0

    团支部微信公众号建设方案

    为了更好地完成团支部组织网络建设任务,以探索团组织建设新途径为动力,针对新信息环境下团建工作出现的新特点和新时期团员青年的心理特点,不断加强和完善团组织的阵地建设

    2年前   
    523    0

    教育类微信公众号运营

    微信公众号如何赚钱做得早定位精 有清晰盈利模式从1做到580万,微信公众号花了近两年的时间,可是从580万上升到近1000万,微信公众号只花了八个多月。特别是2014年底以来,微信公众号几乎有...

    9年前   
    758    0

    微信公众号管理制度

    第一条 本制度所称信息是指在微信公众号上对外发布的文字、数据、图片及其他形式的信息。第二条 微信公众号管理及信息维护遵循统一管理、统筹规划、分级负责的原则。县司法局微信公众号日常

    4个月前   
    142    0

    微信公众平台代运营合同书

    甲乙双方经友好协商,就甲方委托乙方进行微信公众平台托管事宜达成以下协议。双方申明,双方都已理解并认可了本合同的所有内容,同意承担各自应承担的权利和义务,忠实地履行本合同。第一章双方的权利和义务1...

    5年前   
    9149    0

    微信公众平台消息接口使用指南

    一、简介公众平台消息接口为开发者提供了一种新的消息处理方式。二、申请消息接口点击申请,如实填写负责人姓名、手机号和邮箱,填写网址url和token,其中token可由开发者可以任意填写,用作生...

    11年前   
    999    0

    微信公众平台营销方案2篇

     1、添加粉丝方式  通过小号添加好友,小号个人认为最好是以生活中帅哥或美女的身份吸引粉丝(或者再用另外一个小号,在签名档上放广告或者促销的消息,用户查找附近的人的时候或者摇一摇的时候会看见。)...

    2年前   
    884    0

    微信公众号审核制度

    为适应公司发展需要,充分发挥传媒公司微信公众号在对外宣传和信息交流的积极作用,规范管理,树立良好的企业形象,结合实际制定本办法。

    6年前   
    17947    2

    《公司微信公众号运营计划》

    公司微信平台运营计划一、信息推送分类1、行业信息2、公司新闻3、产品介绍4、员工互动空间(面向公司员工组)5、节假日祝福及技术部节假日值班安排二、信息来源:1、总经部负责收集各大门户网站、权威...

    2年前   
    754    0

    微信公众平台广告投放服务合同

    乙方通过腾讯平台为甲方提供技术服务,甲方支付相应费用,经双方平等协商,在真实充分表达各自意愿的基础上,根据《中华人民合同法》和相关法规,本着平等互利,真诚合作的原则,约定如下

    4年前   
    2673    0

    公众微信平台为青春点赞

      玉门油田综合服务处团委公众微信平台为青春点赞   本报讯(通讯员 马宁)7月12日,综合服务处团委微信公众平台迎来了1周岁生日。平台上线运行一年来,通过举行“微”活动、推送“微”资讯...

    10年前   
    8698    0

    团支部微信公众号建设方案

    为了更好地完成团支部组织网络建设任务,以探索团组织建设新途径为动力,针对新信息环境下团建工作出现的新特点和新时期团员青年的心理特点,不断加强和完善团组织的阵地建设,更好地利用新媒体团结

    2年前   
    448    0

    文档贡献者

    鬼***笑

    贡献于2022-01-19

    下载需要 25 香币 [香币充值 ]
    亲,您也可以通过 分享原创文档 来获得香币奖励!
    下载文档

    该用户的其他文档