You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 19:12:46