Java微信开发入门

来源:互联网 发布:sql文 意义 编辑:程序博客网 时间:2024/05/22 03:10

第一步 注册一个公众号

1.1百度输入“微信公众平台”就能够进入公众号平台完成注册或登录。

1.2可以先熟悉一下微信本身的可编辑模式下消息的发送与回复之类的。。

1.3进入开发者模式,在左侧菜单栏找到“开发”菜单,里面会有比较详细的有关开发的知识等。

1.4由于个人注册只能注册订阅号,未经认证的公众号是不能直接进入开发者模式的,不过没关系,微信给每个订阅号提供了一个公众平台测试账号,在“开发者工具”--->“公众平台测试账号”(后面会用到)

如下图:


第二步:环境准备

2.1由于本地服务器不能实现和外网的通信,所以,我们需要一个外网映射内网的工具。

我用的是ngrok(很好下载),这是一个国外的服务器,所以速度可能有点慢,但是免费。他也有部署在国内的服务器,可以自定义域名(以前免费,现在收费)。

2.2配置ngrok。在命令行进入ngrok安装目录,输入ngrok即可进入ngrok

2.2 配置映射地址,输入ngrok 8081ngrok http 8081由于版本不一样所以输入命令有差别。因为我的本地服务器Tomcat的端口设置为8081所以是ngrok http 8081,如果你是8080自行改动。

 

 

红线位置即是随机分配给你的映射地址,也就是说,当你启动本地服务器访问localhost:8081时和访问http://19b82289.ngrok.io是一样的效果。

 

第三步,创建Java项目(最好用maven项目,开发环境idea)部署本地服务器,保证部署无误,即能正确访问localhost:8081;(具体方法,不多说了,可百度idea如何创建maven项目)(虽然我在这一步浪费了好长时间,因为一个无知的错误)

可以给大家说一下maven的依赖方法

当你需要引入某个jar包时,需要在pom.xml中加入依赖。

首先你需要在https://mvnrepository.com/这个网站里搜索是否有你要用到的包,比如说搜dom4j


 

点进去一个,


 

点击verSion下的任意一个


红框内的代码即是你要加入pom.xml的代码。更新maven即可。

第四步,基本代码构成(本测试使用J2ee+tomact

4.1创建目录如下


 

4.2cn.yang.util主要是一些工具类

  Dao里是对象类

 Serlet里是servlet

CheckUtil代码:

//开发者提交信息后,微信服务器将发送get请求到填写的服务器地址URL上,get请求携带四个参数,

 

package cn.yang.util;
/**
 * Created by jibei on 2017/7/20.
 * 验证服务器地址的有效性
 */
        
importjava.io.UnsupportedEncodingException;
        import java.security.MessageDigest;
        import java.security.NoSuchAlgorithmException;
        import java.util.Arrays;
public class CheckUtil {
    private static final Stringtoken="imooc";//自定义的

    public static boolean checkSignature(String signature,String timestamp,String nonce){
        String[] arr=new String[]{token,timestamp,nonce};
        //排序
        
Arrays.sort(arr);
        //生成字符串
        
StringBuffer content=newStringBuffer();
        for(inti=0;i<arr.length;i++){
            content.append(arr[i]);
        }
        //sha1加密
        
String temp=getSha1(content.toString());

//对比
        return temp.equals(signature);
    }
    public static String getSha1(String str){
        if (null== str || 0 == str.length()){
            return null;
        }
        char[] hexDigits = {'0', '1','2', '3','4', '5','6', '7','8', '9',
                'a', 'b', 'c','d', 'e','f'};
        try {
            MessageDigest mdTemp = MessageDigest.getInstance("SHA1");
            mdTemp.update(str.getBytes("UTF-8"));

            byte[] md = mdTemp.digest();
            int j = md.length;
            char[] buf =new char[j * 2];
            int k = 0;
            for (inti = 0; i < j; i++) {
                byte byte0 = md[i];
                buf[k++] = hexDigits[byte0 >>> 4& 0xf];
                buf[k++] = hexDigits[byte0 & 0xf];
            }
            return new String(buf);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        }
    }
}

 

MessageUtil类是xml转换为集合以及文本转化为xml的方法(因为微信是xml格式的)

 

package cn.yang.util;

/**
 * Created by jibei on 2017/7/29.
 */
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;

import com.thoughtworks.xstream.XStream;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.imooc.dao.TextMessage;
public class MessageUtil {
    public static Map<String,String> xmlToMap(HttpServletRequest request)throws IOException, DocumentException {
        //将XML转换成集合
        
Map<String,String> map=newHashMap<String,String>();
        SAXReader reader=new SAXReader();
        //从reuest中获取输入流
        
InputStream ins=request.getInputStream();
        Document doc=reader.read(ins);
        Element  root=doc.getRootElement();
        List<Element> list=root.elements();
        for(Element e:list){
            map.put(e.getName(),e.getText());
        }
        //关闭输入流
        
ins.close();
        return map;
    }

    public static String  textMessageToXml(TextMessage textMessage){
        //将文本转换成XML
        
XStream xstream=newXStream();
        //将xml的根节点替换成xml即<xml>jkkkkk</xml>
        
xstream.alias("xml",textMessage.getClass());
        xstream.toXML(textMessage);
        return  xstream.toXML(textMessage);
    }
}

TextMessage是文本对象,包括他的基本属性和方法

package com.imooc.dao;

/**
 * Created by jibei on 2017/7/29.
 */
public class TextMessage {
    private String ToUserName;
    private String FromUserName;
    private String CreateTime;
    private String MsgType;
    private String Content;
    private String 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 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;
    }




}

WeiX

package com.imooc.servlet;
import cn.yang.util.CheckUtil;
import cn.yang.util.MessageUtil;
import com.imooc.dao.TextMessage;
import org.dom4j.DocumentException;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class WeiX extends HttpServlet{
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException{
        String signature=req.getParameter("signature");
        String timestamp=req.getParameter("timestamp");
        String nonce=req.getParameter("nonce");
        String echostr=req.getParameter("echostr");
        PrintWriter out=resp.getWriter();
        if(CheckUtil.checkSignature(signature,timestamp,nonce)){
            out.print(echostr);
        }
    }

    protected void doPost(HttpServletRequest req,HttpServletResponse resp)
            throws ServletException,IOException{
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        PrintWriter out=resp.getWriter();
        try {
            Map<String,String> map= MessageUtil.xmlToMap(req);
            String fromUserName=map.get("FromUserName");
            String toUserName=map.get("ToUserName");
            String msgType=map.get("MsgType");
            String content=map.get("Content");
            String message=null;
            //判断这个消息是否为文本消息
            
if("text".equals(msgType)){
                TextMessage text=new TextMessage();
                text.setFromUserName(toUserName);
                text.setToUserName(fromUserName);
                text.setMsgType("text");
                SimpleDateFormat df = newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
                
text.setCreateTime(df.format(newDate()) );
                text.setContent("您发送的消息是"+content);
                message=MessageUtil.textMessageToXml(text);
            }
            out.print(message);
            System.out.println(message);
        } catch (DocumentException e) {
            e.printStackTrace();
        }finally {
            out.close();
            //关闭
        
}

    }
}

 

 

第五步:接口配置

由第一步1.4进入测试号,接口配置信息里,填写(我已经填过了)

 

 

配置时要保证你的tomcat是启动的,也就是说你的代码是无编译错误的否则tomcat启动不起来。

如果出现配置失败也就是说微信端无法找到你所给的地址。

 

第六步 测试

打开你的微信,扫一扫你的测试公众号二维码关注,发送消息,看能否收到回复。

Ok!如此算是入了微信开发的一个小门。