PerlでPayPalのExpressCheckoutを実装するのにBusiness::PayPal::APIを使っているのだけれど、日本語(2byte文字)がうまく送信できない。
UTF-8で送ろうが、フラグ付きにしようが、だ。
散々悩んだ挙句、原因はSOAP::Liteが勝手にbase64エンコードするからだと判明。
Business::PayPal::APIは内部でSOAP::Liteを使用していて、Asciiだとそのままなのだけれど、それ以外はbase64にエンコードする仕様の様子。
前々から、例えば、OrderDescription に日本語を使うと上手くいかないと思っていたのだけれど、、、。
仕方がないから Business::PayPal::API::ExpressCheckoutをカスタマイズする。
/usr/lib/perl5/site_perl/5.8.8/Business/PayPal/API/ExpressCheckout.pm
## add all the other fields for my $field ( keys %types ) { next unless defined $args{$field}; if( $field eq 'MaxAmount' ) { push @secrd, SOAP::Data->name( $field => $args{$field} )->type( $types{$field} ) ->attr( {currencyID => $currencyID, xmlns => $self->C_xmlns_ebay} ); } ## 追記ココから elsif($field eq 'Address'){ my @addr; my $hash = $args{$field}; for my $f ( keys %$hash) { push @addr, SOAP::Data->name( $f )->type(string => $args{$field}{$f} ); } my $obj = SOAP::Data->name( $field => \SOAP::Data->value( @addr )); push @secrd,$obj; } ## 追記ココまで else { push @secrd, SOAP::Data->name( $field => $args{$field} )->type( $types{$field} ); } }
SOAPなんて使ってたらダメだね…




