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

在Django项目中获取PayPal按钮支付响应并存储至数据库

解决PayPal支付完成后获取响应并存储到数据库的问题

你当前直接在前端调用actions.order.capture()的方式,既存在安全风险(前端无法可信地操作数据库),也可能因前端环境异常导致无法稳定获取响应。正确的做法是通过后端接口处理PayPal订单捕获与数据库存储,具体实现如下:

1. 修改前端代码,将捕获逻辑转移到后端

把前端onApprove中的本地捕获逻辑,替换为调用你的后端接口,传递PayPal订单ID:

<script src="https://www.paypal.com/sdk/js?client-id=MyClientID&currency=USD" data-sdk-integration-source="button-factory"></script>

<script>
function initPayPalButton() {
    paypal
      .Buttons({
        style: {
          shape: "rect",
          color: "blue",
          layout: "horizontal",
          label: "buynow",
        },

        createOrder: function (data, actions) {
          return actions.order.create({
            purchase_units: [{amount: {currency_code: "USD", value: totalAmount}}],
          });
        },

        onApprove: function (data, actions) {
          // 调用后端接口处理订单捕获和数据库存储
          fetch('/api/paypal/capture-order', {
            method: 'POST',
            headers: {
              'Content-Type': 'application/json',
            },
            body: JSON.stringify({ orderId: data.orderID })
          })
          .then(response => response.json())
          .then(result => {
            console.log("支付成功,数据已存入数据库", result);
            const element = document.getElementById("paypal-button-container");
            element.innerHTML = "<h3>感谢您的支付!</h3>";
          })
          .catch(err => {
            console.error("支付处理失败", err);
            // 可在这里添加错误提示逻辑
          });
        },

        onError: function (err) {
          console.log(err);
        },
      })
      .render("#paypal-button-container");
  }
  initPayPalButton();
</script>

HTML部分保持不变:

<div class="paypalButton-mainDiv">
  <div id="smart-button-container">
    <div style="text-align: center">
      <div id="paypal-button-container"></div>
    </div>
  </div>
</div>

2. 后端实现订单捕获与数据库存储(以Node.js为例)

后端需借助PayPal官方SDK调用API捕获订单,再将结果写入数据库。以下是Node.js + Express的示例:

首先安装依赖:

npm install @paypal/checkout-server-sdk express mysql2

编写后端接口代码:

const express = require('express');
const paypal = require('@paypal/checkout-server-sdk');
const mysql = require('mysql2/promise');
const app = express();
app.use(express.json());

// 配置PayPal客户端(测试用沙箱环境,上线切换为LiveEnvironment)
const environment = new paypal.core.SandboxEnvironment('你的PayPal客户端ID', '你的PayPal密钥');
const paypalClient = new paypal.core.PayPalHttpClient(environment);

// 数据库连接配置
const dbConfig = {
  host: '你的数据库地址',
  user: '数据库用户名',
  password: '数据库密码',
  database: '数据库名称'
};

// 捕获订单并存储到数据库的接口
app.post('/api/paypal/capture-order', async (req, res) => {
  const { orderId } = req.body;
  try {
    // 向PayPal发起捕获请求
    const request = new paypal.orders.OrdersCaptureRequest(orderId);
    request.requestBody({});
    const captureResponse = await paypalClient.execute(request);
    const orderData = captureResponse.result;

    // 将订单数据插入数据库(可根据需求扩展字段)
    const connection = await mysql.createConnection(dbConfig);
    await connection.execute(
      'INSERT INTO paypal_orders (order_id, status, amount, payer_email) VALUES (?, ?, ?, ?)',
      [orderData.id, orderData.status, orderData.purchase_units[0].payments.captures[0].amount.value, orderData.payer.email_address]
    );
    await connection.end();

    // 返回成功结果给前端
    res.json({ success: true, orderData });
  } catch (err) {
    console.error('订单处理失败', err);
    res.status(500).json({ success: false, error: err.message });
  }
});

app.listen(3000, () => console.log('后端服务运行在端口3000'));

关键注意事项

  • 密钥保密:PayPal密钥必须仅在后端使用,前端只保留客户端ID。
  • 环境切换:测试阶段用沙箱环境,正式上线时切换为生产环境(LiveEnvironment)。
  • 错误处理:前后端都需处理异常场景,比如PayPal API调用失败、数据库写入失败等。
  • 表结构扩展:可根据业务需求给数据库表添加订单时间、商品明细等字段。

内容的提问来源于stack exchange,提问作者HMS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 08:23:38