← スキル一覧に戻る

stripe-payments
by Smarter-Poker
Smarter-Poker-World-Hub
⭐ 0🍴 0📅 2026年1月26日
SKILL.md
name: Stripe Payments description: Payment processing, subscriptions, and checkout integration
Stripe Payments Skill
Setup
npm install stripe @stripe/stripe-js @stripe/react-stripe-js
Environment Variables
STRIPE_SECRET_KEY=sk_test_...
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_...
STRIPE_WEBHOOK_SECRET=whsec_...
Server-Side (API Routes)
Create Checkout Session
// pages/api/checkout.js
import Stripe from 'stripe';
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);
export default async function handler(req, res) {
const session = await stripe.checkout.sessions.create({
payment_method_types: ['card'],
line_items: [{
price_data: {
currency: 'usd',
product_data: {
name: '1000 Diamonds',
images: ['https://smarter.poker/diamonds.png']
},
unit_amount: 999, // $9.99 in cents
},
quantity: 1,
}],
mode: 'payment',
success_url: `${process.env.NEXT_PUBLIC_URL}/success?session_id={CHECKOUT_SESSION_ID}`,
cancel_url: `${process.env.NEXT_PUBLIC_URL}/store`,
metadata: {
userId: req.body.userId,
diamonds: 1000
}
});
res.json({ sessionId: session.id });
}
Create Subscription
const session = await stripe.checkout.sessions.create({
mode: 'subscription',
line_items: [{
price: 'price_vip_monthly', // Price ID from Stripe dashboard
quantity: 1,
}],
success_url: `${process.env.NEXT_PUBLIC_URL}/success`,
cancel_url: `${process.env.NEXT_PUBLIC_URL}/pricing`,
});
Webhook Handler
// pages/api/webhooks/stripe.js
import { buffer } from 'micro';
import Stripe from 'stripe';
export const config = { api: { bodyParser: false } };
export default async function handler(req, res) {
const buf = await buffer(req);
const sig = req.headers['stripe-signature'];
let event;
try {
event = stripe.webhooks.constructEvent(buf, sig, process.env.STRIPE_WEBHOOK_SECRET);
} catch (err) {
return res.status(400).send(`Webhook Error: ${err.message}`);
}
switch (event.type) {
case 'checkout.session.completed':
await handleCheckoutComplete(event.data.object);
break;
case 'invoice.paid':
await handleSubscriptionRenewal(event.data.object);
break;
case 'customer.subscription.deleted':
await handleSubscriptionCancelled(event.data.object);
break;
}
res.json({ received: true });
}
Client-Side
Checkout Button
import { loadStripe } from '@stripe/stripe-js';
const stripePromise = loadStripe(process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY);
export function BuyDiamondsButton({ userId }) {
const handleClick = async () => {
const stripe = await stripePromise;
const response = await fetch('/api/checkout', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ userId })
});
const { sessionId } = await response.json();
await stripe.redirectToCheckout({ sessionId });
};
return <button onClick={handleClick}>Buy 1000 Diamonds - $9.99</button>;
}
Database Integration
async function handleCheckoutComplete(session) {
const { userId, diamonds } = session.metadata;
await supabase
.from('transactions')
.insert({
user_id: userId,
stripe_session_id: session.id,
amount: session.amount_total,
diamonds: parseInt(diamonds),
status: 'completed'
});
await supabase.rpc('add_diamonds', {
user_id: userId,
amount: parseInt(diamonds)
});
}
Testing
# Test webhook locally
stripe listen --forward-to localhost:3000/api/webhooks/stripe
# Trigger test events
stripe trigger checkout.session.completed
スコア
総合スコア
50/100
リポジトリの品質指標に基づく評価
✓SKILL.md
SKILL.mdファイルが含まれている
+20
○LICENSE
ライセンスが設定されている
0/10
○説明文
100文字以上の説明がある
0/10
○人気
GitHub Stars 100以上
0/15
○最近の活動
3ヶ月以内に更新がある
0/10
○フォーク
10回以上フォークされている
0/5
✓Issue管理
オープンIssueが50未満
+5
✓言語
プログラミング言語が設定されている
+5
○タグ
1つ以上のタグが設定されている
0/5
レビュー
💬
レビュー機能は近日公開予定です