Update app.py
Browse files
app.py
CHANGED
|
@@ -171,7 +171,7 @@ def create_paystack_payment_link(email: str, amount: int, reference: str) -> dic
|
|
| 171 |
"email": email,
|
| 172 |
"amount": amount,
|
| 173 |
"reference": reference,
|
| 174 |
-
"callback_url": "https://
|
| 175 |
}
|
| 176 |
try:
|
| 177 |
response = requests.post(url, json=data, headers=headers, timeout=10)
|
|
@@ -826,47 +826,62 @@ async def payment_callback(request: Request):
|
|
| 826 |
if request.method == "GET":
|
| 827 |
params = request.query_params
|
| 828 |
order_id = params.get("reference")
|
| 829 |
-
status = params.get("status", "
|
|
|
|
| 830 |
if not order_id:
|
| 831 |
raise HTTPException(status_code=400, detail="Missing order reference in callback.")
|
|
|
|
| 832 |
async with async_session() as session:
|
| 833 |
result = await session.execute(
|
| 834 |
-
|
| 835 |
)
|
| 836 |
-
order = result.
|
|
|
|
| 837 |
if order:
|
| 838 |
-
order.status = status
|
| 839 |
await session.commit()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 840 |
else:
|
| 841 |
raise HTTPException(status_code=404, detail="Order not found.")
|
| 842 |
-
|
| 843 |
-
|
| 844 |
-
f"Payment Update:\nOrder ID: {order_id} is now {status}."
|
| 845 |
-
)
|
| 846 |
-
redirect_url = f"https://wa.link/am87s2"
|
| 847 |
-
return RedirectResponse(url=redirect_url)
|
| 848 |
-
else:
|
| 849 |
data = await request.json()
|
| 850 |
order_id = data.get("reference")
|
| 851 |
-
new_status = data.get("status", "
|
|
|
|
| 852 |
if not order_id:
|
| 853 |
raise HTTPException(status_code=400, detail="Missing order reference in callback.")
|
|
|
|
| 854 |
async with async_session() as session:
|
| 855 |
result = await session.execute(
|
| 856 |
-
|
| 857 |
)
|
| 858 |
-
order = result.
|
|
|
|
| 859 |
if order:
|
| 860 |
-
order.status = new_status
|
| 861 |
await session.commit()
|
| 862 |
-
|
| 863 |
-
await asyncio.to_thread(send_whatsapp_message,
|
| 864 |
-
f"Payment
|
|
|
|
|
|
|
| 865 |
)
|
| 866 |
return JSONResponse(content={"message": "Order updated successfully."})
|
| 867 |
else:
|
| 868 |
raise HTTPException(status_code=404, detail="Order not found.")
|
| 869 |
|
|
|
|
| 870 |
@app.get("/track_order/{order_id}")
|
| 871 |
async def track_order(order_id: str):
|
| 872 |
|
|
|
|
| 171 |
"email": email,
|
| 172 |
"amount": amount,
|
| 173 |
"reference": reference,
|
| 174 |
+
"callback_url": "https://fred808-botpy-808.hf.space/payment_callback"
|
| 175 |
}
|
| 176 |
try:
|
| 177 |
response = requests.post(url, json=data, headers=headers, timeout=10)
|
|
|
|
| 826 |
if request.method == "GET":
|
| 827 |
params = request.query_params
|
| 828 |
order_id = params.get("reference")
|
| 829 |
+
status = params.get("status", "failed") # Default to failed
|
| 830 |
+
|
| 831 |
if not order_id:
|
| 832 |
raise HTTPException(status_code=400, detail="Missing order reference in callback.")
|
| 833 |
+
|
| 834 |
async with async_session() as session:
|
| 835 |
result = await session.execute(
|
| 836 |
+
select(Order).where(Order.order_id == order_id)
|
| 837 |
)
|
| 838 |
+
order = result.scalars().first()
|
| 839 |
+
|
| 840 |
if order:
|
| 841 |
+
order.status = "Paid" if status == "success" else "Failed"
|
| 842 |
await session.commit()
|
| 843 |
+
|
| 844 |
+
if status == "success":
|
| 845 |
+
# Notify the user
|
| 846 |
+
await asyncio.to_thread(send_whatsapp_message, order.user_id,
|
| 847 |
+
f"β
Payment successful! Your order (ID: {order_id}) is now being processed. π"
|
| 848 |
+
)
|
| 849 |
+
|
| 850 |
+
# Redirect user to WhatsApp link
|
| 851 |
+
return RedirectResponse(url="https://wa.link/am87s2")
|
| 852 |
+
else:
|
| 853 |
+
return JSONResponse(content={"message": "Payment failed. Please try again."})
|
| 854 |
else:
|
| 855 |
raise HTTPException(status_code=404, detail="Order not found.")
|
| 856 |
+
|
| 857 |
+
else: # Handle POST webhook (if needed)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 858 |
data = await request.json()
|
| 859 |
order_id = data.get("reference")
|
| 860 |
+
new_status = data.get("status", "failed")
|
| 861 |
+
|
| 862 |
if not order_id:
|
| 863 |
raise HTTPException(status_code=400, detail="Missing order reference in callback.")
|
| 864 |
+
|
| 865 |
async with async_session() as session:
|
| 866 |
result = await session.execute(
|
| 867 |
+
select(Order).where(Order.order_id == order_id)
|
| 868 |
)
|
| 869 |
+
order = result.scalars().first()
|
| 870 |
+
|
| 871 |
if order:
|
| 872 |
+
order.status = "Paid" if new_status == "success" else "Failed"
|
| 873 |
await session.commit()
|
| 874 |
+
|
| 875 |
+
await asyncio.to_thread(send_whatsapp_message, order.user_id,
|
| 876 |
+
f"β
Payment successful! Your order (ID: {order_id}) is now being processed. π"
|
| 877 |
+
if new_status == "success" else
|
| 878 |
+
f"β Payment failed for Order ID: {order_id}. Please retry."
|
| 879 |
)
|
| 880 |
return JSONResponse(content={"message": "Order updated successfully."})
|
| 881 |
else:
|
| 882 |
raise HTTPException(status_code=404, detail="Order not found.")
|
| 883 |
|
| 884 |
+
|
| 885 |
@app.get("/track_order/{order_id}")
|
| 886 |
async def track_order(order_id: str):
|
| 887 |
|