发布到 Square 时出现 422 状态代码错误?

Getting 422 Status Code Error When Posting to Square?

请帮我完成这最后一步,这样我就可以完成这个项目了:)

我正在尝试将此示例转换为 Vb.Net:

https://docs.connect.squareup.com/articles/processing-payment-rest/

我可以在用户输入信用卡信息后成功获取到一个CardOnce ID。我可以成功地从 Square 读取以获取我的位置 ID。但是,当我提供 CardOnce ID、位置 ID 并达到 POST 时,我卡在了最后一步,我一直收到错误消息:"The remote server returned an error: (422) status code 422."

我的代码如下,错误发生:

调用时出现错误:

response = DirectCast(request.GetResponse(), HttpWebResponse)

完整代码在这里:

Public Function IsSuccessProcess(ByVal sLocationId As String, ByVal sCardOnce As String, ByVal iAmount As Integer)
    Dim request As HttpWebRequest
    Dim response As HttpWebResponse = Nothing
    Dim reader As StreamReader
    Dim address As Uri
    Dim data As StringBuilder
    Dim byteData() As Byte
    Dim postStream As Stream = Nothing

    address = New Uri("https://connect.squareup.com/v2/locations/" & sLocationId & "/transactions")

    ' Create the web request  
    request = DirectCast(WebRequest.Create(address), HttpWebRequest)

    ' Set type to POST  
    request.Method = "POST"
    request.ContentType = "application/json"
    request.Accept = "application/json"
    request.Headers.Add("Authorization", "Bearer " & AccessToken)

    data = New StringBuilder()
    Dim sQuote As String = """"
    sQuote = "'"
    data.Append("{" & sQuote & "card_nonce" & sQuote & ": " & sCardOnce & "," & sQuote & "amount_money" & sQuote & ": {" & sQuote & "amount" & sQuote & ": " & iAmount & "," & sQuote & "currency" & sQuote & ": " & sQuote & "USD" & sQuote & "}")

    Dim didempotency_key As Double = Microsoft.VisualBasic.Timer
    Dim idempotency_key As Integer = CInt(didempotency_key)
    data.Append("'idempotency_key': " & idempotency_key)
    ' Create a byte array of the data we want to send  
    byteData = UTF8Encoding.UTF8.GetBytes(data.ToString())
    ' Set the content length in the request headers  
    request.ContentLength = byteData.Length

    ' Write data  
    Try
        postStream = request.GetRequestStream()
        postStream.Write(byteData, 0, byteData.Length)
    Finally
        If Not postStream Is Nothing Then postStream.Close()
    End Try

    Try
        ' Get response  
        response = DirectCast(request.GetResponse(), HttpWebResponse)

        ' Get the response stream into a reader  
        reader = New StreamReader(response.GetResponseStream())

        ' Console application output  
        Console.WriteLine(reader.ReadToEnd())
    Finally
        If Not response Is Nothing Then response.Close()
    End Try


    Return True

End Function

可能会出现此错误,因为您在 JSON 正文中使用了单引号而不是双引号。第一步尝试替换它们。

请注意,您可能会发现借助 Json.NET.

等第三方库更容易生成和解析 JSON 对象

最后,正如 Troy 所提到的,有用的错误消息会在端点响应正文中返回,这应该有助于您诊断未来的问题。有关详细信息,请参阅 this article

我一直在研究 JSON 字符串,终于找到了获胜组合。我没有正确使用 "amount_money"。此外,SDK 表示您必须使用 idempotency_key,我在某些试验中没有使用它。最后,您必须使用实际引号,而不是单个撇号:

Dim sKey As String = Guid.NewGuid().ToString()
Dim sMyJsonString As String
sMyJsonString = "{" & sQuote & "card_nonce" & sQuote & ":" & sQuote & sCardOnce & sQuote & "," & sQuote & "amount_money" & sQuote & ": {" & sQuote & "amount" & sQuote & ": " & iAmount & "," & sQuote & "currency" & sQuote & ": " & sQuote & "USD" & sQuote & "}," & sQuote & "idempotency_key" & sQuote & ":" & sQuote & sKey & sQuote & "}"
data.Append(sMyJsonString)

我最终向自己收取了 1.00 美元,该费用显示在我的 Square 帐户中。这比我希望的要花更长的时间才弄清楚,但一切都好,结局好。