V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
ccnccy
V2EX  ›  PHP

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

  •  
  •   ccnccy · Dec 18, 2018 via iPhone · 4407 views
    This topic created in 2687 days ago, the information mentioned may be changed or developed.
    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))
    Supplement 1  ·  Dec 18, 2018
    改成下面这样,一直错误,提示
    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);
    12 replies    2018-12-19 20:57:39 +08:00
    chatfeed
        1
    chatfeed  
       Dec 18, 2018
    函数大概用到 random_bytes ,date,bin2hex,hash_hmac,base64_encode
    Citrullus
        2
    Citrullus  
       Dec 18, 2018
    虽然从未接触过 Ruby (手动狗头),但是从这段代码上看,这是一个生成签名的片段吧!获取字符串和当前时间等通过 sha1 生成签名再 base64
    lihongjie0209
        3
    lihongjie0209  
       Dec 18, 2018
    有什么看不懂的吗?
    TimLang
        4
    TimLang  
       Dec 18, 2018
    感觉像微信签名呀。。
    2pang
        5
    2pang  
       Dec 18, 2018 via Android
    虽然不会 ruby 但这个代码写的这么通俗 一眼就能看出是做什么的吧
    ccnccy
        6
    ccnccy  
    OP
       Dec 18, 2018
    @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
        7
    2pang  
       Dec 18, 2018 via Android   ❤️ 1
    Parse error: syntax error, unexpected '$payload' (T_VARIABLE)
    不是写的很清楚么?
    上一行没写分号
    linxu
        8
    linxu  
       Dec 18, 2018 via Android   ❤️ 1
    分号少了一个。$api_secret1 = 'xxxx';
    ccnccy
        9
    ccnccy  
    OP
       Dec 18, 2018 via iPhone
    感谢楼上 2 位,我再测试测试。
    peterxu
        10
    peterxu  
       Dec 19, 2018   ❤️ 1
    上面 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
        11
    peterxu  
       Dec 19, 2018
    v2ex 不支持 markdown 模式?
    ccnccy
        12
    ccnccy  
    OP
       Dec 19, 2018 via iPhone
    楼上的辛苦了! ruby 真漂亮。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1070 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 22:51 · PVG 06:51 · LAX 15:51 · JFK 18:51
    ♥ Do have faith in what you're doing.