# API签名工具 - Java实现 ## 项目结构 根据实际项目文件结构: ```plaintext java/ ├── pom.xml # Maven项目配置 ├── src/ │ ├── main/ │ │ └── java/ │ │ └── com/ │ │ └── soundforce/ │ │ └── apisign/ │ │ ├── ApiSigner.java # 签名工具实现 │ │ ├── Main.java # 命令行入口 │ │ ├── SignOptions.java # 签名配置 │ │ └── SignatureAlgorithm.java # 签名算法 │ └── test/ │ └── java/ # 测试代码目录 └── target/ # 构建输出目录 ``` ## 使用方法 ### 构建项目 ```bash mvn clean package ``` ### 运行命令行工具 ```bash java -jar target/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 target/apisign-1.0.0.jar ``` **自定义参数** ```bash java -jar target/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 target/apisign-1.0.0.jar -a SHA256 ``` **帮助信息** ```bash java -jar target/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 target/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 target/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数据。 ### 代码集成 ```java import com.soundforce.apisign.ApiSigner; import com.soundforce.apisign.SignOptions; import com.soundforce.apisign.SignatureAlgorithm; import java.util.HashMap; import java.util.Map; // 创建签名选项 SignOptions options = new SignOptions(SignatureAlgorithm.MD5); // 创建签名工具 ApiSigner signer = new ApiSigner(options); // 准备请求参数 Map params = new HashMap<>(); params.put("singleId", "381980"); // 执行签名 Map signedParams = signer.signRequest( params, "YOUR_ACCESS_KEY", "YOUR_SECRET_KEY", "3" ); // 或签名URL String 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