集成PhonePe API遇callbackurl接收异常:POST报404、GET返回null
PhonePe API回调接收异常:POST 404/GET返回null问题排查
问题现象
- 独立webhook服务可正常接收PhonePe的POST回调
- 自有网站中使用POST方式接收回调时返回404错误
- 改用GET方式接收时,接口可访问但返回null值
核心原因分析与解决办法
1. 路由与URL匹配问题(POST 404主因)
404错误本质是请求路径未匹配到对应Action,需做以下检查:
- 给
samplepaymentAction添加明确路由特性:[Route("samplepayment")],确保PhonePe配置的回调URL(如https://yourdomain.com/samplepayment)与路由完全匹配 - 核对PhonePe后台配置的回调URL:必须包含完整域名、路径,若网站使用非标准端口需一并带上,且HTTP/HTTPS协议要与网站一致(网站用HTTPS则回调URL必须是HTTPS)
2. CSRF防护拦截请求
自有网站默认开启的CSRF验证会拦截无令牌的第三方POST请求,需给Action添加排除规则:
[HttpPost] [AllowAnonymous] [IgnoreAntiforgeryToken] // 跳过CSRF验证 [Route("samplepayment")] public ActionResult samplepayment() { // 原有逻辑 }
3. GET方式不可用的原因
PhonePe回调仅支持POST请求,改用GET时,PhonePe不会在URL参数中传递JSON数据,导致代码中读取的请求体为空,反序列化后自然返回null,请勿使用GET方式接收回调。
4. 代码优化建议
- 替换过时的
Request.InputStream为Request.Body,适配ASP.NET新版本:using (var reader = new StreamReader(Request.Body)) { jsonBody = reader.ReadToEnd(); } - 添加日志记录,排查请求是否到达接口、请求体是否完整:
// 记录请求时间与请求体到日志文件 var logPath = Server.MapPath("~/App_Data/phonepe_callback.log"); System.IO.File.AppendAllText(logPath, $"[{DateTime.Now}] Request Received:\n{jsonBody}\n\n"); - 后续必须实现
VerifyXVerifyHeader的真实验证逻辑,使用商户密钥生成签名与X-VERIFY头对比,避免伪造请求。
调整后的完整示例代码
[HttpPost] [AllowAnonymous] [IgnoreAntiforgeryToken] [Route("samplepayment")] public ActionResult samplepayment() { var xVerifyHeader = Request.Headers["X-VERIFY"]; if (xVerifyHeader == null || !VerifyXVerifyHeader(xVerifyHeader)) { return Content("Invalid Verification"); } string jsonBody; using (var reader = new StreamReader(Request.Body)) { jsonBody = reader.ReadToEnd(); } if (string.IsNullOrEmpty(jsonBody)) { return Content("Empty Request Body"); } dynamic jsonObject = JsonConvert.DeserializeObject(jsonBody); var merchantId = jsonObject["merchantId"]; var merchantTransactionId = jsonObject["merchantTransactionId"]; var amount = jsonObject["amount"]; var status = jsonObject["status"]; // 此处添加业务处理逻辑,如保存交易记录到数据库 return Content("Callback Successful"); } private bool VerifyXVerifyHeader(string xVerifyHeader) { // TODO: 使用PhonePe提供的商户密钥,按照官方文档生成签名并与xVerifyHeader对比 return true; }
回调重定向后的页面截图

内容的提问来源于stack exchange,提问作者MANIKANDAN P
相关产品推荐
相关产品推荐

