2023年8月24日木曜日

fincodeの決済サービスをAPEXアプリケーションに実装する

GMOイプシロン株式会社が提供している決済サービスfincodeによるクレジットカード決済を、Oracle APEXのアプリケーションに実装してみます。

チュートリアルの以下の記述にそって、Oracle APEXに合わせた実装を行います。

テスト環境で決済を実行する
https://docs.fincode.jp/tutorial/test_api_exec

決済登録のAPIは、APEXアプリケーションより呼び出します。

入力フォームの生成は、JavaScriptリファレンスを参照して実装します。

作成したアプリケーションは以下のように動作します。


最後にREST APIを呼び出して決済情報を取得しています。実際に決済の成功や失敗を確認するにはWebhookを実装するのが一般的だと思いますが、本記事ではWebhookの作成は取り扱っていません。通常Webhookは、APEXのアプリケーションではなく、ORDSのRESTサービスとして実装します。

以下より実装について説明します。

アプリケーション作成ウィザードを起動し、空のアプリケーションを作成します。名前fincodeとします。

アプリケーションの作成をクリックします。


アプリケーション定義置換文字列として、パブリックキーAPIのエンドポイントを設定します。

パブリックキーは置換文字列FINCODE_PUBLIC_KEY置換値としてp_test_で始まる(テスト用の)パブリックキーを設定します。

APIのエンドポイント置換文字列としてFINCODE_ENDPOINT置換値としてhttps://api.test.fincode.jpを設定します。


ワークスペース・ユーティリティWeb資格証明を開きます。


fincodeが提供するREST APIに使用するWeb資格証明は、以下の情報より作成します。

fincodeのAPIは、ベアラーとしてシークレットキーを渡すことで認証できます。認証タイプHTTPヘッダーを選択し、資格証明名Authorization資格証明シークレットとして、文字列Bearerで始めて空白で区切り、シークレットキーの値を設定します。

Bearer シークレットキー

Web資格証明の名前fincode CRED静的IDFINCODE_CREDとして、Web資格証明を作成します。URLに対して有効https://api.test.fincode.jpを設定します。

以上で作成をクリックします。


Web資格証明としてfincode CRED(静的IDはFINCODE_CRED)が作成されました。


fincodeによるカード情報入力フォームを表示するページを作成します。

ページの作成をクリックします。


空白ページを選択します。


ページ番号(ページ・アイテム名に現れるため2とします)、名前Payページ・モードとしてドロワーを選択します。

ページの作成をクリックします。


ページPayが作成されました。

ホーム・ページでは決済金額を入力し、確定ボタンを押します。確定ボタンを押すとfincodeが提供するカード情報を入力するフォームを実装したドロワーが開き、そこで決済を実行します。決済を実行すると、ドロワーが閉じます。


ページ・デザイナホーム・ページを開きます。

金額を入力するページ・アイテムP1_AMOUNTを作成します。

タイプ数値フィールドラベルAmountとします。


決済金額を確定するボタンCONFIRMを作成します。

ラベルConfirm外観ホットオンテンプレート・オプションWidthとしてStretchを選択します。動作アクションはデフォルトのページの送信から変更しません。


作成した決済IDを保持するページ・アイテムP1_ORDER_ID取引IDを保持するページ・アイテムP1_ACCESS_IDを作成します。双方ともタイプ非表示です。

セッション・ステートストレージとしてセッションごと(永続)を選択します。決済登録はPL/SQLで実行します。その際にページ・アイテムに設定された決済IDは、ページ遷移の後でも値を維持するようにします。


決済の状態を表示するリージョンを作成します。

識別タイトルPayment Statusタイプとして動的コンテンツを選択します。

ソースのCLOBを返すPL/SQLファンクション本体として以下を記述します。

ページ・アイテムP1_ORDER_IDはセッション・ステートとして保持されているため、送信するページ・アイテムへの設定は不要です。


このリージョンをリフレッシュするボタンREFRESHを作成します。

ラベルはRefresh動作アクションとして動的アクションで定義を選択します。


ボタンREFRESH動的アクションを作成します。

識別名前onClick REFRESHタイミングイベントはボタンのデフォルトであるクリックです。


TRUEアクションとしてリフレッシュを選択します。影響を受ける要素選択タイプリージョンリージョンとしてPayment Statusを選択します。


このページを初期化するボタンCLEARを作成します。

ラベルClear動作アクションページの送信です。レイアウト新規行の開始オフにし、ボタンREFRESHの右隣に配置します。


プロセス・ビューを開き、ボタンを押した時に実行されるプロセスを作成します。

ボタンCONFIRMを押した時に決済登録を実行します。

プロセスの識別名前Register Paymentタイプとしてコードを実行を選択します。ソースPL/SQLコードとして以下を記述します。決済登録を実行する最低限の処理です。


サーバー側の条件ボタン押下時としてCONFIRMを設定します。


ページを初期化するプロセスを作成します。

識別名前Clear Session Stateタイプセッション・ステートのクリア設定タイプとしてClear all Items on the Current Pageを選択します。

サーバー側の条件ボタン押下時としてCLEARを設定します。


ブランチを作成しプロセスの後に実行するように配置します。

識別名前Open Drawer動作タイプとしてページまたはURL(リダイレクト)を選択します。

サーバー側の条件ボタン押下時としてCONFIRMを設定します。


ターゲットは、タイプこのアプリケーションのページページです。アイテムの設定として、ページ・アイテムP2_ORDER_ID&P1_ORDER_ID.、P2_ACCESS_IDに&P1_ACCESS_ID.の値が渡るようにします。


以上で、ボタンをCONFIRMをクリックすると決済登録が実行され、その決済IDと取引IDを(ページ・アイテムP2_ORDER_IDとP2_ACCESS_IDへの)引数としてドロワーが開くようになります。

ページ・デザイナでページPayを開きます。

ページ・プロパティJavaScriptファイルURLとして、fincodeが提供しているJavaScriptライブラリを指定します。

https://js.test.fincode.jp/v1/fincode.js

ファンクションおよびグローバル変数の宣言に以下を記述します。

カード情報の入力フォームを生成しています。


クレジットカード情報を入力するフォームを生成するリージョンを作成します。

Content Bodyの直下にタイプ静的コンテンツのリージョンを作成します。

識別タイトルfincode-form、余計な装飾を省くため外観テンプレートとしてBlank with Attributes (No Grid)を選択します。詳細静的IDとしてfincode-formを設定します。このリージョンは実施的に以下のDIV要素を生成します。

<div id="fincode-form">....</div>

fincodeのチュートリアルではidがfincode-formの要素はFORMです。Oracle APEXが生成したページにFORM要素がすでに含まれているためか、<form id="fincode-form">では動作しません。そのため、代わりにDIV要素を作成しています。


リージョンfincode-formの子リージョンを作成します。

識別タイトルfincodeタイプ静的コンテンツです。レイアウト親リージョンとしてfincode-formを指定します。このリージョンも余計な装飾を省くため、外観テンプレートとしてBlank with Attributes (No Grid)を選びます。詳細静的IDとしてfincodeを設定します。


決済を実行するボタンSUBMITを作成します。

ラベル支払いレイアウトリージョンとしてfincode-form外観ホットオンにし、テンプレート・オプションWidthStretchを選択します。動作アクションとして動的アクションで定義を選択します。


決済ID取引IDを保持するページ・アイテムP2_ORDER_IDP2_ACCESS_IDを作成します。

双方ともタイプ非表示レイアウトリージョンfincode-formセッション・ステートストレージリクエストごと(メモリーのみ)とします。


ボタンSUBMITに動的アクションを作成します。

識別名前onClick SUBMITとします。タイミングイベントはボタンのデフォルトであるクリックです。


TRUEアクションとしてJavaScriptコードの実行を選択し、設定コードに以下を記述します。

カード決済が成功するとドロワーを閉じます。


以上でfincodeの決済サービスの実装は完了です。アプリケーションを実行すると、この記事の先頭のGIF動画のように動作します。

Oracle APEXのアプリケーション作成の参考になれば幸いです。