Authorize.net支付网关向iOS swift的信用卡API收费

Authorize.net支付网关向iOS swift的信用卡API收费,ios,swift,payment-gateway,authorize.net,Ios,Swift,Payment Gateway,Authorize.net,大家好,我正在使用支付网关charge credit api,但在将json对象传递给api时出错。这里是传递给charge credit api的原始json对象 { "createTransactionRequest": { "merchantAuthentication": { "name": "XXXXXX", "transactionKey": "XXXXXXXX" }, "refI

大家好,我正在使用支付网关charge credit api,但在将json对象传递给api时出错。这里是传递给charge credit api的原始json对象

{
    "createTransactionRequest": {
        "merchantAuthentication": {
            "name": "XXXXXX",
            "transactionKey": "XXXXXXXX"
        },
        "refId": "123456",
        "transactionRequest": {
            "transactionType": "authCaptureTransaction",
            "amount": "5",
            "payment": {
                "creditCard": {
                    "cardNumber": "5424000000000015",
                    "expirationDate": "2020-12",
                    "cardCode": "999"
                }
            }
        }
    }
}
这是原始的json请求 但在iOS中,在生成JSON的过程中,JSON对象和JSON对象的顺序发生了变化,这就是我们从api中得到错误的原因

{
    "createTransactionRequest": {
        "merchantAuthentication": {
            "name": "XXXXXX",
            "transactionKey": "XXXXXXX"
        },
        "refId": "123456",
        "transactionRequest": {
            "amount": "5",
            "payment": {
                "creditCard": {
                    "cardCode": "999",
                    "cardNumber": "5424000000000015",
                    "expirationDate": "2020-12"
                }
            },
            "transactionType": "authCaptureTransaction"
        }
    }
} 
在将这个JSON对象传递给API之后,我们将得到下面的错误

{
    "messages": {
        "resultCode": "Error",
        "message": [
            {
                "code": "E00003",
                "text": "The element 'transactionRequest' in namespace 'AnetApi/xml/v1/schema/AnetApiSchema.xsd' has invalid child element 'amount' in namespace 'AnetApi/xml/v1/schema/AnetApiSchema.xsd'. List of possible elements expected: 'transactionType' in namespace 'AnetApi/xml/v1/schema/AnetApiSchema.xsd'."
            }
        ]
    }
}
下面是我在应用程序中创建JSON对象的代码

var dict = Dictionary<String, Any>()
 dict=[
  "merchantAuthentication": [
    "name": "xxxxxxx",
    "transactionKey": "xxxxxxx"
  ],
  "refId": "5656",
  "transactionRequest": [
    "transactionType": "authCaptureTransaction",
    "amount": "55",
    "payment": [
      "creditCard": [
        "cardNumber": "4111111111111111",
        "expirationDate": "2020-12",
        "cardCode": "999"
      ]
    ]
  ]
]
var dict=Dictionary()
口述=[
“商品认证”:[
“名称”:“xxxxxxx”,
“transactionKey”:“xxxxxxx”
],
“refId”:“5656”,
“transactionRequest”:[
“transactionType”:“AuthCaptureTransation”,
“金额”:“55”,
“付款”:[
“信用卡”:[
“卡号”:“4111111111111”,
“到期日期”:“2020-12”,
“卡片代码”:“999”
]
]
]
]
打印后,此JSON序列被更改

您阅读了吗?从链接页面可以清楚地看到,您遇到的是在后端将JSON元素转换为XML元素的副作用,特别是在JSON请求中的参数排序方面:

关于JSON支持的说明 授权.Net API,它不是 基于REST,通过JSON的翻译提供JSON支持 元素转换为XML元素。而JSON通常不需要一个集合 按照对象中元素的顺序,XML需要严格的顺序。 使用Authorize.NETAPI的开发人员应该强制对 元素以匹配此API引用

该块下面的示例还显示了它们的
transactionType
参数作为
transactionRequest
对象中的第一个属性出现Tl;dr-在
事务请求
对象中向上移动
事务类型
参数:

{
    "createTransactionRequest": {
        "merchantAuthentication": {
            "name": "XXXXXX",
            "transactionKey": "XXXXXXX"
        },
        "refId": "123456",
        "transactionRequest": {
            "transactionType": "authCaptureTransaction",
            "amount": "5",
            "payment": {
                "creditCard": {
                    "cardCode": "999",
                    "cardNumber": "5424000000000015",
                    "expirationDate": "2020-12"
                }
            }
        }
    }
} 

请尝试以下代码

let merchantSub =   ["name": "XXXXXX",
                         "transactionKey": "XXXXXXX"]

    let childCreditCard = ["cardCode": "999",
                           "cardNumber": "5424000000000015",
                           "expirationDate": "2020-12"]

    let creditCard = ["creditCard":childCreditCard]

    let transactionRequest = ["amount": "",
                              "payment":creditCard,
                              "transactionType":""] as [String : Any]

    let merchantAuthentication = ["merchantAuthentication" :merchantSub,
                                  "refId" : "123456",
                                  "transactionRequest":transactionRequest] as [String : Any]

    let param = ["createTransactionRequest" : merchantAuthentication]


    if let data = try? JSONSerialization.data(withJSONObject: param, options: .prettyPrinted),
        let str = String(data: data, encoding: .utf8) {
        print(str)
    }

不过,我建议使用类,但对于初始级别,请这样做

我按照您的指示尝试,但它显示错误{“messages”:{“resultCode”:“error”,“message”:[{“code”:“E00003”,“text”:“命名空间‘AnetApi/xml/v1/schema/AnetApiSchema.xsd’中的元素‘createTransactionRequest’在命名空间‘AnetApi/xml/v1/schema/AnetApiSchema.xsd’中具有无效的子元素‘transactionType’。可能的元素列表应为‘AnetApi/xml/v1/schema/AnetApiSchema.xsd’中的‘transactionRequest’。”请检查
payment
元素是否为数组对象是的,它是对象的数组..它的顺序问题..我如何在应用程序中维护JSON的顺序?请首先在postman中与coma一起尝试您的JSON请求。如果成功,那么我将向您发送创建JSON请求的代码。同时向我发送您的代码,以便我了解。是的,我发送JSON对象这是我的代码,var dict=Dictionary()dict=[“merchantAuthentication”:[“name”:“xxxxxx”,“transactionKey”:“xxxxx”],“refId”:“5656”,“transactionRequest”:[“transactionType”:“AuthCaptureTransage”,“amount”:“55”,“payment”:[“creditCard”:[“cardNumber”:“4111111”expirationDate:“2020-12”,“cardCode:“999”]]]]打印后,此对象序列被更改。请在问题中添加此代码,而不是在注释中添加此代码。“尝试此”并不是一个好答案。您应该解释此解决问题的方式和原因。我建议阅读,”