PHP如何实现X-Douyin-Signature验签
277 浏览2025年05月07日作者:ziyoren

阅读文档(https://partner.open-douyin.com/docs/resource/zh-CN/local-life/develop/OpenAPI/preparation/massages.push) 中可以获取一段demo代码

import org.apache.commons.codec.digest.DigestUtils; // sha1算法库


        // 获取消息中body
        String str, wholeStr = "";
        try{
            BufferedReader br = re.getReader();
            while((str = br.readLine()) != null){
                wholeStr += str;
            }
        } catch (Exception e){
            log.warn("获取请求内容失败");
        }
        // 获取请求头中的加签信息
        String  signature = re.getHeader("X-Douyin-Signature");
        String data = appSecret + wholeStr;
        String sign = DigestUtils.sha1Hex(data);
        if(!sign.equals(signature)){
            log.error("验签失败");
        }

转成PHP代码后,总是无法实现验签,不知道问题出在哪里

<?php

namespace Ziyoren\DouyinApi;

use support\Log;

class Message
{
    /**
     * 验证签名
     * @param string $signature header中传入的签名X-Douyin-Signature
     * @param string $body httpBody
     * @return bool
     * @throws \Exception
     */
    public static function verifySignature($signature, $body)
    {
        $config = new Config();
        // appSecret是你的应用密钥,需要从抖音开放平台获取
        $appSecret = $config->getAppSecret();

        // 将appSecret与body内容拼接后进行sha1哈希处理
        $sign = sha1( $appSecret . $body );

        // 验证签名是否匹配
        if ($sign !== $signature) {
            $msg = '验签失败';
            Log::error($msg, compact('signature', 'sign', 'body'));
            throw new \Exception($msg, 403);
        }

        // 如果验签通过,则继续处理业务逻辑
        return true;
    }
}

调用示例

$wholeStr = file_get_contents('php://input');
Message::verifySignature($header['x-douyin-signature'], $wholeStr);


请各位前辈指导一下



最后一次编辑于 2025 年 05 月 07 日
2 条评论

相关文章

专题推荐

热门文章

热门问答