0

尝试在使用 Paypal 沙箱的 grails 项目中通过集成测试来测试 Paypal 付款。在这个阶段,我正在尝试使用 REST API 创建一个 Paypal 付款。

代码片段:

def jsonPaypalPayment ='''
{
  "intent": "sale",
  "redirect_urls": [{
    "return_url": "http://<return URL here>",
    "cancel_url": "http://<cancel URL here>"
  }],
  "payer": {
    "payment_method": "paypal"
  },
  "transactions": [{
    "amount": {
      "total": "0.10",
      "currency": "USD",
    },
    "description": "This is the payment transaction description."
  }]
}
'''

def client = new RESTClient("https://api.sandbox.paypal.com")
client.contentType = ContentType.JSON
client.headers.'Authorization' = "${tokenType} ${accessToken}"
def resp = client.post(path: "/v1/payments/payment", body: jsonPaypalPayment)

tokenType 和 accessToken 在上一步中成功检索。

post 方法返回“400 Bad Request”响应。从文档中获取了带有非常小的 mods 的示例请求。

完整的调试输出:

2013-05-14 12:31:08,276 <> [main] DEBUG impl.conn.SingleClientConnManager  - Get connection for route HttpRoute[{s}->https://api.sandbox.paypal.com]
2013-05-14 12:31:08,461 <> [main] DEBUG client.protocol.RequestAddCookies  - CookieSpec selected: best-match
2013-05-14 12:31:08,461 <> [main] DEBUG impl.client.DefaultHttpClient  - Attempt 1 to execute request
2013-05-14 12:31:08,461 <> [main] DEBUG impl.conn.DefaultClientConnection  - Sending request: POST /v1/payments/payment HTTP/1.1
2013-05-14 12:31:08,461 <> [main] DEBUG apache.http.wire  - >> "POST /v1/payments/payment HTTP/1.1[EOL]"
2013-05-14 12:31:08,461 <> [main] DEBUG apache.http.wire  - >> "Accept: application/json, application/javascript, text/javascript[EOL]"
2013-05-14 12:31:08,464 <> [main] DEBUG apache.http.wire  - >> "Authorization: Bearer 6-OVyjZ1VqEPctkqa7k72DIkwqY0kL2dIfIy6dSkdOc[EOL]"
2013-05-14 12:31:08,464 <> [main] DEBUG apache.http.wire  - >> "Content-Length: 356[EOL]"
2013-05-14 12:31:08,464 <> [main] DEBUG apache.http.wire  - >> "Content-Type: application/json[EOL]"
2013-05-14 12:31:08,464 <> [main] DEBUG apache.http.wire  - >> "Host: api.sandbox.paypal.com[EOL]"
2013-05-14 12:31:08,464 <> [main] DEBUG apache.http.wire  - >> "Connection: Keep-Alive[EOL]"
2013-05-14 12:31:08,464 <> [main] DEBUG apache.http.wire  - >> "Accept-Encoding: gzip,deflate[EOL]"
2013-05-14 12:31:08,464 <> [main] DEBUG apache.http.wire  - >> "[EOL]"
2013-05-14 12:31:08,464 <> [main] DEBUG apache.http.headers  - >> POST /v1/payments/payment HTTP/1.1
2013-05-14 12:31:08,464 <> [main] DEBUG apache.http.headers  - >> Accept: application/json, application/javascript, text/javascript
2013-05-14 12:31:08,464 <> [main] DEBUG apache.http.headers  - >> Authorization: Bearer 6-OVyjZ1VqEPctkqa7k72DIkwqY0kL2dIfIy6dSkdOc
2013-05-14 12:31:08,465 <> [main] DEBUG apache.http.headers  - >> Content-Length: 356
2013-05-14 12:31:08,465 <> [main] DEBUG apache.http.headers  - >> Content-Type: application/json
2013-05-14 12:31:08,465 <> [main] DEBUG apache.http.headers  - >> Host: api.sandbox.paypal.com
2013-05-14 12:31:08,465 <> [main] DEBUG apache.http.headers  - >> Connection: Keep-Alive
2013-05-14 12:31:08,465 <> [main] DEBUG apache.http.headers  - >> Accept-Encoding: gzip,deflate
2013-05-14 12:31:08,466 <> [main] DEBUG apache.http.wire  - >> "[\n]"
2013-05-14 12:31:08,466 <> [main] DEBUG apache.http.wire  - >> "{[\n]"
2013-05-14 12:31:08,466 <> [main] DEBUG apache.http.wire  - >> "  "intent": "sale",[\n]"
2013-05-14 12:31:08,466 <> [main] DEBUG apache.http.wire  - >> "  "redirect_urls": [{[\n]"
2013-05-14 12:31:08,466 <> [main] DEBUG apache.http.wire  - >> "    "return_url": "http://<return URL here>",[\n]"
2013-05-14 12:31:08,466 <> [main] DEBUG apache.http.wire  - >> "    "cancel_url": "http://<cancel URL here>"[\n]"
2013-05-14 12:31:08,471 <> [main] DEBUG apache.http.wire  - >> "  }],[\n]"
2013-05-14 12:31:08,471 <> [main] DEBUG apache.http.wire  - >> "  "payer": {[\n]"
2013-05-14 12:31:08,471 <> [main] DEBUG apache.http.wire  - >> "    "payment_method": "paypal"[\n]"
2013-05-14 12:31:08,471 <> [main] DEBUG apache.http.wire  - >> "  },[\n]"
2013-05-14 12:31:08,471 <> [main] DEBUG apache.http.wire  - >> "  "transactions": [{[\n]"
2013-05-14 12:31:08,471 <> [main] DEBUG apache.http.wire  - >> "    "amount": {[\n]"
2013-05-14 12:31:08,471 <> [main] DEBUG apache.http.wire  - >> "      "total": "0.10",[\n]"
2013-05-14 12:31:08,471 <> [main] DEBUG apache.http.wire  - >> "      "currency": "USD",[\n]"
2013-05-14 12:31:08,471 <> [main] DEBUG apache.http.wire  - >> "    },[\n]"
2013-05-14 12:31:08,471 <> [main] DEBUG apache.http.wire  - >> "    "description": "This is the payment transaction description."[\n]"
2013-05-14 12:31:08,471 <> [main] DEBUG apache.http.wire  - >> "  }][\n]"
2013-05-14 12:31:08,471 <> [main] DEBUG apache.http.wire  - >> "}[\n]"
2013-05-14 12:31:08,661 <> [main] DEBUG apache.http.wire  - << "HTTP/1.1 400 Bad Request[EOL]"
2013-05-14 12:31:08,662 <> [main] DEBUG apache.http.wire  - << "Server: Apache-Coyote/1.1[EOL]"
2013-05-14 12:31:08,662 <> [main] DEBUG apache.http.wire  - << "Date: Tue, 14 May 2013 16:31:08 GMT[EOL]"
2013-05-14 12:31:08,662 <> [main] DEBUG apache.http.wire  - << "Connection: close[EOL]"
2013-05-14 12:31:08,662 <> [main] DEBUG apache.http.wire  - << "PayPal-Debug-Id: 381936211a402[EOL]"
2013-05-14 12:31:08,662 <> [main] DEBUG apache.http.wire  - << "Content-Type: application/json[EOL]"
2013-05-14 12:31:08,662 <> [main] DEBUG apache.http.wire  - << "Content-Length: 195[EOL]"
2013-05-14 12:31:08,662 <> [main] DEBUG apache.http.wire  - << "Connection: close[EOL]"
2013-05-14 12:31:08,662 <> [main] DEBUG apache.http.wire  - << "[EOL]"
2013-05-14 12:31:08,662 <> [main] DEBUG impl.conn.DefaultClientConnection  - Receiving response: HTTP/1.1 400 Bad Request
2013-05-14 12:31:08,662 <> [main] DEBUG apache.http.headers  - << HTTP/1.1 400 Bad Request
2013-05-14 12:31:08,662 <> [main] DEBUG apache.http.headers  - << Server: Apache-Coyote/1.1
2013-05-14 12:31:08,662 <> [main] DEBUG apache.http.headers  - << Date: Tue, 14 May 2013 16:31:08 GMT
2013-05-14 12:31:08,662 <> [main] DEBUG apache.http.headers  - << Connection: close
2013-05-14 12:31:08,662 <> [main] DEBUG apache.http.headers  - << PayPal-Debug-Id: 381936211a402
2013-05-14 12:31:08,662 <> [main] DEBUG apache.http.headers  - << Content-Type: application/json
2013-05-14 12:31:08,662 <> [main] DEBUG apache.http.headers  - << Content-Length: 195
2013-05-14 12:31:08,662 <> [main] DEBUG apache.http.headers  - << Connection: close
2013-05-14 12:31:08,664 <> [main] DEBUG apache.http.wire  - << "{"name":"MALFORMED_REQUEST","message":"Incoming JSON request does not map to API request","information_link":"https://developer.paypal.com/docs/api/#MALFORMED_REQUEST","debug_id":"381936211a402"}"
2013-05-14 12:31:08,664 <> [main] DEBUG impl.conn.SingleClientConnManager  - Releasing connection org.apache.http.impl.conn.SingleClientConnManager$ConnAdapter@1e668b2
2013-05-14 12:31:08,664 <> [main] DEBUG impl.conn.SingleClientConnManager  - Released connection open but not reusable.
2013-05-14 12:31:08,664 <> [main] DEBUG impl.conn.DefaultClientConnection  - Connection shut down
| Failure:  testPayPalPayment(merch.storeapi.OrderIntegrationTests)
|  groovyx.net.http.HttpResponseException: Bad Request

我注意到 REST API 处于测试阶段。文件是否准确?端点是否经过测试?REST API 计划何时发布?关于错误请求的任何见解?提前致谢。

4

1 回答 1

5

您传递的 JSON 无效(格式错误),因为在currency值之后似乎有一个额外的逗号。

这是一个直接来自文档的有效示例:

{
   "intent":"sale",
   "redirect_urls":{
      "return_url":"http://<return URL here>",
      "cancel_url":"http://<cancel URL here>"
   },
   "payer":{
      "payment_method":"paypal"
   },
   "transactions":[
      {
         "amount":{
            "total":"7.47",
            "currency":"USD"
         },
         "description":"This is the payment transaction description."
      }
   ]
}

来源

于 2013-05-15T00:37:23.097 回答