【问题标题】:Perl & SHA1 QueryPerl & SHA1 查询
【发布时间】:2013-01-07 10:51:36
【问题描述】:

我的 PHP 代码

<?php
$xml="<request>
<point_of_sale_id>XXXXXXX</point_of_sale_id>
<order_id>XXXXXXX</order_id>
<amount>XXXXXXX</amount>
<description>XXXXXXX
</description>
<result_url>XXXXXXX</result_url>
<server_url>XXXXXXX</server_url>
</request>";

$parameters_xml=base64_encode($xml);
$merchant_secret_code='XXXXXXX';

$signature=base64_encode(sha1($xml.$merchant_secret_code,1));


echo "<form action=\"https://www.i-koruna.com/i-koruna/api/payment/payment-entry-point.jsf\"\n"; 
echo "method=\"POST\" accept-charset=\"utf-8\">\n"; 
echo "<input type=\"hidden\" name=\"api_version\" value=\"v2\" />\n"; 
echo "<input type=\"hidden\" name=\"parameters_xml\" value=\"$parameters_xml\" />   \n"; 
echo "<input type=\"hidden\" name=\"signature\" value=\"$signature\" />\n"; 
echo "<input type=\"hidden\" name=\"locale\"  value=\"en\" />\n"; 
echo "<input type=\"submit\" value=\"Buy\" />\n"; 
echo "</form> \n";
?>

这段代码可以正常工作,但在 perl 中的复制相同

Perl 代码

     use MIME::Base64;
            use Digest::SHA qw(sha1);
            my $parameters_xml = encode_base64("<request><point_of_sale_id>".$c->{ikoruna_pos}."</point_of_sale_id><order_id>$id</order_id><amount>".$f->{amount}."</amount><description>".$c->{item_name}."</description><result_url>$c->{site_url}/?payment_complete=$id-$usr_id</result_url><server_url>$c->{site_url}/?payment_complete=$id-$usr_id</server_url></request>");
            $parameters_xml =~ s/\s+//g;
            my $merchant = 'XXXXXXXXXXXXX';
            my $signature=encode_base64(sha1($parameters_xml.$merchant), '');

            print "Content-type:text/html\n\n";
print <<END
<form action="https://www.i-koruna.com/i-koruna/api/payment/payment-entry-point.jsf" method="POST" accept-charset="utf-8">
     <input type="hidden" name="api_version" value="v2" />
     <input type="hidden" name="parameters_xml" value="$parameters_xml" /> 
     <input type="hidden" name="signature" value="$signature" />
    <input type="hidden" name="locale"  value="en" />
     <input type="submit" value="Buy" />
</form>
END

我在打包 $signature 时检查了这是一个问题,我这样做是否正确? 如果我错过了一些我可以做到的问题,请忽略 HTML 部分

我从商家“无效的商家签名”处收到此错误

【问题讨论】:

  • 提示:$sha1 = sha1($xml.$xml_merchant_code) 将与您所拥有的完全相同... ,1 参数告诉 sha1 返回原始十六进制字符串而不是默认编码版本...但是您' 无论如何都在编码,所以坚持使用默认值。
  • @MarcB 一个原始的十六进制字符串不同于 base64 编码的二进制数据...
  • @ysth:这很重要……怎么样? sha1() 默认返回 base64,但 op 正在通过请求原始值然后无论如何对其进行 b64 编码来做双重工作。

标签: php xml perl


【解决方案1】:

在 PHP 中,sha 哈希是未编码的 xml,而在 perl 中,sha 哈希是 base64 编码的 xml

更正:

use MIME::Base64;
use Digest::SHA qw(sha1);
my $xml = <<END;
    <request>
        <point_of_sale_id>".$c->{ikoruna_pos}."</point_of_sale_id>
        <order_id>$id</order_id>
        <amount>".$f->{amount}."</amount>
        <description>".$c->{item_name}."</description>
        <result_url>$c->{site_url}/?payment_complete=$id-$usr_id</result_url>
        <server_url>$c->{site_url}/?payment_complete=$id-$usr_id</server_url>
    </request>
END
my $parameters_xml = encode_base64($xml);
$parameters_xml =~ s/\s+//g;
my $merchant = 'XXXXXXXXXXXXX';
my $signature=encode_base64(sha1($xml.$merchant), '');
print "Content-type:text/html\n\n";
print <<END;
<form action="https://www.i-koruna.com/i-koruna/api/payment/payment-entry-point.jsf" method="POST" accept-charset="utf-8">
    <input type="hidden" name="api_version" value="v2" />
    <input type="hidden" name="parameters_xml" value="$parameters_xml" /> 
    <input type="hidden" name="signature" value="$signature" />
    <input type="hidden" name="locale"  value="en" />
    <input type="submit" value="Buy" />
</form>
END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    相关资源
    最近更新 更多