Card card = new Card( cardNumberString, Integer.parseInt( expiryMonthString ), Integer.parseInt( expiryYearString ), cvvString ); if ( ! card.validateNumber() ) if ( ! card.validateExpiryDate() ) if ( ! card.validateCVC() )
@NonNull private static Map<String, Object> hashMapFromCard( @Nullable UidProvider provider, @NonNull Context context, Card card) { Map<String, Object> tokenParams = new HashMap<>(); Map<String, Object> cardParams = new HashMap<>(); cardParams.put("number", StripeTextUtils.nullIfBlank(card.getNumber())); cardParams.put("cvc", StripeTextUtils.nullIfBlank(card.getCVC())); cardParams.put("exp_month", card.getExpMonth()); cardParams.put("exp_year", card.getExpYear()); cardParams.put("name", StripeTextUtils.nullIfBlank(card.getName())); cardParams.put("currency", StripeTextUtils.nullIfBlank(card.getCurrency())); cardParams.put("address_line1", StripeTextUtils.nullIfBlank(card.getAddressLine1())); cardParams.put("address_line2", StripeTextUtils.nullIfBlank(card.getAddressLine2())); cardParams.put("address_city", StripeTextUtils.nullIfBlank(card.getAddressCity())); cardParams.put("address_zip", StripeTextUtils.nullIfBlank(card.getAddressZip())); cardParams.put("address_state", StripeTextUtils.nullIfBlank(card.getAddressState())); cardParams.put("address_country", StripeTextUtils.nullIfBlank(card.getAddressCountry())); // Remove all null values; they cause validation errors removeNullAndEmptyParams(cardParams); // We store the logging items in this field, which is extracted from the parameters // sent to the API. tokenParams.put(LoggingUtils.FIELD_PRODUCT_USAGE, card.getLoggingTokens()); tokenParams.put(Token.TYPE_CARD, cardParams); addUidParams(provider, context, tokenParams); return tokenParams; }
stripeCard = new com.stripe.android.model.Card(cardNumber.getText().toString(), Integer.parseInt(month.getText().toString()), Integer.parseInt(year.getText().toString()), null); if (!stripeCard.validateNumber()) { cardNumber.setError("Number not valid"); return false; if (!stripeCard.validateExpiryDate()) { year.setError("Year not valid"); return false; card = new Card(stripeCard.getLast4(), stripeCard.getExpMonth(), stripeCard.getExpYear(), stripeCard.getType()); String cardNum = cardNumber.getText().toString().replace("-", ""); card.setNumber(cardNum);
boolean validateCard(@NonNull Calendar now) { if (cvc == null) { return validateNumber() && validateExpiryDate(now); } else { return validateNumber() && validateExpiryDate(now) && validateCVC(); } }
/** * Set the card data displayed using a {@link Card} object. Note that * the full number will not be accessed here. * * @param card the {@link Card} to be partially displayed */ void setCard(@NonNull Card card) { mCardBrand = card.getBrand(); mLast4 = card.getLast4(); updateBrandIcon(); updateCardInformation(); }
private void saveCard() { final Card cardToSave = mCardInputWidget.getCard(); if (cardToSave == null) { mErrorDialogHandler.showError("Invalid Card Data"); return; } final Intent tokenServiceIntent = TokenIntentService.createTokenIntent( mActivity, cardToSave.getNumber(), cardToSave.getExpMonth(), cardToSave.getExpYear(), cardToSave.getCVC()); mProgressDialogController.startProgress(); mActivity.startService(tokenServiceIntent); }
@Test public void getCard_whenInputIsValidAmexAndNoZipRequiredAnd4DigitCvc_returnsFullCardAndExpectedLogging() { // The input date here will be invalid after 2050. Please update the test. assertTrue(Calendar.getInstance().get(Calendar.YEAR) < 2050); mNoZipGroup.cardNumberEditText.setText(VALID_AMEX_WITH_SPACES); mNoZipGroup.expiryDateEditText.append("12"); mNoZipGroup.expiryDateEditText.append("50"); mNoZipGroup.cvcEditText.append("1234"); Card card = mNoZipCardMultilineWidget.getCard(); assertNotNull(card); assertEquals(VALID_AMEX_NO_SPACES, card.getNumber()); assertNotNull(card.getExpMonth()); assertNotNull(card.getExpYear()); assertEquals(12, card.getExpMonth().intValue()); assertEquals(2050, card.getExpYear().intValue()); assertEquals("1234", card.getCVC()); assertNull(card.getAddressZip()); assertTrue(card.validateCard()); assertArrayEquals(EXPECTED_LOGGING_ARRAY, card.getLoggingTokens().toArray()); }
@Test public void shouldFailValidateExpiryDateIfNullMonth() { Card card = new Card(null, null, YEAR_IN_FUTURE, null); assertFalse(card.validateExpMonth()); assertTrue(card.validateExpYear(calendar)); assertFalse(card.validateExpiryDate(calendar)); }
@Test public void fromString_whenStringIsValidJson_returnsExpectedCard() { final Card expectedCard = buildEquivalentJsonCard(); final Card cardFromJson = Card.fromString(JSON_CARD); assertNotNull(cardFromJson); assertEquals(expectedCard.getBrand(), cardFromJson.getBrand()); assertEquals(expectedCard.getFunding(), cardFromJson.getFunding()); assertEquals(expectedCard.getCountry(), cardFromJson.getCountry()); assertEquals(expectedCard.getLast4(), cardFromJson.getLast4()); assertEquals(expectedCard.getExpMonth(), cardFromJson.getExpMonth()); assertEquals(expectedCard.getExpYear(), cardFromJson.getExpYear()); assertEquals(expectedCard.getCurrency(), cardFromJson.getCurrency()); assertEquals(expectedCard.getAddressCity(), cardFromJson.getAddressCity()); assertEquals(expectedCard.getAddressCountry(), cardFromJson.getAddressCountry()); assertEquals(expectedCard.getAddressLine1(), cardFromJson.getAddressLine1()); assertEquals(expectedCard.getAddressLine1Check(), cardFromJson.getAddressLine1Check()); assertEquals(expectedCard.getAddressLine2(), cardFromJson.getAddressLine2()); assertEquals(expectedCard.getAddressState(), cardFromJson.getAddressState()); assertEquals(expectedCard.getAddressZip(), cardFromJson.getAddressZip()); assertEquals(expectedCard.getAddressZipCheck(), cardFromJson.getAddressZipCheck()); assertEquals(expectedCard.getCvcCheck(), cardFromJson.getCvcCheck()); assertEquals(expectedCard.getName(), cardFromJson.getName()); assertEquals(expectedCard.getCustomerId(), cardFromJson.getCustomerId()); assertEquals(expectedCard.getFingerprint(), cardFromJson.getFingerprint()); assertEquals(expectedCard.getId(), cardFromJson.getId()); assertEquals(expectedCard.getMetadata(), cardFromJson.getMetadata()); }
basicInfoMap.put(FIELD_NUMBER, card.getNumber()); basicInfoMap.put(FIELD_EXP_MONTH, card.getExpMonth()); basicInfoMap.put(FIELD_EXP_YEAR, card.getExpYear()); basicInfoMap.put(FIELD_CVC, card.getCVC()); removeNullAndEmptyParams(basicInfoMap); addressMap.put(FIELD_LINE_1, card.getAddressLine1()); addressMap.put(FIELD_LINE_2, card.getAddressLine2()); addressMap.put(FIELD_CITY, card.getAddressCity()); addressMap.put(FIELD_COUNTRY, card.getAddressCountry()); addressMap.put(FIELD_STATE, card.getAddressState()); addressMap.put(FIELD_POSTAL_CODE, card.getAddressZip()); removeNullAndEmptyParams(addressMap); ownerMap.put(FIELD_NAME, card.getName()); if (addressMap.keySet().size() > 0) { ownerMap.put(FIELD_ADDRESS, addressMap); final Map<String, String> metadata = card.getMetadata(); if (metadata != null) { params.setMetaData(metadata);
@Test public void canInitializeWithMinimalArguments() { Card card = new Card("4242-4242-4242-4242", 12, 2050, "123"); assertTrue(card.validateNumber()); }
@Test public void shouldFailValidateCVCIfNull() { Card card = new Card(null, null, null, null); assertFalse(card.validateCVC()); }
@Test public void createCardTokenSynchronous_withValidData_returnsToken() { try { Stripe stripe = new Stripe(mContext, FUNCTIONAL_SOURCE_PUBLISHABLE_KEY); TestLoggingListener listener = new TestLoggingListener(true); stripe.setLoggingResponseListener(listener); Token token = stripe.createTokenSynchronous(mCard); assertNotNull(token); Card returnedCard = token.getCard(); assertNotNull(returnedCard); assertNull(token.getBankAccount()); assertEquals(Token.TYPE_CARD, token.getType()); assertEquals(mCard.getLast4(), returnedCard.getLast4()); assertEquals(Card.VISA, returnedCard.getBrand()); assertEquals(mCard.getExpYear(), returnedCard.getExpYear()); assertEquals(mCard.getExpMonth(), returnedCard.getExpMonth()); assertEquals(Card.FUNDING_CREDIT, returnedCard.getFunding()); assertAllLogsAreValid(listener, 2); } catch (AuthenticationException authEx) { fail("Unexpected error: " + authEx.getLocalizedMessage()); } catch (StripeException stripeEx) { fail("Unexpected error when connecting to Stripe API: " + stripeEx.getLocalizedMessage()); } }
@Test public void shouldPassValidateNumberIfLuhnNumberAmex() { Card card = new Card("378282246310005", null, null, null); assertEquals(Card.AMERICAN_EXPRESS, card.getBrand()); assertTrue(card.validateNumber()); }
private Card(Builder builder) { this.number = StripeTextUtils.nullIfBlank(normalizeCardNumber(builder.number)); this.expMonth = builder.expMonth; this.expYear = builder.expYear; this.cvc = StripeTextUtils.nullIfBlank(builder.cvc); this.name = StripeTextUtils.nullIfBlank(builder.name); this.addressLine1 = StripeTextUtils.nullIfBlank(builder.addressLine1); this.addressLine1Check = StripeTextUtils.nullIfBlank(builder.addressLine1Check); this.addressLine2 = StripeTextUtils.nullIfBlank(builder.addressLine2); this.addressCity = StripeTextUtils.nullIfBlank(builder.addressCity); this.addressState = StripeTextUtils.nullIfBlank(builder.addressState); this.addressZip = StripeTextUtils.nullIfBlank(builder.addressZip); this.addressZipCheck = StripeTextUtils.nullIfBlank(builder.addressZipCheck); this.addressCountry = StripeTextUtils.nullIfBlank(builder.addressCountry); this.last4 = StripeTextUtils.nullIfBlank(builder.last4) == null ? getLast4() : builder.last4; this.brand = asCardBrand(builder.brand) == null ? getBrand() : builder.brand; this.fingerprint = StripeTextUtils.nullIfBlank(builder.fingerprint); this.funding = asFundingType(builder.funding); this.country = StripeTextUtils.nullIfBlank(builder.country); this.currency = StripeTextUtils.nullIfBlank(builder.currency); this.customerId = StripeTextUtils.nullIfBlank(builder.customer); this.cvcCheck = StripeTextUtils.nullIfBlank(builder.cvcCheck); this.id = StripeTextUtils.nullIfBlank(builder.id); this.tokenizationMethod = StripeTextUtils.nullIfBlank(builder.tokenizationMethod); this.metadata = builder.metadata; }
@Test public void shouldFailValidateExpiryDateIfNullYear() { Card card = new Card(null, 1, null, null); assertFalse(card.validateExpiryDate(calendar)); }
@Test public void asCardBrand_whenBlank_returnsNull() { assertNull(asCardBrand(" ")); assertNull(asCardBrand(null)); }
@Nullable static SourceCardData fromJson(@Nullable JSONObject jsonObject) { if (jsonObject == null) { return null; } SourceCardData cardData = new SourceCardData(); cardData.setAddressLine1Check(optString(jsonObject, FIELD_ADDRESS_LINE1_CHECK)) .setAddressZipCheck(optString(jsonObject, FIELD_ADDRESS_ZIP_CHECK)) .setBrand(Card.asCardBrand(optString(jsonObject, FIELD_BRAND))) .setCountry(optString(jsonObject, FIELD_COUNTRY)) .setCvcCheck(optString(jsonObject, FIELD_CVC_CHECK)) .setDynamicLast4(optString(jsonObject, FIELD_DYNAMIC_LAST4)) .setExpiryMonth(optInteger(jsonObject, FIELD_EXP_MONTH)) .setExpiryYear(optInteger(jsonObject, FIELD_EXP_YEAR)) .setFunding(Card.asFundingType(optString(jsonObject, FIELD_FUNDING))) .setLast4(optString(jsonObject, FIELD_LAST4)) .setThreeDSecureStatus(asThreeDSecureStatus(optString(jsonObject, FIELD_THREE_D_SECURE))) .setTokenizationMethod(optString(jsonObject, FIELD_TOKENIZATION_METHOD)); Map<String, Object> nonStandardFields = jsonObjectToMapWithoutKeys(jsonObject, cardData.mStandardFields); if (nonStandardFields != null) { cardData.setAdditionalFields(nonStandardFields); } return cardData; }