我需要将一些C#代码转换为PHP等效代码以使用SOAP Web API。他们所有的例子都在C#中。我认为我有相同的PHP函数,但我的SOAP请求返回'错误请求'或'未授权 - 无效的API密钥' - 而API页面上的示例页面与我的密钥一起使用,请求URL看起来相同正在传递的摘要消息。 API和客户端ID绝对正确。
这是C#代码:
private string GenerateDigest(long currentTime)
{
SHA256Managed hashString = new SHA256Managed();
StringBuilder hex = new StringBuilder();
byte[] hashValue = hashString.ComputeHash(Encoding.UTF8.GetBytes(String.Format("{0}{1}", currentTime, txtApiKey.Text)));
foreach (byte x in hashValue)
{
hex.AppendFormat("{0:x2}", x);
}
return hex.ToString();
}
这是我编写的用于尝试执行C#正在执行的操作的PHP函数:
public static function generateDigest($api_key) {
return hash('sha256', time() . mb_convert_encoding($api_key, 'UTF-8'));
}
我对C#不是很流利,所以我假设我出错的地方是它在做hex.AppendFormat()。我不确定PHP中应该是什么。最终结果是附加到URL以生成SOAP请求的哈希,如下所示:
https://payments.homeaway.com/tokens?time=1387385872013&digest=1bd70217d02ecc1398a1c90b2be733ff686b13489d9d5b1229461c8aab6e6844&clientId= [删除]
编辑:
这是在C#中传递的currentTime变量。
// Request validation setup
TimeSpan timeSinceEpoch = DateTime.UtcNow - new DateTime(1970, 1, 1);
long currentTime = (long)timeSinceEpoch.TotalMilliseconds;
string digest = GenerateDigest(currentTime);
答案 0 :(得分:0)
我将同样的问题转换为php代码,这是解决问题的代码:
function generateDigest($time, $api_key) {
$hash = hash('sha256', $time . mb_convert_encoding($api_key, 'UTF-8'), true);
return $this->hexToStr($hash);
}
function hexToStr($string){
//return bin2hex($string);
$hex="";
for ($i=0; $i < strlen($string); $i++)
{
if (ord($string[$i])<16)
$hex .= "0";
$hex .= dechex(ord($string[$i]));
}
return ($hex);
}
答案 1 :(得分:0)
如果有人在寻找这个,答案与时间有关。 PHP的time()
函数返回以秒为单位的时间,其中C#中的调用返回毫秒。
因此,获取$currentTime
的正确方法是
$currentTime = time() * 1000;
这已经过API测试。