微信验证开发者服务器

一.功能解释

微信之所以验证开发者服务器,是为了绑定公众号用户与其开发服务器,以完成公众号的用户与公众号之间交互信息的推送。
举个例子来说,比如用户领取了公众号的会员卡,微信就会往这个公众号绑定的服务器地址发送一个xml格式的领取事件,告知开发者。接下来开发者就可以进行自己的业务处理了。

二.具体过程叙述

1.登录“微信公众平台”---->“基本配置”---->“服务器配置”。填写对应信息在这里插入图片描述2.服务起在哪个位置,url就填写该信息即可;token用于加密,本地一致即可;EncodingAESKey随机即可----用token去解密微信返回的参数,得到的字符串和EncodingAESKey一致则表示验证通过

三.实现代码

import com.google.common.base.Strings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.security.*;

/**
 * 服务实现:接收微信后台
 *
 * @author 
 * @date 
 */
@RestController
public class WxController {

    @Value("${wx.appId}")
    private String appId;
    @Value("${wx.secret}")
    private String secret;
    @Value("${wx.verifyToken}")
    private String token;

    private static final Logger logger = LoggerFactory.getLogger(WxController.class);

    @RequestMapping(value = "", method = RequestMethod.GET, produces = MediaType.TEXT_PLAIN)
    public String verifyServer(@QueryParam("signature") String signature,
                               @QueryParam("timestamp") String timestamp,
                               @QueryParam("nonce") String nonce,
                               @QueryParam("echostr") String echostr) {

        String str = null;
        logger.info("接收到前端请求报文signature=[{}], timestamp=[{}], nonce=[{}], echostr=[{}],",
                signature, timestamp, nonce, echostr);

        try {
            String mySign = getSign(timestamp, nonce);
            logger.info("mySign=[{}], wxSign=[{}]", mySign, signature);

            // 参数错误,确认失败
            if (Strings.isNullOrEmpty(signature) || Strings.isNullOrEmpty(mySign)) {
                logger.error("系统异常=[{}]", ErrorCode.SYS_PARAMETER_INVALID.getMsg());
                return null;
            }

            // 验证失败
            if (!signature.equals(mySign)) {
                logger.error("验证出错=[{}]", "微信签名与本地签名不匹配");
                return null;
            }

            logger.info("系统验证成功,进行get返回...");
            str = echostr;

        } catch (Exception e) {
            logger.error("系统错误=[{}]", ErrorCode.SYS_SYSTEM_ERROR.getMsg());
        }

        return str;
    }

    /**
     * 获得微信验证签名
     *
     * @param time
     * @param nonce
     * @return
     */
    private String getSign(String time, String nonce) {
        ArrayList<String> list = new ArrayList<>();
        list.add(time);
        list.add(nonce);
        list.add(token);
        Collections.sort(list);
        StringBuilder sb = new StringBuilder();
        for (String item : list) {
            sb.append(item);
        }
        return sha1(sb.toString(), false);
    }
    
    /**
     * @param src
     * @param upcase 结果是否大写true大写,false小写
     * @return
     */
    public static String sha1(String src, boolean upcase) {
        String ret = null;

        try {
            MessageDigest sha1 = MessageDigest.getInstance("SHA1");
            byte[] bytes = sha1.digest(src.getBytes("UTF-8"));

            ret = bytes2HexString(bytes, upcase);

        } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        return ret;
    }
    
    /**
     * byte[] 转 16进制字符串
     *
     * @param arr
     * @param upcase 是否大写
     * @return
     */
    public static String bytes2HexString(byte[] arr, boolean upcase) {
        StringBuilder sbd = new StringBuilder();
        for (byte b : arr) {
            String tmp = Integer.toHexString(0xFF & b);
            if (tmp.length() < 2) {
                tmp = "0" + tmp;
            }
            sbd.append(tmp);
        }

        if (upcase) {
            return sbd.toString().toUpperCase();
        }
        else {
            return sbd.toString();
        }
    }
}
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页