ExpressJS显示空请求.POST请求的body对象,但不包含失眠或cURL



我正在尝试将全球支付网关(GPG checkout)包含到我的MERN网站。

付款过程完成后,GPG服务器应该使用cURL向我在GPG仪表板中设置的路由发送post请求。这个post request的内容是:PayAmount, PAYID, TransStatus, Signature。

这是我的路线:

router.route('/confirm-payment-detailes').post(async (req,res)=>{

//const {TotalAmount,PAYID,TransStatus,Signature} = req.body;
//console.log({TotalAmount,PAYID,TransStatus,Signature});
// show any post request content to this route 
console.log(req.body)
});

我正在显示我在该路由上获得的所有POST字段。

当我在笔记本电脑上使用失眠或cURL进行测试时,它会显示我在服务器日志中发送的数据,但是当我完成支付过程时,它会显示空对象(这意味着GPG结账服务器知道我的通知URL并发送POST请求,但无论如何它都会显示空)。

我打电话给技术支持团队,他们给了我一个PHP通知页面的例子:

<?php
$url = (!empty($_SERVER['HTTPS'])) ? "https://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'] : "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
$url = $_SERVER['REQUEST_URI'];
$my_url = explode('wp-content' , $url); 
$path = $_SERVER['DOCUMENT_ROOT']."/".$my_url[0];
$PayAmount    = $_POST['TotalAmount'];
$PAYID     = $_POST['PAYID'];
$TransStatus   = $_POST['TransStatus'];
$Signature = $_POST['Signature'];
include_once $path . '/wp-config.php';
include_once $path . '/wp-includes/wp-db.php';
include_once $path . '/wp-includes/pluggable.php';
$sign = sha1( $_POST['TransStatus']. $PAYID . "XXXXXXX" );
if($Signature == $sign){
$order  = wc_get_order( $PAYID );
switch ( $TransStatus ) {

case '05' : // refus
$order->update_status( 'wc-failed', $reason );
break;
case '00' : // accord
$order->update_status( 'wc-processing', $reason );
WC()->cart->empty_cart();
break;
case '06' : //annuler
$order->update_status( 'wc-cancelled', $reason );
break;
case '07' : // rembourser
$order->update_status( 'wc-refunded', $reason );
break;
case '08' : // Charge back 

default :
break;
}

}
?>

据我所知,这只是一个简单的POST请求!为什么我的服务器显示空对象?虽然它工作良好,当我测试失眠或cURL随机场。

这是我的app.js文件内容:

//imports Here : 
const express = require('express');
const cors = require('cors');
const cookieParser = require('cookie-parser');
const mongoStore = require('connect-mongo');
//declare app here : 
const app = express();
app.disable('x-powered-by');
app.set('view engine','ejs');
app.set('views','Views');
app.use(express.static(__dirname + '/Public'));
app.use(cookieParser());
app.use(express.json());
app.use(express.urlencoded({extended:false}));
app.use(cors());
//Clients API Routes :
app.use(process.env.CLIENT_API_PATH,require('./Routes/clientAPIRoutes'));
//Admin Pages Routes :
app.use(process.env.ADMIN_PATH,require('./Routes/adminPageRoutes'));
module.exports = app;

有人对这个问题有什么看法吗?编辑:我确实在服务器上创建了一个php文件来接收数据,而不是节点应用程序,它确实通过使用$_POST["field_name"]来工作,所以我真的很困惑!

在从PHP脚本发送请求时设置内容类型头。这里是CURL (CURL可能会给你输出错误的格式),默认情况下邮差会为你做这个。这里,服务器需要知道您在请求中发送的数据类型,以便它可以使用适当的方法来获取编码的数据。例如json, xml,x-www-form-urlencoded和multipart等

可以通过设置Content-Type请求头

像这样设置Content-Type : application/json(for json data) or xml (for xml data) or x-www-form-urlencoded

$_POST使用application/x-www-form-urlencoded或multipart/form-data作为请求中的HTTP Content-Type。通过包含这个echo $_SERVER["CONTENT_TYPE"];在PHP脚本中运行检查,可能的输出可能是multipart/form-data,application/x-www-form-urlencoded已经在您的节点服务器中被解析。为解析multipart/form-data,请安装npm multer中间件包npm install multer

//imports Here : 
const express = require('express');
const cors = require('cors');
const cookieParser = require('cookie-parser');
const mongoStore = require('connect-mongo');
const multer= require('multer');
//declare app here : 
const app = express();
app.disable('x-powered-by');
app.set('view engine','ejs');
app.set('views','Views');
app.use(express.static(__dirname + '/Public'));
app.use(cookieParser());
app.use(express.json());
app.use(express.urlencoded({extended:false}));
app.use(multer().array()) // parses multipart/form-data
app.use(cors());
//Clients API Routes :
app.use(process.env.CLIENT_API_PATH,require('./Routes/clientAPIRoutes'));
//Admin Pages Routes :
app.use(process.env.ADMIN_PATH,require('./Routes/adminPageRoutes'));
module.exports = app;

我想我找到问题了。

支付网关服务器使用php cURL,在向Node/express Js应用程序发送数据时似乎不太顺利。

所以我没有办法修复它,因为这是他们的服务器错误。

使PHP curl POST到nodeJS API,但不能读取响应数据

PHP cURL请求正文在node.js中未定义

Node js无法通过php从curl请求中读取数据

我要报告这个问题。但是现在,我要用这个php脚本,因为我需要完成的工作!

<?php
/*


Author : Rouissi Iheb ( rouissi2017@gmail.com ) 
Date : 27/09/2021
stackoverflow qustion : https://stackoverflow.com/questions/69286519/expressjs-showing-empty-req-body-object-on-post-request-but-not-with-insomnia-o/


This script is used to redirect the POST payment detailes recived from GPG checkout servers to the E-commerce Node/expressJs server
reason : 
https://stackoverflow.com/questions/54385528/made-php-curl-post-to-nodejs-api-but-cant-read-response-data
https://stackoverflow.com/questions/35162073/php-curl-request-body-is-undefined-in-node-js
https://stackoverflow.com/questions/63463873/node-js-can-not-read-the-data-from-curl-request-via-php


*/
function execInBackground($cmd) {
if (substr(php_uname(), 0, 7) == "Windows"){
pclose(popen("start /B ". $cmd, "r")); 
}
else {
exec($cmd . " > /dev/null &");  
}
}
if(isset($_POST['TotalAmount']) && isset($_POST['PAYID']) && isset($_POST['TransStatus']) && isset($_POST['Signature'])){

//for test only TO REMOVE ON PRODUCTION !!
//-----------------------------
$content = "New Post Request from : ".$_SERVER['REMOTE_ADDR']." n";
$myfile = fopen("log.txt", "a") or die("Unable to open file!");
fwrite($myfile, $content);
fclose($myfile);
//------------------------------
$data = "TotalAmount=".$_POST['TotalAmount']."&PAYID=".$_POST['PAYID']."&TransStatus=".$_POST['TransStatus']."&Signature=".$_POST['Signature'];
execInBackground('curl -X POST -d "'.$data.'" http://nodeserver:nodeport/some-route');
}
?>

关于通知链接,我需要提供接收它的数据,我必须在我的服务器上安装php,用ssl创建一个新的子域,并将此配置添加到我的nginx配置:

server{
listen 80;
server_name gpg-gateway.mywebsite.com;
root /home/user/php-proxy;
index index.php;
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
}
}