Stripe: 顧客, 生成
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/en-us/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 化の仕組み(カード登録フォーム)が別途必要です。
  • 定額課金や利用量課金の際には、顧客オブジェクトのID(CustomerID)を使用します。
    • 生成工程で取得可能です。 例 “cus_XXXXXYYYYYZZZZ”

Capture

決済プラットフォームStripe上に "顧客オブジェクト" を追加します。オブジェクトの登録により、継続的なカード課金が可能となります。契約の成立を示すトークンIDとメールアドレス等の顧客情報が必要です。なお、トークン化の仕組み(顧客ブラウザとStripe間で直接通信)を別途実装しておく必要があります。
決済プラットフォームStripe上に "顧客オブジェクト" を追加します。オブジェクトの登録により、継続的なカード課金が可能となります。契約の成立を示すトークンIDとメールアドレス等の顧客情報が必要です。なお、トークン化の仕組み(顧客ブラウザとStripe間で直接通信)を別途実装しておく必要があります。

Appendix

  • PCI DSS 「カード情報の非保持」(SAQ A)には、カード情報はいかなるサーバも経由してはいけません。
  • Stripe SecretKey は “HTTP認証設定” > “トークン直接指定” にてセットしてください
    • “sk_live_XXXXXyyyyyZZZZZxxxxxYYYY” (32文字)
  • エラーコード(200以外のResponseCode)の内容については以下を参照してください。
  • 旧版(2020-06-03)から移行する場合、更新ではなく、新規に追加してください。
    • SecretKey の設定方法が変更されています。(隠蔽化)
    • https://support.questetra.com/ja/addons/stripe-customer-object-create/
    • ワークフローアプリに、新しいAddonを追加 (アドオンの管理 > サービスタスク定義ファイル > 追加)
    • “HTTP認証設定” から “トークン直接指定” を追加
    • モデラで、新版のアドオンを配置し、旧版のアドオンを削除
    • ワークフローアプリをバージョンアップ(リリース)

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

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

%d人のブロガーが「いいね」をつけました。