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
相关产品推荐
相关产品推荐

