Сеанс оформления заказа Stripe, создающий несколько клиентовPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Сеанс оформления заказа Stripe, создающий несколько клиентов

Сообщение Anonymous »

Я настраиваю Stripe для платежей в своем проекте, и у меня возникли некоторые проблемы с управлением клиентами.
Я пытаюсь создать нового клиента и сохранить идентификатор клиента Stripe. в моей базе данных, когда пользователь создает сеанс оформления заказа. Проблема в том, что после того, как пользователь совершает платеж, создается еще один клиент.

Код: Выделить всё

@app.post('/create-checkout-session')
async def create_checkout_session(request: Request):

data = await request.json()

price_id = data['price_id']
user_id = data['user_id']
base_url = data['base_url']
stripe_customer_id = data.get('stripe_customer_id')

try:
if stripe_customer_id is not None:
stripe_customer = stripe.Customer.retrieve(stripe_customer_id)

if stripe_customer:
print('stripe_customer', stripe_customer)
return
else:
print('request', request)
stripe_customer = stripe.Customer.create(metadata={"user_id": user_id})
customer_id = stripe_customer.id
await update_user_with_stripe_customer_id(user_id, customer_id)

checkout_session = stripe.checkout.Session.create(
customer=stripe_customer_id,
line_items=[
{
'price': price_id,
'quantity': 1,
},
],
mode='subscription',
success_url=base_url + '/payment-success',
cancel_url=base_url + '?canceled=true',
client_reference_id=user_id,
)

logger.info(f"Checkout session created successfully: {checkout_session.id}")
return JSONResponse(content={"url": checkout_session.url}, status_code=200)
except stripe.error.StripeError as e:
logger.error(f"Stripe error: {str(e)}")
raise HTTPException(status_code=400, detail=str(e))
except Exception as e:
logger.error(f"Error creating checkout session: {str(e)}")
raise HTTPException(status_code=500, detail=str(e))

async def update_user_with_stripe_customer_id(user_id: str, stripe_customer_id: str):
db = firestore.client()
user_ref = db.collection('customers').where(filter=FieldFilter("user_id", "==", user_id))
user_docs = user_ref.get()

if user_docs:
user_doc = user_docs[0]
user_doc.reference.update({
'stripe_customer_id': stripe_customer_id
})
print(f"Updated user {user_id} with Stripe customer ID {stripe_customer_id}")
else:
logger.error(f"User {user_id} not found in database")
raise HTTPException(status_code=404, detail="User not found")
После завершения сеанса оформления заказа и успешной оплаты я хочу обновить свою базу данных, чтобы предоставить пользователю выделенные кредиты. Однако я получаю сообщение об ошибке 404: пользователь не найден.

Код: Выделить всё

@app.post('/webhook')
async def webhook_received(request: Request):
print("Webhook received!")
payload = await request.body()
sig_header = request.headers.get('stripe-signature')
logger.info(f"Stripe signature: {sig_header}")

try:
event = stripe.Webhook.construct_event(
payload, sig_header, STRIPE_WEBHOOK_SECRET
)
print(f"Event constructed: {event['type']}")
except ValueError as e:
logger.info(f"Invalid payload: {str(e)}")
raise HTTPException(status_code=400, detail='Invalid payload')
except stripe.error.SignatureVerificationError as e:
logger.info(f"Invalid signature: {str(e)}")
raise HTTPException(status_code=400, detail='Invalid signature')

if event['type'] == 'checkout.session.completed':
logger.info("Checkout session completed event received")
return
session = event['data']['object']
try:
result = await handle_checkout_session_completed(session)
return JSONResponse(content={"status": "success", "result": result}, status_code=200)
except Exception as e:
logger.error(f"Error handling checkout session: {str(e)}")
return JSONResponse(content={"status": "error", "message": str(e)}, status_code=500)
elif event['type'] =='invoice.paid':
logger.info("Invoice paid event received")
session = event['data']['object']
try:
result = await handle_invoice_paid(session)
return JSONResponse(content={"status": "success", "result": result}, status_code=200)
except Exception as e:
logger.error(f"Error handling invoice paid: {str(e)}")
return JSONResponse(content={"status": "error", "message": str(e)}, status_code=500)
else:
logger.info(f"Unhandled event type: {event['type']}")

async def handle_invoice_paid(session):
print('session', session)
credits = session.get('lines').data[0].plan.metadata.credits
tier = session.get('lines').data[0].plan.metadata.tier
stripe_customer_id = session.get('customer')
print('credits', credits, tier, stripe_customer_id)

if credits:
db = firestore.client()
user_ref = db.collection('customers').where(filter=FieldFilter("stripe_customer_id", "==", stripe_customer_id))
user_docs = user_ref.get()

if user_docs:
user_doc = user_docs[0]
user_doc.reference.update({
'credits': credits,
'current_subscription_tier': tier,
'stripe_customer_id': stripe_customer_id
})
updated_user_doc = user_doc.reference.get()
updated_user_data = updated_user_doc.to_dict()
return JSONResponse(content={"updated_user": updated_user_data}, status_code=200)
else:
print(f"User document not found for user_id: {stripe_customer_id}")
raise HTTPException(status_code=404, detail="User not found")
else:
print(f"credits: {credits} not found")
Я пробовал разные реализации для создания клиента. В конечном итоге мне нужно обновить свою базу данных, указав идентификатор клиента, однако моя проблема в том, что, поскольку создается несколько пользователей, существует несколько идентификаторов клиентов.

Подробнее здесь: https://stackoverflow.com/questions/790 ... -customers
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»