Business::PayPal::API::ExpressCheckoutで住所とか氏名とかの日本語が正しく送れない理由

Business::PayPal::API::ExpressCheckoutで住所とか氏名とかの日本語が正しく送れない理由

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なんて使ってたらダメだね...