Stripe: 顧客, 生成 (Stripe: Customer, Create)
決済プラットフォームStripe上に “顧客オブジェクト” を追加します。オブジェクトの登録により、継続的なカード課金が可能となります。契約の成立を示すトークンIDとメールアドレス等の顧客情報が必要です。なお、トークン化の仕組み(顧客ブラウザとStripe間で直接通信)を別途実装しておく必要があります。
Configs
- U: HTTP認証設定を選択してください *
- B: Token をセットしてください *#{EL}
- C1: 顧客メールをセットしてください *#{EL}
- C2: 顧客説明をセットしてください (会員番号・法人名など) *#{EL}
- C3: 連絡先名をセットしてください (担当者名・商号など)#{EL}
- D1: Stripe顧客IDが格納される文字列型データを選択してください (更新) *
- D2: カードBrandが格納される文字列型データを選択してください (更新)
- D3: カード末尾4桁が格納される文字列型データを選択してください (更新)
- D4: カード有効期限が格納される文字列型or年月型データを選択してください (更新)
Script (click to open)
// GraalJS Script (engine type: 2)
//////// START "main()" /////////////////////////////////////////////////////////////////
main();
function main(){
//// == Config Retrieving / 工程コンフィグの参照 ==
const strAuthzSetting = configs.get ( "AuthzConfU" ); /// REQUIRED
engine.log( " AutomatedTask Config: Authz Setting: " + strAuthzSetting );
const strTokenId = configs.get( "strSetConfB" ); // required
const strCustomerEmail = configs.get( "strSetConfC1" ); // required
const strCustomerDescr = configs.get( "strSetConfC2" ); // required
const strCustomerName = configs.get( "strSetConfC3" ); // not
const pocketCustomerId = configs.getObject( "SelectConfD1" ); // required
const pocketCardBrand = configs.getObject( "SelectConfD2" ); // not
const pocketCardLast4 = configs.getObject( "SelectConfD3" ); // not
const pocketCardExp = configs.getObject( "SelectConfD4" ); // not *STRING/YMDATE
if( strTokenId === "" ){
throw new Error( "\n AutomatedTask ConfigError:" +
" Config {Token ID B} is empty \n" );
}
if( strCustomerEmail === "" ){
throw new Error( "\n AutomatedTask ConfigError:" +
" Config {CustomerEmail C1} is empty \n" );
}
if( strCustomerDescr === "" ){
throw new Error( "\n AutomatedTask ConfigError:" +
" Config {CustomerDescription C2} is empty \n" );
}
//// == Data Retrieving / ワークフローデータの参照 ==
// (nothing, except Expression Language config)
//// == Calculating / 演算 ==
/// POST /v1/customers
// https://stripe.com/docs/api/customers/create
// https://stripe.com/docs/api/authentication
// If you need to authenticate via bearer auth (e.g., for a cross-origin request),
// use -H "Authorization: Bearer sk_xxx" instead of -u sk_test_xxx.
// preparing for API Request
let apiUri = "https://api.stripe.com/v1/customers";
let apiRequest = httpClient.begin(); // HttpRequestWrapper
apiRequest = apiRequest.authSetting( strAuthzSetting ); // with "Authorization: Bearer XX"
// https://questetra.zendesk.com/hc/ja/articles/360024574471-R2300#HttpRequestWrapper
apiRequest = apiRequest.formParam( "source", strTokenId );
apiRequest = apiRequest.formParam( "email", strCustomerEmail );
apiRequest = apiRequest.formParam( "description", strCustomerDescr );
apiRequest = apiRequest.formParam( "name", strCustomerName );
// throwing Request to the API (POST, GET, PUT, etc)
engine.log( " AutomatedTask Trying: POST " + apiUri );
const response = apiRequest.post( apiUri );
const responseCode = response.getStatusCode() + "";
engine.log( " AutomatedTask ApiResponse: Status " + responseCode );
if( responseCode !== "200"){
throw new Error( "\n AutomatedTask UnexpectedResponseError: " +
responseCode + "\n" + response.getResponseAsString() + "\n" );
} // C.F. https://stripe.com/docs/api/errors
// parsing Response Json
const responseStr = response.getResponseAsString() + "";
//engine.log( " DEBUG for api upgrade: \n" + responseStr );
const responseObj = JSON.parse( responseStr );
engine.log( " AutomatedTask ApiResponse:" +
" New CustomerObject ID: " + responseObj.id );
engine.log( " AutomatedTask ApiResponse:" +
" Card Brand: " + responseObj.sources.data[0].brand );
//// == Data Updating / ワークフローデータへの代入 ==
engine.setData( pocketCustomerId, responseObj.id );
if( pocketCardBrand !== null ){ // STRING
engine.setData( pocketCardBrand, responseObj.sources.data[0].brand );
}
if( pocketCardLast4 !== null ){ // STRING
engine.setData( pocketCardLast4, responseObj.sources.data[0].last4 );
}
if( pocketCardExp !== null ){ // STRING or YMDATE
if( pocketCardExp.matchDataType( "STRING" ) ){
engine.setData( pocketCardExp,
("0" + responseObj.sources.data[0].exp_month).slice(-2) + "/" +
responseObj.sources.data[0].exp_year );
}else{
engine.setData( pocketCardExp,
java.sql.Date.valueOf(
responseObj.sources.data[0].exp_year + "-" +
("0" + responseObj.sources.data[0].exp_month).slice(-2) + "-01"
)
);
}
}
} //////// END "main()" /////////////////////////////////////////////////////////////////
/*
Notes:
- Create a "Customer object" on Stripe using Token.
- An environment for recurring charges will be built on Stripe.
- Eg. place it after the "Payment card registration" step in the order handling workflow.
- A Tokenization mechanism (card registration form) is required.
- Refer to the sample below for how to implement the card registration form (tokenization).
- "Elements" (custom payment forms)
- https://stripe.com/docs/stripe-js
- https://support.questetra.com/tips/form-decoration-examples/#tokenize
- "Checkout" (forms hosted on Stripe)
- https://stripe.com/docs/payments/checkout
- Use the customer object ID (CustomerID) for flat-rate billing and usage billing.
- Can be obtained in this creation process. Example "cus_XXXXXYYYYYZZZZ"
Notes(ja):
- Token を利用して Stripe 上に "顧客オブジェクト" を生成します。
- Stripe上に「継続的な課金を実現するための環境」が構築されます。
- たとえば、受注対応ワークフローにおける「決済カードの登録」の工程の直後に配置します。
- Token 化の仕組み(カード登録フォーム)が別途必要です。
- カード登録フォーム(トークン化)の実装方法は以下のサンプルを参照してください。
- "Elements" (custom payment forms)
- https://stripe.com/docs/stripe-js
- https://support.questetra.com/ja/tips/form-decoration-examples/#tokenize
- "Checkout" (forms hosted on Stripe)
- https://stripe.com/docs/payments/checkout
- 定額課金や利用量課金の際には、顧客オブジェクトのID(CustomerID)を使用します。
- 生成工程で取得可能です。 例 "cus_XXXXXYYYYYZZZZ"
APPENDIX
- PCI DSS Compliance (SAQ A) is to ensure that payment card data never touches any server.
- https://stripe.com/docs/security/guide
- This automated step allows you to build a system that does not retain sensitive info with no-code.
- Set Stripe SecretKey in "HTTP Authentication" > "Token Fixed Value"
- "sk_live_XXXXXyyyyyZZZZZxxxxxYYYY" (32 letters)
- For the contents of the error code (ResponseCode other than 200)
- https://stripe.com/docs/api/errors
- When migrating from the old version (2020-06-03), add a new one instead of updating.
- The method of setting SecretKey has changed. (To be hidden)
- https://support.questetra.com/addons/stripe-customer-object-create/
- Add a new Addon to the workflow app (Maage Add-on > Definition of Service task > Add)
- Added "Token Fixed Value" at "HTTP Authz Settings"
- In the modeler, place the new version of the add-on and remove the old version of the add-on.
- Release workflow app.
APPENDIX-ja
- PCI DSS 「カード情報の非保持」(SAQ A)には、カード情報はいかなるサーバも経由してはいけません。
- https://stripe.com/docs/security/guide
- この自動工程を活用すれば、センシティブ情報を保持しない仕組み(完全委託)をノーコード開発できます。
- Stripe SecretKey は "HTTP認証設定" > "トークン直接指定" にてセットしてください
- "sk_live_XXXXXyyyyyZZZZZxxxxxYYYY" (32文字)
- エラーコード(200以外のResponseCode)の内容については以下を参照してください。
- https://stripe.com/docs/api/errors
- 旧版(2020-06-03)から移行する場合、更新ではなく、新規に追加してください。
- SecretKey の設定方法が変更されています。(隠蔽化)
- https://support.questetra.com/ja/addons/stripe-customer-object-create/
- ワークフローアプリに、新しいAddonを追加 (アドオンの管理 > サービスタスク定義ファイル > 追加)
- "HTTP認証設定" から "トークン直接指定" を追加
- モデラで、新版のアドオンを配置し、旧版のアドオンを削除
- ワークフローアプリをバージョンアップ(リリース)
*/

Download
2021-06-07 (C) Questetra, Inc. (MIT License)
https://support.questetra.com/ja/addons/stripe-customer-create-2021/
Addonファイルのインポートは Professional でのみご利用いただけます
Notes
- Token を利用して Stripe 上に “顧客オブジェクト” を生成します。
- Stripe上に「継続的な課金を実現するための環境」が構築されます。
- たとえば、受注対応ワークフローにおける「決済カードの登録」の工程の直後に配置します。
- Token 化の仕組み(カード登録フォーム)が別途必要です。
- カード登録フォーム(トークン化)の実装方法は以下のサンプルを参照してください。
- “Elements” (custom payment forms)
- “Checkout” (forms hosted on Stripe)
- 定額課金や利用量課金の際には、顧客オブジェクトのID(CustomerID)を使用します。
- 生成工程で取得可能です。 例 “cus_XXXXXYYYYYZZZZ”
Capture
Appendix
- PCI DSS 「カード情報の非保持」(SAQ A)には、カード情報はいかなるサーバも経由してはいけません。
- Stripe SecretKey は “HTTP認証設定” > “トークン直接指定” にてセットしてください
- “sk_live_XXXXXyyyyyZZZZZxxxxxYYYY” (32文字)
- エラーコード(200以外のResponseCode)の内容については以下を参照してください。
- 旧版(2020-06-03)から移行する場合、更新ではなく、新規に追加してください。
Glossary
※stripe.com は、日本語のマニュアルも充実している。しかし、多くの『訳語』に違和感を感じる。もし、あなたが違和感を感じたのなら、以下の「対訳」(訳語案)も参考にして欲しい。
- Payment = 支払い
- 対訳:顧客支払
- 解説:”顧客” による代金支払いのこと。事業者(Stripeアカウント)の視点から言えば「受取」となる。「決済」と訳して欲しいケースも多い。なお、「支払」「受取」「決済」の関係は、「輸出」「輸入」「貿易」の関係に近い。対象物が同じでも、視点によって認識が変わる。ちなみに、”Payment Platform” は「決済プラットフォーム」と訳されることが多い。しかし規約では「支払サービス」と表現されている。
- Payouts
- 対訳:銀行口座への出金、払い出し
- 解説:事業者(Stripeユーザ)の銀行口座へのお金の流れ(出金)のこと。Stripe からの払い出し。Payout(出金)が発生すると Balance(Stripe残高)が減る。なお、Payment(顧客支払)が発生しても、一定の期間は Payout(出金)できない。
- Tokens
- 対訳:預り票、預り札、預りトークン
- 解説:Stripe社はカード番号等の機微情報を保管する。Stripeユーザはその預り票(預りトークン)を受け取る(”非保持” のため)。なお、Token は複数回使用できない。顧客オブジェクトに紐づけることで、任意の課金が可能となる。
- Sources = 支払元
- 対訳:支払方法、支払カード、支払口座、引落口座、資金元、資金ソース
- 解説:金融口座の総称。Creditカードなど、Stripe社が自動引き落とし可能な口座。国によっては銀行口座やスマホ決済会社なども含まれる。「支払元」と言う表記があるが “人間” を指すわけではない。Stripe 上の “顧客オブジェクト” には通常、メールアドレスや法人名などの基本的な情報だけでなく Source(支払方法)情報が保存される。
- Customers = 顧客
- 対訳:顧客、お客様
- 解説:代金の支払いを行う人。買い手。Customer object を API 経由で生成する場合、source として token を指定すれば足りる。なお、当該顧客の基本情報や支払履歴は、ダッシュボードの顧客一覧から顧客を指定することで参照できる。また、一人の顧客に複数の支払方法を紐づけることも可能。
- Charges = 請求、支払い
- 対訳:課金
- 解説:事業者の視点で言えば、ステータスが成功の場合、将来の現金回収が確定する。つまり、「支払いを求めます」というニュアンスの「請求」より、「カード会社に債権譲渡しました」というニュアンスの「課金」の方が理解されやすいケースが多い。Customer object を登録すれば、いつでも Charge できるようになる。
- Balance = 残高
- 対訳:Stripe 残高
- 解説:いまだ出金(Payout)されていない口座残高。課金(Charge)が成功すれば、増える。
- Connected Accounts = 連結されたアカウント
- 対訳:子アカウント、ビジネスパートナーアカウント、協力会社アカウント、マーケットプレイス出店者
- 解説:自身のビジネス上の協力者アカウント。事業者(Stripeユーザ)のアカウントに紐づけられた特殊なアカウント。”子アカウント” は、売上の一部を受け取ることができる。なお、Connect の仕組みには、3つのタイプ(Standard / Express / Custom)があり、事業者は1つを選択する。Express は2019年に米国以外の国でも利用できるようになった。
- Transfers
- 対訳:子アカウントへの送金、協力金振込、売上分配金
- 解説:顧客から受け取った代金の一部を、子アカウントに送金すること。送金額の指定方法にはいくつかのパターンがある。なお、Standard タイプの手数料が無料となっているが、Express タイプと Custom タイプの場合は Payout のたびに「0.25%+250円」(0.25%+25セント in USA)稼働月ごとに「200円」(2ドル in USA)の手数料がかかる。ちなみに、Transfer という表現は、2017年までは事業者が “自身の銀行口座に出金する” (現在の “Payout” )のケースにも混用されていた。現在 transfer と payout は明確に使い分けられている。
- Onboarding
- 対訳:子アカウント登録
- 解説:ビジネスパートナーが、子アカウントになること。登録フォームは Stripe Connect によって用意されているため、事業者はダッシュボードからパートナーのメールアドレスを登録するだけで良い。なお、Custom タイプの場合、登録フォームを自作することも可能。
See also
https://support.questetra.com/ja/addons/stripe-customer-charge-2021/
https://support.questetra.com/ja/addons/stripe-customer-destination-charge-2021/