You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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&currency=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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 18:04:54