如何在ASP.NET页面读取加密支付网关回调的JSON数据
加密支付网关回调JSON解析的正确实现方法
首先要明确:支付网关的回调是主动向你提交的回调URL(即你的notifypayment.aspx)发送POST请求,不需要你主动去请求任何未知的源URL。你之前的代码逻辑错误,应该在回调页面的后台代码中直接读取网关发送的请求体。
步骤1:读取回调请求的JSON数据
在notifypayment.aspx的后台代码中,直接读取HTTP请求的输入流,获取网关发送的JSON字符串:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack && Request.HttpMethod == "POST") { // 读取请求体的JSON数据 string jsonData; using (var reader = new StreamReader(Request.InputStream)) { jsonData = reader.ReadToEnd(); } // 此时jsonData就是网关发送的完整JSON字符串 LabelJsonData.Text = jsonData; // 接下来解析JSON ParsePaymentNotification(jsonData); } }
步骤2:解析JSON数据(以Newtonsoft.Json为例)
首先需要安装Newtonsoft.Json NuGet包,然后定义对应的实体类来映射JSON结构:
实体类定义
public class PaymentNotification { public long Timestamp { get; set; } public int Nonce { get; set; } public string Sign { get; set; } public string Body { get; set; } // 注意这里是嵌套的JSON字符串,后续需要二次解析 } public class PaymentBody { public string Address { get; set; } public string Amount { get; set; } public string BlockHigh { get; set; } public string CoinType { get; set; } public string Decimals { get; set; } public string Fee { get; set; } public string MainCoinType { get; set; } public int Status { get; set; } public string TradeId { get; set; } public int TradeType { get; set; } public string TxId { get; set; } }
解析逻辑
private void ParsePaymentNotification(string jsonData) { // 解析外层JSON var notification = Newtonsoft.Json.JsonConvert.DeserializeObject<PaymentNotification>(jsonData); // 解析嵌套的Body JSON var paymentBody = Newtonsoft.Json.JsonConvert.DeserializeObject<PaymentBody>(notification.Body); // 现在可以使用解析后的数据,比如获取交易ID、状态等 string tradeId = paymentBody.TradeId; int paymentStatus = paymentBody.Status; // 后续处理:更新订单状态、记录日志等 }
步骤3:使用System.Text.Json解析(.NET Core/.NET 5+)
如果使用的是.NET Core或更高版本,也可以用内置的System.Text.Json:
private void ParsePaymentNotification(string jsonData) { var options = new System.Text.Json.JsonSerializerOptions { PropertyNameCaseInsensitive = true // 忽略大小写匹配属性 }; // 解析外层 var notification = System.Text.Json.JsonSerializer.Deserialize<PaymentNotification>(jsonData, options); // 解析Body var paymentBody = System.Text.Json.JsonSerializer.Deserialize<PaymentBody>(notification.Body, options); // 使用解析后的数据 }
关键注意事项
- 验证签名:必须根据网关提供的签名规则,使用
timestamp、nonce、body等字段重新计算签名,与网关发送的sign字段对比,确保通知是合法的,防止伪造请求。 - 异常处理:添加try-catch块处理JSON解析失败的情况,避免页面崩溃。
- 幂等性:同一笔交易可能会收到多次回调,需要根据
tradeId或txId判断是否已经处理过,避免重复操作。
内容的提问来源于stack exchange,提问作者Biz Data Serv
相关产品推荐
相关产品推荐

