微信公众号服务器搭建

       微信服务器搭建公众号服务器搭建主要分成两步:第一步是在自己的服务器上搭建一个用于校验开发者的服务器项目,第二步则是在微信公众号配置服务器资源即可。

一、搭建服务器器项目

1.使用springBoot或者其他的框架进行项目搭建比较快捷一点搭建一个简单的校验开发者项目。这里是使用了springBoot进行搭建,详细实现是参考https://blog.csdn.net/wsadzxcleg/article/details/80983108博客中的代码。

目录架构如下:

 2.controller层代码如下,使用SignVO对象接收微信公众号设置传递的参数,通过工具类WxUtil.checkSignature()方法对用户的参数进行校验,如果通过则返回echostr参数给公众号即可。

package com.hls.demo.wx;

import com.hls.demo.bean.SignVO;
import com.hls.demo.utils.WxUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class WxVerifyController {
    private static Logger logger = LoggerFactory.getLogger(WxVerifyController.class);

    @RequestMapping("/wx/verifysign")
    public String wxVerifySign(SignVO vo){
        logger.info("微信服务器验证信息:" + vo.toString());

        if (WxUtil.checkSignature(vo)){
            return vo.getEchostr();
        }

        return null;
    }
}

3.bean对象以及参数说明如下:

package com.hls.demo.bean;

/**
 * @Description 微信校验bean
 * @Author HLS
 * @Date 2018/12/25 14:36
 **/
public class SignVO {
    //微信加密签名
    private String signature;

    //时间戳
    private String timestamp;

    //随机数
    private String nonce;

    //随机字符串
    private String echostr;

    public String getSignature() {
        return signature;
    }

    public void setSignature(String signature) {
        this.signature = signature;
    }

    public String getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(String timestamp) {
        this.timestamp = timestamp;
    }

    public String getNonce() {
        return nonce;
    }

    public void setNonce(String nonce) {
        this.nonce = nonce;
    }

    public String getEchostr() {
        return echostr;
    }

    public void setEchostr(String echostr) {
        this.echostr = echostr;
    }

    @Override
    public String toString() {
        return "SignVO{" +
                "signature='" + signature + '\'' +
                ", timestamp='" + timestamp + '\'' +
                ", nonce='" + nonce + '\'' +
                ", echostr='" + echostr + '\'' +
                '}';
    }
}

3.wxUtils工具类,使用的是参考博客的工具类

package com.hls.demo.utils;

import com.hls.demo.bean.SignVO;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * @Description 微信公众号工具类
 * @Author HLS
 * @Date 2018/12/25 14:46
 **/
public class WxUtil {
    // 与接口配置信息中的Token要一致
    private static String token = "MonkeyLee";

    /**
     * 验证签名
     *
     * @param signature
     * @param timestamp
     * @param nonce
     * @return
     */
    public static boolean checkSignature(SignVO vo) {
        String signature = vo.getSignature();
        String timestamp = vo.getTimestamp();
        String nonce = vo.getNonce();

        String[] arr = new String[]{token, timestamp, nonce};

        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;
                }
            }

        }
    }
}

二.微信公众号配置

用户在配置服务器时,微信公众号会给定appID和AppSecret这两个参数,这是用于后台开发验证用的,我们服务器搭建用不到,主要是url、token、encodingAeskey参数。这里url是访问你服务器的url,并且规定端口号是80。token则是和服务器中的token需要统一,否则会导致加解密时出错,导致验证不通过。encodingAeskey参数则无需理会,直接生成即可。加密方式在开发时使用明文模式。

三、具体的流程如下:

感觉不用我解释也可以懂了吧!!!!!!!!!

猜你喜欢

转载自blog.csdn.net/qq_33556350/article/details/85259236