package com.braintreegateway.integrationtest; import java.math.BigDecimal; import java.util.Date; import java.util.List; import java.util.ArrayList; import java.util.Random; import java.util.regex.Pattern; import com.braintreegateway.*; import com.braintreegateway.testhelpers.TestHelper; import com.braintreegateway.exceptions.NotFoundException; import com.braintreegateway.test.Nonce; import com.braintreegateway.util.NodeWrapper; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.*; public class PaymentMethodIT extends IntegrationTest { @Test public void createPayPalAccountWithNonce() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); assertTrue(customerResult.isSuccess()); Customer customer = customerResult.getTarget(); String nonce = TestHelper.generateFuturePaymentPayPalNonce(gateway); PaymentMethodRequest request = new PaymentMethodRequest(). customerId(customer.getId()). paymentMethodNonce(nonce); Result<? extends PaymentMethod> result = gateway.paymentMethod().create(request); assertTrue(result.isSuccess()); PaymentMethod paymentMethod = result.getTarget(); assertNotNull(paymentMethod.getToken()); assertNotNull(paymentMethod.getImageUrl()); PayPalAccount paypalAccount = (PayPalAccount) paymentMethod; assertNotNull(paypalAccount.getEmail()); assertNotNull(paypalAccount.getImageUrl()); assertNotNull(paypalAccount.getCustomerId()); assertNotNull(paypalAccount.getSubscriptions()); } @Test public void createPayPalAccountFromNonceWithPayPalOptions() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); assertTrue(customerResult.isSuccess()); Customer customer = customerResult.getTarget(); String nonce = TestHelper.generateOrderPaymentPayPalNonce(gateway); PaymentMethodRequest request = new PaymentMethodRequest(). customerId(customer.getId()). paymentMethodNonce(nonce). options(). paypal(). payeeEmail("payee@example.com"). orderId("merchant-order-id"). customField("custom merchant field"). description("merchant description"). amount(new BigDecimal("1.23")). done(). done(); Result<? extends PaymentMethod> result = gateway.paymentMethod().create(request); assertTrue(result.isSuccess()); PaymentMethod paymentMethod = result.getTarget(); assertNotNull(paymentMethod.getToken()); assertNotNull(paymentMethod.getImageUrl()); PayPalAccount paypalAccount = (PayPalAccount) paymentMethod; assertNotNull(paypalAccount.getEmail()); assertNotNull(paypalAccount.getImageUrl()); assertNotNull(paypalAccount.getCustomerId()); assertNotNull(paypalAccount.getSubscriptions()); } @Test public void createApplePayCardFromNonce() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); assertTrue(customerResult.isSuccess()); Customer customer = customerResult.getTarget(); String nonce = Nonce.ApplePayAmex; PaymentMethodRequest request = new PaymentMethodRequest(). customerId(customer.getId()). paymentMethodNonce(nonce); Result<? extends PaymentMethod> result = gateway.paymentMethod().create(request); assertTrue(result.isSuccess()); PaymentMethod paymentMethod = result.getTarget(); assertNotNull(paymentMethod.getToken()); assertNotNull(paymentMethod.getImageUrl()); ApplePayCard applePayCard = (ApplePayCard) paymentMethod; assertNotNull(applePayCard.getCardType()); assertNotNull(applePayCard.getPaymentInstrumentName()); assertNotNull(applePayCard.getCreatedAt()); assertNotNull(applePayCard.getUpdatedAt()); assertNotNull(applePayCard.getExpirationMonth()); assertNotNull(applePayCard.getExpirationYear()); assertNotNull(applePayCard.getExpired()); assertNotNull(applePayCard.getSubscriptions()); assertNotNull(applePayCard.getLast4()); assertNotNull(applePayCard.getCustomerId()); assertTrue(applePayCard.getSubscriptions().isEmpty()); } @Test public void createApplePayCardFromNonceWithDefault() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); assertTrue(customerResult.isSuccess()); Customer customer = customerResult.getTarget(); String nonce = Nonce.ApplePayAmex; PaymentMethodRequest request = new PaymentMethodRequest(). customerId(customer.getId()). paymentMethodNonce(nonce). options(). makeDefault(true). done(); Result<? extends PaymentMethod> result = gateway.paymentMethod().create(request); assertTrue(result.isSuccess()); PaymentMethod paymentMethod = result.getTarget(); assertNotNull(paymentMethod.getToken()); assertNotNull(paymentMethod.getImageUrl()); assertNotNull(paymentMethod.getCustomerId()); assertTrue(paymentMethod.isDefault()); assertNotNull(paymentMethod.getSubscriptions()); } @Test public void createAndroidPayProxyCardFromNonce() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); assertTrue(customerResult.isSuccess()); Customer customer = customerResult.getTarget(); String nonce = Nonce.AndroidPayDiscover; PaymentMethodRequest request = new PaymentMethodRequest(). customerId(customer.getId()). paymentMethodNonce(nonce); Result<? extends PaymentMethod> result = gateway.paymentMethod().create(request); assertTrue(result.isSuccess()); PaymentMethod paymentMethod = result.getTarget(); assertNotNull(paymentMethod.getToken()); assertNotNull(paymentMethod.getImageUrl()); assertNotNull(paymentMethod.getCustomerId()); assertNotNull(paymentMethod.getSubscriptions()); } @Test public void createAndroidPayNetworkTokenFromNonce() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); assertTrue(customerResult.isSuccess()); Customer customer = customerResult.getTarget(); String nonce = Nonce.AndroidPayMasterCard; PaymentMethodRequest request = new PaymentMethodRequest(). customerId(customer.getId()). paymentMethodNonce(nonce); Result<? extends PaymentMethod> result = gateway.paymentMethod().create(request); assertTrue(result.isSuccess()); PaymentMethod paymentMethod = result.getTarget(); assertNotNull(paymentMethod.getToken()); assertNotNull(paymentMethod.getImageUrl()); assertNotNull(paymentMethod.getCustomerId()); assertNotNull(paymentMethod.getSubscriptions()); } @Test public void createAndroidPayCardFromNonceWithDefault() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); assertTrue(customerResult.isSuccess()); Customer customer = customerResult.getTarget(); String nonce = Nonce.AndroidPay; PaymentMethodRequest request = new PaymentMethodRequest(). customerId(customer.getId()). paymentMethodNonce(nonce). options(). makeDefault(true). done(); Result<? extends PaymentMethod> result = gateway.paymentMethod().create(request); assertTrue(result.isSuccess()); PaymentMethod paymentMethod = result.getTarget(); assertNotNull(paymentMethod.getToken()); assertNotNull(paymentMethod.getImageUrl()); assertTrue(paymentMethod.isDefault()); AndroidPayCard androidPayCard = (AndroidPayCard) paymentMethod; assertNotNull(androidPayCard.getSourceCardType()); assertNotNull(androidPayCard.getSourceCardLast4()); assertNotNull(androidPayCard.getVirtualCardType()); assertNotNull(androidPayCard.getVirtualCardLast4()); assertNotNull(androidPayCard.getCardType()); assertNotNull(androidPayCard.getLast4()); assertNotNull(androidPayCard.getExpirationMonth()); assertNotNull(androidPayCard.getExpirationYear()); assertNotNull(androidPayCard.getToken()); assertNotNull(androidPayCard.getGoogleTransactionId()); assertNotNull(androidPayCard.getBin()); assertTrue(androidPayCard.isDefault()); assertNotNull(androidPayCard.getImageUrl()); assertNotNull(androidPayCard.getCreatedAt()); assertNotNull(androidPayCard.getUpdatedAt()); assertNotNull(androidPayCard.getSubscriptions()); assertNotNull(androidPayCard.getCustomerId()); assertTrue(androidPayCard.getSubscriptions().isEmpty()); } @Test public void createAmexExpressCheckoutCardFromNonce() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); assertTrue(customerResult.isSuccess()); Customer customer = customerResult.getTarget(); String nonce = Nonce.AmexExpressCheckout; PaymentMethodRequest request = new PaymentMethodRequest(). customerId(customer.getId()). paymentMethodNonce(nonce). options(). makeDefault(true). done(); Result<? extends PaymentMethod> result = gateway.paymentMethod().create(request); assertTrue(result.isSuccess()); PaymentMethod paymentMethod = result.getTarget(); assertNotNull(paymentMethod.getToken()); assertNotNull(paymentMethod.getImageUrl()); assertTrue(paymentMethod.isDefault()); AmexExpressCheckoutCard amexExpressCheckoutCard = (AmexExpressCheckoutCard) paymentMethod; assertNotNull(amexExpressCheckoutCard.getCreatedAt()); assertNotNull(amexExpressCheckoutCard.getUpdatedAt()); assertNotNull(amexExpressCheckoutCard.getSubscriptions()); assertNotNull(amexExpressCheckoutCard.getBin()); assertNotNull(amexExpressCheckoutCard.getCardMemberExpiryDate()); assertNotNull(amexExpressCheckoutCard.getCardMemberNumber()); assertNotNull(amexExpressCheckoutCard.getCardType()); assertNotNull(amexExpressCheckoutCard.getCustomerId()); assertNotNull(amexExpressCheckoutCard.getExpirationMonth()); assertNotNull(amexExpressCheckoutCard.getExpirationYear()); assertNotNull(amexExpressCheckoutCard.getImageUrl()); assertNotNull(amexExpressCheckoutCard.getSourceDescription()); assertNotNull(amexExpressCheckoutCard.getToken()); } @Test public void createVenmoAccountFromNonce() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); assertTrue(customerResult.isSuccess()); Customer customer = customerResult.getTarget(); String nonce = Nonce.VenmoAccount; PaymentMethodRequest request = new PaymentMethodRequest() .customerId(customer.getId()) .paymentMethodNonce(nonce) .options() .makeDefault(true) .done(); Result<? extends PaymentMethod> result = gateway.paymentMethod().create(request); assertTrue(result.isSuccess()); PaymentMethod paymentMethod = result.getTarget(); assertNotNull(paymentMethod.getToken()); assertTrue(paymentMethod.isDefault()); VenmoAccount venmoAccount = (VenmoAccount) paymentMethod; assertNotNull(venmoAccount.getToken()); assertNotNull(venmoAccount.getUsername()); assertNotNull(venmoAccount.getVenmoUserId()); assertNotNull(venmoAccount.getSourceDescription()); assertNotNull(venmoAccount.getCreatedAt()); assertNotNull(venmoAccount.getUpdatedAt()); assertNotNull(venmoAccount.getSubscriptions()); assertNotNull(venmoAccount.getImageUrl()); assertNotNull(venmoAccount.getCustomerId()); } @Test public void createUsBankAccountFromNonce() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); assertTrue(customerResult.isSuccess()); Customer customer = customerResult.getTarget(); String nonce = TestHelper.generateValidUsBankAccountNonce(gateway); PaymentMethodRequest request = new PaymentMethodRequest() .customerId(customer.getId()) .paymentMethodNonce(nonce) .options() .done(); Result<? extends PaymentMethod> result = gateway.paymentMethod().create(request); assertTrue(result.isSuccess()); PaymentMethod paymentMethod = result.getTarget(); assertNotNull(paymentMethod.getToken()); UsBankAccount usBankAccount = (UsBankAccount) paymentMethod; assertEquals("021000021", usBankAccount.getRoutingNumber()); assertEquals("1234", usBankAccount.getLast4()); assertEquals("checking", usBankAccount.getAccountType()); assertEquals("Dan Schulman", usBankAccount.getAccountHolderName()); assertTrue(Pattern.compile(".*CHASE.*").matcher(usBankAccount.getBankName()).matches()); } @Test public void doesNotCreateUsBankAccountFromInvalidNonce() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); assertTrue(customerResult.isSuccess()); Customer customer = customerResult.getTarget(); String nonce = TestHelper.generateInvalidUsBankAccountNonce(); PaymentMethodRequest request = new PaymentMethodRequest() .customerId(customer.getId()) .paymentMethodNonce(nonce) .options() .done(); Result<? extends PaymentMethod> result = gateway.paymentMethod().create(request); assertFalse(result.isSuccess()); assertEquals( ValidationErrorCode.PAYMENT_METHOD_PAYMENT_METHOD_NONCE_UNKNOWN, result.getErrors().forObject("payment_method").onField("payment_method_nonce").get(0).getCode() ); } @Test public void createAbstractPaymentMethod() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); assertTrue(customerResult.isSuccess()); Customer customer = customerResult.getTarget(); PaymentMethodRequest request = new PaymentMethodRequest(). customerId(customer.getId()). paymentMethodNonce(Nonce.AbstractTransactable); Result<? extends PaymentMethod> result = gateway.paymentMethod().create(request); assertTrue(result.isSuccess()); PaymentMethod paymentMethod = result.getTarget(); assertNotNull(paymentMethod.getToken()); assertNotNull(paymentMethod.getImageUrl()); assertNotNull(paymentMethod.getCustomerId()); assertNotNull(paymentMethod.getSubscriptions()); } @Test public void createPaymentMethodAndMakeDefault() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); assertTrue(customerResult.isSuccess()); Customer customer = customerResult.getTarget(); CreditCardRequest creditCardRequest = new CreditCardRequest(). customerId(customer.getId()). cardholderName("John Doe"). cvv("123"). number("5105105105105100"). expirationDate("05/12"); Result<CreditCard> creditCardResult = gateway.creditCard().create(creditCardRequest); assertTrue(creditCardResult.isSuccess()); String nonce = TestHelper.generateFuturePaymentPayPalNonce(gateway); PaymentMethodRequest request = new PaymentMethodRequest(). customerId(customer.getId()). paymentMethodNonce(nonce). options(). makeDefault(true). done(); Result<? extends PaymentMethod> result = gateway.paymentMethod().create(request); assertTrue(result.isSuccess()); PaymentMethod paymentMethod = result.getTarget(); assertTrue(paymentMethod.isDefault()); } @Test public void createPaymentMethodWithToken() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); assertTrue(customerResult.isSuccess()); Customer customer = customerResult.getTarget(); String nonce = TestHelper.generateFuturePaymentPayPalNonce(gateway); int r = (int)(Math.random() * 100000); String paymentMethodToken = "token-" + r; PaymentMethodRequest request = new PaymentMethodRequest(). customerId(customer.getId()). paymentMethodNonce(nonce). token(paymentMethodToken); Result<? extends PaymentMethod> result = gateway.paymentMethod().create(request); assertTrue(result.isSuccess()); PaymentMethod paymentMethod = result.getTarget(); assertEquals(paymentMethodToken, paymentMethod.getToken()); } @Test public void createPayPalAccountWithOneTimeNonceFails() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); assertTrue(customerResult.isSuccess()); Customer customer = customerResult.getTarget(); String nonce = TestHelper.generateOneTimePayPalNonce(gateway); PaymentMethodRequest request = new PaymentMethodRequest(). customerId(customer.getId()). paymentMethodNonce(nonce); Result<? extends PaymentMethod> result = gateway.paymentMethod().create(request); assertFalse(result.isSuccess()); assertEquals( ValidationErrorCode.PAYPAL_ACCOUNT_CANNOT_VAULT_ONE_TIME_USE_PAYPAL_ACCOUNT, result.getErrors().forObject("paypalAccount").onField("base").get(0).getCode() ); } @Test public void createEuropeBankAccountWithNonce() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); assertTrue(customerResult.isSuccess()); Customer customer = customerResult.getTarget(); String nonce = TestHelper.generateEuropeBankAccountNonce(gateway, customer); PaymentMethodRequest request = new PaymentMethodRequest(). customerId(customer.getId()). paymentMethodNonce(nonce); Result<? extends PaymentMethod> result = gateway.paymentMethod().create(request); assertTrue(result.isSuccess()); PaymentMethod paymentMethod = result.getTarget(); assertNotNull(paymentMethod.getImageUrl()); assertNotNull(paymentMethod.getCustomerId()); assertNotNull(paymentMethod.getSubscriptions()); } @Test public void createCreditCardWithNonce() { String nonce = TestHelper.generateUnlockedNonce(gateway, null, SandboxValues.CreditCardNumber.VISA.number); Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); assertTrue(customerResult.isSuccess()); Customer customer = customerResult.getTarget(); PaymentMethodRequest request = new PaymentMethodRequest(). customerId(customer.getId()). paymentMethodNonce(nonce); Result<? extends PaymentMethod> result = gateway.paymentMethod().create(request); assertTrue(result.isSuccess()); PaymentMethod paymentMethod = result.getTarget(); assertNotNull(paymentMethod.getToken()); CreditCard creditCard = (CreditCard) paymentMethod; assertEquals("1111", creditCard.getLast4()); } @Test public void allowsPassingBillingAddressIdOutsideOfTheNonce() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); assertTrue(customerResult.isSuccess()); Customer customer = customerResult.getTarget(); CreditCardRequest request = new CreditCardRequest(). number("4111111111111111"). expirationMonth("12"). expirationYear("2020"); String nonce = TestHelper.generateNonceForCreditCard(gateway, request, customer.getId(), false); AddressRequest addressRequest = new AddressRequest(). firstName("Bobby"). lastName("Tables"); Result<Address> addressResult = gateway.address().create(customer.getId(), addressRequest); PaymentMethodRequest paymentMethodRequest = new PaymentMethodRequest(). paymentMethodNonce(nonce). customerId(customer.getId()). billingAddressId(addressResult.getTarget().getId()); Result<? extends PaymentMethod> paymentMethodResult = gateway.paymentMethod().create(paymentMethodRequest); assertTrue(paymentMethodResult.isSuccess()); PaymentMethod paymentMethod = paymentMethodResult.getTarget(); assertTrue(paymentMethod instanceof CreditCard); String token = paymentMethod.getToken(); CreditCard foundCreditCard = gateway.creditCard().find(token); assertTrue(foundCreditCard instanceof CreditCard); assertEquals("Bobby", foundCreditCard.getBillingAddress().getFirstName()); assertEquals("Tables", foundCreditCard.getBillingAddress().getLastName()); } @Test public void createAllowsCustomVerificationAmount() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); Customer customer = customerResult.getTarget(); PaymentMethodRequest paymentMethodRequest = new PaymentMethodRequest(). customerId(customer.getId()). paymentMethodNonce("fake-valid-nonce"). options(). verifyCard(true). verificationAmount("1.02"). done(); Result<? extends PaymentMethod> paymentMethodResult = gateway.paymentMethod().create(paymentMethodRequest); assertTrue(paymentMethodResult.isSuccess()); } @Test public void deletePayPalAccount() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); assertTrue(customerResult.isSuccess()); Customer customer = customerResult.getTarget(); String nonce = TestHelper.generateFuturePaymentPayPalNonce(gateway); PaymentMethodRequest request = new PaymentMethodRequest(). customerId(customer.getId()). paymentMethodNonce(nonce); Result<? extends PaymentMethod> result = gateway.paymentMethod().create(request); assertTrue(result.isSuccess()); PaymentMethod paymentMethod = result.getTarget(); PaymentMethodDeleteRequest deleteRequest = new PaymentMethodDeleteRequest().revokeAllGrants(false); Result<? extends PaymentMethod> deleteResult = gateway.paymentMethod().delete(paymentMethod.getToken(), deleteRequest); assertTrue(deleteResult.isSuccess()); } @Test public void deleteCreditCard() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); assertTrue(customerResult.isSuccess()); Customer customer = customerResult.getTarget(); String nonce = TestHelper.generateUnlockedNonce(gateway, null, SandboxValues.CreditCardNumber.VISA.number); PaymentMethodRequest request = new PaymentMethodRequest(). customerId(customer.getId()). paymentMethodNonce(nonce); Result<? extends PaymentMethod> result = gateway.paymentMethod().create(request); assertTrue(result.isSuccess()); PaymentMethod paymentMethod = result.getTarget(); Result<? extends PaymentMethod> deleteResult = gateway.paymentMethod().delete(paymentMethod.getToken()); assertTrue(deleteResult.isSuccess()); } @Test public void deleteMissingRaisesNotFoundError() { try { gateway.paymentMethod().delete("missing"); fail("Should throw NotFoundException"); } catch (NotFoundException e) { } } @Test public void findAndroidPayCard() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); assertTrue(customerResult.isSuccess()); Customer customer = customerResult.getTarget(); String nonce = Nonce.AndroidPay; PaymentMethodRequest request = new PaymentMethodRequest(). customerId(customer.getId()). paymentMethodNonce(nonce); Result<? extends PaymentMethod> result = gateway.paymentMethod().create(request); assertTrue(result.isSuccess()); PaymentMethod paymentMethod = result.getTarget(); PaymentMethod found = gateway.paymentMethod().find(paymentMethod.getToken()); assertNotNull(found); assertTrue(found instanceof AndroidPayCard); } @Test public void findPayPalAccount() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); assertTrue(customerResult.isSuccess()); Customer customer = customerResult.getTarget(); String nonce = TestHelper.generateFuturePaymentPayPalNonce(gateway); PaymentMethodRequest request = new PaymentMethodRequest(). customerId(customer.getId()). paymentMethodNonce(nonce); Result<? extends PaymentMethod> result = gateway.paymentMethod().create(request); assertTrue(result.isSuccess()); PaymentMethod paymentMethod = result.getTarget(); PaymentMethod found = gateway.paymentMethod().find(paymentMethod.getToken()); assertNotNull(found); assertTrue(found instanceof PayPalAccount); } @Test public void paypalIgnoresPassedBillingAddressId() { String nonce = TestHelper.getNonceForPayPalAccount(gateway, "PAYPAL_CONSENT_CODE"); Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); assertTrue(customerResult.isSuccess()); Customer customer = customerResult.getTarget(); AddressRequest addressRequest = new AddressRequest(). firstName("Bobby"). lastName("Tables"); Result<Address> addressResult = gateway.address().create(customer.getId(), addressRequest); PaymentMethodRequest request = new PaymentMethodRequest(). paymentMethodNonce(nonce). customerId(customer.getId()). billingAddressId(addressResult.getTarget().getId()); Result<? extends PaymentMethod> result = gateway.paymentMethod().create(request); assertTrue(result.isSuccess()); assertTrue(result.getTarget() instanceof PayPalAccount); PayPalAccount account = (PayPalAccount)result.getTarget(); assertFalse(account.getImageUrl() == null); String token = result.getTarget().getToken(); PayPalAccount foundAccount = gateway.paypalAccount().find(token); assertFalse(foundAccount == null); } @Test public void ignoresPassedBillingAddressParams() { String nonce = TestHelper.getNonceForPayPalAccount(gateway, "PAYPAL_CONSENT_CODE"); Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); assertTrue(customerResult.isSuccess()); Customer customer = customerResult.getTarget(); PaymentMethodRequest request = new PaymentMethodRequest(). paymentMethodNonce(nonce). customerId(customer.getId()). billingAddress(). streetAddress("123 Abc Way"). done(); Result<? extends PaymentMethod> result = gateway.paymentMethod().create(request); assertTrue(result.isSuccess()); assertTrue(result.getTarget() instanceof PayPalAccount); PayPalAccount account = (PayPalAccount)result.getTarget(); assertFalse(account.getImageUrl() == null); String token = result.getTarget().getToken(); PayPalAccount foundAccount = gateway.paypalAccount().find(token); assertFalse(foundAccount == null); } @Test public void getSubscriptionsForAllPaymentMethodTypes() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); assertTrue(customerResult.isSuccess()); Customer customer = customerResult.getTarget(); String[] nonces = { Nonce.AndroidPay, Nonce.ApplePayVisa, Nonce.Coinbase, Nonce.Transactable, Nonce.PayPalFuturePayment }; List<String> subscriptionIds = new ArrayList<String>(); for (String nonce : nonces) { PaymentMethodRequest request = new PaymentMethodRequest() .paymentMethodNonce(nonce) .customerId(customer.getId()); Result<? extends PaymentMethod> paymentMethodResult = gateway.paymentMethod().create(request); assertTrue(paymentMethodResult.isSuccess()); Plan plan = PlanFixture.PLAN_WITHOUT_TRIAL; SubscriptionRequest subscriptionRequest = new SubscriptionRequest() .paymentMethodToken(paymentMethodResult.getTarget().getToken()) .planId(plan.getId()); Result<? extends Subscription> subscriptionResult = gateway.subscription().create(subscriptionRequest); assertTrue(subscriptionResult.isSuccess()); assertNotNull(subscriptionResult.getTarget().getId()); subscriptionIds.add(subscriptionResult.getTarget().getId()); } Customer foundCustomer = gateway.customer().find(customer.getId()); List<? extends PaymentMethod> paymentMethods = foundCustomer.getPaymentMethods(); assertEquals(paymentMethods.size(), nonces.length); int subscriptionCount = 0; for (PaymentMethod paymentMethod : paymentMethods) { List<Subscription> subscriptions = paymentMethod.getSubscriptions(); for (Subscription subscription : subscriptions) { subscriptionCount++; assertTrue(subscriptionIds.contains(subscription.getId())); } } assertEquals(subscriptionCount, nonces.length); } @Test public void doesNotReturnErrorIfCreditCardOptionsArePresentForPaypalNonce() { String nonce = TestHelper.getNonceForPayPalAccount(gateway, "PAYPAL_CONSENT_CODE"); Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); assertTrue(customerResult.isSuccess()); Customer customer = customerResult.getTarget(); PaymentMethodRequest request = new PaymentMethodRequest(). paymentMethodNonce(nonce). customerId(customer.getId()). options(). verifyCard(true). failOnDuplicatePaymentMethod(true). verificationMerchantAccountId("not_a_real_merchant_account_id"). done(); Result<? extends PaymentMethod> result = gateway.paymentMethod().create(request); assertTrue(result.isSuccess()); } @Test public void findCreditCard() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); assertTrue(customerResult.isSuccess()); Customer customer = customerResult.getTarget(); String nonce = TestHelper.generateUnlockedNonce(gateway, null, SandboxValues.CreditCardNumber.VISA.number); PaymentMethodRequest request = new PaymentMethodRequest(). customerId(customer.getId()). paymentMethodNonce(nonce); Result<? extends PaymentMethod> result = gateway.paymentMethod().create(request); assertTrue(result.isSuccess()); PaymentMethod paymentMethod = result.getTarget(); PaymentMethod found = gateway.paymentMethod().find(paymentMethod.getToken()); assertNotNull(found); assertTrue(found instanceof CreditCard); } @Test public void findAbstractPaymentMethod() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); assertTrue(customerResult.isSuccess()); Customer customer = customerResult.getTarget(); PaymentMethodRequest request = new PaymentMethodRequest(). customerId(customer.getId()). paymentMethodNonce(Nonce.AbstractTransactable); Result<? extends PaymentMethod> result = gateway.paymentMethod().create(request); assertTrue(result.isSuccess()); PaymentMethod paymentMethod = result.getTarget(); PaymentMethod found = gateway.paymentMethod().find(paymentMethod.getToken()); assertNotNull(found); assertNotNull(found.getToken()); assertEquals(found.getToken(), paymentMethod.getToken()); } @Test public void findBlankRaisesNotFoundError() { try { gateway.paymentMethod().find(""); fail("Should throw NotFoundException"); } catch (NotFoundException e) { } } @Test public void findMissingRaisesNotFoundError() { try { gateway.paymentMethod().find("missing"); fail("Should throw NotFoundException"); } catch (NotFoundException e) { } } @Test public void updateUpdatesCreditCards() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); Customer customer = customerResult.getTarget(); CreditCardRequest creditCardRequest = new CreditCardRequest(). customerId(customer.getId()). cardholderName("John Doe"). cvv("123"). number("5105105105105100"). expirationDate("05/12"); Result<CreditCard> creditCardResult = gateway.creditCard().create(creditCardRequest); assertTrue(creditCardResult.isSuccess()); PaymentMethodRequest updateCardRequest = new PaymentMethodRequest(). cardholderName("New Holder"). cvv("456"). number(SandboxValues.CreditCardNumber.VISA.number). expirationDate("06/13"); String token = creditCardResult.getTarget().getToken(); Result<? extends PaymentMethod> result = gateway.paymentMethod().update(token, updateCardRequest); assertTrue(result.isSuccess()); assertTrue(result.getTarget() instanceof CreditCard); CreditCard creditCard = (CreditCard) result.getTarget(); assertEquals(creditCard.getCardholderName(), "New Holder"); assertEquals(creditCard.getBin(), SandboxValues.CreditCardNumber.VISA.number.substring(0, 6)); assertEquals(creditCard.getExpirationDate(), "06/2013"); } @Test public void updateBillingAddressOverwritesOldAddress() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); Customer customer = customerResult.getTarget(); CreditCardRequest creditCardRequest = new CreditCardRequest(). customerId(customer.getId()). billingAddress(). streetAddress("1 E Main St"). extendedAddress("Unit 2"). locality("Chicago"). region("Illinois"). postalCode("60607"). countryName("United States of America"). countryCodeAlpha2("US"). countryCodeAlpha3("USA"). countryCodeNumeric("840"). done(). cardholderName("John Doe"). cvv("123"). number("5105105105105100"). expirationDate("05/12"); Result<CreditCard> creditCardResult = gateway.creditCard().create(creditCardRequest); assertTrue(creditCardResult.isSuccess()); CreditCard oldCreditCard = creditCardResult.getTarget(); PaymentMethodRequest updateCardRequest = new PaymentMethodRequest(). billingAddress(). region("Illinois"). done(); String token = oldCreditCard.getToken(); Result<? extends PaymentMethod> result = gateway.paymentMethod().update(token, updateCardRequest); assertTrue(result.isSuccess()); assertTrue(result.getTarget() instanceof CreditCard); CreditCard creditCard = (CreditCard) result.getTarget(); assertEquals(creditCard.getBillingAddress().getRegion(),"Illinois"); assertEquals(creditCard.getBillingAddress().getStreetAddress(), null); assertTrue(!creditCard.getBillingAddress().getId().equals(oldCreditCard.getBillingAddress().getId())); } @Test public void updateBillingAddressWhenOptionIsSpecified() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); Customer customer = customerResult.getTarget(); CreditCardRequest creditCardRequest = new CreditCardRequest(). customerId(customer.getId()). cardholderName("John Doe"). cvv("123"). number("5105105105105100"). expirationDate("05/12"). billingAddress(). streetAddress("1 E Main St"). done(); Result<CreditCard> creditCardResult = gateway.creditCard().create(creditCardRequest); assertTrue(creditCardResult.isSuccess()); CreditCard oldCreditCard = creditCardResult.getTarget(); PaymentMethodRequest updateCardRequest = new PaymentMethodRequest(). billingAddress(). region("Illinois"). options(). updateExisting(true). done(). done(); String token = oldCreditCard.getToken(); Result<? extends PaymentMethod> result = gateway.paymentMethod().update(token, updateCardRequest); assertTrue(result.isSuccess()); assertTrue(result.getTarget() instanceof CreditCard); CreditCard creditCard = (CreditCard) result.getTarget(); assertEquals(creditCard.getBillingAddress().getRegion(),"Illinois"); assertEquals(creditCard.getBillingAddress().getStreetAddress(),"1 E Main St"); assertEquals(creditCard.getBillingAddress().getId(), oldCreditCard.getBillingAddress().getId()); } @Test public void updatesTheCountryViaCodes() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); Customer customer = customerResult.getTarget(); CreditCardRequest creditCardRequest = new CreditCardRequest(). customerId(customer.getId()). cardholderName("John Doe"). number(SandboxValues.CreditCardNumber.VISA.number). expirationDate("05/12"). billingAddress(). streetAddress("1 E Main St"). done(); Result<CreditCard> creditCardResult = gateway.creditCard().create(creditCardRequest); assertTrue(creditCardResult.isSuccess()); CreditCard oldCreditCard = creditCardResult.getTarget(); PaymentMethodRequest updateCardRequest = new PaymentMethodRequest(). billingAddress(). countryName("American Samoa"). countryCodeAlpha2("AS"). countryCodeAlpha3("ASM"). countryCodeNumeric("016"). options(). updateExisting(true). done(). done(); String token = oldCreditCard.getToken(); Result<? extends PaymentMethod> result = gateway.paymentMethod().update(token, updateCardRequest); assertTrue(result.isSuccess()); assertTrue(result.getTarget() instanceof CreditCard); CreditCard creditCard = (CreditCard) result.getTarget(); Address billingAddress = creditCard.getBillingAddress(); assertEquals(billingAddress.getCountryName(), "American Samoa"); assertEquals(billingAddress.getCountryCodeAlpha2(), "AS"); assertEquals(billingAddress.getCountryCodeAlpha3(), "ASM"); assertEquals(billingAddress.getCountryCodeNumeric(), "016"); } @Test public void updateCanPassExpirationMonthAndYear() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); Customer customer = customerResult.getTarget(); CreditCardRequest creditCardRequest = new CreditCardRequest(). customerId(customer.getId()). cardholderName("John Doe"). number(SandboxValues.CreditCardNumber.VISA.number). expirationDate("05/12"); Result<CreditCard> creditCardResult = gateway.creditCard().create(creditCardRequest); assertTrue(creditCardResult.isSuccess()); CreditCard oldCreditCard = creditCardResult.getTarget(); PaymentMethodRequest updateCardRequest = new PaymentMethodRequest(). expirationMonth("06"). expirationYear("2013"); String token = oldCreditCard.getToken(); Result<? extends PaymentMethod> result = gateway.paymentMethod().update(token, updateCardRequest); assertTrue(result.isSuccess()); assertTrue(result.getTarget() instanceof CreditCard); CreditCard creditCard = (CreditCard) result.getTarget(); assertEquals(creditCard.getExpirationMonth(), "06"); assertEquals(creditCard.getExpirationYear(), "2013"); assertEquals(creditCard.getExpirationDate(), "06/2013"); } @Test public void verifiesUpdateIfVerifyCardIsTrue() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); Customer customer = customerResult.getTarget(); CreditCardRequest creditCardRequest = new CreditCardRequest(). customerId(customer.getId()). cardholderName("Original Holder"). cvv("123"). number(SandboxValues.CreditCardNumber.VISA.number). expirationDate("05/12"); Result<CreditCard> creditCardResult = gateway.creditCard().create(creditCardRequest); assertTrue(creditCardResult.isSuccess()); CreditCard oldCreditCard = creditCardResult.getTarget(); PaymentMethodRequest updateCardRequest = new PaymentMethodRequest(). cardholderName("New Holder"). cvv("456"). number(SandboxValues.FailsVerification.MASTER_CARD.number). expirationDate("06/2013"). options(). verifyCard(true). done(); String token = oldCreditCard.getToken(); Result<? extends PaymentMethod> result = gateway.paymentMethod().update(token, updateCardRequest); assertFalse(result.isSuccess()); assertEquals(result.getCreditCardVerification().getStatus(), CreditCardVerification.Status.PROCESSOR_DECLINED); assertNull(result.getCreditCardVerification().getGatewayRejectionReason()); } @Test public void updateAllowsCustomVerificationAmount() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); Customer customer = customerResult.getTarget(); CreditCardRequest creditCardRequest = new CreditCardRequest(). customerId(customer.getId()). cardholderName("Card Holder"). cvv("123"). number(SandboxValues.CreditCardNumber.VISA.number). expirationDate("05/20"); Result<CreditCard> creditCardResult = gateway.creditCard().create(creditCardRequest); assertTrue(creditCardResult.isSuccess()); CreditCard oldCreditCard = creditCardResult.getTarget(); PaymentMethodRequest updateCardRequest = new PaymentMethodRequest(). paymentMethodNonce(Nonce.ProcessorDeclinedMasterCard). options(). verifyCard(true). verificationAmount("2.34"). done(); String token = oldCreditCard.getToken(); Result<? extends PaymentMethod> result = gateway.paymentMethod().update(token, updateCardRequest); assertFalse(result.isSuccess()); assertEquals(result.getCreditCardVerification().getStatus(), CreditCardVerification.Status.PROCESSOR_DECLINED); assertNull(result.getCreditCardVerification().getGatewayRejectionReason()); } @Test public void updateCanUpdateTheBillingAddress() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); Customer customer = customerResult.getTarget(); CreditCardRequest creditCardRequest = new CreditCardRequest(). cardholderName("Original Holder"). customerId(customer.getId()). cvv("123"). number(SandboxValues.CreditCardNumber.VISA.number). expirationDate("05/12"). billingAddress(). firstName("Old First Name"). lastName("Old Last Name"). company("Old Company"). streetAddress("123 Old St"). extendedAddress("Apt Old"). locality("Old City"). region("Old State"). postalCode("12345"). countryName("Canada"). done(); Result<CreditCard> creditCardResult = gateway.creditCard().create(creditCardRequest); assertTrue(creditCardResult.isSuccess()); CreditCard oldCreditCard = creditCardResult.getTarget(); PaymentMethodRequest updateCardRequest = new PaymentMethodRequest(). options(). verifyCard(false). done(). billingAddress(). firstName("New First Name"). lastName("New Last Name"). company("New Company"). streetAddress("123 New St"). extendedAddress("Apt New"). locality("New City"). region("New State"). postalCode("56789"). countryName("United States of America"). done(); String token = oldCreditCard.getToken(); Result<? extends PaymentMethod> result = gateway.paymentMethod().update(token, updateCardRequest); assertTrue(result.isSuccess()); assertTrue(result.getTarget() instanceof CreditCard); CreditCard creditCard = (CreditCard) result.getTarget(); Address billingAddress = creditCard.getBillingAddress(); assertEquals(billingAddress.getFirstName(), "New First Name"); assertEquals(billingAddress.getLastName(), "New Last Name"); assertEquals(billingAddress.getCompany(), "New Company"); assertEquals(billingAddress.getStreetAddress(), "123 New St"); assertEquals(billingAddress.getExtendedAddress(), "Apt New"); assertEquals(billingAddress.getLocality(), "New City"); assertEquals(billingAddress.getRegion(), "New State"); assertEquals(billingAddress.getPostalCode(), "56789"); assertEquals(billingAddress.getCountryName(), "United States of America"); } @Test public void returnsAnErrorResponseIfInvalid() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); Customer customer = customerResult.getTarget(); CreditCardRequest creditCardRequest = new CreditCardRequest(). customerId(customer.getId()). cardholderName("Original Holder"). number(SandboxValues.CreditCardNumber.VISA.number). expirationDate("05/12"); Result<CreditCard> creditCardResult = gateway.creditCard().create(creditCardRequest); assertTrue(creditCardResult.isSuccess()); CreditCard oldCreditCard = creditCardResult.getTarget(); PaymentMethodRequest updateCardRequest = new PaymentMethodRequest(). cardholderName("New Holder"). number("invalid"). expirationDate("05/2014"); String token = oldCreditCard.getToken(); Result<? extends PaymentMethod> result = gateway.paymentMethod().update(token, updateCardRequest); assertFalse(result.isSuccess()); assertEquals(result.getErrors().forObject("creditCard").onField("number").get(0).getMessage(), "Credit card number must be 12-19 digits."); } @Test public void updateCanUpdateTheDefault() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); Customer customer = customerResult.getTarget(); CreditCardRequest creditCardRequest1 = new CreditCardRequest(). customerId(customer.getId()). number(SandboxValues.CreditCardNumber.VISA.number). expirationDate("05/09"); CreditCardRequest creditCardRequest2 = new CreditCardRequest(). customerId(customer.getId()). number(SandboxValues.CreditCardNumber.VISA.number). expirationDate("05/09"); Result<CreditCard> creditCardResult = gateway.creditCard().create(creditCardRequest1); CreditCard creditCard1 = creditCardResult.getTarget(); creditCardResult = gateway.creditCard().create(creditCardRequest2); CreditCard creditCard2 = creditCardResult.getTarget(); assertTrue(creditCard1.isDefault()); assertFalse(creditCard2.isDefault()); PaymentMethodRequest updateCardRequest = new PaymentMethodRequest(). options(). makeDefault(true). done(); String token = creditCard2.getToken(); Result<? extends PaymentMethod> result = gateway.paymentMethod().update(token, updateCardRequest); PaymentMethod updatedResult1 = gateway.paymentMethod().find(creditCard1.getToken()); PaymentMethod updatedResult2 = gateway.paymentMethod().find(creditCard2.getToken()); assertFalse(updatedResult1.isDefault()); assertTrue(updatedResult2.isDefault()); } @Test public void updatesAPayPalAccountToken() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); Customer customer = customerResult.getTarget(); String originalToken = "paypal-account-" + (int)new Date().getTime(); String nonce = TestHelper.getNonceForPayPalAccount(gateway, "consent-code", originalToken); PaymentMethodRequest request = new PaymentMethodRequest(). paymentMethodNonce(nonce). customerId(customer.getId()); Result<? extends PaymentMethod> originalResult = gateway.paymentMethod().create(request); String updatedToken = "UPDATED_TOKEN-" + new Random().nextInt(); request = new PaymentMethodRequest().token(updatedToken); Result<? extends PaymentMethod> updatedResult = gateway.paymentMethod().update( originalToken, request); PayPalAccount updatedPayPalAccount = gateway.paypalAccount().find(updatedToken); PayPalAccount originalPayPalAccount = (PayPalAccount)originalResult.getTarget(); assertEquals(updatedPayPalAccount.getEmail(), originalPayPalAccount.getEmail()); try { gateway.paypalAccount().find(originalToken); fail("Didn't throw a NotFoundException for a nonexistent account token on find"); } catch (NotFoundException ex) { } } @Test public void UpdateMakesPaypalAccountDefaultPaymentMethod() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); Customer customer = customerResult.getTarget(); CreditCardRequest creditCardRequest = new CreditCardRequest(). customerId(customer.getId()). number(SandboxValues.CreditCardNumber.VISA.number). expirationDate("05/09"). options(). makeDefault(true). done(); Result<CreditCard> creditCardResult = gateway.creditCard().create(creditCardRequest); assertTrue(creditCardResult.isSuccess()); String nonce = TestHelper.getNonceForPayPalAccount(gateway, "consent-code"); PaymentMethodRequest request = new PaymentMethodRequest(). paymentMethodNonce(nonce). customerId(customer.getId()); Result<? extends PaymentMethod> originalResult = gateway.paymentMethod().create(request); String originalToken = originalResult.getTarget().getToken(); request = new PaymentMethodRequest(). token(originalToken). options(). makeDefault(true). done(); Result<? extends PaymentMethod> updatedResult = gateway.paymentMethod().update( originalToken, request); PayPalAccount updatedPayPalAccount = gateway.paypalAccount().find(originalToken); assertTrue(updatedPayPalAccount.isDefault()); } @Test public void returnsErrorIfTokenForAccountIsUsedForUpdate() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); Customer customer = customerResult.getTarget(); String firstToken = "paypal-account-" + new Random().nextInt(); String secondToken = "paypal-account-" + new Random().nextInt(); String firstNonce = TestHelper.getNonceForPayPalAccount( gateway, "consent-code", firstToken); PaymentMethodRequest request = new PaymentMethodRequest(). paymentMethodNonce(firstNonce). customerId(customer.getId()); Result<? extends PaymentMethod> firstResult = gateway.paymentMethod().create(request); String secondNonce = TestHelper.getNonceForPayPalAccount( gateway, "consent-code", secondToken); request = new PaymentMethodRequest(). paymentMethodNonce(secondNonce). customerId(customer.getId()); Result<? extends PaymentMethod> secondResult = gateway.paymentMethod().create(request); request = new PaymentMethodRequest().token(secondToken); Result<? extends PaymentMethod> updatedResult = gateway.paymentMethod().update(firstToken, request); assertFalse(updatedResult.isSuccess()); assertEquals(updatedResult.getErrors().getAllDeepValidationErrors().get(0).getCode().code, "92906"); } @Test public void updateDoesNotReturnErrorIfCardOptionsArePresentForPaypalNonce() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); Customer customer = customerResult.getTarget(); String originalToken = "paypal-account-" + new Random().nextInt(); String nonce = TestHelper.getNonceForPayPalAccount( gateway, "consent-code", originalToken); PaymentMethodRequest request = new PaymentMethodRequest(). paymentMethodNonce(nonce). customerId(customer.getId()). options(). verifyCard(true). failOnDuplicatePaymentMethod(true). verificationMerchantAccountId("not_a_real_merchant_account_id"). done(); Result<? extends PaymentMethod> result = gateway.paymentMethod().create(request); assertTrue(result.isSuccess()); } @Test public void allowsPassingTheBillingAddressOutsideNonce() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); Customer customer = customerResult.getTarget(); CreditCardRequest creditCardRequest = new CreditCardRequest(). number("4111111111111111"). expirationMonth("12"). expirationYear("2020"); String nonce = TestHelper.generateNonceForCreditCard(gateway, creditCardRequest, customer.getId(), false); PaymentMethodRequest request = new PaymentMethodRequest(). paymentMethodNonce(nonce). customerId(customer.getId()). billingAddress(). streetAddress("123 Abc Way"). done(); Result<? extends PaymentMethod> result = gateway.paymentMethod().create(request); assertTrue(result.isSuccess()); assertTrue(result.getTarget() instanceof CreditCard); String token = result.getTarget().getToken(); CreditCard foundCreditCard = gateway.creditCard().find(token); assertFalse(foundCreditCard == null); assertEquals(foundCreditCard.getBillingAddress().getStreetAddress(), "123 Abc Way"); } @Test public void updateOverridesTheBillingAddressInTheNonce() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); Customer customer = customerResult.getTarget(); CreditCardRequest creditCardRequest = new CreditCardRequest(). number("4111111111111111"). expirationMonth("12"). expirationYear("2020"). billingAddress(). streetAddress("456 Xyz Way"). done(); String nonce = TestHelper.generateNonceForCreditCard(gateway, creditCardRequest, customer.getId(), false); PaymentMethodRequest request = new PaymentMethodRequest(). paymentMethodNonce(nonce). customerId(customer.getId()). billingAddress(). streetAddress("123 Abc Way"). done(); Result<? extends PaymentMethod> result = gateway.paymentMethod().create(request); assertTrue(result.isSuccess()); assertTrue(result.getTarget() instanceof CreditCard); String token = result.getTarget().getToken(); CreditCard foundCreditCard = gateway.creditCard().find(token); assertFalse(foundCreditCard == null); assertEquals(foundCreditCard.getBillingAddress().getStreetAddress(), "123 Abc Way"); } @Test public void updateDoesNotOverrideBillingAddressForVaultedCreditCards() { Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); Customer customer = customerResult.getTarget(); CreditCardRequest creditCardRequest = new CreditCardRequest(). number("4111111111111111"). expirationMonth("12"). expirationYear("2020"). billingAddress(). streetAddress("456 Xyz Way"). done(); String nonce = TestHelper.generateNonceForCreditCard(gateway, creditCardRequest, customer.getId(), true); PaymentMethodRequest request = new PaymentMethodRequest(). paymentMethodNonce(nonce). customerId(customer.getId()). billingAddress(). streetAddress("123 Abc Way"). done(); Result<? extends PaymentMethod> result = gateway.paymentMethod().create(request); assertTrue(result.isSuccess()); assertTrue(result.getTarget() instanceof CreditCard); String token = result.getTarget().getToken(); CreditCard foundCreditCard = gateway.creditCard().find(token); assertFalse(foundCreditCard == null); assertEquals(foundCreditCard.getBillingAddress().getStreetAddress(), "456 Xyz Way"); } @Test public void grantAndRevoke() { BraintreeGateway partnerMerchantGateway = new BraintreeGateway(Environment.DEVELOPMENT, "integration_merchant_public_id", "oauth_app_partner_user_public_key", "oauth_app_partner_user_private_key"); String paymentMethodToken = createPaymentMethodForGrant(partnerMerchantGateway); BraintreeGateway accessTokenGateway = getOAuthAccessTokenForPaymentMethodGrant(); Result<PaymentMethodNonce> grantResult = accessTokenGateway.paymentMethod().grant(paymentMethodToken); assertTrue(grantResult.isSuccess()); Result<? extends PaymentMethod> revokeResult = accessTokenGateway.paymentMethod().revoke(paymentMethodToken); assertTrue(revokeResult.isSuccess()); } @Test public void grantAndVault() { BraintreeGateway partnerMerchantGateway = new BraintreeGateway(Environment.DEVELOPMENT, "integration_merchant_public_id", "oauth_app_partner_user_public_key", "oauth_app_partner_user_private_key"); String paymentMethodToken = createPaymentMethodForGrant(partnerMerchantGateway); BraintreeGateway accessTokenGateway = getOAuthAccessTokenForPaymentMethodGrant(); PaymentMethodGrantRequest grantRequest = new PaymentMethodGrantRequest().allowVaulting(true); Result<PaymentMethodNonce> grantResult = accessTokenGateway.paymentMethod().grant(paymentMethodToken, grantRequest); assertTrue(grantResult.isSuccess()); BraintreeGateway recipientMerchantGateway = new BraintreeGateway(Environment.DEVELOPMENT, "integration_merchant_id", "integration_public_key", "integration_private_key"); Result<Customer> customerResult = recipientMerchantGateway.customer().create(new CustomerRequest()); Customer customer = customerResult.getTarget(); PaymentMethodRequest paymentMethodRequest = new PaymentMethodRequest(). paymentMethodNonce(grantResult.getTarget().getNonce()). customerId(customer.getId()); Result<? extends PaymentMethod> paymentMethodVault = recipientMerchantGateway.paymentMethod().create(paymentMethodRequest); assertTrue(paymentMethodVault.isSuccess()); } @Test public void grantWithOptionsAndRevoke() { BraintreeGateway partnerMerchantGateway = new BraintreeGateway(Environment.DEVELOPMENT, "integration_merchant_public_id", "oauth_app_partner_user_public_key", "oauth_app_partner_user_private_key"); String paymentMethodToken = createPaymentMethodForGrant(partnerMerchantGateway); BraintreeGateway accessTokenGateway = getOAuthAccessTokenForPaymentMethodGrant(); PaymentMethodGrantRequest grantRequest = new PaymentMethodGrantRequest(). allowVaulting(false). includeBillingPostalCode(true); Result<PaymentMethodNonce> grantResult = accessTokenGateway.paymentMethod().grant(paymentMethodToken, grantRequest); assertTrue(grantResult.isSuccess()); Result<? extends PaymentMethod> revokeResult = accessTokenGateway.paymentMethod().revoke(paymentMethodToken); assertTrue(revokeResult.isSuccess()); } private String createPaymentMethodForGrant(BraintreeGateway partnerMerchantGateway) { Result<Customer> customerResult = partnerMerchantGateway.customer().create(new CustomerRequest()); Customer customer = customerResult.getTarget(); PaymentMethodRequest request = new PaymentMethodRequest(). paymentMethodNonce(Nonce.Transactable). customerId(customer.getId()); Result<? extends PaymentMethod> result = partnerMerchantGateway.paymentMethod().create(request); return result.getTarget().getToken(); } private BraintreeGateway getOAuthAccessTokenForPaymentMethodGrant() { BraintreeGateway oauthGateway = new BraintreeGateway("client_id$development$integration_client_id", "client_secret$development$integration_client_secret"); String code = TestHelper.createOAuthGrant(oauthGateway, "integration_merchant_id", "grant_payment_method"); OAuthCredentialsRequest oauthRequest = new OAuthCredentialsRequest(). code(code). scope("grant_payment_method"); Result<OAuthCredentials> accessTokenResult = oauthGateway.oauth().createTokenFromCode(oauthRequest); return new BraintreeGateway(accessTokenResult.getTarget().getAccessToken()); } }