Hero img
Stripeをサーバーで商品のリストを取得する

サーバー実装し、Stripeの商品のリストを取得する。

Stripeで決算ページを作成できるが、それ以外にWebHook、商品のリスト、請求書の下書き等ができる。ここでは商品のリストの取得と、金額の取得をします。


目次

  • Stripeのサーバー
  • 商品のリストを取得
  • 商品のリストを取得するには?
  • 商品の金額を取得するには?
  • まとめ

Stripeのサーバー

今回はStripeのサーバーで商品のリストを取得します。

以下は設定済みとします。

  • シークレットキー
  • Nextjs設定
  • stripe SDK インストール

商品のリストを取得

サーバーで商品のリスト、価格を取得します。
ここで使うのはproductsとpriceのAPI2つです。 残念ながら何故か商品のリストと、価格の取得方法が別になっています。

2つのAPIを使う必要があるのか?

ここで疑問に思うことは何でproduct APIとprices APIを使っているのか?
私もここは疑問なのですが、仕方なさそうです。
商品の「名前、画像、説明」と、「金額」の取得は同じAPIではできなさそうです... stripeでは1つの商品に複数の金額設定ができてしまうのでこのような形になっている気がしますが、正直煩わしいです。

商品のリストを取得するには?

まず商品のリストを取得します。 取得するためにproductsというAPIを使用します。

取得できる情報

  • id
  • アクティブ(販売有効化)
  • priceID
  • 画像
  • 商品名
  • 商品説明
  • etc...
import Stripe from 'stripe';
const stripe = new Stripe(process.env.NEXT_PUBLIC_STRIPE_SECKEY || '', {})
const products = await stripe.products.list();

商品のリストを取得するにはproducts.list()を使用します。
商品はdata[]となって全ての商品の値が返ってきます。

商品の削除

一度販売したものに関しては削除ができないため,商品は既に販売終了,今は売らないように設定するためには,stripeの商品カタログのページでアーカイブ化する必要があります。

有効な商品のみを返す
//active:trueを入れる
const products = await stripe.products.list({
  active: true,
});

active:trueを入れることでアーカイブ化されていない商品のみを取得できます。

戻り値例
{
  "data": [
    {
      "id": "prod_P6GSf3GXW5BEE9",
      "object": "product",
      "active": true,
      "attributes": [],
      "created": 1701326474,
      "default_price": "price_abc3vkHyZe134aOnjb5UKo0O",
      "description": "discription",
      "features": [
        {
          "name": "name"
        }
      ],
      "images": [
        "https://files.stripe.com/links/8GEL8YYMDAF8xS3F1b0JIeU96bTM0T2FufGZsX3Rlc3RfR1I1SVpUdVNhRzY0R0NTVHh6SXhZeWVz00CegP9cJP"
      ],
      "livemode": false,
      "metadata": {
        "season": "true"
      },
      "name": "テスト名前",
      "package_dimensions": null,
      "shippable": null,
      "statement_descriptor": null,
      "tax_code": null,
      "type": "service",
      "unit_label": null,
      "updated": 1701326497,
      "url": null
    }]
    }

しかし、商品の金額は取得できないのです...orz

フィルタリング

商品のフィルタリングは次のようにすることでも実現できます。

const products = await stripe.products.list();
//activeがtrueであれば
 const response = await Promise.all(products.data.filter(product => product.active).map(async product => {
     ...
        return product
      }))

商品の金額を取得するには?

このstripe.products.list()には商品の金額が表示されていません。!!?
商品の金額はpricesのAPIを使う必要があります。

//stripe.prices.listを使うことで金額を取得できます。  
        const priceResponse = await stripe.prices.list({
          product: product.id
        })
       const Value =  priceResponse.data[0].unit_amount 

prices.listにパラメーターを付けることで特定の商品の金額のみを取得できます。
この方法は商品数が少ない場合のみ使えそうですね...

const response = await Promise.all(products.data.map(async product => {
  const priceResponse = await stripe.prices.list({
    product: product.id
  });
  product.price = priceResponse.data[0].unit_amount;
  return product;
}));

Nextjsのapiでは次のようになります。
これで商品のリストと金額を取得することができました。

app/api/getproducts
import { NextResponse, NextRequest } from 'next/server';
import Stripe from 'stripe';

const stripe = new Stripe(process.env.NEXT_PUBLIC_STRIPE_SECKEY || '', {})

// Handle GET request
export const GET = async (req: NextRequest, res: NextResponse) => {
    const products = await stripe.products.list({
      active:true
    });
    try{
    }
    catch{
      console.log("ERROR????")
    }
    const response = await Promise.all(products.data.map(async product => {
        const priceResponse = await stripe.prices.list({
          product: product.id
        })
        product.price = priceResponse.data[0].unit_amount
        return product
      }))
      console.log(response);
        return new Response(JSON.stringify(response), { status: 200, headers: new Headers({ 'Content-Type': 'application/json' }) });
}

まとめ

stripeに登録してある商品のリストと金額を取得することができました。2つのAPIを投げなければならないのでなんかしっくり来ずもっといい方法があるのではないか。

関連記事

コメント

コメントを書く

質問や、間違いがありましたら、お気軽にどうぞ

※お名前とコメントの内容を入力してください。
※全てこのブログ上に公表されます。
※許可なく管理者によって修正・削除する場合がございます。 詳しくはプライバシーポリシーを参照ください