作成日:2023-12-20
Stripeで決算ページを作成できるが、それ以外にWebHook、商品のリスト、請求書の下書き等ができる。ここでは商品のリストの取得と、金額の取得をします。
今回はStripeのサーバーで商品のリストを取得します。
以下は設定済みとします。
サーバーで商品のリスト、価格を取得します。
ここで使うのはproductsとpriceのAPI2つです。
残念ながら何故か商品のリストと、価格の取得方法が別になっています。
ここで疑問に思うことは何でproduct APIとprices APIを使っているのか?
私もここは疑問なのですが、仕方なさそうです。
商品の「名前、画像、説明」と、「金額」の取得は同じAPIではできなさそうです...
stripeでは1つの商品に複数の金額設定ができてしまうのでこのような形になっている気がしますが、正直煩わしいです。
まず商品のリストを取得します。 取得するためにproductsというAPIを使用します。
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では次のようになります。
これで商品のリストと金額を取得することができました。
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を投げなければならないのでなんかしっくり来ずもっといい方法があるのではないか。
質問や、間違いがありましたら、お気軽にどうぞ
※お名前とコメントの内容を入力してください。
※全てこのブログ上に公表されます。
※許可なく管理者によって修正・削除する場合がございます。 詳しくはプライバシーポリシーを参照ください