PayPal Client integration のJPYが効かない件

PayPal Client integration で日本円を扱おうとしたら、Checkout画面がUSDになってしまう現象にハマった。currency=JPYで指定すれば、通貨を日本円に出来るだろうって簡単に思っていたけど、そんなに甘くなかった。 結論から言うと、金額(purchase_units.amount.value)に小数点が含まれていたのが原因。

現象

SDK指定時のURLクエリパラメータにcurrency=JPYで指定しているにも関わらず、PayPalのCheckout画面が日本円(JPY)ではなく米ドル(USD)で表示された。

JPYではなくUSDになってしまった時の実装

ほぼ、実装ガイドや、実装サンプルの通りのソースコード。 異なるのはSDK指定時のURLクエリパラメータのみ。

<script src="https://www.paypal.com/sdk/js?client-id=ほげほげ&currency=JPY&disable-funding=card,sepa"></script>
paypal.Buttons({

    // Set up the transaction
    createOrder: function(data, actions) {
        return actions.order.create({
            purchase_units: [{
                amount: {
                    value: '0.01'
                }
            }]
        });
    },

    // Finalize the transaction
    onApprove: function(data, actions) {
        return actions.order.capture().then(function(details) {
            // Show a success message to the buyer
            alert('Transaction completed by ' + details.payer.name.given_name + '!');
        });
    }


}).render('#paypal-button-container');

解決方法

JavaScriptで記述している固定の金額(purchase_units.amount.value)にありえない金額(=小数点)が含まれていたため、バリデーションがかかった模様。 結果、デフォルトのUSDが適用されたCheckout画面が表示されたみたい。なので、以下のように修正。

    // Set up the transaction
    createOrder: function(data, actions) {
        return actions.order.create({
            purchase_units: [{
                amount: {
                    value: '100' // ここを修正
                }
            }]
        });
    },

検証をコピペで楽してたのがいけないんだけどね。実際のサービスと組み合わせながら実装していたらハマっていない気もする。

いやー、ツラかった。