FPX の支払いを受け付ける
マレーシアで一般的な支払い方法である FPX を受け付ける方法について説明します。
注意
このセクションにはレガシープロダクトについてのコンテンツが含まれています。最新の導入パスについては、代わりに決済を受け付けるのガイドを使用する必要があります。Stripe はこのプロダクトを引き続きサポートしていますが、プロダクトが非推奨になった場合にはサポートが終了する可能性があります。
FPX は 1 回限りの決済手段です。FPX を使用して支払う場合、顧客はお客様のウェブサイトからリダイレクトされ、支払いの送信後に、ウェブサイトに戻ります。ここで、お客様は支払いが成功したか失敗したかに関する即時通知を受け取ります。
FPX 決済を有効にするには、以下の手順に従います。
- ダッシュボードで、決済手段の設定に移動します。まだ対応されていない場合は、Stripe アカウントの本番環境利用の申請を行ってください。
- 銀行へのリダイレクトで FPX を探し、有効にするを選択します。
- FPX の利用規約に同意します。
FPX 決済は、マレーシアに拠点を置く加盟店のみ受け付け可能です。Stripe プロダクトがサポートしている国、通貨、決済手段については、決済手段のサポートをご覧ください。
注
FPX は 1 回限りの決済手段のため、継続的な支払いや追加の支払いには使用できません。FPX は現在 Stripe Billing ではサポートされていません。Custom アカウントの FPX 支払いはベータでサポートされています。サポートに関するご質問については、Stripe サポートまでお問い合わせください。
PaymentIntent を作成するサーバ側
PaymentIntent (支払いインテント) は、顧客から支払いを回収する意図を表すオブジェクトであり、支払いプロセスのライフサイクルの各段階を追跡します。金額が分かり次第 (決済プロセスの最初など)、PaymentIntent を作成してください。PaymentIntent を作成するには、次の値が必要です。
パラメータ | 値 |
---|---|
payment_ | fpx |
amount | 最小通貨単位の正の整数で、顧客に請求する金額を表します (たとえば、RM10.99 の支払いの場合は 1099)。Stripe は、取引ごとに最小額の RM2 から最大額の RM30,000 までをサポートしています。 |
currency | myr (FPX は常にリンギットを使用する必要があります) |
金額が後で (配送手数料や税金の計算時などに) 変更された場合、amount (金額) を 更新することもできます。
支払い方法の詳細を収集するクライアント側
Stripe Elements は支払い詳細を収集するための事前構築された UI コンポーネントのセットです。Elements は、Stripe.js の機能として自動的に使用可能になります。決済ページに Stripe.js スクリプトを含めるには、HTML ファイルの head
にそのスクリプトを追加します。Stripe.js を常に js.stripe.com から直接読み込むことで、PCI への準拠が維持されます。スクリプトをバンドルに含めたり、そのコピーを自身でホストすることがないようにしてください。
<head> <title>Checkout</title> <script src="https://js.stripe.com/basil/stripe.js"></script> </head>
決済ページで以下の JavaScript を使用して、Elements のインスタンスを作成します。
const stripe = Stripe(
); const elements = stripe.elements();'pk_test_TYooMQauvdEDq54NiTphI7jx'
Elements には、支払いフォーム内の配置場所が必要です。支払いフォームに一意の ID を持つ空の DOM ノード (コンテナ) を作成し、それらの ID を Elements に渡します。
<form id="payment-form"> <div class="form-row"> <div> <label for="fpx-bank-element"> FPX Bank </label> <div id="fpx-bank-element"> <!-- A Stripe Element will be inserted here. --> </div> </div> </div> <button id="fpx-button" data-secret="{{ CLIENT_SECRET }}"> Submit Payment </button> <!-- Used to display form errors. --> <div id="error-message" role="alert"></div> </form>
上記のフォームが読み込まれたら、fpxBank
Element のインスタンスを作成し、それを上記で作成した Element コンテナーにマウントします。
const style = { base: { // Add your base input styles here. For example: padding: '10px 12px', color: '#32325d', fontSize: '16px', }, }; // Create an instance of the fpxBank Element. const fpxBank = elements.create( 'fpxBank', { style: style, accountHolderType: 'individual', } ); // Add an instance of the fpxBank Element into the container with id `fpx-bank-element`. fpxBank.mount('#fpx-bank-element');
Stripe に支払いを送信するクライアント側
クライアント側で支払いを作成するには、ステップ 1 で作成した PaymentIntent
オブジェクトの client secret を渡します。
stripe.confirmFpxPayment を使用し、お客様のページからのリダイレクトを処理して支払いを完了します。この機能に return_
を追加して、ユーザーが銀行のウェブサイトまたはモバイルアプリで支払いを完了した後に Stripe がユーザーをリダイレクトする場所を示します。
const form = document.getElementById('payment-form'); form.addEventListener('submit', async function(event) { event.preventDefault(); const fpxButton = document.getElementById('fpx-button'); const clientSecret = fpxButton.dataset.secret; const result = await stripe.confirmFpxPayment(clientSecret, { payment_method: { fpx: fpxBank, }, // Return URL where the customer should be redirected after the authorization return_url: `${window.location.href}`, }); if (result.error) { // Inform the customer that there was an error. const errorElement = document.getElementById('error-message'); errorElement.textContent = result.error.message; } });
顧客が支払いを送信すると、Stripe は顧客を return_
にリダイレクトし、以下の URL クエリーパラメーターを含めます。返品ページでは、これらを使用して PaymentIntent のステータスを取得し、顧客に支払いステータスを表示できます。
return_
を指定する際に、返品ページで使用する独自のクエリパラメーターを追加することもできます。
パラメーター | 説明 |
---|---|
payment_ | PaymentIntent の一意の識別子。 |
payment_ | PaymentIntent オブジェクトの client secret。サブスクリプションの実装の場合、この client_secret は confirmation_ を通じて Invoice オブジェクトでも公開されます |
顧客が自社のサイトにリダイレクトされたら、payment_
を使用して PaymentIntent をクエリし、顧客に取引ステータスを表示できます。
組み込みをテストする
認証の成功と失敗のケース
FPX の組み込みをテストするには、テスト API キーを使用して任意の銀行を選択し、リダイレクトページを表示します。支払い成功のケースをテストするには、リダイレクトページで支払いを認証します。PaymentIntent が requires_
から succeeded
に移行します。
ユーザが認証に失敗するケースをテストするには、テスト API キーを使用して任意の銀行を選択します。リダイレクトページでテスト支払い失敗をクリックします。PaymentIntent が、requires_
から requires_
に移行します。
確認エラーのケース
発生する可能性のあるその他のエラーケースには、オフライン状態の銀行への接続や、確認時の処理エラーなどがあります。これらのエラーを発生させるには、確認の fpx[bank]
値を以下のいずれかのテストエラー銀行値に設定します。PaymentIntent のステータスは requires_
になります。これらのエラーコードの詳細についてはこちらをご覧ください。
パラメータ | 値 | エラーコード |
---|---|---|
fpx[bank] | test_ | offline_ |
fpx[bank] | test_ | payment_ |
支払い後のイベントを処理するサーバ側
支払いが完了すると、Stripe は payment_intent.succeeded イベントを送信します。ダッシュボード、カスタム Webhook、またはパートナーソリューションを使用してこれらのイベントを受信し、また、顧客への注文確認メールの送信、データベースでの売上の記録、配送ワークフローの開始などのアクションを実行します。
クライアントからのコールバックを待つのではなく、これらのイベントをリッスンします。クライアント側では、コールバックが実行される前に顧客がブラウザーのウィンドウを閉じたり、アプリを終了したりする可能性があります。また、悪意を持つクライアントがレスポンスを不正操作する恐れもあります。非同期型のイベントをリッスンするよう構築済みのシステムを設定することで、これ以降はより多くの決済手段を簡単に受け付けられるようになります。サポートされているすべての決済手段の違いをご確認ください。
手動
Stripe ダッシュボードは、すべての Stripe 支払いの確認、メールでの領収書の送信、入金処理、または失敗した支払いの再試行に使用できます。
カスタムコード
Webhook ハンドラを作成してイベントをリッスンし、カスタムの非同期決済フローを作成します。Stripe CLI を使用し、ローカルで Webhook 組み込みのテストとデバッグを行います。
事前構築のアプリ
オートメーションやマーケティングとセールスなどの一般的なビジネスイベントを、パートナーアプリケーションとの連携によって処理します。
チェックアウトおよび支払い確認の要件
決済ページでは、以下の要件に従う必要があります。
要件 | 詳細 |
---|---|
FPX のロゴを表示する。 | こちらから FPX ロゴをダウンロードします。 |
ドロップダウンリストに、FPX の買い手の銀行の選択肢を作成する。 | 銀行名は、取引銀行に記載されている名前と一致している必要があります。 |
FPX 利用規約の標準的な表現と URL を提示する。 | 標準的な表現: 進むボタンをクリックすると、FPX の利用規約に同意することになります。 |
銀行の認証完了後に顧客が戻る支払い確認ページには、以下の情報を表示する必要があります。
情報 | 情報のソース |
---|---|
取引日時 | Charge オブジェクトの created 。 |
金額 | Charge オブジェクトの amount 。 |
売り手の注文番号 | Charge オブジェクトの statement_ 。 |
FPX 取引 ID | Charge オブジェクトの payment_ 。 |
買い手の銀行名 | Charge オブジェクトの payment_ 。 |
取引ステータス | Charge オブジェクトの status 。 |
この情報には、Charge (支払い) からアクセスできます。Charge オブジェクトは、payment_
イベントから取得できます。
API バージョン 2022-08-01 以前を使用するユーザー: この情報には、Charge (支払い) からアクセスできます。Charge オブジェクトは、payment_
イベントから、または直接 PaymentIntent (支払いインテント) から取得できます。
取引銀行
銀行名 | 値 |
---|---|
Affin Bank | affin_bank |
Alliance Bank | alliance_bank |
AmBank | ambank |
Bank Islam | bank_islam |
Bank Muamalat | bank_muamalat |
Bank Rakyat | bank_rakyat |
BSN | bsn |
CIMB Clicks | cimb |
Hong Leong Bank | hong_leong_bank |
HSBC Bank | hsbc |
KFH | kfh |
Maybank2E | maybank2e |
Maybank2U | maybank2u |
OCBC Bank | ocbc |
Public Bank | public_bank |
RHB Bank | rhb |
Standard Chartered | standard_chartered |
UOB Bank | uob |
エラーコード
一般的なエラーコードと対応する推奨アクションは以下のとおりです。
エラーコード | 推奨アクション |
---|---|
invalid_ | FPX 取引は、RM2 より大きく、RM30,000 未満である必要があります。 |
invalid_ | 指定した銀行は FPX では未対応です。上記の取引銀行からいずれかのオプションを使用してください。 |
invalid_ | FPX は MYR 取引にのみ対応しています。 |
missing_ | 必要なパラメータがありません。必要なパラメータの詳細については、error_ を確認してください。 |
offline_ | 指定した銀行は現在オフラインです。別の銀行または支払い方法のタイプをお試しください。 |
payment_ | この支払い方法は現在使用できません。戻って別の支払い方法で処理するように、顧客に依頼してください。 |
payment_ | 予期しないエラーが発生したため、Payment Intent を確定できませんでした。Payment Intent の確定をもう一度お試しください。 |
入金と送金
コンプライアンス上の理由から、FPX の売上はアカウントの独立した fpx
残高で決済されます。実際、同じ日に 1 つは FPX の売上、もう 1 つはその他すべての売上に対する、2 件の自動入金を別々に受け取る可能性があります。Connect プラットフォームでは、次のように source_
として fpx
を指定することにより、fpx
残高から入金を作成または送金できます。
また、残高を取得して、available
および pending
の Stripe 残高の内訳を source_
ごとに確認することもできます。