美文网首页
美团外卖开放平台签名验证(验签)JAVA

美团外卖开放平台签名验证(验签)JAVA

作者: LeWis_c15c | 来源:发表于2019-03-06 23:02 被阅读0次

package com.panda.task.common.utils;

import com.google.common.base.Charsets;
import com.google.common.collect.Ordering;
import com.google.common.hash.Hashing;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.*;

/**
 * Created by LeWis on 2018/1/15.
 */
public class SignUtil {

    private static Log log = LogFactory.getLog(SignUtil.class);

    /**
     * 验证签名
     *
     * @param request 请求
     * @param domain 域名如: http://test.xxx.com
     * @param secret   密钥
     * @return
     */
    public static boolean verify(HttpServletRequest request,String domain, String secret) {
        //获取所有请求参数
        Enumeration<String> paramKeys = request.getParameterNames();
        Map<String, String> params = new HashMap<>();
        while (paramKeys.hasMoreElements()) {
            String key = paramKeys.nextElement();
            params.put(key, request.getParameter(key));
        }
        if (!params.containsKey("sig")) {
            return false;
        } else {
            //获取当前key
            String key = params.remove("sig");
            //对参数进行加密
            String currentKey = sign(domain + request.getRequestURI(), params, secret);
            log.info("sig:" + key);
            log.info("currentKey:" + currentKey);
            //对比
            return Objects.equals(key, currentKey);
        }
    }

    //生成签名
    private static String sign(String uri, Map<String, String> params, String secret) {
        List<String> keys = Ordering.usingToString().sortedCopy(params.keySet());//key排序
        StringBuilder sb = new StringBuilder();
        sb.append(uri).append("?");
        for (String k : keys) {
            try {
                sb.append(k).append("=").append(URLDecoder.decode(params.get(k), "utf-8")).append("&");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        sb.deleteCharAt(sb.length() - 1);
        sb.append(secret);
        log.info("参数:" + sb.toString());
        return Hashing.md5().hashString(sb, Charsets.UTF_8).toString();
    }
}


相关文章

网友评论

      本文标题:美团外卖开放平台签名验证(验签)JAVA

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