Stripe: 顧客オブジェクト, 生成

Stripe: 顧客オブジェクト, 生成
Stripe: 顧客オブジェクト, 生成 (Stripe: Customer Object, Create)

決済プラットフォームStripe上に “顧客オブジェクト” を生成します。オブジェクトの登録により、その後の継続的なカード課金が可能となります。契約の成立を示すトークンID(tok_123456789012345678901234)とメールアドレス等の顧客情報が必要です。通常トークンIDはブラウザ側で生成されるため、センシティブ情報の非保持非通過を実現できます。

2020-06-02 (C) Questetra, Inc. (MIT License)
https://support.questetra.com/ja/addons/stripe-customer-object-create/

Configs
  • A: Stripe SecretKey をセットしてください (sk_xxx: 32文字) * #{EL}
  • B: Token ID をセットしてください * #{EL}
  • C1: 顧客メールをセットしてください * #{EL}
  • C2: 顧客説明をセットしてください (会員番号・法人名など) * #{EL}
  • C3: 連絡先名をセットしてください (担当者名・商号など) #{EL}
  • D1: Stripe顧客IDが格納される文字列型データを選択してください (更新) *
  • D2: カードBrandが格納される文字列型データを選択してください (更新)
  • D3: カード末尾4桁が格納される文字列型データを選択してください (更新)
  • D4: カード有効期限が格納される文字列型or年月型データを選択してください (更新)
Script
// Nashorn Script (engine type: 1)
// 
// Notes:
// Token is generated by JavaScript on the browser.
// - "Checkout" (forms hosted on Stripe) https://stripe.com/docs/payments/checkout
// - "Elements" (custom payment forms) https://stripe.com/docs/stripe-js
// - If M213-decoration "jQuery.getScript('https://js.stripe.com/v3/', function(){..."
// -- https://questetra.zendesk.com/hc/en-us/articles/360002245252-M213
// The card number etc is deposited at Stripe, and only the token flows in the workflow.
// Token is converted to Customer object and continuous billing becomes possible.
// There is no way to incorporate sensitive information into workflow data.
// - PAN: Primary Account Number
// - PIN: Personal Identification Number
// - CVC: Card Verification Code/Value (3 digit number, to be exact CVC2, CID)
// * also on the Stripe Dashboard (Non-retention of card information)
// Refer to the following for the error codes (ResponseCode other than 200).
// - https://stripe.com/docs/api/errors

// Notes(ja):
// Tokenはブラウザ上のJavaScriptによって生成されます。
// - "Checkout" (forms hosted on Stripe) https://stripe.com/docs/payments/checkout
// - "Elements" (custom payment forms) https://stripe.com/docs/stripe-js
// - M213デコの場合 "jQuery.getScript('https://js.stripe.com/v3/', function(){..."
// -- https://questetra.zendesk.com/hc/ja/articles/360002245252-M213
// カード番号等はStripe社に預けられ、フローには「預かり番号」としてのTokenを流します。
// TokenはCustomerオブジェクト(Customer ID)に変換され、継続課金が可能な状態となります。
// センシティブ情報をワークフローデータに取り込む方法はありません。(カード情報の非保持)
// - PAN:Primary Account Number (カード番号)
// - PIN:Personal Identification Number (暗証番号)
// - CVC: Card Verification Code/Value (3桁数字/正確にはCVC2/CIDとも)
// ※Stripe管理画面からも取得できません。(カード情報の非保持)
// エラーコード(200以外のResponseCode)の内容については以下を参照してください。
// - https://stripe.com/docs/api/errors

/*
 Questetra BPMS V12.0 (released 2020-05-11)
 - configs.getObject()
 - engine.findData()
 - engine.setData()
*/

//////// START "main()" /////////////////////////////////////////////////////////////////

main();
function main(){ 

//// == Config Retrieving / 工程コンフィグの参照 ==
const strSecretKey     = configs.get( "strSetConfA"  ); // required
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( strSecretKey === "" ){
  throw new Error( "\n AutomatedTask ConfigError:" +
                   " Config {SecretKey A} is empty \n" );
}
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
// curl https://api.stripe.com/v1/customers \
//   -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \
//   -d description="My First Test Customer (created for API docs)"

// preparing for API Request
let apiUri = "https://api.stripe.com/v1/customers";
let apiRequest = httpClient.begin(); // HttpRequestWrapper
    apiRequest = apiRequest.basic( strSecretKey, "" );
    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()" /////////////////////////////////////////////////////////////////

Download

Capture

決済プラットフォームStripe上に "顧客オブジェクト" を生成します。オブジェクトの登録により、その後の継続的なカード課金が可能となります。契約の成立を示すトークンID(tok_123456789012345678901234)とメールアドレス等の顧客情報が必要です。通常トークンIDはブラウザ側で生成されるため、センシティブ情報の非保持非通過を実現できます。

Notes

  1. Tokenはブラウザ上のJavaScriptによって生成されます。
    1. “Checkout” (forms hosted on Stripe) https://stripe.com/docs/payments/checkout
    2. “Elements” (custom payment forms) https://stripe.com/docs/stripe-js
    3. M213デコの場合 jQuery.getScript(“https://js.stripe.com/v3/ “, function(){…
      1. https://questetra.zendesk.com/hc/ja/articles/360002245252-M213
  2. カード番号等はStripe社に預けられ、フローには「預かり番号」としてのTokenを流します。
  3. TokenはCustomerオブジェクト(Customer ID)に変換され、継続課金が可能な状態となります。
  4. センシティブ情報をワークフローデータに取り込む方法はありません。(カード情報の非保持)
    1. PAN:Primary Account Number (カード番号)
    2. PIN:Personal Identification Number (暗証番号)
    3. CVC: Card Verification Code/Value (3桁数字/正確にはCVC2/CIDとも)
    4. ※Stripe管理画面からも取得できません。(カード情報の非保持)
  5. エラーコード(200以外のResponseCode)の内容については以下を参照してください。
    1. https://stripe.com/docs/api/errors

See also

Stripe: 課金オブジェクト, 生成

Glossary

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 タイプの場合、登録フォームを自作することも可能。

コメントを残す

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

Questetra Supportをもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む

上部へスクロール