【问题标题】:Getting 400 Bad Request When POSTing to Get Transaction TokenPOST 获取交易令牌时收到 400 错误请求
【发布时间】:2020-09-01 17:26:40
【问题描述】:

我正在尝试将我们的网站与Converge APIHosted Payments Page 集成。这是他们的文档链接https://developer.elavon.com/#/api/eb6e9106-0172-4305-bc5a-b3ebe832f823.rcosoomi/versions/5180a9f2-741b-439c-bced-5c84a822f39b.rcosoomi/documents?converge-integration-guide/book/integration_methods/../../book/integration_methods/hosted_payments.html

我无法通过第一步,即从他们的 API 端点请求交易令牌。我使用axios 使用正确的参数和URL 从我的服务器发送POST 请求,但是当我尝试POST 时,我得到400 Bad Request。当我在POSTMAN 中发出相同的请求时,我得到一个带有事务令牌的200 response。我与他们的开发人员交谈,他们说我所做的一切都是正确的,而且在我的代码中似乎没有什么奇怪的地方,所以即使他们也很难理解为什么我不能向他们的端点发出 POST 请求。很明显,我的代码中有一些他们的 API 不喜欢的东西,否则我不会在这里试图找到答案。

这是我发出 POST 请求的方式:

app.get('/converge_token_req', (request, response) => {

    let params = {
        ssl_merchant_id: '*****',
        ssl_user_id: '*****',
        ssl_pin: '*****',
        ssl_transaction_type: 'ccsale',
        ssl_amount: '1.00'
    }

    axios.post('https://api.demo.convergepay.com/hosted-payments/transaction_token', params, {
        headers: { 'Content_Type' : 'application/x-www-form-urlencoded' }
    }).then((res) => {
        response.send(res.data)
    }).catch((error) => {
        console.log('there was an error getting transaction token')
        response.send(error.message)
    })

})

这里是请求标头:

老实说,我没有尝试的想法。开发人员说一切看起来都很好,但我无法成功向他们的 API 发出请求。如果有人对此有任何想法,那就太好了。谢谢!

【问题讨论】:

    标签: node.js express axios


    【解决方案1】:

    以下代码对我有用:

    app.get('/converge_token_req', (request, response) => {
    
    let params = {
        ssl_merchant_id: '*****',
        ssl_user_id: '*****',
        ssl_pin: '*****',
        ssl_transaction_type: 'ccsale',
        ssl_amount: '1.00'
    }
    
      axios({
        method: 'post',
        url: 'https://api.demo.convergepay.com/hosted-payments/transaction_token',
        params: params
        }).then((res) => { response.send(res.data)
        }).catch((error) => {
        console.log('there was an error getting transaction token: ', 
        error)
      })
    
    })
    

    【讨论】:

      【解决方案2】:

      我正在尝试使用 python 做同样的事情

      elavon_headers = { 'Content_Type' : 'application/x-www-form-urlencoded' }
          
      elavon_data = json.dumps({'ssl_merchant_id': ssl_merchant_id, 'ssl_user_id' : ssl_user_id, 'ssl_pin' : ssl_pin, 'ssl_transaction_type': 'ccsale', 'ssl_ammount':'1.00'})    
       
      elavon_token_url = "https://api.demo.convergepay.com/hosted-payments/transaction_token"
      
      res = requests.post(elavon_token_url, data=elavon_data, headers=elavon_headers)
          
      print(res.headers)
      
      print(res.content)
      

      我得到了同样的错误请求 400 错误

      {'Server': 'Apache', 'X-Frame-Options': 'SAMEORIGIN', 'Strict-Transport-Security': 'max-age=31536000; includeSubDomains; preload', 'Cache-Control': 'no-store', 'Content-Type': 'text/html; charset=UTF-8', 'Content-Length': '76', 'X-Cnection': 'close', 'Date': 'Tue, 14 Dec 2021 01:46:19 GMT', 'Connection': 'close', 'Debug-XFF-Seen-by-Edge': '176.194.105.12', 'Client-IP-Seen-by-Edge': '176.194.105.12'}
      
      b'\n\n<h3><b>The application has encountered an error, error code = 400</b></h3>'
      

      【讨论】:

      • 请看我上面的回答。
      【解决方案3】:

      我已经找到了解决问题的方法。这里的问题是,在提交请求之前,converge 需要一个 x-www-form-urlencoded 字符串,该字符串需要是 Stringified。我找到了一个很好用的库,叫做qs,我像这样使用它:

      let params = qs.stringify({ // need this if content_type is application/x-www-form-urlencoded
                  ssl_merchant_id: env.CONVERGE.MERCHANT_ID,
                  ssl_user_id: env.CONVERGE.USER_ID,
                  ssl_pin: env.CONVERGE.PIN,
                  ssl_transaction_type: request.query.type,
                  ssl_amount: request.query.amount,
                  ssl_email: request.query.email,
                  ssl_company: request.query.company,
                  ssl_avs_address: request.query.address,
                  ssl_avs_zip: request.query.zip,
                  ssl_description: request.query.desc,
              })
          
              axios.post('https://api.convergepay.com/hosted-payments/transaction_token', params, {
                  headers: { 
                      'Content_Type' : 'application/x-www-form-urlencoded; charset=UTF-8' 
                  }
              }).then((res) => {
                  response.send(res.data)
              }).catch((error) => {
                  console.log('there was an error getting transaction token')
                  response.send(error.message)
              })
      
      

      我认为您也可以只使用 JSON.stringify() 而侥幸,但这种方式对我有用。

      【讨论】:

        猜你喜欢
        • 2019-06-23
        • 1970-01-01
        • 2016-12-08
        • 2023-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多