-
-
Save leandrohsilveira/48d92d0815744b9c219af0d5efd778b9 to your computer and use it in GitHub Desktop.
Proof of concept (https://github.com/paypal/PayPal-Java-SDK/issues/339)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
The test run with debug logger level: