JAVA源码微信公众号开发 | 第一篇: 前期准备及实现自动回复(附源码)

JAVA微信公众号开发 | 第一篇: 前期准备及实现自动回复(附源码)

本系列文章是记录本身微信公众号的开发过程,也但愿能为感兴趣的其余人提供一些思路和帮助
欢迎转发,转发请在文前明显位置,注明本文地址
项目源码放到文末,须要自取
最终效果
html

前言

有一个特别坑的地方,须要提早说一下 我的订阅号 如今已经没有接口开发自定义菜单的权限了。
java

也就是说只能经过微信帐号后台自定义菜单,而不能经过接口开发自定义菜单
可是接口开发和后台自定义二者互斥

要想接口开发自定义菜单,就必须是认证公众号,可是
spring

wt fk
鸡你太美 诶,,,
鸡你太美**
可是服务号申请也不难
虽然有这么多限制,我仍是想去尝试一下,兴趣大于一切shell

1.申请公众号

  • 登陆地址:https://mp.weixin.qq.com/,注册-选择类型,
  • 对类型不清楚的点击连接,帐号类型区别http://kf.qq.com/faq/170815aUZjeQ170815mU7bI7.html
  • 公众号申请流程:http://kf.qq.com/product/weixinmp.html#hid=99

申请服务号 仍是比较麻烦的 可是服务号是直接展现在好友消息列表中 而订阅号是展现在订阅号消息
服务器

2.云服务器或者其余外网映射工具

我用的是腾讯云。其余外网映射工具在这里就不说了,搜一下不少微信

3.接口配置

进入配置页面:基本配置 > 修改配置
app

  • URL:中的IP地址,若是是腾讯云则能够在云服务器界面找本身的公网IP地址
  • Token :能够本身随意填,可是要和后面服务器的保持一致

点击提交>肯定
以后微信会自动向你的服务器发送GET请求并验证你的服务器,所以咱们须要完成了对GET请求的处理(后面有代码讲解,先不用点肯定)maven

4.验证消息的确来自微信服务器

开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数以下表所示:ide

参数 描述
signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数
timestamp 时间戳
nonce 随机数
echostr 随机字符串

开发者经过检验signature对请求进行校验(下面有校验方式)。若确认这次GET请求来自微信服务器,请原样返回echostr参数内容,则> 接入生效,成为开发者成功,不然接入失败。
加密/校验流程以下:
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者得到加密后的字符串可与signature对比,标识该请求来源于微信spring-boot

以上是来源 微信文档,写的很清楚了,撸代码。

/** 
* 处理微信服务器发来的get请求,进行签名的验证 
* signature 微信端发来的签名 * timestamp 微信端发来的时间戳 
* nonce     微信端发来的随机字符串 
* echostr   微信端发来的验证字符串 
*/
@GetMapping(value = "wechat")
public String validate(@RequestParam(value = "signature") String signature,        
                            @RequestParam(value = "timestamp") String timestamp,                     
                            @RequestParam(value = "nonce") String nonce,                       
                            @RequestParam(value = "echostr") String echostr) {    
                            
                            return WeChatUtil.checkSignature(signature, timestamp, nonce) ? echostr : null;
                            
}
public static boolean checkSignature(String signature, String timestamp, String nonce) {   
        String[] arr = new String[] { WeChatContant.TOKEN, timestamp, nonce };   
        // 将token、timestamp、nonce三个参数进行字典序排序   
        sort(arr);    
        StringBuilder content = new StringBuilder();   
        for (int i = 0; i < arr.length; i++) {       
            content.append(arr[i]);    
        }    
        MessageDigest md = null;    
        String tmpStr = null;    
        try {        
            md = MessageDigest.getInstance("SHA-1");        
            // 将三个参数字符串拼接成一个字符串进行sha1加密        
            byte[] digest = md.digest(content.toString().getBytes());        
            tmpStr = byteToStr(digest);    
         } catch (NoSuchAlgorithmException e) {       
            e.printStackTrace();    
         }    
        content = null;   
        // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信    
        return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
}

String[] arr = new String[] { WeChatContant.TOKEN, timestamp, nonce };
此处的WeChatContant.TOKEN是个常量 public static final String TOKEN = "lhx";
必须和上文基本配置中的 此处随便写 保持一致
完成以后 把项目打个JAR包 扔到服务器上面(别忘安装jdk,安装方法百度搜一下)
此处用到的工具软件:Xshell 6 Xftp 6
工具软件放到文末,须要自取

<build>    
    <plugins>        
        <plugin>            
            <groupId>org.springframework.boot</groupId>            
            <artifactId>spring-boot-maven-plugin</artifactId>            
            <executions>                
                <execution>                   
                    <configuration>         
                        <!--此处填写boot启动类-->               
                        <mainClass>com.lhx.wechat.WechatApplication</mainClass>                                
                    </configuration>                 
                    <goals>                        
                        <goal>repackage</goal>        
                    </goals>      
                </execution>            
            </executions>        
        </plugin>    
    </plugins>
</build>

项目源码中添加了maven打包插件 能够直接maven clen package -> 可运行的jar包
项目源码放到文末,须要自取

而后再回到 配置页面:基本配置 > 修改配置 > 提交 >肯定 网页顶端会显示提交成功

5.接收普通消息

当普通微信用户向公众帐号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。
请注意:
一、关于重试的消息排重,推荐使用msgid排重。
二、微信服务器在五秒内收不到响应会断掉链接,而且从新发起请求,总共重试三次。假如服务器没法保证在五秒内处理并回复,能够直接 回复空串,微信服务器不会对此做任何处理,而且不会发起重试。详情请见“发送消息-被动回复消息”。
三、若是开发者须要对用户消息在5秒内当即作出回应,即便用“发送消息-被动回复消息”接口向用户被动回复消息时,能够在公众平台官网的开发者中心处设置消息加密。开启加密后,用户发来的消息和开发者回复的消息都会被加密(但开发者经过客服接口等API调用形式向用户发送消息,则不受影响)。关于消息加解密的详细说明,请见“发送消息-被动回复消息加解密说明”。各消息类型的推送XML数据包结构以下:

<xml> 
    <ToUserName><![CDATA[toUser]]></ToUserName>  
    <FromUserName><![CDATA[fromUser]]></FromUserName>  
    <CreateTime>1348831860</CreateTime>  
    <MsgType><![CDATA[text]]></MsgType>  
    <Content><![CDATA[this is a test]]></Content> 
    <MsgId>1234567890123456</MsgId>
</xml>
参数 描述
ToUserName 开发者微信号
FromUserName 发送方账号(一个OpenID)
CreateTime 消息建立时间 (整型)
MsgType 消息类型,文本为text
Content 文本消息内容
MsgId 消息id,64位整型

文末有源码

6.回复普通消息

当用户发送消息给公众号时(或某些特定的用户操做引起的事件推送时),会产生一个POST请求,开发者能够在响应包(Get)中返回特> 定XML结构,来对该消息进行响应(现支持回复文本、图片、图文、语音、视频、音乐)。严格来讲,发送被动响应消息其实并非一种> 接口,而是对微信服务器发过来消息的一次回复。须要的XML数据包结构以下:

回复文本消息

<xml>  
    <ToUserName><![CDATA[toUser]]></ToUserName>  
    <FromUserName><![CDATA[fromUser]]></FromUserName>  
    <CreateTime>12345678</CreateTime>  
    <MsgType><![CDATA[text]]></MsgType>  
    <Content><![CDATA[你好]]></Content>
</xml>
参数 是否必须 描述
ToUserName 接收方账号(收到的OpenID)
FromUserName 开发者微信号
CreateTime 消息建立时间 (整型)
MsgType 消息类型,文本为text
Content 回复的消息内容(换行:在content中可以换行,微信客户端就支持换行显示)

文末有源码

完整代码

@PostMapping(value = "wechat")
public String textMessge(HttpServletRequest request) {   
    logger.info("wechat");  
    return javaMessageService.textMessage(request);
}
@Service
public class JavaMessageServiceImpl implements JavaMessageService {    
    private static final Logger logger = LoggerFactory.getLogger(JavaMessageServiceImpl.class);    
    @Override    
    public String textMessage(HttpServletRequest request) {        
        logger.info("进来了");      
        // xml格式的消息数据        
        String respXml = null;      
        // 默认返回的文本消息内容       
        String respContent;       
        try {        
            // 调用parseXml方法解析请求消息     
            Map<String,String> requestMap = WeChatUtil.parseXml(request);     
            // 消息类型         
            String msgType = requestMap.get(WeChatContant.MsgType);       
            String mes = null;        

            // 文本消息          
            if (msgType.equals(WeChatContant.REQ_MESSAGE_TYPE_TEXT)) {         
                mes =requestMap.get(WeChatContant.Content);              
                    if(mes != null){                  
                        String content = checkResources(mes);              
                            if(!StringUtils.isBlank(content)) {                   
                            return WeChatUtil.sendTextMsg(requestMap, content);                
                        }           
                     }          
             }           
             // 图片消息           
             // ......           
             mes = mes == null ? "在吗" : mes;         
             return WeChatUtil.sendTextMsg(requestMap, mes);   
         
            } catch (DocumentException e) {      
                return null;       
            } catch (Exception e) {         
                e.printStackTrace();   
                return null;   
            }      
            return null;   
            }    
        
            private String checkResources(String message){        
                String returnMessage = null;        
                if("加油".equals(message)){            
                    returnMessage = "你也是";            
                    return returnMessage;        
                }        
                if("我爱你".equals(message)){            
                    returnMessage = "一见面就说爱?";            
                    return returnMessage;        
                }        
                return null;    
            }
        }

测试能够用postman 进行测试

项目源码和本文用到的全部工具我已经打包好放在了微信公众号中> "爪哇之父兄弟",
关注后,回复"公众号源码",便可获取
若是你对本文有不对的地方或者遇到难题了 欢迎评论或者扫码进群 一块儿讨论 免费帮助
若是本文对你有帮助,请小编喝咖啡啊

公众号 爪哇之父兄弟 微信 支付宝 q群
相关文章
相关标签/搜索