Java用Stripe APIの紹介

Stripe API for Javaの概要

1. 概要

Stripeは、enables businesses and individuals to receive payments over the internetであるクラウドベースのサービスであり、クライアント側ライブラリ(JavaScriptとネイティブモバイル)とサーバー側ライブラリ(Java、Ruby、Node.jsなど)の両方を提供します。

Stripeは、支払いの受け取りの複雑さを軽減する抽象化レイヤーを提供します。 その結果、we don’t need to deal with credit card details directly – instead, we deal with a token symbolizing an authorization to charge

このチュートリアルでは、ユーザーがクレジットカードを入力できるようにするサンプルのSpring Bootプロジェクトを作成し、後でStripe API for Javaを使用してカードに特定の金額を請求します。

2. 依存関係

プロジェクトでStripe API for Javaを利用するには、対応する依存関係をpom.xmlに追加します。


    com.stripe
    stripe-java
    4.2.0

its latest version in the Maven Central repositoryを見つけることができます。

サンプルプロジェクトでは、spring-boot-starter-parentを活用します。


    org.springframework.boot
    spring-boot-starter-parent
    1.5.2.RELEASE

また、Lombokを使用して定型コードを削減し、Thymeleafを動的Webページを配信するためのテンプレートエンジンにします。

これらのライブラリのバージョンを管理するためにspring-boot-starter-parentを使用しているため、それらのバージョンをpom.xmlに含める必要はありません。


    org.springframework.boot
    spring-boot-starter-web


    org.springframework.boot
    spring-boot-starter-thymeleaf


    org.projectlombok
    lombok

Spring Boot 1.5.2で提供されるバージョンのLombokのバグにより、NetBeansが多くのエラーを生成するため、if you’re using NetBeans, you may want to use Lombok explicitly with version 1.16.16に注意してください。

3. APIキー

Stripeと通信してクレジットカードの請求を実行する前に、register a Stripe account and obtain secret/public Stripe API keysを実行する必要があります。

アカウントを確認したら、ログインしてStripe dashboardにアクセスします。 次に、左側のメニューで「APIキー」を選択します。

Stripe Dashboard API Keys

秘密鍵/公開鍵の2つのペア—one for test and one for liveがあります。 後でこれらのキーを使用できるように、このタブを開いたままにしておきます。

4. 一般的なフロー

クレジットカードの請求は、フロントエンド(ブラウザーで実行)、バックエンド(Spring Bootアプリケーション)、およびStripeを含む5つの簡単なステップで行われます。

  1. ユーザーはチェックアウトページに移動し、[カードで支払う]をクリックします。

  2. ユーザーには、クレジットカードの詳細を入力するStripe Checkoutオーバーレイダイアログが表示されます。

  3. ユーザーは「Pay 」で確認します。

    • Stripeにクレジットカードを送信します

    • 既存のフォームに追加される応答でトークンを取得します

    • 金額、公開APIキー、メール、トークンを含むフォームをバックエンドに送信します

  4. バックエンドは、トークン、金額、シークレットAPIキーを使用してStripeに連絡します。

  5. バックエンドはストライプ応答をチェックし、ユーザーに操作のフィードバックを提供します。

Stripe payment flow

次のセクションでは、各ステップについて詳しく説明します。

5. チェックアウトフォーム

Stripe Checkoutは、クレジットカードの詳細を紹介するフォームをレンダリングするcustomizable, mobile ready, and localizable widgetです。 「checkout.js」を含めて構成することにより、次の責任を負います。

  • 「カードで支払う」ボタンのレンダリングPay with Card button

  • 支払いオーバーレイダイアログのレンダリング([カードで支払う]をクリックするとトリガーされます)Stripe checkout form overlay

  • クレジットカードの検証

  • 「記憶」機能(カードを携帯電話番号に関連付けます)

  • クレジットカードをStripeに送信し、それを囲んでいるフォームのトークンに置き換えます(「Pay 」をクリックした後にトリガーされます)

Stripe Checkoutによって提供されるよりもチェックアウトフォームをより細かく制御する必要がある場合は、Stripe Elementsを使用できます。

次に、フォームを準備するコントローラーを分析し、次にフォーム自体を分析します。

5.1. コントローラ

prepare the model with the necessary information that the checkout form needsへのコントローラーを作成することから始めましょう。

まず、copy the test version of our public key from the Stripe dashboardを実行し、それを使用してSTRIPE_PUBLIC_KEYを環境変数として定義する必要があります。 次に、この値をstripePublicKeyフィールドで使用します。

また、ここではデモンストレーションの目的でcurrencyamount(セントで表される)を手動で設定していますが、実際のアプリケーションでは、実際のフェッチに使用できる製品/販売IDを設定する場合があります値。

次に、チェックアウトフォームを保持するチェックアウトビューにディスパッチします。

@Controller
public class CheckoutController {

    @Value("${STRIPE_PUBLIC_KEY}")
    private String stripePublicKey;

    @RequestMapping("/checkout")
    public String checkout(Model model) {
        model.addAttribute("amount", 50 * 100); // in cents
        model.addAttribute("stripePublicKey", stripePublicKey);
        model.addAttribute("currency", ChargeRequest.Currency.EUR);
        return "checkout";
    }
}

Stripe APIキーについては、アプリケーションごとに環境変数として定義できます(テストvs. ライブ)。

パスワードや機密情報の場合と同様に、バージョン管理システムに秘密鍵を入れないようにすることをお勧めします。

5.2. Form

「カードで支払う」ボタンとチェックアウトダイアログは、データ属性で正しく構成されたスクリプトを含むフォームを追加することにより含まれています。

checkout.js」スクリプトは、送信の直前にStripeへの要求を自動的にトリガーし、その後、非表示フィールド「stripeToken」および「stripeEmail」としてStripeトークンとStripeユーザーの電子メールを追加します。 。

これらは、他のフォームフィールドとともにバックエンドに送信されます。 スクリプトデータの属性は送信されません。

Thymeleafを使用して、属性「data-key」、「data-amount」、および「data-currency」をレンダリングします。

金額(「data-amount」)は、表示目的でのみ使用されます(「data-currency」とともに)。 その単位は使用通貨のセントであるため、100で割って表示します。

ユーザーが支払いを要求すると、Stripe公開キーがStripeに渡されます。 Do not use the secret key here, as this is sent to the browser.

6. 充電操作

サーバー側の処理では、チェックアウトフォームで使用されるPOST要求ハンドラーを定義する必要があります。 充電操作に必要なクラスを見てみましょう。

6.1. ChargeRequestエンティティ

課金操作中にビジネスエンティティとして使用するChargeRequestPOJOを定義しましょう。

@Data
public class ChargeRequest {

    public enum Currency {
        EUR, USD;
    }
    private String description;
    private int amount;
    private Currency currency;
    private String stripeEmail;
    private String stripeToken;
}

6.2. サービス

StripeServiceクラスをcommunicate the actual charge operation to Stripeに書き込みましょう:

@Service
public class StripeService {

    @Value("${STRIPE_SECRET_KEY}")
    private String secretKey;

    @PostConstruct
    public void init() {
        Stripe.apiKey = secretKey;
    }
    public Charge charge(ChargeRequest chargeRequest)
      throws AuthenticationException, InvalidRequestException,
        APIConnectionException, CardException, APIException {
        Map chargeParams = new HashMap<>();
        chargeParams.put("amount", chargeRequest.getAmount());
        chargeParams.put("currency", chargeRequest.getCurrency());
        chargeParams.put("description", chargeRequest.getDescription());
        chargeParams.put("source", chargeRequest.getStripeToken());
        return Charge.create(chargeParams);
    }
}

CheckoutControllerthe secretKey field is populated from the STRIPE_SECRET_KEY environment variable that we copied from the Stripe dashboardに示されているように。

サービスが初期化されると、このキーは以降のすべてのストライプ操作で使用されます。

Stripeライブラリによって返されるオブジェクトはcharge operationを表し、操作IDなどの有用なデータが含まれています。

6.3. コントローラ

最後に、StripeServiceを介してcontroller that will receive the POST request made by the checkout form and submit the charge to Stripeを記述しましょう。

ChargeRequest」パラメータは、次の形式に含まれるリクエストパラメータ「amount」、「stripeEmail」、および「stripeToken」で自動的に初期化されることに注意してください。

@Controller
public class ChargeController {

    @Autowired
    private StripeService paymentsService;

    @PostMapping("/charge")
    public String charge(ChargeRequest chargeRequest, Model model)
      throws StripeException {
        chargeRequest.setDescription("Example charge");
        chargeRequest.setCurrency(Currency.EUR);
        Charge charge = paymentsService.charge(chargeRequest);
        model.addAttribute("id", charge.getId());
        model.addAttribute("status", charge.getStatus());
        model.addAttribute("chargeId", charge.getId());
        model.addAttribute("balance_transaction", charge.getBalanceTransaction());
        return "result";
    }

    @ExceptionHandler(StripeException.class)
    public String handleError(Model model, StripeException ex) {
        model.addAttribute("error", ex.getMessage());
        return "result";
    }
}

成功したら、ステータス、オペレーションID、チャージID、残高トランザクションIDをモデルに追加して、後でユーザーに表示できるようにします(セクション7)。 これは、charge objectの内容の一部を説明するために行われます。

ExceptionHandlerは、充電操作中にスローされるタイプStripeExceptionの例外を処理します。

よりきめ細かいエラー処理が必要な場合は、CardExceptionRateLimitExceptionAuthenticationExceptionなどのStripeExceptionのサブクラスに個別のハンドラーを追加できます。

result」ビューは、充電操作の結果を表示します。

7. 結果の表示

結果の表示に使用されるHTMLは、充電操作の結果を表示する基本的なThymeleafテンプレートです。 課金操作が成功したかどうかに関係なく、ユーザーはChargeControllerによってここに送信されます。



    
        Result
    
    
        

Success!

Id.:
Status:
Charge id.:
Balance transaction id.:
Checkout again

成功すると、ユーザーには充電操作の詳細が表示されます。

Charge successful

エラーが発生すると、Stripeから返されたエラーメッセージがユーザーに表示されます。

Charge error

8. 結論

このチュートリアルでは、Stripe JavaAPIを使用してクレジットカードに請求する方法を示しました。 将来的には、サーバー側のコードを再利用してネイティブモバイルアプリを提供できるようになります。

チャージフロー全体をテストするために、実際のクレジットカードを使用する必要はありません(テストモードでも)。 代わりにStripe testing cardsに頼ることができます。

充電操作は、Stripe Java APIによって提供される多くの可能性の1つです。 The official API referenceは、一連の操作全体をガイドします。

このチュートリアルで使用されるサンプルコードは、GitHub projectにあります。