#!/usr/bin/env python # -*- coding: utf-8 -*- """ 易收米支付SDK Web服务演示 这个演示展示了如何在Web应用中集成易收米支付: 1. 创建支付页面 2. 处理支付回调 3. 查询订单状态 运行前请安装依赖: pip install fastapi uvicorn jinja2 python-multipart 运行方式: python web_demo.py 然后访问: http://localhost:8000 """ import json import time import asyncio from fastapi import FastAPI, Request, Form, Response from fastapi.responses import HTMLResponse, JSONResponse from fastapi.templating import Jinja2Templates from pay import create_payment from query import query_order from notify import PaymentNotify # 创建FastAPI应用 app = FastAPI(title="易收米支付演示", description="易收米支付SDK Web演示") # 配置信息 - 请替换为你的真实配置 APPID = 'YSMcd16b45d' APPSECRET = '899850e778e8d2b53e4c4a4e88695688' # 回调地址 - 实际使用时应该是你的域名 NOTIFY_URL = "http://localhost:8000/notify" NOPAY_URL = "http://localhost:8000/cancel" CALLBACK_URL = "http://localhost:8000/success" # 模板引擎 templates = Jinja2Templates(directory="templates") @app.get("/", response_class=HTMLResponse) async def index(request: Request): """首页 - 支付表单""" html_content = """ 易收米支付演示

🚀 易收米支付演示

创建支付订单

查询订单状态

📚 接口说明

""" return HTMLResponse(content=html_content) @app.post("/create_payment") async def create_payment_endpoint( description: str = Form(...), amount: float = Form(...), pay_type: int = Form(...) ): """创建支付订单""" try: # 生成订单号 order_id = f"demo_{int(time.time())}" # 转换金额为分 amount_cents = int(amount * 100) # 创建支付 pay_url = await create_payment( appid=APPID, appsecret=APPSECRET, order_id=order_id, description=description, amount=amount_cents, notify_url=NOTIFY_URL, nopay_url=NOPAY_URL, callback_url=CALLBACK_URL, pay_type=pay_type ) if pay_url: # 保存订单信息(实际应用中应该保存到数据库) order_info = { 'order_id': order_id, 'description': description, 'amount': amount, 'pay_type': pay_type, 'pay_url': pay_url, 'status': 'created', 'created_at': time.time() } result_html = f""" 支付订单创建成功

✅ 支付订单创建成功

支付订单已成功创建!请点击下方链接进行支付。
订单信息:
订单号: {order_id}
商品: {description}
金额: ¥{amount}
支付类型: {pay_type}
🚀 立即支付 🏠 返回首页 🔍 查询订单 """ return HTMLResponse(content=result_html) else: return JSONResponse( content={"error": "创建支付失败"}, status_code=400 ) except Exception as e: return JSONResponse( content={"error": f"创建支付时出错: {str(e)}"}, status_code=500 ) @app.post("/query_order") async def query_order_endpoint(order_id: str = Form(...)): """查询订单状态""" try: # 查询订单 order_info = await query_order( appid=APPID, mch_orderid=order_id ) if order_info: status_map = { 'SUCCESS': '✅ 支付成功', 'REFUND': '🔄 转入退款', 'NOTPAY': '⏳ 未支付', 'CLOSED': '❌ 已关闭', } state = order_info.get('state', 'UNKNOWN') status_text = status_map.get(state, f'未知状态({state})') result_html = f""" 订单查询结果

🔍 订单查询结果

订单号: {order_id}
状态: {status_text}

📋 详细信息:

{json.dumps(order_info, ensure_ascii=False, indent=2)}
🏠 返回首页 """ return HTMLResponse(content=result_html) else: return JSONResponse( content={"error": "订单不存在或查询失败"}, status_code=404 ) except Exception as e: return JSONResponse( content={"error": f"查询订单时出错: {str(e)}"}, status_code=500 ) @app.post("/notify") async def payment_notify(request: Request): """支付成功回调处理""" try: # 获取请求数据 request_data = await request.body() # 创建通知处理器 notify_handler = PaymentNotify(APPID, APPSECRET) # 处理通知 success, message = await notify_handler.process(request_data) if success: # 这里应该更新数据库中的订单状态 print(f"💰 支付成功回调处理: {message}") return Response(content=message) else: print(f"❌ 支付回调处理失败: {message}") return JSONResponse(content={"error": message}, status_code=400) except Exception as e: print(f"❌ 处理支付回调时出错: {str(e)}") return JSONResponse(content={"error": str(e)}, status_code=500) @app.get("/success") async def payment_success(request: Request): """支付成功页面""" html_content = """ 支付成功

🎉 支付成功!

您的订单已支付成功,感谢您的购买!

🏠 返回首页 """ return HTMLResponse(content=html_content) @app.get("/cancel") async def payment_cancel(request: Request): """支付取消页面""" html_content = """ 支付取消

⚠️ 支付已取消

您取消了支付,如有需要可以重新发起支付。

🏠 返回首页 """ return HTMLResponse(content=html_content) @app.get("/query_order_page") async def query_order_page(request: Request, order_id: str = None): """订单查询页面""" if order_id: # 直接查询订单 try: order_info = await query_order(appid=APPID, mch_orderid=order_id) if order_info: status_map = { 'SUCCESS': '✅ 支付成功', 'REFUND': '🔄 转入退款', 'NOTPAY': '⏳ 未支付', 'CLOSED': '❌ 已关闭', } state = order_info.get('state', 'UNKNOWN') status_text = status_map.get(state, f'未知状态({state})') html_content = f""" 订单详情

📋 订单详情

订单号: {order_id}
状态: {status_text}
{json.dumps(order_info, ensure_ascii=False, indent=2)}
🏠 返回首页 """ return HTMLResponse(content=html_content) except: pass # 显示查询表单 html_content = """ 订单查询

🔍 订单查询

🏠 返回首页 """ return HTMLResponse(content=html_content) if __name__ == "__main__": import uvicorn print("🚀 启动易收米支付演示服务...") print("📱 访问地址: http://localhost:8000") print("📋 配置信息:") print(f" AppID: {APPID}") print(f" AppSecret: {APPSECRET[:8]}***{APPSECRET[-8:]}") print("=" * 50) uvicorn.run(app, host="0.0.0.0", port=8000)