# API签名工具 - Kotlin实现 ## 项目结构 根据实际项目文件结构: ```plaintext kotlin/ ├── build.gradle.kts # Gradle构建文件 ├── gradle/ # Gradle包装器目录 ├── gradlew # Gradle包装器脚本(Unix) ├── gradlew.bat # Gradle包装器脚本(Windows) ├── gradle.properties # Gradle属性配置 ├── settings.gradle.kts # Gradle设置 ├── src/ │ └── main/ │ └── kotlin/ │ └── com/ │ └── soundforce/ │ └── apisign/ │ ├── ApiSigner.kt # 签名工具实现 │ ├── Main.kt # 命令行接口 │ ├── SignOptions.kt # 签名配置 │ └── SignatureAlgorithm.kt # 签名算法 ├── build/ # 构建输出目录 └── .gradle/ # Gradle缓存目录 ``` ## 使用方法 ### 构建项目 ```bash # 初始化Gradle包装器(如果尚未初始化) gradle wrapper # 构建项目 ./gradlew build # 构建可执行JAR文件 ./gradlew shadowJar ``` 这将在`build/libs/`目录下生成一个包含所有依赖的可执行JAR文件。 ### 运行命令行工具 ```bash # 直接运行(不需要先构建) ./gradlew run --args="[选项]" # 或使用构建后的JAR文件 java -jar build/libs/apisign-1.0.0.jar [选项] ``` ### 命令行选项 | 选项 | 描述 | |------|------| | `-a, --algorithm` | 签名算法: MD5, SHA1, SHA256, HMAC-SHA256 | | `-u, --url` | API基础URL | | `-p, --param` | 请求参数,格式为key=value,可多次使用 | | `-k, --key` | 访问密钥ID | | `-s, --secret` | 密钥 | | `-c, --channel` | 合作渠道方ID | | `-h, --help` | 显示帮助信息 | ### 常用命令示例 **基本用法** ```bash java -jar build/libs/apisign-1.0.0.jar ``` **自定义参数** ```bash java -jar build/libs/apisign-1.0.0.jar \ -u "https://api.example.com/user/info" \ -p "userId=12345" -p "action=getInfo" \ -k "YOUR_ACCESS_KEY" \ -s "YOUR_SECRET_KEY" \ -c "3" ``` **指定签名算法** ```bash java -jar build/libs/apisign-1.0.0.jar -a SHA256 ``` **帮助信息** ```bash java -jar build/libs/apisign-1.0.0.jar --help ``` ### API接口测试实例 使用真实API接口进行测试: ```bash # 未签名的API调用测试 - 返回错误 curl "https://api-v1.sound-force.com:8443/p/album/single/media-url?channelId=3&singleId=381980" # 返回: {"code":400,"data":null,"msg":"Missing AccessKeyId","success":false} # 生成访问https://api-v1.sound-force.com:8443/p/album/single/media-url的签名URL java -jar build/libs/apisign-1.0.0.jar \ -a MD5 \ -u "https://api-v1.sound-force.com:8443/p/album/single/media-url" \ -p "singleId=381980" \ -k "YOUR_ACCESS_KEY" \ -s "YOUR_SECRET_KEY" \ -c "3" # 使用curl测试API接口 signed_url=$(java -jar build/libs/apisign-1.0.0.jar \ -a MD5 \ -u "https://api-v1.sound-force.com:8443/p/album/single/media-url" \ -p "singleId=381980" \ -k "YOUR_ACCESS_KEY" \ -s "YOUR_SECRET_KEY" \ -c "3" | grep -A 1 "签名后的URL:" | tail -n 1) curl -v "$signed_url" ``` 请注意: - 替换`YOUR_ACCESS_KEY`为实际的访问密钥ID - 替换`YOUR_SECRET_KEY`为实际的密钥 - 示例使用的渠道ID为`3`,请根据实际情况调整 使用有效的密钥和签名后,API接口将返回成功响应(状态码200)并提供媒体URL数据。 ### 代码集成 ```kotlin import com.soundforce.apisign.ApiSigner import com.soundforce.apisign.SignOptions import com.soundforce.apisign.SignatureAlgorithm // 创建签名工具 val signer = ApiSigner() // 参数 val params = mapOf( "singleId" to "381980" ) // 执行签名 val signedParams = signer.signRequest( params, "YOUR_ACCESS_KEY", "YOUR_SECRET_KEY", "3" ) // 或签名URL val signedUrl = signer.signUrl( "https://api-v1.sound-force.com:8443/p/album/single/media-url", params, "YOUR_ACCESS_KEY", "YOUR_SECRET_KEY", "3" ) ``` ### 环境变量 该工具支持从`.env`文件加载以下配置: - `ACCESS_KEY_ID`: 访问密钥ID - `SECRET_KEY`: 密钥 - `CHANNEL_ID`: 渠道ID - `SIGN_ALGORITHM`: 签名算法 - `API_BASE_URL`: API基础URL