将微信订阅号的用户消息发到自己的服务器

来源:互联网 发布:敏感肌肤如何美白 知乎 编辑:程序博客网 时间:2024/06/06 06:37

首先进入微信公众号的开发者中心,找到服务器配置如下图:

填写服务器的url 和token 如上图 具体代码如下:

@RequestMapping("/talk.do")    public void Talk(HttpServletRequest request,HttpServletResponse response) {        response.setCharacterEncoding("UTF-8");        boolean isGet = request.getMethod().toLowerCase().equals("get");            PrintWriter print;            if (isGet) {                // 微信加密签名                String signature = request.getParameter("signature");                // 时间戳                String timestamp = request.getParameter("timestamp");                // 随机数                String nonce = request.getParameter("nonce");                // 随机字符串                String echostr = request.getParameter("echostr");                // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败                if (signature != null && CheckoutUtil.checkSignature(StringConfig.Wen_Code,signature, timestamp, nonce)) {                    try {                        print = response.getWriter();                        print.write(echostr);                        print.flush();                    } catch (IOException e) {                        e.printStackTrace();                    }                }            }else {                 try {                       // 接收消息并返回消息                     new AcceptMessage().acceptMessage(request, response);                   } catch (IOException e) {                       e.printStackTrace();                   }              }       }

微信的token 检验时get请求。
我们获取4个参数 如下代码

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

通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
CheckoutUtil.checkSignature(StringConfig.Wen_Code,signature, timestamp, nonce))
checkSignature 的详细代码如下

public class CheckoutUtil {    /**     * 验证签名     *      * @param signature     * @param timestamp     * @param nonce     * @return     */    public static boolean checkSignature(String token,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;                }            }        }    }}

如果能返回正确的结果就代表接入成功了,之后就可以将微信订阅号的用户输入的内容,传到自己的服务器了。

原创粉丝点击