Flask集成PayPal个人账户收款及支付验证方案咨询
Flask + PayPal 小额支付验证与积分兑换实现方案
1. 前期准备:用个人账户搭建测试环境
- 无需企业账户,个人账号可直接登录PayPal开发者平台创建沙箱测试账号,生成商家(收款方)和买家(付款方)的测试账户
- 在开发者平台获取沙箱环境的
Client ID和Secret,后续API调用会用到
2. 前端嵌入PayPal智能支付按钮
直接使用PayPal官方的前端脚本嵌入到Flask渲染的HTML模板中,无需依赖过时SDK:
<!-- 引入PayPal SDK,替换为你的沙箱Client ID --> <script src="https://www.paypal.com/sdk/js?client-id=YOUR_SANDBOX_CLIENT_ID¤cy=USD"></script> <!-- 按钮容器 --> <div id="paypal-button-container"></div> <script> paypal.Buttons({ // 创建订单 createOrder: (data, actions) => { return actions.order.create({ purchase_units: [{ amount: { value: '0.99' } // 测试用小额金额 }] }); }, // 支付成功回调 onApprove: (data, actions) => { return actions.order.capture().then(details => { // 将订单ID和用户ID发送到Flask后端验证 fetch('/verify-payment', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ order_id: data.orderID, user_id: '{{ current_user.id }}' // 需结合Flask-Login等身份验证工具 }) }) .then(res => res.json()) .then(result => { result.success ? alert('支付成功,积分已到账!') : alert('支付验证失败,请联系管理员'); }); }); } }).render('#paypal-button-container'); </script>
3. Flask后端验证支付并发放积分
使用PayPal最新的v2 REST API(替代已废弃的paypalrestsdk),通过requests库直接调用API验证支付状态:
from flask import Flask, request, jsonify import requests import base64 app = Flask(__name__) # PayPal配置 PAYPAL_CLIENT_ID = "YOUR_SANDBOX_CLIENT_ID" PAYPAL_CLIENT_SECRET = "YOUR_SANDBOX_CLIENT_SECRET" PAYPAL_API_BASE = "https://api-m.sandbox.paypal.com" # 生产环境替换为https://api-m.paypal.com def get_access_token(): """获取PayPal API访问令牌""" creds = base64.b64encode(f"{PAYPAL_CLIENT_ID}:{PAYPAL_CLIENT_SECRET}".encode()).decode() headers = { "Authorization": f"Basic {creds}", "Content-Type": "application/x-www-form-urlencoded" } resp = requests.post(f"{PAYPAL_API_BASE}/v1/oauth2/token", headers=headers, data={"grant_type": "client_credentials"}) resp.raise_for_status() return resp.json()["access_token"] @app.route("/verify-payment", methods=["POST"]) def verify_payment(): try: req_data = request.get_json() order_id = req_data.get("order_id") user_id = req_data.get("user_id") if not all([order_id, user_id]): return jsonify({"success": False, "msg": "缺少必要参数"}) # 获取令牌并查询订单详情 token = get_access_token() headers = {"Authorization": f"Bearer {token}", "Content-Type": "application/json"} order_resp = requests.get(f"{PAYPAL_API_BASE}/v2/checkout/orders/{order_id}", headers=headers) order_resp.raise_for_status() order_details = order_resp.json() # 验证支付状态与金额 if order_details["status"] == "COMPLETED": actual_amount = order_details["purchase_units"][0]["amount"]["value"] # 确保金额符合预期(防止篡改前端金额) if actual_amount == "0.99": # 执行发放积分逻辑(示例:更新用户数据库) # db.session.execute(update(User).where(User.id == user_id).values(points=User.points + 100)) # db.session.commit() return jsonify({"success": True, "msg": "积分已发放"}) return jsonify({"success": False, "msg": "支付金额不符"}) return jsonify({"success": False, "msg": "支付未完成"}) except Exception as e: return jsonify({"success": False, "msg": str(e)}) if __name__ == "__main__": app.run(debug=True)
4. 替代方案
Webhook自动触发积分发放
如果不想依赖前端回调,可以配置PayPal Webhook:
- 在PayPal开发者平台添加Webhook事件
CHECKOUT.ORDER.COMPLETED,设置回调URL为你的Flask路由(测试时用ngrok暴露本地服务) - 后端路由接收PayPal发送的POST请求,验证签名后直接为对应用户发放积分
其他支付工具
若PayPal流程不符合需求,可考虑Stripe:
- 支持个人账户收款,有官方Python SDK,Flask整合简单,小额支付流程更轻量化
内容的提问来源于stack exchange,提问作者wildcolor
相关产品推荐
相关产品推荐

