JAVA微信开发

使用java连接图灵机器人完成微信自动回复功能

有很多人想知道微信开发是怎么回事,也看过文档,无奈官方文档写的比较凌乱,不适合新手去学习,下面就是微信验证Token完成自动回复的教程

开发工具:Eclipse jdk7

首先,新建一个Maven项目

新建完成之后整个项目大概是这样

这里写图片描述

在Maven下的pom.xml加入如下代码

        <dependency> <!-- 这是dom4j jar包 主要用于操作xml -->
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>

等待项目构建完成之后在src/main/java文件夹下新建包
大概是这样

这里写图片描述

接下来我们在com.byxs.server包下新建一个名为WeiXinServer.java的类

代码如下:

package com.byxs.server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.Arrays;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 
 * @author 布衣小生
 * 链接并验证服务器
 *
 */
public class WeiXinServer extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        final String token="snsgj"; //使用时把这里换成自己的token

         // 微信加密签名
        String signature = request.getParameter("signature");
        // 随机字符串
        String echostr = request.getParameter("echostr");
        // 时间戳
        String timestamp = request.getParameter("timestamp");
        // 随机数
        String nonce = request.getParameter("nonce");

        String[] str={token,timestamp,nonce};

        Arrays.sort(str);

        String bigStr=str[0]+str[1]+str[2];

        String digest=new SHA1().getDigestOfString(bigStr.getBytes()).toLowerCase();
        String result="";
        if(digest.equals(signature)){
            //获取微信发来的xml信息
            System.out.println("请求来自微信!");
            BufferedReader buf=new BufferedReader(new InputStreamReader(request.getInputStream(),"UTF-8"));
            StringBuilder sb=new StringBuilder();
            String strs=null;
            while((strs=buf.readLine())!=null){
                sb.append(strs);
            }
            String xml=sb.toString();
            //封装回复的消息
            result=TestXML.setXML(TestXML.getXMLText(xml));
        }else{
            response.sendError(404);
        }

        try{
            OutputStream out=response.getOutputStream();
            //回复消息
            out.write(result.getBytes("UTF-8"));
            out.close();
            out.flush();
        }catch(Exception EX){
            EX.printStackTrace();
        }
    }


    @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

上面的判断,当请求来自微信时,我们使用request获取InputStream,读取微信所发来的xml信息。

在com.byxs.server包里新建一个名为TestXML.java的类

代码如下:

package com.byxs.server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import com.byxs.entity.Message;
import com.byxs.tools.Tool;


/**
 * 
 * @author 布衣小生
 * 封装xml
 *
 */
public class TestXML {

    /**
     * 解析微信发来的消息XML
     * @param Xml
     * @return
     */
    public static Message getXMLText(String Xml){
        Message mes=new Message();
        Map<String, String> map=new HashMap<String,String>();
        try {
            Document docu=DocumentHelper.parseText(Xml);
            Element root=docu.getRootElement();
            for(Iterator it=root.elementIterator();it.hasNext();){
                Element elment=(Element) it.next();
                map.put(elment.getName(), elment.getText());
            }
            mes.setToUserName(map.get("ToUserName"));
            mes.setFromUserName(map.get("FromUserName"));
            mes.setCreateTime(map.get("CreateTime"));
            mes.setMsgType(map.get("MsgType"));
            mes.setContent(map.get("Content"));
            mes.setMsgId(map.get("MsgId"));
        } catch (DocumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("消息解析成功!"+mes.getContent());
        return mes;
    }

        //http://mobilecdn.kugou.com/api/v3/search/song?format=json&keyword=%E4%BC%A4%E7%97%95&page=1&pageSize=1
    /**
     * 封装消息
     * @param mes
     * @return
     */
    public static String setXML(Message mes){
        if(mes.getContent().indexOf("深夜咖啡馆")!=-1||mes.getContent().indexOf("电台")!=-1||mes.getContent().indexOf("木马八音盒")!=-1){
            return setNewsXML(mes);
        }else if(mes.getContent().indexOf("佛秀")!=-1||mes.getContent().indexOf("五蕴六毒")!=-1){
            return setNewsXMLF(mes);
        }else{
            return setTuLingXML(mes);
        }
    }


    /**
     * 文本类型
     * @param mes
     * @return
     */
    public static String setTextXML(Message mes){

        StringBuilder str=new StringBuilder();
        str.append("<xml><ToUserName><![CDATA[");
        str.append(mes.getFromUserName());
        str.append("]]></ToUserName>");
        str.append("<FromUserName><![CDATA[");
        str.append(mes.getToUserName());
        str.append("]]></FromUserName>");
        str.append("<CreateTime>");
        str.append(new Date().getTime());
        str.append("</CreateTime>");
        str.append("<MsgType><![CDATA[");
        str.append(mes.getMsgType());
        str.append("]]></MsgType>");
        str.append("<Content><![CDATA[");
        str.append(mes.getContent());
        str.append("]]></Content></xml>");
        return str.toString();

    }

    /**
     * 自定义文本类型
     * @param mes
     * @return
     */
    public static String setTextXMLS(Message mes,String content){

        StringBuilder str=new StringBuilder();
        str.append("<xml><ToUserName><![CDATA[");
        str.append(mes.getFromUserName());
        str.append("]]></ToUserName>");
        str.append("<FromUserName><![CDATA[");
        str.append(mes.getToUserName());
        str.append("]]></FromUserName>");
        str.append("<CreateTime>");
        str.append(new Date().getTime());
        str.append("</CreateTime>");
        str.append("<MsgType><![CDATA[");
        str.append(mes.getMsgType());
        str.append("]]></MsgType>");
        str.append("<Content><![CDATA[");
        str.append(content);
        str.append("]]></Content></xml>");
        return str.toString();
    }

    //图文类型
    public static String setNewsXML(Message mes){
        StringBuilder str=new StringBuilder();
        str.append("<xml><ToUserName><![CDATA[");
        str.append(mes.getFromUserName());
        str.append("]]></ToUserName><FromUserName><![CDATA[");
        str.append(mes.getToUserName());
        str.append("]]></FromUserName><CreateTime>");
        str.append(new Date().getTime());
        str.append("</CreateTime><MsgType><![CDATA[news]]></MsgType><ArticleCount>1");
        str.append("</ArticleCount><Articles><item><Title><![CDATA[");
        str.append("木马八音盒-深夜咖啡馆");
        str.append("]]></Title> <Description><![CDATA[");
        str.append("总有一句话能温暖你颓废的思绪, 每夜一次心理对话,深夜的咖啡馆,我来与你聊聊心事,做你远方不见面的知心人。");
        str.append("]]></Description><PicUrl><![CDATA[");
        str.append("http://fdfs.xmcdn.com/group4/M07/83/57/wKgDtFRI013jZuL8AAKqDpUiShE345_mobile_large.jpg");
        str.append("]]></PicUrl><Url><![CDATA[");
        str.append("http://m.ximalaya.com/9157823/album/258810");
        str.append("]]></Url></item></Articles></xml>");
        return str.toString();
    }

    //图文类型
        public static String setNewsXMLF(Message mes){
            StringBuilder str=new StringBuilder();
            str.append("<xml><ToUserName><![CDATA[");
            str.append(mes.getFromUserName());
            str.append("]]></ToUserName><FromUserName><![CDATA[");
            str.append(mes.getToUserName());
            str.append("]]></FromUserName><CreateTime>");
            str.append(new Date().getTime());
            str.append("</CreateTime><MsgType><![CDATA[news]]></MsgType><ArticleCount>1");
            str.append("</ArticleCount><Articles><item><Title><![CDATA[");
            str.append("佛秀-我眼中的画世界");
            str.append("]]></Title> <Description><![CDATA[");
            str.append("佛说五蕴六毒是妄,把因果都念作业障。");
            str.append("]]></Description><PicUrl><![CDATA[");
            str.append("http://s8.sinaimg.cn/mw690/004fYOo0zy78YB9o46zd7");
            str.append("]]></PicUrl><Url><![CDATA[");
            str.append("http://blog.sina.com.cn/s/blog_e87f7f280102x4o8.html");
            str.append("]]></Url></item></Articles></xml>");
            return str.toString();
        }

    /**
     * 音乐类型
     * @param mes
     * @return
     */
    public static String setMusicXML(Message mes){
        StringBuilder str=new StringBuilder();

        return str.toString();
    }

    /**
     * 图灵回复
     * @param mes
     * @return
     */
    public static String setTuLingXML(Message mes){
        StringBuilder str=new StringBuilder();
        try {
            Tool.init();//加载配置文件
            URL url=new URL(Tool.t.get("url").toString()+Tool.t.get("key").toString()+"&info="+new String(mes.getContent().getBytes("UTF-8")));
            HttpURLConnection con=(HttpURLConnection) url.openConnection();
            BufferedReader buf=new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
            String strs=null;
            String content="";
            while((strs=buf.readLine())!=null){
                content+=strs;
            }
            //接收到图灵返回的消息时,判断是不是菜谱之类的信息,如果是,就返回菜谱,如果不是就返回文本消息
            if(content.indexOf("list")!=-1){
                //判断如果是菜谱则进入if 如果是新闻就进入else
                if(content.indexOf("name")!=-1){
                    String contents="";
                    str.append("<xml><ToUserName><![CDATA[");
                    str.append(mes.getFromUserName());
                    str.append("]]></ToUserName><FromUserName><![CDATA[");
                    str.append(mes.getToUserName());
                    str.append("]]></FromUserName><CreateTime>");
                    str.append(new Date().getTime());
                    str.append("</CreateTime><MsgType><![CDATA[news]]></MsgType><ArticleCount>1");
                    str.append("</ArticleCount><Articles><item><Title><![CDATA[");
                    contents=content.substring(content.indexOf("name")+7);
                    str.append(contents.substring(0,contents.indexOf("\"")));
                    contents=content.substring(content.indexOf("info")+7);
                    str.append("]]></Title> <Description><![CDATA[");
                    str.append(contents.substring(0,contents.indexOf("\"")));
                    contents=content.substring(content.indexOf("detailurl")+12);
                    str.append("]]></Description><Url><![CDATA[");
                    str.append(contents.substring(0,contents.indexOf("\"")));
                    str.append("]]></Url></item></Articles></xml>");
                }else{
                    String contents="";
                    str.append("<xml><ToUserName><![CDATA[");
                    str.append(mes.getFromUserName());
                    str.append("]]></ToUserName><FromUserName><![CDATA[");
                    str.append(mes.getToUserName());
                    str.append("]]></FromUserName><CreateTime>");
                    str.append(new Date().getTime());
                    str.append("</CreateTime><MsgType><![CDATA[news]]></MsgType><ArticleCount>1");
                    str.append("</ArticleCount><Articles><item><Title><![CDATA[");
                    contents=content.substring(content.indexOf("article")+10);
                    str.append(contents.substring(0,contents.indexOf("\"")));
                    contents=content.substring(content.indexOf("source")+9);
                    str.append("]]></Title> <Description><![CDATA[");
                    str.append(contents.substring(0,contents.indexOf("\"")));
                    contents=content.substring(content.indexOf("detailurl")+12);
                    str.append("]]></Description><PicUrl><![CDATA[");
                    contents=content.substring(content.indexOf("icon")+7);
                    str.append(contents.substring(0,contents.indexOf("\"")));
                    str.append("]]></PicUrl><Url><![CDATA[");
                    contents=content.substring(content.indexOf("detailurl")+12);
                    str.append(contents.substring(0,contents.indexOf("\"")));
                    str.append("]]></Url></item></Articles></xml>");
                }
            }else{
                //如果是普通聊天消息则返回文本   反之则返回超链接文本
                if(content.indexOf("url")!=-1){
                    str.append("<xml><ToUserName><![CDATA[");
                    str.append(mes.getFromUserName());
                    str.append("]]></ToUserName>");
                    str.append("<FromUserName><![CDATA[");
                    str.append(mes.getToUserName());
                    str.append("]]></FromUserName>");
                    str.append("<CreateTime>");
                    str.append(new Date().getTime());
                    str.append("</CreateTime>");
                    str.append("<MsgType><![CDATA[");
                    str.append(mes.getMsgType());
                    str.append("]]></MsgType>");
                    str.append("<Content><![CDATA[");
                    String contents=content.substring(content.indexOf("text")+7);
                    String text=contents.substring(0, contents.indexOf("\""));
                    contents=content.substring(content.indexOf("url")+6);
                    String urls=contents.substring(0,contents.indexOf("\""));
                    str.append("<a href='"+urls+"'>"+text+"</a>");
                    str.append("]]></Content></xml>");
                }else{
                    str.append("<xml><ToUserName><![CDATA[");
                    str.append(mes.getFromUserName());
                    str.append("]]></ToUserName>");
                    str.append("<FromUserName><![CDATA[");
                    str.append(mes.getToUserName());
                    str.append("]]></FromUserName>");
                    str.append("<CreateTime>");
                    str.append(new Date().getTime());
                    str.append("</CreateTime>");
                    str.append("<MsgType><![CDATA[");
                    str.append(mes.getMsgType());
                    str.append("]]></MsgType>");
                    str.append("<Content><![CDATA[");
                    String contents=content.substring(content.indexOf("text")+7);
                    str.append(contents.substring(0, contents.lastIndexOf("\"")));
                    str.append("]]></Content></xml>");
                }
            }


        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return str.toString();
    }

}

这个类主要是用来解析和封装xml使用的其中Too.init();为加载配置文件,文件格式如下

# Config
url=http://www.tuling123.com/openapi/api?key=
#这里是key,如果没有的,去图灵机器人官网注册账号,新建一个应用就行
key=  

Tool.init();默认加载路径是“C:/byxs config/Tool.properties” 可在Tool类中更改

接下来我们在com.byxs.tools包中新建一个名为Tool.java类

代码如下

package com.byxs.tools;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;

/**
 * 
 * @author 布衣小生
 *
 */
public class Tool {

    public static Properties t=new Properties();

    public static void init(){
        try {
            t.load(new FileReader(new File("C:/byxs config/Tool.properties")));
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

把t.load中的文件路径改为自己的就行了

下面我们新建一个用于封装的实体类,在com.byxs.entity中新建名为Messages.java的类

代码如下

package com.byxs.entity;

/**
 * 
 * @author 布衣小生
 * 消息实体类
 *
 */
public class Message {

    //开发者微信账号
    private String ToUserName;
    //发送方账号(OpenID)
    private String FromUserName;
    //消息创建时间
    private String CreateTime;
    //text (消息种类)
    private String MsgType;
    //内容
    private String Content;
    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 String getCreateTime() {
        return CreateTime;
    }
    public void setCreateTime(String createTime) {
        CreateTime = createTime;
    }
    public String getMsgType() {
        return MsgType;
    }
    public void setMsgType(String msgType) {
        MsgType = msgType;
    }
    public String getContent() {
        return Content;
    }
    public void setContent(String content) {
        Content = content;
    }
    public String getMsgId() {
        return MsgId;
    }
    public void setMsgId(String msgId) {
        MsgId = msgId;
    }
    //消息ID 64位整型
    private String MsgId;
}

现在类已经基本上建完了,但是微信验证参数时,需要加密,加密类如下:

在com.byxs.server包里新建一个名为SHA1.java的类

代码:

package com.byxs.server;

public class SHA1 { 
    private final int[] abcde = { 
            0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0 
        }; 
    // 摘要数据存储数组 
    private int[] digestInt = new int[5]; 
    // 计算过程中的临时数据存储数组 
    private int[] tmpData = new int[80]; 
    // 计算sha-1摘要 
    private int process_input_bytes(byte[] bytedata) { 
        // 初试化常量 
        System.arraycopy(abcde, 0, digestInt, 0, abcde.length); 
        // 格式化输入字节数组,补10及长度数据 
        byte[] newbyte = byteArrayFormatData(bytedata); 
        // 获取数据摘要计算的数据单元个数 
        int MCount = newbyte.length / 64; 
        // 循环对每个数据单元进行摘要计算 
        for (int pos = 0; pos < MCount; pos++) { 
            // 将每个单元的数据转换成16个整型数据,并保存到tmpData的前16个数组元素中 
            for (int j = 0; j < 16; j++) { 
                tmpData[j] = byteArrayToInt(newbyte, (pos * 64) + (j * 4)); 
            } 
            // 摘要计算函数 
            encrypt(); 
        } 
        return 20; 
    } 
    // 格式化输入字节数组格式 
    private byte[] byteArrayFormatData(byte[] bytedata) { 
        // 补0数量 
        int zeros = 0; 
        // 补位后总位数 
        int size = 0; 
        // 原始数据长度 
        int n = bytedata.length; 
        // 模64后的剩余位数 
        int m = n % 64; 
        // 计算添加0的个数以及添加10后的总长度 
        if (m < 56) { 
            zeros = 55 - m; 
            size = n - m + 64; 
        } else if (m == 56) { 
            zeros = 63; 
            size = n + 8 + 64; 
        } else { 
            zeros = 63 - m + 56; 
            size = (n + 64) - m + 64; 
        } 
        // 补位后生成的新数组内容 
        byte[] newbyte = new byte[size]; 
        // 复制数组的前面部分 
        System.arraycopy(bytedata, 0, newbyte, 0, n); 
        // 获得数组Append数据元素的位置 
        int l = n; 
        // 补1操作 
        newbyte[l++] = (byte) 0x80; 
        // 补0操作 
        for (int i = 0; i < zeros; i++) { 
            newbyte[l++] = (byte) 0x00; 
        } 
        // 计算数据长度,补数据长度位共8字节,长整型 
        long N = (long) n * 8; 
        byte h8 = (byte) (N & 0xFF); 
        byte h7 = (byte) ((N >> 8) & 0xFF); 
        byte h6 = (byte) ((N >> 16) & 0xFF); 
        byte h5 = (byte) ((N >> 24) & 0xFF); 
        byte h4 = (byte) ((N >> 32) & 0xFF); 
        byte h3 = (byte) ((N >> 40) & 0xFF); 
        byte h2 = (byte) ((N >> 48) & 0xFF); 
        byte h1 = (byte) (N >> 56); 
        newbyte[l++] = h1; 
        newbyte[l++] = h2; 
        newbyte[l++] = h3; 
        newbyte[l++] = h4; 
        newbyte[l++] = h5; 
        newbyte[l++] = h6; 
        newbyte[l++] = h7; 
        newbyte[l++] = h8; 
        return newbyte; 
    } 
    private int f1(int x, int y, int z) { 
        return (x & y) | (~x & z); 
    } 
    private int f2(int x, int y, int z) { 
        return x ^ y ^ z; 
    } 
    private int f3(int x, int y, int z) { 
        return (x & y) | (x & z) | (y & z); 
    } 
    private int f4(int x, int y) { 
        return (x << y) | x >>> (32 - y); 
    } 
    // 单元摘要计算函数 
    private void encrypt() { 
        for (int i = 16; i <= 79; i++) { 
            tmpData[i] = f4(tmpData[i - 3] ^ tmpData[i - 8] ^ tmpData[i - 14] ^ 
                    tmpData[i - 16], 1); 
        } 
        int[] tmpabcde = new int[5]; 
        for (int i1 = 0; i1 < tmpabcde.length; i1++) { 
            tmpabcde[i1] = digestInt[i1]; 
        } 
        for (int j = 0; j <= 19; j++) { 
            int tmp = f4(tmpabcde[0], 5) + 
                f1(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] + 
                tmpData[j] + 0x5a827999; 
            tmpabcde[4] = tmpabcde[3]; 
            tmpabcde[3] = tmpabcde[2]; 
            tmpabcde[2] = f4(tmpabcde[1], 30); 
            tmpabcde[1] = tmpabcde[0]; 
            tmpabcde[0] = tmp; 
        } 
        for (int k = 20; k <= 39; k++) { 
            int tmp = f4(tmpabcde[0], 5) + 
                f2(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] + 
                tmpData[k] + 0x6ed9eba1; 
            tmpabcde[4] = tmpabcde[3]; 
            tmpabcde[3] = tmpabcde[2]; 
            tmpabcde[2] = f4(tmpabcde[1], 30); 
            tmpabcde[1] = tmpabcde[0]; 
            tmpabcde[0] = tmp; 
        } 
        for (int l = 40; l <= 59; l++) { 
            int tmp = f4(tmpabcde[0], 5) + 
                f3(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] + 
                tmpData[l] + 0x8f1bbcdc; 
            tmpabcde[4] = tmpabcde[3]; 
            tmpabcde[3] = tmpabcde[2]; 
            tmpabcde[2] = f4(tmpabcde[1], 30); 
            tmpabcde[1] = tmpabcde[0]; 
            tmpabcde[0] = tmp; 
        } 
        for (int m = 60; m <= 79; m++) { 
            int tmp = f4(tmpabcde[0], 5) + 
                f2(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] + 
                tmpData[m] + 0xca62c1d6; 
            tmpabcde[4] = tmpabcde[3]; 
            tmpabcde[3] = tmpabcde[2]; 
            tmpabcde[2] = f4(tmpabcde[1], 30); 
            tmpabcde[1] = tmpabcde[0]; 
            tmpabcde[0] = tmp; 
        } 
        for (int i2 = 0; i2 < tmpabcde.length; i2++) { 
            digestInt[i2] = digestInt[i2] + tmpabcde[i2]; 
        } 
        for (int n = 0; n < tmpData.length; n++) { 
            tmpData[n] = 0; 
        } 
    } 
    // 4字节数组转换为整数 
    private int byteArrayToInt(byte[] bytedata, int i) { 
        return ((bytedata[i] & 0xff) << 24) | ((bytedata[i + 1] & 0xff) << 16) | 
        ((bytedata[i + 2] & 0xff) << 8) | (bytedata[i + 3] & 0xff); 
    } 
    // 整数转换为4字节数组 
    private void intToByteArray(int intValue, byte[] byteData, int i) { 
        byteData[i] = (byte) (intValue >>> 24); 
        byteData[i + 1] = (byte) (intValue >>> 16); 
        byteData[i + 2] = (byte) (intValue >>> 8); 
        byteData[i + 3] = (byte) intValue; 
    } 
    // 将字节转换为十六进制字符串 
    private static String byteToHexString(byte ib) { 
        char[] Digit = { 
                '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 
                'D', 'E', 'F' 
            }; 
        char[] ob = new char[2]; 
        ob[0] = Digit[(ib >>> 4) & 0X0F]; 
        ob[1] = Digit[ib & 0X0F]; 
        String s = new String(ob); 
        return s; 
    } 
    // 将字节数组转换为十六进制字符串 
    private static String byteArrayToHexString(byte[] bytearray) { 
        String strDigest = ""; 
        for (int i = 0; i < bytearray.length; i++) { 
            strDigest += byteToHexString(bytearray[i]); 
        } 
        return strDigest; 
    } 
    // 计算sha-1摘要,返回相应的字节数组 
    public byte[] getDigestOfBytes(byte[] byteData) { 
        process_input_bytes(byteData); 
        byte[] digest = new byte[20]; 
        for (int i = 0; i < digestInt.length; i++) { 
            intToByteArray(digestInt[i], digest, i * 4); 
        } 
        return digest; 
    } 
    // 计算sha-1摘要,返回相应的十六进制字符串 
    public String getDigestOfString(byte[] byteData) { 
        return byteArrayToHexString(getDigestOfBytes(byteData)); 
    } 
    public static void main(String[] args) { 
        String data = "123456"; 
        System.out.println(data); 
        String digest = new SHA1().getDigestOfString(data.getBytes()); 
        System.out.println(digest);

       // System.out.println( ToMD5.convertSHA1(data).toUpperCase());
    } 
} 

这样就大功告成了!

下面我们配置一个servlet

在web.xml文件中添加如下代码

<servlet>
    <servlet-name>WeiXin</servlet-name>
    <servlet-class>com.byxs.server.WeiXinServer</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>WeiXin</servlet-name>
    <url-pattern>/YanZheng</url-pattern>
  </servlet-mapping>

到这里项目就全部完成了!

访问时:假如使用的是Tomcat服务器,需要访问http://localhost:8080/项目名/YanZheng

这样就可以访问了

注意,如果在本地服务器上使用浏览器访问会报500错误,其错误信息为空指针异常,这是正常现象。

下面我们来配置公众号设置吧!

把你的项目部署到服务器上,没有服务器的可以去百度或者新浪申请一个sea应用
(这里使用新浪sea来演示)

在Eclipse中右键项目导出war包

去新浪云官网新建一个SEA应用,使用java版本的

之后进入控制台打开你的应用

然后点击左侧的

应用>代码管理>上传war包

把我们刚刚导出的war包上传上去就没问题了!

现在我们把应用与微信连接起来! (≧▽≦)/

进入微信后台

选择基本配置>服务器配置

配置如下图

这里写图片描述

Token填写我们WeiXinServer.java中声明的Token就行了

接下来,就尽情的调戏你的公众号吧!

这个项目我上传到github上面了,使用Eclipse导出就可以直接使用,路径如下

https://github.com/ChuJiaJu/WeChat-auto-reply

阅读更多
版权声明:本文为By布衣小生原创文章,未经博主允许不得转载。 https://blog.csdn.net/chujiaju/article/details/64437841
文章标签: 微信 java eclipse
个人分类: 微信开发
上一篇JAVA连接Redis教程
想对作者说点什么? 我来说一句

java操作xml工具包

2015年08月28日 654KB 下载

微信wechat4j从入门到精通两个DEMO

2018年03月01日 4.43MB 下载

java微信开发

2014年07月31日 2.38MB 下载

Java微信开发

2015年07月13日 49.2MB 下载

java微信开发jar包

2017年09月21日 3.77MB 下载

java版微信开发全套

2017年11月17日 7.62MB 下载

java微信开发所需要的各种jar包

2015年05月19日 3.81MB 下载

没有更多推荐了,返回首页

关闭
关闭