Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试为api创建与C#签名哈希方法等效的php_C#_Php_Sha1_Hmac - Fatal编程技术网

尝试为api创建与C#签名哈希方法等效的php

尝试为api创建与C#签名哈希方法等效的php,c#,php,sha1,hmac,C#,Php,Sha1,Hmac,我试图复制一个c#方法来生成一个签名散列以与API通信,在PHP中基于我给出的c#方法示例再现相同的示例结果时遇到了问题 我试图做的文字问题版本是:(来自api文档) 计算请求签名 请求签名,即带有SHA-1哈希码的HMAC,通过按顺序连接服务、方法和时间戳参数的值,然后使用秘密访问密钥作为“密钥”,计算符合RFC 2104的HMAC来计算。计算出的HMAC值必须是base64编码的 测试数据: service_name = “Zoyto Fulfillment Service” timesta

我试图复制一个c#方法来生成一个签名散列以与API通信,在PHP中基于我给出的c#方法示例再现相同的示例结果时遇到了问题

我试图做的文字问题版本是:(来自api文档)

计算请求签名

请求签名,即带有SHA-1哈希码的HMAC,通过按顺序连接服务、方法和时间戳参数的值,然后使用秘密访问密钥作为“密钥”,计算符合RFC 2104的HMAC来计算。计算出的HMAC值必须是base64编码的

测试数据:

service_name = “Zoyto Fulfillment Service”
timestamp: “2010-07-21T04:33:55Z”
api_secret = “2c0774063f4bb1a10ca39ba6c806636a57d78dc3”
method = “getOrderStatus”

Result should be:
signature: “mlePFDcrTAxd+PWA6hOGGtvu2Zc=”
我有以下c#方法的代码示例,用于创建签名散列以进行API调用:

public string createSignature(string api_secret, string method, string timestamp, string service_name) { 
  DateTime currentTime = DateTime.UtcNow; string toSign = service_name.ToLower() +   method.ToLower() + timestamp.ToLower(); 
  byte[] toSignBytes = Encoding.UTF8.GetBytes(toSign); byte[] secretBytes = Encoding.UTF8.GetBytes(api_secret); 
  HMAC signer = new HMACSHA1(secretBytes byte[] sigBytes = signer.ComputeHash(toSignBytes); 
  string signature = Convert.ToBase64String(sigBytes); 
  return signature; 
}
目前,我的php方法如下所示:

$testSecret = '2c0774063f4bb1a10ca39ba6c806636a57d78dc3';
$testSvc    = 'Zoyto Fulfillment Service';
$testStamp  = strtotime('2010-07-21 04:33:55');   
$method = 'getOrderStatus';

$sig    = utf8_encode($testSvc.$method.$testStamp);

$hash   = hash_hmac("sha1", $sig, $testSecret, true);

$sig    = base64_encode($hash);
return $sig;

//returns:
//OUhgiIqxngaFm1Rquxm1lZ/3CzE=

非常感谢您提供的任何帮助

我不确定您是从哪里获得C代码的,但它不起作用。此PHP代码将为给定的输入提供所需的输入

function createSignature($api_secret, $method, $timestamp, $service_name) {
    $toSign = strtolower($service_name) . strtolower($method) . strtolower($timestamp);
    $sig = hash_hmac('sha1', $toSign, $api_secret, true);
    return base64_encode($sig);
}

$api_secret = '2c0774063f4bb1a10ca39ba6c806636a57d78dc3';
$method = 'getOrderStatus';
$timestamp  = '2010-07-21T04:33:55Z'; 
$service_name    = 'Zoyto Fulfillment Service';

echo createSignature($api_secret, $method, $timestamp, $service_name);
// output: mlePFDcrTAxd+PWA6hOGGtvu2Zc=

注意:需要PHP5>=5.1.2或PECL哈希>=1.1

您的C#代码第4行有语法错误。如果您可以先解决这个问题,我可以帮助您使用PHP code.crap,我将unix时间戳传递给哈希,而不是日期字符串。谢谢你,伙计