業務:決済カード登録の受付
「クレジットカード決済」を推進したい…。サービス利用実績にあわせて自動的に「カード課金」できれば、非常にスムーズな決済が可能となる。もし「明細発行」も電子化できれば、売上回収コストは大幅に低減できるだろう。
電気会社・ガス会社・ケータイ会社のように「カード課金できる体制」を整えたい。
課題:カード情報の漏洩リスク
しかし、セキュリティ要件が厳しくなった今日、「クレジットカード番号を保有すること」は大きなリスクらしい。ウチは、電力会社でもなければ、Google Facebook といった大会社でもない。つまり「PCI DSS」が言っているような要件は維持できそうにない。カード会社(アクワイアラー)も言っているが「持たないこと(非保持)が大切」なのだろう。
よし、、、日本政府が「2018年3月までに非保持化を目指す」と言う書類にあるように、PAN PIN CVC といったカード情報等は「決済代行業者」に預けようと思う・・・。(どうやって??)
- PAN:Primary Account Number (カード番号)
- PIN:Personal Identification Number (暗証番号)
- CVC: Card Verification Code/Value (3桁数字。正確にはCVC2。CIDとも)
※参考:EU の法改正(決済サービス指令 2015年)、日本の法改正(改正割賦販売法 2016年)
[クレジットカード情報の受付プロセス]
解決:ブラウザ上でのトークン化
ワークフローの先頭に「Form開始イベント」を置けば、公開Webフォームへのエントリがあれば、自動的にワークフローが開始されるようになります。この例では、お客様の「サービス申込の入力」が完了されれば、社内の「申込受付フロー」が自動的に開始される仕組みとなっています。特筆すべきは「クレジットカード番号等」が、ワークフローシステムに届けられることはないという点です。
具体的には、お客様の「カード情報等」はお客様のブラウザと Stripe.com との JavaScript 通信 (CORS通信)によってトークン化され、ワークフローシステムにはそのトークン情報だけが送信される仕組みとなっています。(受付処理にかかわる社員はクレジットカード情報を目にすることはありません)
※ 課金業務については次回記事にて紹介する予定です。
考察:JavaScript の実装難易度
【お客様のブラウザ】から【加盟店サーバ】を通過させず、直接【決済代行業者】(PSP)にカード情報を送信する仕組みは「非保持の実現」に非常に有効です。この例では「カード情報等」は Stripe.com 社に預けられ、ワークフローにはその保管IDとしてのトークンが流れることになります。いわゆる「クロスドメインアクセス」が必要になりますが、Stripe.com では2012年からCORS(2013年1月W3C勧告候補・2014年1月W3C勧告)がサポートされています。
※ なお、Stripe.com では『Checkout』(embedded payment form)と『Elements』(pre-built UI components)と呼ばれる2つのトークン化機構がありますが、ここでは「Form開始イベント」のカスタマイズを行うために、より自由度の高い『Elements』が利用されています。
一方で、クラウド型ワークフロー「Questetra BPM Suite」では HTML/JavaScript によって[処理フォーム画面](フォーム開始画面を含む)をデコレーションすることが可能です。(M213)
しかしながら、(少なくともv11.4現在においては)、それらのコードはHTML文書の <body> 内に挿入される形となります。すなわち、外部 .js ファイルに定義される関数を使用したい場合は「動的読み込み」のプログラミングが必要となります。たとえば jQuery を利用する場合であれば、getScript() の第2引数にコールバック関数を設定すると言った手法で「js ファイルのロード完了」を担保します。
▼[ガイドパネル]の設定サンプル(HTML/JavaScript)
<script type='text/javascript'> jQuery.getScript("https://js.stripe.com/v3/", function(){ var stripe = Stripe('pk_test_6pRNASCoBOKtIshFeQd4XMUh'); // Create a Stripe client var elements = stripe.elements(); // Create an instance of Elements var card = elements.create('card', { hidePostalCode: true, style: { base: { iconColor: '#666EE8', color: '#31325F', lineHeight: '30px', fontWeight: 300, fontFamily: '"Helvetica Neue", Helvetica, sans-serif', fontSize: '14px', '::placeholder': { color: '#CFD7E0', } }, invalid: { color: '#fa755a', iconColor: '#fa755a' } } }); card.mount('#card-element'); //// Handle real-time validation errors from the card Element card.addEventListener('change', function(event) { var displayError = document.getElementById('carderror'); if (event.error) { displayError.textContent = event.error.message; } else { displayError.textContent = ''; } }); //////// Tokenize with Button Click var tokenizeButton = document.getElementById('stripeTokenization'); tokenizeButton.addEventListener('click', function(event) { var extraDetails = { name: jQuery('input[name=cardholder-name]').val(), }; stripe.createToken(card, extraDetails).then(function(result) { if (result.error) { // Inform the user if there was an error var errorElement = document.getElementById('carderror'); errorElement.textContent = result.error.message; } else { jQuery("input[name='data\\[6\\].input']").val( result.token.id ); jQuery("input[name='data\\[7\\].input']").val( result.token.card.last4 ); var successElement = document.getElementById('cardsuccess'); successElement.textContent = "Your Stripe token for use of Questetra is generated! : " + result.token.id; } }); }); }); // endof "jQuery.getScript( , function(){" jQuery('input[name="data\\[6\\].input"]').attr( "readonly", true ); jQuery('input[name="data\\[7\\].input"]').attr( "readonly", true ); jQuery('input[name="data\\[6\\].input"]').css( "background-color", "#f2f2f2" ); jQuery('input[name="data\\[7\\].input"]').css( "background-color", "#f2f2f2" ); </script> <div class="stripegroup"> <label class="stripebox"> <span>Cardholder</span> <input name="cardholder-name" class="field" placeholder="Jane Doe" /> </label> <label class="stripebox"> <span>CardNum</span> <div id="card-element" class="field"></div> </label> <div class="outcome"> <div id="carderror" role="alert"></div> </div> <button type="button" id="stripeTokenization">Tokenization</button> <div id="stripenote"> * Tokenized by Stripe.com, your credit card details will Not be submitted to Questetra.</div> <div class="outcome"> <div id="cardsuccess"></div> </div> </div>
<フォーム開始画面>
<データ項目一覧画面>
[雛形ダウンロード (無料)]
- 業務テンプレート:クレジットカード情報の受付プロセス
- 第542話:PayPal Invoice 連携で、ラクラク請求業務(3) (2017-07-03)
- 第529話:PayPal業務のサブルーチン化 (2017-04-03)
- 第528話:自動工程で PayPal ステータスの自動確認 (2017-03-27)
- M213 入力画面: 処理フォーム画面をデコレーションする(HTML/JavaScript) (使い方)
- M220 自動開始: 公開フォーム画面に入力があった時に自動的に開始されるように設定する (使い方)
- M415 自動工程: 業務プロセス定義で利用可能な自動工程を追加する (使い方)
- オンライン決済 Stripe を試してみた (Blog)
- Stripe Customer ID 生成 (Addon解説)
[英文記事 (English Entry) ]
0 件のコメント :
コメントを投稿