加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

试图为api创建PHP等效的C#签名哈希方法

发布时间:2020-12-13 16:14:00 所属栏目:PHP教程 来源:网络整理
导读:我正在尝试复制一个c#方法来生成签名哈希以与API通信,在基于我给出的c#方法示例的 PHP中复制相同的示例结果时遇到了麻烦. 我正在尝试做的单词问题版本是:(来自api文档) 计算请求签名 请求签名,具有SHA-1哈希码的HMAC,通过按顺序连接Service,Method和Timestam
我正在尝试复制一个c#方法来生成签名哈希以与API通信,在基于我给出的c#方法示例的 PHP中复制相同的示例结果时遇到了麻烦.

我正在尝试做的单词问题版本是:(来自api文档)

计算请求签名

请求签名,具有SHA-1哈希码的HMAC,通过按顺序连接Service,Method和Timestamp参数的值,然后使用秘密访问密钥计算符合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,$service_name);
// output: mlePFDcrTAxd+PWA6hOGGtvu2Zc=

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读