Reputation: 779
Trying to test Paypal payments via integration test in a grails project using Paypal sandbox. At this stage, I'm trying to create a Paypal payment using the REST API.
code snippet:
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 and accessToken are retrieved successfully in previous step.
The post method returns with "400 Bad Request" response. Took the sample request from the documentation with very minor mods.
Full debug output:
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
I've noticed that the REST API is in Beta. Is the documentation accurate? Have the endpoints been tested? When is the REST API scheduled for release? Any insights regarding the bad request? Thanks in advance.
Upvotes: 0
Views: 6141
Reputation: 620
The JSON you are passing is not valid (malformed) since it seems you have an extra comma after the currency
value.
Here is a valid example that is directly from the documentation:
{
"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."
}
]
}
Upvotes: 5