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

React.js/Next.js集成Przelewy24支付:回调URL数据获取求助

处理Przelewy24支付成功后的回调数据

1. 明确Przelewy24的两种回调逻辑

  • 前端跳转回调:用户支付完成后,P24会跳转到你申请token时指定的urlReturn地址,URL查询参数里会携带sessionId、orderId、status等支付结果数据。这种方式仅适合给用户展示结果,不能直接作为业务逻辑的依据(参数可被篡改)。
  • 服务器端异步回调:P24会主动向你预先配置的urlStatus地址发送POST请求,携带加密后的支付结果。这是验证支付有效性、更新订单状态的核心依据,必须优先处理。

2. 搭建服务器端监听端点(以Node.js/Express为例)

你需要创建一个可被公网访问的API端点(开发阶段可用内网穿透工具如ngrok临时暴露本地服务),用来接收并验证P24的回调请求:

const express = require('express');
const bodyParser = require('body-parser');
const crypto = require('crypto');
const app = express();

// 解析P24发送的表单格式数据
app.use(bodyParser.urlencoded({ extended: true }));

// 替换为你的P24商户信息
const P24_MERCHANT_ID = '你的商户ID';
const P24_MERCHANT_KEY = '你的商户密钥';

// P24回调接收端点
app.post('/api/p24-webhook', (req, res) => {
  try {
    // 提取回调参数
    const { p24_session_id, p24_order_id, p24_amount, p24_currency, p24_signature } = req.body;

    // 验证签名(关键步骤,防止伪造请求)
    const signParams = [p24_session_id, p24_order_id, p24_amount, p24_currency, P24_MERCHANT_ID];
    const signString = signParams.join('|');
    const calculatedSignature = crypto.createHmac('sha256', P24_MERCHANT_KEY).update(signString).digest('hex');

    if (calculatedSignature !== p24_signature) {
      res.status(403).send('Invalid signature');
      return;
    }

    // 签名验证通过,执行你的业务逻辑:更新订单状态、记录支付日志等
    console.log('支付确认,订单ID:', p24_order_id);
    console.log('P24会话ID:', p24_session_id);

    // 必须返回200状态码,否则P24会重复发送回调请求
    res.status(200).send('OK');
  } catch (error) {
    console.error('回调处理失败:', error);
    res.status(500).send('Internal Server Error');
  }
});

app.listen(3000, () => {
  console.log('服务启动,监听端口3000');
});

3. 前端跳转参数的处理(可选)

如果需要在前端页面给用户展示支付结果,可以通过URL参数获取数据,但建议再调用自身后端接口二次验证:

// 解析URL中的查询参数
const urlParams = new URLSearchParams(window.location.search);
const sessionId = urlParams.get('p24_session_id');
const orderId = urlParams.get('p24_order_id');

// 调用后端接口验证支付真实性
fetch('/api/verify-payment', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ sessionId, orderId }),
})
.then(res => res.json())
.then(data => {
  if (data.success) {
    alert('支付成功!');
  } else {
    alert('支付验证失败,请联系客服');
  }
});

4. 核心注意事项

  • 签名验证不可省略:所有P24的回调请求都必须验证签名,避免恶意请求篡改支付状态。
  • 端点必须公网可访问:P24无法访问本地localhost地址,开发阶段用内网穿透工具,生产环境部署到公网服务器。
  • 务必返回200状态码:P24会在回调失败时重复发送请求(最多重试多次),处理成功后必须返回200告知P24无需再重试。
  • 业务逻辑依赖服务器端回调:前端URL参数可被篡改,不能作为订单状态更新的依据,必须以服务器端回调的验证结果为准。

内容的提问来源于stack exchange,提问作者Marek Marszałek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:33:26