Итак, основной XML-код, который я пытаюсь создать, - это (заголовок для краткости сокращен).
<SOAP-ENV:Body><data:requestMessage xmlns:data="urn:schemas-cybersource-com:transaction-data-1.62">
<data:merchantID>obfuscated</data:merchantID>
<data:merchantReferenceCode>42</data:merchantReferenceCode>
<data:billTo><data:firstName>caleb</data:firstName>
<data:lastName>cushing</data:lastName><data:street1>somewhere</data:street1>
<data:city>houston</data:city>
<data:state>TX</data:state>
<data:postalCode>77064</data:postalCode>
<data:country>US</data:country>
<data:email>xenoterracide@gmail.com</data:email>
</data:billTo>
<data:item id="0">
<data:unitPrice>2.01</data:unitPrice>
<data:quantity>1</data:quantity>
</data:item>
<data:item id="1">
<data:unitPrice>3</data:unitPrice>
<data:quantity>1</data:quantity>
</data:item>
<data:purchaseTotals>
<data:currency>USD</data:currency>
<data:grandTotalAmount>5.01</data:grandTotalAmount>
</data:purchaseTotals><data:card>
<data:accountNumber>4111111111111111</data:accountNumber>
<data:expirationMonth>12</data:expirationMonth>
<data:expirationYear>2015</data:expirationYear>
</data:card><data:ccAuthService run="true"/>
</data:requestMessage></SOAP-ENV:Body>
Вот Perl
#!/usr/bin/perl
use v5.14;
use strict;
use warnings;
use Env qw( CYBS_ID CYBS_KEY );
use XML::Compile::Util qw( pack_type type_of_node );
use XML::Compile::Cache;
use XML::Compile::SOAP::WSS;
use XML::Compile::WSDL11;
use XML::Compile::SOAP11;
use XML::Compile::Transport::SOAPHTTP;
my $wss = XML::Compile::SOAP::WSS->new( version => '1.1' );
my $wsdl = XML::Compile::WSDL11->new( 'CyberSourceTransaction_1.62.wsdl' );
$wsdl->importDefinitions( 'CyberSourceTransaction_1.62.xsd' );
my $call = $wsdl->compileClient('runTransaction');
my $security = $wss->wsseBasicAuth( $CYBS_ID, $CYBS_KEY );
my ( $answer, $trace ) = $call->(
wsse_Security => $security,
merchantID => $CYBS_ID,
merchantReferenceCode => '42',
billTo => {
firstName => 'caleb',
lastName => 'cushing',
street1 => 'somewhere',
city => 'houston',
state => 'TX',
postalCode => '77064',
country => 'US',
email => 'xenoterracide@gmail.com',
},
item => {
id => 0,
quantity => 1,
unitPrice => 2.01,
},
item => {
id => 1,
quantity => 1,
unitPrice => 3.00,
},
purchaseTotals => {
currency => 'USD',
grandTotalAmount => 5.01,
},
card => {
accountNumber => '4111111111111111',
expirationMonth => '12',
expirationYear => '2015',
},
ccAuthService => {
run => 'true',
},
);
$trace->printRequest;
say '---';
$trace->printResponse;
Вот WSDL и XSD
Ниже приведен генерируемый XML. Очевидно, я получаю только второй предмет. Как я могу создать запрос, содержащий более одного элемента?
<SOAP-ENV:Body><data:requestMessage xmlns:data="urn:schemas-cybersource-com:transaction-data-1.62">
<data:merchantID>obfuscated</data:merchantID>
<data:merchantReferenceCode>42</data:merchantReferenceCode>
<data:billTo><data:firstName>caleb</data:firstName>
<data:lastName>cushing</data:lastName><data:street1>somewhere</data:street1>
<data:city>houston</data:city>
<data:state>TX</data:state>
<data:postalCode>77064</data:postalCode>
<data:country>US</data:country>
<data:email>xenoterracide@gmail.com</data:email>
</data:billTo>
<data:item id="1">
<data:unitPrice>3</data:unitPrice>
<data:quantity>1</data:quantity>
</data:item>
<data:purchaseTotals>
<data:currency>USD</data:currency>
<data:grandTotalAmount>5.01</data:grandTotalAmount>
</data:purchaseTotals><data:card>
<data:accountNumber>4111111111111111</data:accountNumber>
<data:expirationMonth>12</data:expirationMonth>
<data:expirationYear>2015</data:expirationYear>
</data:card><data:ccAuthService run="true"/>
</data:requestMessage></SOAP-ENV:Body>