You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将C# API认证令牌生成代码转为PHP:解决Agent not found错误

问题分析与解决方案

首先,你的PHP实现和服务商提供的C#示例存在几个核心差异,这些差异直接导致了API认证失败。我们一步步拆解问题:

1. 密钥使用完全错误

服务商的C#代码是使用提供的公钥进行加密,但你的PHP代码却自己生成了新的密钥对,并且用自己的私钥加密——这完全不符合API的认证逻辑:

  • 正确逻辑:用服务商给你的公钥加密认证信息(Agent和Group),服务商拿到后用自身私钥解密,以此验证你的身份。
  • 你自行生成密钥对的话,服务商没有对应的私钥解密,自然识别不到你的Agent信息。

2. 加密填充方式不匹配

C#代码中rsa.Encrypt(agentBytes, true)的第二个参数true表示使用RSA-OAEP填充,而phpseclib的RSA类默认填充方式是PKCS#1 v1.5,这会导致加密结果完全不同,API无法解析。

3. JSON格式可能不一致

C#里的JSON字符串带有空格:{ Agent : "XXX", Group: "XXXXXXX" },而PHP的json_encode()默认生成紧凑格式(如{"Agent":"XXX","Group":"XXXXXXX"}),如果API对JSON的空格格式敏感,也会导致识别失败。


修正后的PHP代码

<?php
use phpseclib\Crypt\RSA;

// 替换为服务商提供的公钥字符串
$publicKey = "XXXXXXXXXXXXXXXXXX"; 
$rsa = new RSA();

// 加载公钥并设置OAEP填充(匹配C#的加密方式)
$rsa->loadKey($publicKey);
$rsa->setEncryptionMode(RSA::ENCRYPTION_OAEP);
// 注:C#的RSACryptoServiceProvider默认用SHA1作为OAEP哈希函数,若加密结果仍不对可手动指定
// $rsa->setHash('sha1');

// 构造与C#格式完全一致的JSON(若API对空格不敏感,也可使用json_encode)
$json = '{ Agent : "XXX", Group: "XXXXXXX" }';
// 备选:$json = json_encode(['Agent' => 'XXX', 'Group' => 'XXXXXXX']);

// 执行加密并转换为Base64
$encrypted = $rsa->encrypt($json);
$output = base64_encode($encrypted);

echo $output;
?>

额外排查点

  • 公钥格式适配:如果服务商提供的是纯Base64字符串(无PEM头),需要先包装成PEM格式再加载:
    $publicKeyPem = "-----BEGIN PUBLIC KEY-----\n" . chunk_split($publicKey, 64) . "-----END PUBLIC KEY-----";
    $rsa->loadKey($publicKeyPem);
    
  • 参数正确性:确认Agent和Group的取值和C#示例完全一致,包括大小写、特殊字符,避免拼写错误。
  • 编码一致性:C#使用UTF8编码,PHP的encrypt默认处理UTF8字符串,但如果你的PHP环境编码非UTF8,需手动转换字符串编码。

内容的提问来源于stack exchange,提问作者Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:28:01