有没大佬帮忙看看这段 ruby, PHP 要怎么改

2018-12-18 13:30:27 +08:00
 ccnccy
nonce = SecureRandom.hex
date = Time.now.httpdate
canonical_string = "application/json,,#{path},#{date},#{nonce}"
signature = Base64.strict_encode64(OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha1'), user_secret, canonical_string))
3777 次点击
所在节点    PHP
12 条回复
chatfeed
2018-12-18 14:25:51 +08:00
函数大概用到 random_bytes ,date,bin2hex,hash_hmac,base64_encode
Citrullus
2018-12-18 16:53:19 +08:00
虽然从未接触过 Ruby (手动狗头),但是从这段代码上看,这是一个生成签名的片段吧!获取字符串和当前时间等通过 sha1 生成签名再 base64
lihongjie0209
2018-12-18 17:59:52 +08:00
有什么看不懂的吗?
TimLang
2018-12-18 18:01:26 +08:00
感觉像微信签名呀。。
2pang
2018-12-18 18:32:02 +08:00
虽然不会 ruby 但这个代码写的这么通俗 一眼就能看出是做什么的吧
ccnccy
2018-12-18 19:13:30 +08:00
@lihongjie0209
@2pang
@chatfeed
改成下面这样,一直错误,提示
Parse error: syntax error, unexpected '$payload' (T_VARIABLE)


$path = "/orders?status=live";

$nonce = md5(time() . mt_rand(0,1000));
$dt = new DateTime('UTC');
$date = $dt->format('D, d M Y H:i:s \G\M\T');
$api_secret1 = 'xxxx'


$payload = ["#{$path}","#{$date}","#{$nonce}"];
$signature = hash_hmac("SHA1", $payload,$api_secret1, true);
$signature_encoded = $this->base64url_encode($signature);
2pang
2018-12-18 19:27:54 +08:00
Parse error: syntax error, unexpected '$payload' (T_VARIABLE)
不是写的很清楚么?
上一行没写分号
linxu
2018-12-18 19:28:10 +08:00
分号少了一个。$api_secret1 = 'xxxx';
ccnccy
2018-12-18 20:14:48 +08:00
感谢楼上 2 位,我再测试测试。
peterxu
2018-12-19 10:47:29 +08:00
上面 ruby 的代码运行结果如下
```
2.4.1 :003 > require 'securerandom'
=> true
2.4.1 :004 > nonce = SecureRandom.hex
=> "5b6097c4519fb22eb0ae399f0678bd05"
2.4.1 :005 > require 'time'
=> true
2.4.1 :006 > date = Time.now.httpdate
=> "Wed, 19 Dec 2018 02:39:32 GMT"
2.4.1 :007 > path = "path"
=> "path"
2.4.1 :008 > canonical_string = "application/json,,#{path},#{date},#{nonce}"
=> "application/json,,path,Wed, 19 Dec 2018 02:39:32 GMT,5b6097c4519fb22eb0ae399f0678bd05"
2.4.1 :009 > require "base64"
=> false
2.4.1 :010 > user_secret = "user_secret"
=> "user_secret"
2.4.1 :011 > signature = Base64.strict_encode64(OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha1'), user_secret, canonical_string))
=> "iGwkpjulP43xZqK/h8JBjL9L9ro="
```
为了能跑通,我把 path 和 user_secret 分别给了个值
path = "path"
user_secret = "user_secret"
代码的意思就是
1、获取一个随机数
2,获取当前时间的一个 date 格式
3、拼成一个指定字符串
4,先使用 sha 算法,再使用 base64 编码
peterxu
2018-12-19 10:48:31 +08:00
v2ex 不支持 markdown 模式?
ccnccy
2018-12-19 20:57:39 +08:00
楼上的辛苦了! ruby 真漂亮。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/518591

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX