Java微信公众号之开发环境接入一

公众号类型:

企业号,服务号,订阅号

微信公众号申请:

进入微信公众平台https://mp.weixin.qq.com ,点击右上角立即注册,选择“服务号”或“订阅号”注册(服务号仅限机构用户注册,个人用户只能选择订阅号)

开发人员也可以不用申请微信公众号也可以测试,测试账号申请请地址:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 点击后扫描二维码,即可获得一个测试账号,拥有服务号全部权限。

Java微信公众号之开发环境接入一_第1张图片

微信扫码下面的即可即可在微信上测试Java微信公众号之开发环境接入一_第2张图片

开发环境准备

1、 外网映射工具

微信公众平台在访问后台时,必须提供能够正确访问的外网地址,微信平台对后台URL的要求有两点:

① 必须能够用公网访问 ② 必须使用80端口

要实现以上两点,我们可以选择购买外网服务器,例如:阿里云、百度云、腾讯云…都是不错的选择。如果没有服务器,可以选择用外网映射工具,将我们的内网链接映射为公网,比较不错的映射软件有:花生壳、ngrok、nat123等…

ngrok下载:https://ngrok.com/download
这几款软件都可以百度很容易搜索到并下载,下面简单讲解一下用法:

① Ngrock:

进入dos环境,切换到ngrock所在盘符,输入ngrock 8080(ngrok 2.0以上版本,ngrok http 8080) 回车:
Java微信公众号之开发环境接入一_第3张图片
回车后等待一会,即可得到公网链接,下图所示阴影区域给出的链接,即可直接访问本机127.0.0.1:8080下的链接内容,分别是http协议和https协议对应的地址:
Java微信公众号之开发环境接入一_第4张图片

此时此刻,我们后台的代码已经可以放到共网地址上了,那那么微信号开发的数据交互是怎么样的
Java微信公众号之开发环境接入一_第5张图片

实际开发过程,我们可以参考官方提供的开发文档:

https://mp.weixin.qq.com/wiki

Java微信公众号之开发环境接入一_第6张图片

web.xml配置:



<web-app
        version="3.0"
        xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">


     <servlet>
       <servlet-name>bbservlet-name>
       <servlet-class>yiche.com.servlet.WeiXinServletservlet-class>
     servlet>
    <servlet-mapping>
      <servlet-name>bbservlet-name>
      <url-pattern>/*url-pattern>
    servlet-mapping>
web-app>

Servlet:


public class WeiXinServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        System.out.println(request.getMethod().toString());
        while (request.getAttributeNames().hasMoreElements()){
            System.out.println("1");
            request.getAttributeNames().nextElement();
        }
        // 微信加密签名
        String signature = request.getParameter("signature");

        // 时间戳
        String timestamp = request.getParameter("timestamp");

        // 随机数
        String nonce = request.getParameter("nonce");


        // 随机字符串  由于我使用的是申请的测试账号,并没有随机字符串随意这里的ech是null
        String ech = request.getParameter("echostr");

        PrintWriter out = response.getWriter();

        if (CheckUtil.checkSignature(signature,timestamp,nonce))
             System.out.println("校验成功");

              out.print(ech);

           }

    }

此时填写url和token

URL:即我们上述所说的后台服务器公网访问地址

Token:开发者自定的验证口令

EncodingAESKey:随机字符串,如果消息加解密方式采用安全模式才需验证,
我这里的测试账号没有所以传入Servlet的echostr为null
当点击提交的时候会想Servlet发送一个get请求,而后在微信接口测试上都是post请求如下的方法都是发送的post请求

Java微信公众号之开发环境接入一_第7张图片

Java微信公众号之开发环境接入一_第8张图片

Servlet接受的参数

Java微信公众号之开发环境接入一_第9张图片

结果

Java微信公众号之开发环境接入一_第10张图片

加密方法:

public class CheckUtil {

    public static final String tooken = "jkjkjkhk"; //开发者自行定义Tooken


    //signatrue微信公众平台传过来的的经过加密的签名
    public static boolean checkSignature(String signature, String timestamp, String nonce) {

//1.定义数组存放tooken,timestamp,nonce

        String[] arr = {tooken, timestamp, nonce};

//2.对数组进行排序

        Arrays.sort(arr);

//3.生成字符串

        StringBuffer sb = new StringBuffer();

        for (String s : arr) {

            sb.append(s);

        }

//4.sha1加密,网上均有现成代码

        String temp = getSha1(sb.toString());

//5.将加密后的字符串,与微信传来的加密签名比较,返回结果

        return temp.equals(signature);
    }



    public static String getSha1(String str){

        if(str==null||str.length()==0){

            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 (int i = 0; i < j; i++) {

                byte byte0 = md[i];

                buf[k++] = hexDigits[byte0 >>> 4 & 0xf];

                buf[k++] = hexDigits[byte0 & 0xf];

            }

            return new String(buf);

        } catch (Exception e) {

            // TODO: handle exception

            return null;

        }

    }


}

参考:http://www.cnblogs.com/jerehedu/category/988743.html

你可能感兴趣的:(微信开发)