微信开发模式启用及接口配置Java

来源:互联网 发布:lb网络用语 编辑:程序博客网 时间:2024/06/05 21:07

微信开发模式启用及接口配置Java

转载出处:http://www.cnblogs.com/zyw-205520/p/3581250.html
1、编辑模式请看:http://www.cnblogs.com/zyw-205520/p/3516495.html

2、开发模式

1)PHP开发者接入:http://www.cnblogs.com/zyw-205520/p/3500761.html
2)Java开发者接入如下 详细的接口文档说明:微信接口文档

package com.javen.course.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.javen.course.service.CrazyService;import com.javen.course.util.SignUtil;/** * 核心请求处理类  * @author 简爱微萌 * @Email zyw205@gmail.com *  */public class CrazyServlet extends HttpServlet {    private static final long serialVersionUID = -5021188348833856475L;    @Override    protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {        // 微信加密签名          String signature = request.getParameter("signature");          // 时间戳          String timestamp = request.getParameter("timestamp");          // 随机数          String nonce = request.getParameter("nonce");          // 随机字符串          String echostr = request.getParameter("echostr");          PrintWriter out = response.getWriter();          // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败          if (SignUtil.checkSignature(signature, timestamp, nonce)) {              out.print(echostr);          }          out.close();        out = null;    }    @Override    protected void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        // TODO 消息的接收、处理、响应      }}

代码中只完成了doGet方法,它的作用正是确认请求是否来自于微信服务器;而doPost方法这里验证不需要我们先放着。

在doGet方法中调用了SignUtil.java 实现代码如下 1 package com.javen.course.util;

package com.javen.course.util;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.util.Arrays;/** * 请求校验工具类 *  * @author 简爱微萌 * @Email zyw205@gmial.com *  */public class SignUtil {    // 与接口配置信息中的Token要一致    private static String token = "Javen";    /**     * 验证签名     *      * @param signature     * @param timestamp     * @param nonce     * @return     */    public static boolean checkSignature(String signature, String timestamp,            String nonce) {        String[] arr = new String[] { token, timestamp, nonce };        // 将token、timestamp、nonce三个参数进行字典序排序        //Arrays.sort(arr);        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;    }    /**     * 将字节数组转换为十六进制字符串     *      * @param byteArray     * @return     */    private static String byteToStr(byte[] byteArray) {        String strDigest = "";        for (int i = 0; i < byteArray.length; 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;    }    public static void sort(String a[]) {        for (int i = 0; i < a.length - 1; i++) {            for (int j = i + 1; j < a.length; j++) {                if (a[j].compareTo(a[i]) < 0) {                    String temp = a[i];                    a[i] = a[j];                    a[j] = temp;                }            }        }    }}

注意:SignUtil类中的成员变量token,这里赋予什么值,在接口配置信息中的Token就要填写什么值,两边要保持一致

最后再来看一下CoreServlet是怎么配置的,web.xml中的配置代码如下:

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">  <display-name></display-name>  <servlet>    <servlet-name>CrazyServlet</servlet-name>    <servlet-class>              com.javen.course.servlet.CrazyServlet         </servlet-class>  </servlet>  <servlet-mapping>    <servlet-name>CrazyServlet</servlet-name>    <url-pattern>/Javen</url-pattern>  </servlet-mapping>  <welcome-file-list>    <welcome-file>index.jsp</welcome-file>  </welcome-file-list></web-app>

到目前为止,所有编码都完成了,就是这么简单。

0 0