Stripeでオンライン決済した後のダウンロードページの作り方


Silicon Valley Super Ware

2020年9月17日




Stripeでオンライン決済した後のダウンロードページの作り方

Stripeでオンライン決済をした際のダウンロードページの作り方について触れておきます。

今回紹介している方法は、Stripe側で事前に用意したユーザーインターフェースを利用しています。したがって、決済が完了した後に表示するページのURLはセッションを作成する際に指定する必要があります。

ここで考えなくてはいけないのは、複数の商品(サービス)を販売する場合、提供するファイルへのリンク先も異なります。決済が終わった後にそのページが呼び出される際に何を表示するかを事前に決めておく必要があります。

Stripeが提供する方法は?


Stripeの開発者向けの記事を読むと紹介されている一つの方法は、「クエリーパラメータ」を指定する方法です。

要は、URLの最後に「?session_id=XXXX」の様に、セッションIDの情報を渡す方法です。この方法を使うと、表示する際にセッションIDを基に販売した商品(サービス)情報を取得して、必要なダウンロード情報を表示するという方法が一番簡単です。

先日の全体の流れの時の説明では詳しい事を書いていませんでしたが、バックエンドからセッション情報を受け取ってStripeの決済画面を呼び出す前に、商品情報とセッション情報をFirebaseに残すようにします。

決済が完了(成功)した場合は、クエリーパラメータと一緒に指定したページが呼び出されるので、Vueルータでクエリパラメータを読みだして、商品情報を基にページを作成すれば商品、ユーザーごとのダウンロードページの作成が可能です。

Vueで記述する場合は、「created」の所に以下のような記述を書けば、セッションIDを取得できます。
created: function() {
    console.log("create");
    console.log(this.$route.query.session_id);
  },

この方法が比較的簡単に個別のダウンロードページを作成する方法になります。

Firebaseはデータベースの利用ができるので値の受け渡しも簡単です

別の方法としては、Firebaseではなく、VUEXの方にセッション情報を残して対応する事も可能ですが、インターネット接続が遮断されたり、ブラウザーを閉じてしまった場合などは情報が失われる可能性があるのでおすすめしません。

バックエンドで対応する方法

オンライン決済処理をするために、バックエンドサービスを導入しているので、別の方法としては、バックエンド側でダウンロードページを用意する方法もあります。

この場合も、Stripeの決済画面の処理が成功した場合、一緒にセッションIDをクエリーパラメータとして送って、バックエンド側でこの情報を読み取ってダウンロードページを作成するという方法が利用できます。
 this.app.get("/download"async (reqres=> {
      // Gets the session information
      const sessionId = req.query.session_id

Expressを利用している場合は、ルーティングの処理で「/download」が呼ばれた場合に、リクエストのメッセージから、クエリーパラメータを取り出す事ができます。

この方法はセキュリティ上有利です!

フロントエンドで処理する場合、Firebaseのデータベースアクセスのコードはブラウザーから閲覧可能になるので、セキュリティールールをしっかり設定する必要がありますが、バックエンドで処理する場合、データベースアクセスはフロントエンドからは見られない様にできるため、Firebaseのセキュリティルールの設定は簡単ですみます。

バックエンドサイドでレンダリングする方法としては、NUXTやNEXTを含めていろいろありますが、ダウンロードページの作成だけならば、ExpressとExpress-Handlebars(express-handlebars)を使うともう少しシンプルなコードでバックエンド側のレンダリングが可能です。

詳細は、別途説明の投稿を書こうと思いますので今日は紹介だけにします!

クエリーパラメータがない場合

バックエンドで、オンライン決済が成功した場合と失敗した場合の表示するページは、バックエンドがセッションをリクエストする際に送ります。

// Requests a check out session
        const sessionany = await stripe.checkout.sessions.create({
          payment_method_types: ["card"],
          line_items: [
            {
              price_data: price_data,
              quantity: 1,
            },
          ],
          mode: "payment",
          success_url: URL + "download?session_id={CHECKOUT_SESSION_ID}",
          cancel_url: URL,
        });

成功した場合は、必ずセッションIDを埋め込むように指定します。
つまり、セッションIDがURLに含まれていない場合はエラーにします。

上の例では、商品選択ページ(「URL」)にリダイレクトしています。

こうする事で、支払いを完了した場合のみにダウンロードページを表示できます!

あとは、ダウンロードのリンクを取得して、それをダウンロードページのHTMLに埋め込めば良い事になります。

ダウンロードのリンクは注意が必要なのは別の投稿で紹介した通りです。

FirebaseのStorageのAPIを使ってダウンロードのURLを取得した場合はそのリンクは誰にでも有効で、有効期限もありません。それで問題ない場合はこれを使っても問題ありません。

しかし多くの場合では、リンクの有効期限を設定した方が良い場合が多くなります。
その場合の方法は

こちらで解説してますので参考にされてください。


シリコンバレースーパーウエアでは、フリーランスの方だけではなく、プログラミングを職業とされる方にビジネスを意識した マインドセットを身に着けるお手伝いも提供しています。プログラミングは手段であって、それをどのように生かして、将来のキャリアに結び付けて行くかを長期的な視点で考えるのがとても大切です。この意識が出来ると勉強の方向も絞られて、あなたの夢を実現する道筋が見えてきます。

興味のある方は今すぐお問合せください!



またよろしければ、ニュースレターの登録をお願いします!大体週一回お届けしています。ブログよりは一歩踏み込んだもっと濃い内容を発信しています。

コメント

このブログの人気の投稿

足し算以外もできるようにする

ユーザーインターフェースの設計

改良版足し算プログラム