PAYATHON 2026

Golang发送http请求时resultCode -334表示什么?

支付老李

明确结论

resultCode: -334 不是 Golang 或 HTTP 协议定义的状态码,而是 Paymentology 在响应正文中返回的业务错误码。

仅凭 -334 不能确定具体原因。需要结合以下信息,查阅 Paymentology 对应接口的错误码文档:

  • 具体的 API 和版本
  • 测试环境或生产环境
  • HTTP 状态码
  • 完整响应正文中的 message、description 等字段
  • Paymentology 返回的请求追踪 ID

resultCode 和 HTTP 状态码是两回事。HTTP 状态码通过 resp.StatusCode 获取,-334 则是 Paymentology 自行定义的字段。

可能的原因

请求成功发出,只能说明网络连接和 HTTP 传输已经完成,不能说明 Paymentology 接受了这笔业务请求。常见原因有以下几类:

  1. 请求参数不符合要求

    例如缺少必填字段、字段格式有误,或者金额、日期格式不正确。

  2. 身份认证或签名校验失败

    如果 API Key、访问令牌、签名、时间戳或证书有误,服务端仍可能返回正常的 HTTP 响应,并在正文中给出负数 resultCode。

  3. 环境或接口版本不匹配

    例如使用测试环境的凭据请求生产地址,或者按照旧版本格式调用新版本接口。

  4. 账户或卡片状态不允许当前操作

    账户未启用、卡片状态异常、权限不足、额度受限或其他业务规则限制,都可能导致业务系统拒绝请求。

  5. 请求内容不符合 Paymentology 的协议定义

    可能涉及错误的 Content-Type、字段名称、JSON 类型、字符编码或枚举值。

-334 是否对应其中某一种情况,仍要以 Paymentology 针对当前接口和环境提供的错误码说明为准,不能只根据它是负数来推断。

排查步骤

先同时记录 HTTP 状态码和原始响应正文:

resp, err := client.Do(req)
if err != nil {
    return fmt.Errorf("send request: %w", err)
}
defer resp.Body.Close()

body, err := io.ReadAll(resp.Body)
if err != nil {
    return fmt.Errorf("read response: %w", err)
}

log.Printf("HTTP status: %d", resp.StatusCode)
log.Printf("Paymentology response: %s", string(body))

接着按顺序检查:

  1. 将实际请求与 Paymentology 当前版本的接口文档逐字段比较。
  2. 确认请求地址、API 版本和凭据属于同一个环境。
  3. 检查认证头、签名原文、时间戳和时区。
  4. 查看响应中是否还有 message、error、description 或追踪 ID。
  5. 使用相同参数通过 curl 或 API 调试工具发送请求,确认问题是否出在 Golang 代码中。
  6. 如果文档没有列出 -334,向 Paymentology 技术支持提供接口名称、发生时间、环境和追踪 ID,请其查询服务端日志。

完整的响应解析示例

假设响应格式如下:

{
  "resultCode": -334,
  "message": "..."
}

可以分别处理 HTTP 错误和业务错误:

package main

import (
    "encoding/json"
    "fmt"
    "io"
    "net/http"
)

type PaymentologyResponse struct {
    ResultCode  int             `json:"resultCode"`
    Message     string          `json:"message"`
    Description string          `json:"description"`
    Data        json.RawMessage `json:"data"`
}

func handleResponse(resp *http.Response) (*PaymentologyResponse, error) {
    defer resp.Body.Close()

    body, err := io.ReadAll(resp.Body)
    if err != nil {
        return nil, fmt.Errorf("read response body: %w", err)
    }

    if resp.StatusCode < 200 || resp.StatusCode >= 300 {
        return nil, fmt.Errorf(
            "unexpected HTTP status %d: %s",
            resp.StatusCode,
            string(body),
        )
    }

    var result PaymentologyResponse
    if err := json.Unmarshal(body, &result); err != nil {
        return nil, fmt.Errorf(
            "decode Paymentology response: %w; body=%s",
            err,
            string(body),
        )
    }

    if result.ResultCode != 0 {
        return &result, fmt.Errorf(
            "Paymentology rejected request: resultCode=%d, message=%q, description=%q",
            result.ResultCode,
            result.Message,
            result.Description,
        )
    }

    return &result, nil
}

示例中的 ResultCode != 0 是一种常见写法。Paymentology 是否以 0 表示成功,应以该接口文档为准。

注意事项

排查时可以记录原始响应,但不要在生产日志中直接输出卡号、CVV、访问令牌、API Key、签名或个人信息。如有必要,应先对这些内容做脱敏处理。

Golang 的网络错误通常由 client.Do(req) 通过 error 返回,不会自动转换成 -334。因此,排查重点应放在 Paymentology 的请求校验和业务处理上,不要把 -334 当成 Go HTTP 客户端错误。

备注:内容仅供参考。