ラベル Integration の投稿を表示しています。 すべての投稿を表示
ラベル Integration の投稿を表示しています。 すべての投稿を表示

2022年8月23日火曜日

Stripeを使ってみる

 以前から気になっていたStripeをAPEXアプリケーションから呼び出して支払いを行ってみました。参考にした手順はOracle ACEであるLino SchildeさんのOracle APEX and Stripe v3 integration - part 1です。この記事にはpart2part3と後続の記事もあるのですが、今の所、それらは難しくて手に負えません。

Oracle CloudのAlways FreeのAutonomous Transaction Processingに、APEXアプリケーションを作成しています。

作業を実施しているのは2022年8月23日です。APEXのバージョンは22.1、その他のスクリーンショットなどは、この時点での情報になります。

以下より実施した手順を記述します。


Stripeのテスト環境を構成する


最初にStripeのダッシュボードにアクセスし、ユーザ登録を行います。

https://dashboard.stripe.com/login


Stripeアカウントの作成画面に移ります。メール氏名パスワードを入力し、アカウントを作成をクリックします。国について、ヘルプには「ビジネスが設立された国または地域を選択してください。個人の場合は、ビジネスを行っている国を選択してください。」と説明されています。この記事を読んでいる方であれば、日本を選択すると思います。


メールに指定したアドレスに、確認のためのメールが届きます。メールアドレスを確認をクリックします。


メールアドレスの確認が完了すると、Stripeのテスト環境にアクセスできるようになります。

本当に支払いを受け付ける場合は受け取り設定を行う必要があるようですが、今回はStripeとの連携テストを行うだけなので、テスト環境で作業を進めます。

Stripeのダッシュボードのホームを開き、開発者向け公開可能キーの位置を確認します。後でAPEXアプリケーションに記述するJavaScriptのコードに埋め込みます。


購入のテストに使用する商品を登録します。

商品タブを開き、商品を追加をクリックします。


商品が登録できていればよいので、商品情報の設定は自由です。今回の例では、商品詳細名前として入浴料説明北海道の温泉としています。画像も適当に貼り付けています。

料金情報料金体系モデルとして標準の料金体系価格500円にしました。支払い一括です。

以上の設定を行い、商品の保存をクリックします。


テスト環境ですが、商品の購入が可能になります。APEX側から支払いリクエストを発行する際に、料金API IDが引数になります。APEXアプリケーションで使用するので、この値を覚えておきます。


 今回はStripeのCheckoutクライアント側のみの組み込みを行います。そのため、設定CheckoutとPayment Linksを開き、クライアント側のみの組み込みを有効にするをクリックします。商品IDが公開されます、と確認を求められるので、許可をクリックします。

https://dashboard.stripe.com/settings/checkout


Stripe側の準備は以上で完了です。

公開可能キーと商品のAPI IDを使って、この商品を購入するAPEXアプリケーションを作成します。


APEXアプリケーションを作成する



アプリケーション作成ウィザードを起動します。

ホーム・ページはそのままにし、空白のページ2つ追加します。ページ名としてsuccess、もう一つはerrorとします。

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


アプリケーションが作成されます。

アプリケーションはすべてホーム・ページに実装します。success、errorのページはStripeでの支払いが成功または失敗したときに呼び出されるページで、今回は何も実装しません。


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

デフォルトで作成されているページ・ナビゲーション削除します。


 ページ・アイテムP1_PRODUCTを作成します。商品API IDを指定します。

識別名前P1_PRODUCTタイプテキスト・フィールドとします。ラベルProductとします。


ページ・アイテムP1_QUANTITYを作成します。商品個数を指定します。

識別名前P1_QUANTITYタイプ数値フィールドとします。ラベルQuantityレイアウト新規行の開始OFFにし、Productの右にページ・アイテムを配置します。


Stripeに支払いを要求するボタンB_STRIPE_PAYを作成します。

識別ボタン名B_STRIPE_PAYラベルStripe Payとします。レイアウト新規行の開始OFFとし、Quantityの右にボタンを配置します。詳細カスタム属性として、以下を記述します。

data-action="#action$stripe-payment"

Stripeを呼び出す処理は、APEXアクションのstripe-paymentとして実装します。


Stripeの呼び出しを実装します。

ページ・プロパティJavaScriptファイルURLとして、以下を記述します。

https://js.stripe.com/v3/

StripeのJavaScriptライブラリv3を読み込んでいます。


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

Stripeオブジェクトを作成するにあたって、pk_で始まる公開可能キーをコンストラクタに与えます。

apex_pathはAPEXを実行している環境に依存して形式は変わります。アプリケーションに作成しているsuccessページやerrorページを開き、URLを確認した上でapex_pathを設定します。customerEmailには、商品を購入する人のメール・アドレスを設定します。
var stripe = Stripe('pk_公開可能キーの貼り付け');
var apex_path = 'https://ホスト名/ords/r/ワークスペース名/';
var successUrl = apex_path + '/stripe-payment/success?session=' + apex.env.APP_SESSION;
var cancelUrl =  apex_path + '/stripe-payment/error?session=' + apex.env.APP_SESSION;
var customerEmail = '電子メール・アドレス';

ページ・ロードに時に実行に、以下を記述します。APEXアクションで実装していると、カード・リージョンやレポートからの呼び出しの対応が容易です。



Stripeの画面に遷移する際、APEXで保存されていない変更について警告のポップアップが表示されます。それを抑止するためにページ・プロパティのナビゲーション保存されていない変更の警告OFFにします。


以上でアプリケーションは完成です。

アプリケーションを実行して、動作を確認します。

Productに商品のAPI IDを入力し、Quantityに1以上の数値を入力します。その後、ボタンStripe Payをクリックします。


Stripeの支払い画面が開きます。テストカードの情報は、Stripe Docのテストに一覧されています。

https://stripe.com/docs/testing

カード情報を入力し、支払うをクリックします。


支払いに成功すると、Successページが表示されます。


Stripeのダッシュボード支払いを開くと、支払い履歴を確認することができます。

以上で、APEXアプリケーションからStripeによる支払いができることを確認しました。

基本的な実装ですが、Stripeのダッシュボードのホームに書かれているように「何から始めればよいのかわからない場合」というのは多いように思います。


クライアント側のみの組み込みであれば、クレジット・カード情報といったセンシティブなデータをAPEX側で保持しないので、比較的導入しやすいように思います。

今回の記事は以上になります。

今回作成したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/basic-stripe-integration.zip

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

追記

その他のPayment Gatewayとの連携としては、以下の紹介記事があります。

PayPal(USA)は、Jon Dixsonさんによる記事
Receiving Payments from Oracle APEX with PayPal.
https://blog.cloudnueva.com/apex-paypal
Razorpay(主にIndia)は、Karkuvelraja Thangamariappanさんによる記事
Mollie(主にEU)は、Alan Arentsenによるセミナー資料と動画
Where it all comes together, doing secure payments with APEX.

2022年7月15日金曜日

ADBに1000列x100行のファイルをアップロードする

 表題の相談があったので、確認のために実施した作業を紹介します。

まずはテストに使用するデータを準備しました。以下のスクリプトを実行しています。

sh csv1000.sh > col1000.csv

macOSで実行したのですが、echoコマンドの動作はシェル組み込みや外部コマンドで異なるようで、OSが違うと期待通りの動作をしないかもしれません。テストに使用するCSVファイルやXLSXファイルは何でも構いません。

上記のシェル・スクリプトを実行して作成したCSVファイルを、新規に作成したExcelファイルにインポートしてcol1000.xlsxファイルを作成しました。このファイルを使って作業を進めます。


APEXのデータ・ワークショップを使う


SQLワークショップデータ・ワークショップを使って、col1000.xlsxをロードしてみます。あらかじめ説明すると、データ・ワークショップで取り込める列数の上限は300です。そのため、col1000.xlsxはロードできません

SQLワークショップユーティリティデータ・ワークショップを開きます。

データのロードを選択します。


ファイルの選択をクリックして、col1000.xlsxを選択します。


データのロードが開きます。ロードされる列を確認するため、構成をクリックします。


ロードする列の表示の一番下を確認します。300列までしか認識されていないことが分かります。

ダイアログを閉じるをクリックします。


300列だけ読み込まれても仕方がないので、取消をクリックします。


別の方法を試します。


APEX_DATA_PARSER.PARSEを呼び出す



先ほどアップロードされたcol1000.xlsxは、APEXの静的ワークスペース・ファイルとして保存されています。そのデータを使って、直接APEX_DATA_PARSER.PARSEを呼び出してみます。

実行するSQLは以下になります。もっとも最近にアップロードされたファイルcol1000.xlsxをロードする対象としています。
create table test_col1000 
as
select * from apex_data_parser.parse(
    p_content => (select document from apex_workspace_files where file_name = 'col1000.xlsx' order by created_on desc fetch first 1 rows only),
    p_skip_rows => 1,
    p_file_name => 'col1000.xlsx'
);
SQLワークショップSQLコマンドより実行します。

データがロードされる表はTEST_COL1000です。


ロードされた列を確認します。

select column_name from user_tab_cols where table_name = 'TEST_COL1000' order by column_name desc;


ロードされている最後の列がCOL300なので、300列までしかロードされていません。

Oracle APEXでは、パッケージAPEX_DATA_PARSERに含まれるプロシージャPARSEが、データ・ロードの基礎です。この上限が300列なので、他のすべての機能も上限は300列になります。

別の方法を試します。


データベース・アクションのデータ・ロードを使用する


APEXのワークスペース・ユーザーにてデータベース・アクションに接続できるよう、準備を行います。

管理者ユーザーADMINにてデータベース・アクションに接続し、管理データベース・ユーザーを開きます。


データベース・ユーザーをAPEXのワークスペース名で検索します。

データベース・ユーザーがひとつ(正確にはWKSP_で始まるユーザーが見つからない)である場合は、ワークスペース・スキーマと管理者ユーザーがひとつのデータベース・ユーザーにて賄われています。


データベース・アクションから接続できるようにするために、操作メニューからRESTの有効化を実行します。


ダイアログが開きます。スキーマ別名のデフォルトはワークスペース名になります。そのまま変更せず、REST対応ユーザーをクリックします。

ここで指定されているスキーマ別名が、データベース・アクションに接続する際に最初に入力するユーザー名になります。


操作メニューから編集を開きます。

データ・ロードを使用するために必要なロールDWROLEを、データベース・ユーザーに割り当てます。

付与されたロールのタブを開き、ロールDWROLE付与済デフォルトチェックを入れます。

以上で、変更の適用をクリックします。


データベース・ユーザーをワークスペース名で検索したときに、WKSP_で始まるユーザーが見つかった場合は、RESTの有効化とロールDWROLEの割り当てWKSP_で始まるデータベース・ユーザーに対して実施します


Autonomous DatabaseのAPEX 22.1からは、ワークスペースの管理者ユーザーの名前は自由に設定できるようになっています。そのため、管理者ユーザーの名前はワークスペース名と一致していないこともあります。

データベース・アクションへサインインする際には、APEXのワークスペースを作成する際に作成した管理者ユーザーのユーザー名とパスワードを使ってサインインします。

管理者ユーザーADMINからサインアウトします。


データベース・アクションサインインします。


ユーザー名
として、ワークスペース・スキーマのORDS別名を入力します。これは通常、ワークスペース名と同じです。

へ進みます。


APEXのワークスペースの管理者ユーザーのユーザー名とパスワードを入力して、サインインします。


データベース・アクションにサインインすると、画面右上に作業を行なうスキーマの名前が表示されます。このスキーマが作業を行なうスキーマになります。これはAPEXのワークスペースにサインインしたときと同じスキーマになります。


ちなみに、APEXでのサインインとは、以下のように対応しています。


サインイン後にSQLワークショップオブジェクト・ブラウザまたはSQLコマンドなどを開くと、デフォルトの作業スキーマを確認できます。

このスキーマは、データベース・アクションにサインインしたときのデフォルトのスキーマと一致します。


データベース・アクションに戻って、データ・ロードを実行します。

データの処理を選択してください。にはデータのロードを選択します。データの場所を選択してください。ではローカル・ファイルを選択します。

へ進みます。


ファイルを選択をクリックし、col1000.xlsxを選択します。


ファイルのアップロードが完了します。鉛筆アイコンクリックします。


マッピングの最後を確認します。1000列すべて認識されています(1000列が上限です)。

表の名前を設定します。この例ではTEST1000としています。

プロパティについては、ロードするファイルの内容に従って、エンコーディングソース列名スキップする行などの調整が必要な場合もあるでしょう。

閉じるをクリックします。


開始アイコンをクリックします。


確認画面がポップアップします。実行をクリックします。


ステータス完了になると、データのロードは完了です。

完了をクリックして、作業を終了します。


作成された表TEST1000は、データベース・アクションSQLナビゲータから確認することもできますし、


APEXのSQLワークショップオブジェクト・ブラウザより確認することもできます。


これでもうまくいかない場合は、DBMS_CLOUD.COPY_DATAを直接呼び出したり、外部表を使うことになるかと思います。それらを使用する方法については、こちらの記事で触れています。

ADBに1000列x100行のファイルをアップロードするために実施した作業の紹介は以上になります。