美文网首页
将微信订阅号的用户消息发到自己的服务器

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

作者: 意浅离殇 | 来源:发表于2017-09-08 14:22 被阅读0次

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

    ![](http://ou8xokgeo.bkt.clouddn.com/2017/8/24/11429536612.png)

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

    `````java

    @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个参数 如下代码

    ```java

    //              微信加密签名

    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 的详细代码如下

    ```java

    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;

    }

    }

    }

    }

    }

    ```

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

    个人博客地址 www.haha174.top

    相关文章

      网友评论

          本文标题:将微信订阅号的用户消息发到自己的服务器

          本文链接:https://www.haomeiwen.com/subject/zqwgjxtx.html