Skip to content

Instantly share code, notes, and snippets.

@leandrohsilveira
Created January 30, 2018 16:11
Show Gist options
  • Save leandrohsilveira/48d92d0815744b9c219af0d5efd778b9 to your computer and use it in GitHub Desktop.
Save leandrohsilveira/48d92d0815744b9c219af0d5efd778b9 to your computer and use it in GitHub Desktop.
package com.paypal.concept.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
import java.awt.Desktop;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.StringTokenizer;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.paypal.api.payments.Amount;
import com.paypal.api.payments.Item;
import com.paypal.api.payments.ItemList;
import com.paypal.api.payments.Links;
import com.paypal.api.payments.Payer;
import com.paypal.api.payments.PayerInfo;
import com.paypal.api.payments.Payment;
import com.paypal.api.payments.PaymentExecution;
import com.paypal.api.payments.RedirectUrls;
import com.paypal.api.payments.Transaction;
import com.paypal.base.rest.APIContext;
import com.paypal.base.rest.PayPalRESTException;
public class PayPalPaymentTest {
private static final String RESPONSE_ERROR_NAME = "AMOUNT_MISMATCH";
private static final int SOCKET_LISTEN_TIMEOUT = 120000;
private static final int SERVER_SOCKET_PORT = 8001;
private String clientId = "AdJbvXS9rxpE0RpKbyDNWgdMuUFzzQGqagF6iyAz9nx8zNaG_SH2rnMHU53RQNJrF3c-DrCBEO6w1LHX";
private String clientSecret = "EOJ0xGUuP7FhBmUsP_cDOOhrKx6SrkMXZXScslI3mAhJouxpov8_ZDUOwxKAqXP7OXHeWRzzQgGeFzHV";
private static final Logger logger = LoggerFactory.getLogger(PayPalPaymentTest.class);
@Test
public void paymentNegativeTest() throws Exception {
try {
// creating a payment
Payment payment = createPayment();
payment = payment.create(getContextoAPIPaypal(new HashMap<String, String>()));
// opening the approval URL in default web browser
String approvalUrl = getApprovalUrl(payment.getLinks());
openInDefaultWebBrowser(approvalUrl);
// open a server socket to listen PayPal return, this will wait a single request until socket timeout.
Map<String, String> queryStringParams = listenToApproval();
// retrieving the payer reference
String payerId = queryStringParams.get("PayerID");
if (payment.getPayer().getPayerInfo() == null) {
payment.getPayer().setPayerInfo(new PayerInfo());
}
payment.getPayer().getPayerInfo().setPayerId(payerId);
PaymentExecution paymentExecution = new PaymentExecution();
paymentExecution.setPayerId(payerId);
// setting a mock response
Map<String, String> httpHeaders = getMockResponseHeader(RESPONSE_ERROR_NAME);
payment.execute(getContextoAPIPaypal(httpHeaders), paymentExecution);
fail("should throw the PayPalRESTException exception");
} catch (PayPalRESTException e) {
logger.error(e.getMessage(), e);
assertNotNull(e.getDetails());
assertEquals(RESPONSE_ERROR_NAME, e.getDetails().getName());
}
}
private Map<String, String> listenToApproval() throws SocketException, IOException {
try (ServerSocket serverSocket = new ServerSocket(SERVER_SOCKET_PORT)) {
serverSocket.setSoTimeout(SOCKET_LISTEN_TIMEOUT);
try(Socket socket = serverSocket.accept();
InputStream content = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(content, StandardCharsets.UTF_8));) {
return getQueryStringParameters(reader);
}
}
}
private Map<String, String> getQueryStringParameters(BufferedReader reader) throws IOException {
String line = reader.readLine();
String queryString = line.replaceAll("GET /\\?", "").replaceAll(" HTTP/1.1", "");
Map<String, String> params = new HashMap<>();
StringTokenizer keyValueParamTokenizer = new StringTokenizer(queryString, "&");
while (keyValueParamTokenizer.hasMoreElements()) {
String keyValueParam = (String) keyValueParamTokenizer.nextElement();
StringTokenizer paramTokenizer = new StringTokenizer(keyValueParam, "=");
String key = paramTokenizer.nextToken();
String value = paramTokenizer.nextToken();
params.put(key, value);
}
return params;
}
private APIContext getContextoAPIPaypal(Map<String, String> customHttpHeaders) {
APIContext apiContext = new APIContext(clientId, clientSecret, "sandbox");
apiContext.addHTTPHeaders(customHttpHeaders);
return apiContext;
}
private Payment createPayment() {
String url = String.format("http://localhost:%d", SERVER_SOCKET_PORT);
DecimalFormat decimalFormat = new DecimalFormat("0.00");
decimalFormat.setDecimalFormatSymbols(DecimalFormatSymbols.getInstance(Locale.US));
Amount amount = new Amount();
amount.setCurrency("BRL");
amount.setTotal(decimalFormat.format(25));
Item item = new Item();
item.setCurrency(amount.getCurrency());
item.setName("Test item");
item.setPrice(decimalFormat.format(25));
item.setQuantity("1");
ItemList itemList = new ItemList();
itemList.setItems(Arrays.asList(item));
Transaction transaction = new Transaction();
transaction.setDescription("Test checkout.");
transaction.setAmount(amount);
transaction.setItemList(itemList);
Payer payer = new Payer();
payer.setPaymentMethod("paypal");
Payment payment = new Payment();
payment.setIntent("sale");
payment.setPayer(payer);
payment.setTransactions(Arrays.asList(transaction));
payment.setRedirectUrls(new RedirectUrls());
payment.getRedirectUrls().setReturnUrl(url);
payment.getRedirectUrls().setCancelUrl(url);
return payment;
}
public String getApprovalUrl(List<Links> links) {
String urlAprovacao = null;
for (Links link : links) {
if (link.getRel().equalsIgnoreCase("approval_url")) {
urlAprovacao = link.getHref();
}
}
return urlAprovacao;
}
private Map<String, String> getMockResponseHeader(String responseName) {
Map<String, String> headers = new HashMap<>();
headers.put("PayPal-Mock-Response", String.format("{\"mock_application_codes\":\"%s\"}", responseName));
return headers;
}
private void openInDefaultWebBrowser(String approvalUrl) throws IOException, URISyntaxException {
Desktop.getDesktop().browse(new URI(approvalUrl));
}
}
@leandrohsilveira
Copy link
Author

The test run with debug logger level:

2018-01-29 17:04:53,268 DEBUG com.paypal.base.ConfigManager:95: sdk_config.properties not present. Skipping...
2018-01-29 17:04:53,505 DEBUG com.paypal.base.rest.OAuthTokenCredential:378: request header: {Authorization=Basic QWRKYnZYUzlyeHBFMFJwS2J5RE5XZ2RNdVVGenpRR3FhZ0Y2aXlBejlueDh6TmFHX1NIMnJuTUhVNTNSUU5KckYzYy1EckNCRU82dzFMSFg6RU9KMHhHVXVQN0ZoQm1Vc1BfY0RPT2hyS3g2U3JrTVhaWFNjc2xJM21BaEpvdXhwb3Y4X1pEVU93eEtBcVhQN09YSGVXUnp6UWdHZUZ6SFY=, User-Agent=PayPalSDK/PayPal-Java-SDK 1.14.0 (v=1.7.0_51; vendor=Oracle Corporation; bit=64; os=Windows_8 6.2), Accept=application/json, Content-Type=application/x-www-form-urlencoded}
2018-01-29 17:04:53,505 DEBUG com.paypal.base.rest.OAuthTokenCredential:379: request body: grant_type=client_credentials
2018-01-29 17:04:53,505 DEBUG com.paypal.base.HttpConnection:225: curl command: 
curl --verbose --request POST 'https://api.sandbox.paypal.com/v1/oauth2/token' \
  --header "Authorization:Basic QWRKYnZYUzlyeHBFMFJwS2J5RE5XZ2RNdVVGenpRR3FhZ0Y2aXlBejlueDh6TmFHX1NIMnJuTUhVNTNSUU5KckYzYy1EckNCRU82dzFMSFg6RU9KMHhHVXVQN0ZoQm1Vc1BfY0RPT2hyS3g2U3JrTVhaWFNjc2xJM21BaEpvdXhwb3Y4X1pEVU93eEtBcVhQN09YSGVXUnp6UWdHZUZ6SFY=" \
  --header "User-Agent:PayPalSDK/PayPal-Java-SDK 1.14.0 (v=1.7.0_51; vendor=Oracle Corporation; bit=64; os=Windows_8 6.2)" \
  --header "Accept:application/json" \
  --header "Content-Type:application/x-www-form-urlencoded" \
  --data 'grant_type=client_credentials'
2018-01-29 17:04:54,824 DEBUG com.paypal.base.rest.OAuthTokenCredential:385: response header: {null=[HTTP/1.1 200 OK], X-PAYPAL-TOKEN-SERVICE=[IAAS], Vary=[Authorization], Date=[Mon, 29 Jan 2018 19:04:58 GMT], Content-Length=[710], Paypal-Debug-Id=[67c6013788d90], Set-Cookie=[X-PP-SILOVER=; Expires=Thu, 01 Jan 1970 00:00:01 GMT, X-PP-SILOVER=name%3DSANDBOX3.API.1%26silo_version%3D1880%26app%3Dapiplatformproxyserv%26TIME%3D1517317978%26HTTP_X_PP_AZ_LOCATOR%3Dsandbox.slc; Expires=Mon, 29 Jan 2018 19:34:58 GMT; domain=.paypal.com; path=/; Secure; HttpOnly], Content-Type=[application/json], Connection=[close], HTTP_X_PP_AZ_LOCATOR=[sandbox.slc], paypal-debug-id=[67c6013788d90], Server=[Apache]}
2018-01-29 17:04:54,824 DEBUG com.paypal.base.rest.OAuthTokenCredential:386: response: {"scope":"https://uri.paypal.com/services/disputes/read-seller https://uri.paypal.com/services/subscriptions https://api.paypal.com/v1/payments/.* https://uri.paypal.com/services/disputes/read-buyer https://api.paypal.com/v1/vault/credit-card https://uri.paypal.com/services/applications/webhooks openid https://uri.paypal.com/payments/payouts https://uri.paypal.com/services/disputes/update-seller https://api.paypal.com/v1/vault/credit-card/.*","nonce":"2018-01-29T19:04:58ZxLOmREfbczJWOQPBg9F9KNgnBlSculMhEnlKYLDV2zA","access_token":"A21AAG1Ev_JgNtsL4-o9w77X7AgGoGIr3eKwNxFLiXyyNyvsCNp-kkL3db8kLTJuuoEu3qlRsURqxMRjU1rEERrJx5NjGMqmA","token_type":"Bearer","app_id":"APP-80W284485P519543T","expires_in":32400}
2018-01-29 17:04:54,840 DEBUG com.paypal.base.rest.PayPalResource:412: request header: {Authorization=Bearer A21AAG1Ev_JgNtsL4-o9w77X7AgGoGIr3eKwNxFLiXyyNyvsCNp-kkL3db8kLTJuuoEu3qlRsURqxMRjU1rEERrJx5NjGMqmA, PayPal-Request-Id=e6d4e4c5-da7a-468e-8a9f-3295432f78c9, User-Agent=PayPalSDK/  (v=1.7.0_51; vendor=Oracle Corporation; bit=64; os=Windows_8 6.2), Content-Type=application/json, Accept=application/json}
2018-01-29 17:04:54,840 DEBUG com.paypal.base.rest.PayPalResource:413: request body: {
  "intent": "sale",
  "payer": {
    "payment_method": "paypal"
  },
  "transactions": [
    {
      "amount": {
        "currency": "BRL",
        "total": "25.00"
      },
      "description": "Test checkout.",
      "item_list": {
        "items": [
          {
            "name": "Test item",
            "quantity": "1",
            "price": "25.00",
            "currency": "BRL"
          }
        ]
      }
    }
  ],
  "redirect_urls": {
    "return_url": "http://localhost:8001",
    "cancel_url": "http://localhost:8001"
  }
}
2018-01-29 17:04:54,841 DEBUG com.paypal.base.HttpConnection:225: curl command: 
curl --verbose --request POST 'https://api.sandbox.paypal.com/v1/payments/payment' \
  --header "Authorization:Bearer A21AAG1Ev_JgNtsL4-o9w77X7AgGoGIr3eKwNxFLiXyyNyvsCNp-kkL3db8kLTJuuoEu3qlRsURqxMRjU1rEERrJx5NjGMqmA" \
  --header "PayPal-Request-Id:e6d4e4c5-da7a-468e-8a9f-3295432f78c9" \
  --header "User-Agent:PayPalSDK/  (v=1.7.0_51; vendor=Oracle Corporation; bit=64; os=Windows_8 6.2)" \
  --header "Content-Type:application/json" \
  --header "Accept:application/json" \
  --data '{
  "intent": "sale",
  "payer": {
    "payment_method": "paypal"
  },
  "transactions": [
    {
      "amount": {
        "currency": "BRL",
        "total": "25.00"
      },
      "description": "Test checkout.",
      "item_list": {
        "items": [
          {
            "name": "Test item",
            "quantity": "1",
            "price": "25.00",
            "currency": "BRL"
          }
        ]
      }
    }
  ],
  "redirect_urls": {
    "return_url": "http://localhost:8001",
    "cancel_url": "http://localhost:8001"
  }
}'
2018-01-29 17:04:56,069 DEBUG com.paypal.base.rest.PayPalResource:423: response: {"id":"PAY-4Y939080DF027712BLJXXAWY","intent":"sale","state":"created","payer":{"payment_method":"paypal"},"transactions":[{"amount":{"total":"25.00","currency":"BRL"},"description":"Test checkout.","item_list":{"items":[{"name":"Test item","price":"25.00","currency":"BRL","quantity":1}]},"related_resources":[]}],"create_time":"2018-01-29T19:04:59Z","links":[{"href":"https://api.sandbox.paypal.com/v1/payments/payment/PAY-4Y939080DF027712BLJXXAWY","rel":"self","method":"GET"},{"href":"https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-35V70233H2912670U","rel":"approval_url","method":"REDIRECT"},{"href":"https://api.sandbox.paypal.com/v1/payments/payment/PAY-4Y939080DF027712BLJXXAWY/execute","rel":"execute","method":"POST"}]}
2018-01-29 17:05:20,336 DEBUG com.paypal.base.rest.PayPalResource:412: request header: {Authorization=Bearer A21AAG1Ev_JgNtsL4-o9w77X7AgGoGIr3eKwNxFLiXyyNyvsCNp-kkL3db8kLTJuuoEu3qlRsURqxMRjU1rEERrJx5NjGMqmA, PayPal-Mock-Response={"mock_application_codes":"AMOUNT_MISMATCH"}, User-Agent=PayPalSDK/  (v=1.7.0_51; vendor=Oracle Corporation; bit=64; os=Windows_8 6.2), PayPal-Request-Id=508258ff-1a63-4d2c-9f90-96f4eaea6299, Content-Type=application/json}
2018-01-29 17:05:20,336 DEBUG com.paypal.base.rest.PayPalResource:413: request body: {
  "payer_id": "BF898XQFFAQWA"
}
2018-01-29 17:05:20,337 DEBUG com.paypal.base.HttpConnection:225: curl command: 
curl --verbose --request POST 'https://api.sandbox.paypal.com/v1/payments/payment/PAY-4Y939080DF027712BLJXXAWY/execute' \
  --header "Authorization:Bearer A21AAG1Ev_JgNtsL4-o9w77X7AgGoGIr3eKwNxFLiXyyNyvsCNp-kkL3db8kLTJuuoEu3qlRsURqxMRjU1rEERrJx5NjGMqmA" \
  --header "PayPal-Mock-Response:{"mock_application_codes":"AMOUNT_MISMATCH"}" \
  --header "User-Agent:PayPalSDK/  (v=1.7.0_51; vendor=Oracle Corporation; bit=64; os=Windows_8 6.2)" \
  --header "PayPal-Request-Id:508258ff-1a63-4d2c-9f90-96f4eaea6299" \
  --header "Content-Type:application/json" \
  --data '{
  "payer_id": "BF898XQFFAQWA"
}'
2018-01-29 17:05:21,293 ERROR com.paypal.base.HttpConnection:153: Response code: 400	Error response: {    "name": "AMOUNT_MISMATCH",    "message": "The totals of the cart item amounts do not match sale amounts.",    "information_link": "https://developer.paypal.com/docs/api/payments/#errors",    "details": "The amount total does not match the item amount totals."}
2018-01-29 17:05:21,295 ERROR com.paypal.base.rest.PayPalRESTException:79: Exception thrown while parsing error response: {    "name": "AMOUNT_MISMATCH",    "message": "The totals of the cart item amounts do not match sale amounts.",    "information_link": "https://developer.paypal.com/docs/api/payments/#errors",    "details": "The amount total does not match the item amount totals."}
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 265
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:176) ~[gson-2.2.2.jar:?]
	at com.google.gson.Gson.fromJson(Gson.java:795) ~[gson-2.2.2.jar:?]
	at com.google.gson.Gson.fromJson(Gson.java:761) ~[gson-2.2.2.jar:?]
	at com.google.gson.Gson.fromJson(Gson.java:710) ~[gson-2.2.2.jar:?]
	at com.google.gson.Gson.fromJson(Gson.java:682) ~[gson-2.2.2.jar:?]
	at com.paypal.base.rest.JSONFormatter.fromJSON(JSONFormatter.java:75) ~[rest-api-sdk-1.14.0.jar:?]
	at com.paypal.base.rest.PayPalRESTException.createFromHttpErrorException(PayPalRESTException.java:76) [rest-api-sdk-1.14.0.jar:?]
	at com.paypal.base.rest.PayPalResource.execute(PayPalResource.java:431) [rest-api-sdk-1.14.0.jar:?]
	at com.paypal.base.rest.PayPalResource.configureAndExecute(PayPalResource.java:295) [rest-api-sdk-1.14.0.jar:?]
	at com.paypal.base.rest.PayPalResource.configureAndExecute(PayPalResource.java:228) [rest-api-sdk-1.14.0.jar:?]
	at com.paypal.api.payments.Payment.execute(Payment.java:226) [rest-api-sdk-1.14.0.jar:?]
	at com.paypal.concept.test.PayPalPaymentTest.paymentNegativeTest(PayPalPaymentTest.java:83) [test-classes/:?]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.7.0_51]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[?:1.7.0_51]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.7.0_51]
	at java.lang.reflect.Method.invoke(Method.java:606) ~[?:1.7.0_51]
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) [junit-4.12.jar:4.12]
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) [junit-4.12.jar:4.12]
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) [junit-4.12.jar:4.12]
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) [junit-4.12.jar:4.12]
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) [junit-4.12.jar:4.12]
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) [junit-4.12.jar:4.12]
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) [junit-4.12.jar:4.12]
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) [junit-4.12.jar:4.12]
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) [junit-4.12.jar:4.12]
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) [junit-4.12.jar:4.12]
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) [junit-4.12.jar:4.12]
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) [junit-4.12.jar:4.12]
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363) [junit-4.12.jar:4.12]
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) [.cp/:?]
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) [.cp/:?]
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538) [.cp/:?]
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760) [.cp/:?]
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460) [.cp/:?]
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206) [.cp/:?]
Caused by: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 265
	at com.google.gson.stream.JsonReader.expect(JsonReader.java:339) ~[gson-2.2.2.jar:?]
	at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:306) ~[gson-2.2.2.jar:?]
	at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:79) ~[gson-2.2.2.jar:?]
	at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:60) ~[gson-2.2.2.jar:?]
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93) ~[gson-2.2.2.jar:?]
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172) ~[gson-2.2.2.jar:?]
	... 34 more
2018-01-29 17:05:21,300 ERROR com.paypal.concept.test.PayPalPaymentTest:87: Response code: 400	Error response: {    "name": "AMOUNT_MISMATCH",    "message": "The totals of the cart item amounts do not match sale amounts.",    "information_link": "https://developer.paypal.com/docs/api/payments/#errors",    "details": "The amount total does not match the item amount totals."}
com.paypal.base.rest.PayPalRESTException: Response code: 400	Error response: {    "name": "AMOUNT_MISMATCH",    "message": "The totals of the cart item amounts do not match sale amounts.",    "information_link": "https://developer.paypal.com/docs/api/payments/#errors",    "details": "The amount total does not match the item amount totals."}
	at com.paypal.base.rest.PayPalRESTException.createFromHttpErrorException(PayPalRESTException.java:72) ~[rest-api-sdk-1.14.0.jar:?]
	at com.paypal.base.rest.PayPalResource.execute(PayPalResource.java:431) ~[rest-api-sdk-1.14.0.jar:?]
	at com.paypal.base.rest.PayPalResource.configureAndExecute(PayPalResource.java:295) ~[rest-api-sdk-1.14.0.jar:?]
	at com.paypal.base.rest.PayPalResource.configureAndExecute(PayPalResource.java:228) ~[rest-api-sdk-1.14.0.jar:?]
	at com.paypal.api.payments.Payment.execute(Payment.java:226) ~[rest-api-sdk-1.14.0.jar:?]
	at com.paypal.concept.test.PayPalPaymentTest.paymentNegativeTest(PayPalPaymentTest.java:83) [test-classes/:?]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.7.0_51]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[?:1.7.0_51]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.7.0_51]
	at java.lang.reflect.Method.invoke(Method.java:606) ~[?:1.7.0_51]
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) [junit-4.12.jar:4.12]
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) [junit-4.12.jar:4.12]
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) [junit-4.12.jar:4.12]
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) [junit-4.12.jar:4.12]
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) [junit-4.12.jar:4.12]
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) [junit-4.12.jar:4.12]
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) [junit-4.12.jar:4.12]
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) [junit-4.12.jar:4.12]
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) [junit-4.12.jar:4.12]
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) [junit-4.12.jar:4.12]
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) [junit-4.12.jar:4.12]
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) [junit-4.12.jar:4.12]
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363) [junit-4.12.jar:4.12]
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) [.cp/:?]
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) [.cp/:?]
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538) [.cp/:?]
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760) [.cp/:?]
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460) [.cp/:?]
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206) [.cp/:?]
Caused by: com.paypal.base.exception.HttpErrorException: Response code: 400	Error response: {    "name": "AMOUNT_MISMATCH",    "message": "The totals of the cart item amounts do not match sale amounts.",    "information_link": "https://developer.paypal.com/docs/api/payments/#errors",    "details": "The amount total does not match the item amount totals."}
	at com.paypal.base.HttpConnection.executeWithStream(HttpConnection.java:162) ~[rest-api-sdk-1.14.0.jar:?]
	at com.paypal.base.HttpConnection.execute(HttpConnection.java:65) ~[rest-api-sdk-1.14.0.jar:?]
	at com.paypal.base.rest.PayPalResource.execute(PayPalResource.java:417) ~[rest-api-sdk-1.14.0.jar:?]
	... 27 more
Caused by: java.io.IOException: Server returned HTTP response code: 400 for URL: https://api.sandbox.paypal.com/v1/payments/payment/PAY-4Y939080DF027712BLJXXAWY/execute
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.7.0_51]
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) ~[?:1.7.0_51]
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.7.0_51]
	at java.lang.reflect.Constructor.newInstance(Constructor.java:526) ~[?:1.7.0_51]
	at sun.net.www.protocol.http.HttpURLConnection$6.run(HttpURLConnection.java:1675) ~[?:1.7.0_51]
	at sun.net.www.protocol.http.HttpURLConnection$6.run(HttpURLConnection.java:1673) ~[?:1.7.0_51]
	at java.security.AccessController.doPrivileged(Native Method) ~[?:1.7.0_51]
	at sun.net.www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:1671) ~[?:1.7.0_51]
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1244) ~[?:1.7.0_51]
	at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254) ~[?:1.7.0_51]
	at com.paypal.base.HttpConnection.executeWithStream(HttpConnection.java:132) ~[rest-api-sdk-1.14.0.jar:?]
	at com.paypal.base.HttpConnection.execute(HttpConnection.java:65) ~[rest-api-sdk-1.14.0.jar:?]
	at com.paypal.base.rest.PayPalResource.execute(PayPalResource.java:417) ~[rest-api-sdk-1.14.0.jar:?]
	... 27 more
Caused by: java.io.IOException: Server returned HTTP response code: 400 for URL: https://api.sandbox.paypal.com/v1/payments/payment/PAY-4Y939080DF027712BLJXXAWY/execute
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1626) ~[?:1.7.0_51]
	at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:468) ~[?:1.7.0_51]
	at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:338) ~[?:1.7.0_51]
	at com.paypal.base.HttpConnection.executeWithStream(HttpConnection.java:117) ~[rest-api-sdk-1.14.0.jar:?]
	at com.paypal.base.HttpConnection.execute(HttpConnection.java:65) ~[rest-api-sdk-1.14.0.jar:?]
	at com.paypal.base.rest.PayPalResource.execute(PayPalResource.java:417) ~[rest-api-sdk-1.14.0.jar:?]
	... 27 more

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment