2013-01-23 2 views
1

내 PHP 코드펄 & SHA1 쿼리

<?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"; 
?> 

이 코드가 작동 있지만 펄에서 그 같은 재생

펄 코드

 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 

나는 그것을 포장하는 동안 문제가 확인했다 $ 시그니처가 올바른지? 내가 뭔가를 놓친 경우 인코딩되지 않은 XML이다 그건 내가 그것을 나는 샤 해시는 PHP에서 상인 "잘못된 상인 서명"

+0

팁 : 펄의 샤 해시 XML

수정

base64 인코딩입니다 동안'$의 SHA1 = SHA1 (. $ XML $의 xml_merchant_code)'당신이 가진 것과 정확히 같은 작동합니다. ..'1,'인수는 sha1에게 16 진수 문자열을 반환하도록 지시합니다. 기본 인코딩 된 버전 대신 ...하지만 어쨌든 인코딩 중이므로 기본값을 사용하십시오. –

+0

@MarcB 원시 16 진수 문자열은 base64로 인코딩 된 바이너리 데이터와 다릅니다 ... – ysth

+0

@ysth : 문제는 ... 어떻게됩니까? sha1()은 기본적으로 base64를 반환하지만, op는 원시 값을 요청한 다음 어쨌든 b64 인코딩하여 이중 작업을 수행합니다. –

답변

3

에서이 오류를 얻고있다

을 할 수있는 문제가되지 않습니다 HTML 부분을 무시

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 
+0

부탁해 너무 고마워요. – user1934413