Express/Node.js集成PhonePe网页支付网关时返回404错误求助
Express/Node.js集成PhonePe网页支付网关时返回404错误求助
嗨,我之前帮朋友排查过类似的PhonePe支付接口404问题,给你梳理几个大概率的坑点,你可以逐一核对:
1. 环境API端点不匹配(最常见原因)
PhonePe的测试环境和生产环境的API地址是完全分开的!如果你用的是测试商户ID/密钥,却调用了生产环境的接口,就会直接返回404。
你当前的MERCHANT_BASE_URL是生产环境的:
const MERCHANT_BASE_URL = "https://api.phonepe.com/apis/hermes/pg/v1/pay"
请替换为测试沙箱环境的地址:
const MERCHANT_BASE_URL = "https://api-preprod.phonepe.com/apis/pg-sandbox/pg/v1/pay"
同时要确保你的MERCHANT_ID和MERCHANT_KEY也是测试环境的(测试和生产的密钥不通用)。
2. 校验和生成的细节检查
你生成校验和的规则是对的,但要注意几个细节:
- 确认
MERCHANT_KEY没有多余的空格、换行符,可以打印出来看看是否和商户后台复制的完全一致; - 拼接校验字符串时,要确保没有遗漏或多加字符,比如在代码里临时打印拼接后的字符串,确认格式正确:
const string = payload + '/pg/v1/pay' + MERCHANT_KEY; console.log("校验拼接字符串:", string); // 检查这个字符串是否符合要求 const sha256 = crypto.createHash('sha256').update(string).digest('hex');
3. 请求数据格式验证
虽然你的请求结构看起来没问题,但可以做两个小检查:
- 确认
payload是正确的Base64编码:可以把payload解码回JSON,看看是否和原始的paymentPayload完全一致; - 检查
paymentPayload里的amount字段是数字类型(PhonePe要求用最小货币单位,比如2000代表20卢比,这个你是对的),不要写成字符串。
4. 额外小提示
- 确保你的服务器可以正常访问PhonePe的API,没有被防火墙或代理拦截;
- 如果你是在本地测试回调URL,需要用ngrok之类的工具把本地端口暴露到公网,不过这个是回调阶段的问题,和当前的404无关,但可以提前准备好。
先优先更换测试环境的API地址试试,这应该是大部分人遇到404的核心原因!
备注:内容来源于stack exchange,提问作者Aftab Ahmed




