抖音验证签名和接口含中文签名,需要在发送端加上utf8编码

抖音验证签名和接口含中文签名,需要在发送端加上utf8编码

抖音验签和抖音异步通知回调验签解决:是对整个接收的字符串做验签,而不是部分数据做验签
解决中文参数问题,否则中文乱码报验签错误

 

签名算法
https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/server/signature-algorithm/
请注意使用原生的request body中的内容进行验签,避免因框架解析导致字段顺序变化。
(重要) 验签时需要接收原始的 http request body 数据,并不要进行任何处理。保证原始的 body 数据,作为字符串参与验签。如果是 JAVA 语言,
回调接口需要用字符串接收,不要用 Bean 接收,Bean 接收参数会乱序导致验签不过。
在读取网络包的时候如果使用了readLine函数则可能导致验签通不过,因为readLine默认会在每次读取的时候在行位append '\n'字符。


## 原因1: 抖音异步通知回调验签解决-230607-是对整个接收的字符串做验签,而不是部分数据做验签
签名问题:请提供参与签名的全部参数,提供签名计算代码。
验签问题:请提供接收到的平台请求包原始内容,提供验签代码。
你们验证签名用的reqbody搞错了吧
你们是不是把内部的那个msg搞出来当reqbody了
好的,谢谢。原先担保支付验证签名的是取的msg
[捂脸]
文档理解歧义了



应答时间戳
从应答 HTTP 头Byte-Timestamp中获取应答时间戳。 byte-timestamp
应答随机串
从应答 HTTP 头Byte-Nonce-Str中获取应答随机串。 byte-nonce-str
应答报文主体
应答中的报文主体(response body)。

第二步:获取应答签名
应答签名值通过 HTTP 头Byte-Signature传递 byte-signature

 

##原因2:
//核心代码,解决中文参数问题,否则中文乱码报验签错误。
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);

application/json 修改为: application/json;charset=UTF-8

public final static String APPLICATION_JSON_VALUE = "application/json";
public final static String APPLICATION_JSON_UTF8_VALUE = "application/json;charset=UTF-8";

public static String doPostForJson(String url, String json,String byteAuthorization) {
        RestTemplate restTemplate = new RestTemplate();

        logger.info("restTemplate invoke post method. url:[{}], json:[{}],byteAuthorization=[{}]", url, json,byteAuthorization);
        long startTime = System.currentTimeMillis();
        String result = "";

        HttpHeaders headers = new HttpHeaders();
//        headers.setContentType(MediaType.APPLICATION_JSON); //APPLICATION_JSON_UTF8_VALUE
        //核心代码,解决中文参数问题
        headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
        headers.add("Byte-Authorization",byteAuthorization);
        //核心代码
        ArrayList<MediaType> accepts = new ArrayList<>();
        accepts.add(new MediaType("application","json", Charset.forName("UTF-8")));
        headers.setAccept(accepts);

        HttpEntity<String> request = new HttpEntity<>(json, headers);
        result = restTemplate.postForEntity(url,request,String.class).getBody();


        logger.info("restTemplate invoke [{}] consume time is,[{}] ms.", url, System.currentTimeMillis() - startTime);
        logger.info("restTemplate invoke post method. result:[{}]", result);
        return result;
    }

 

posted on 2024-06-15 15:35  oktokeep  阅读(126)  评论(0编辑  收藏  举报