Skip to content

Commit 3631909

Browse files
committed
Add support for 8 digit IINs and 2 digit last_digits
Previously issuerIdNumber was expected to be 6 digits and last4Digits to be 4 digits. This changes the validation to additionally allow for 8 digit issuerIdNumbers and 2 digit last4Digits. Additionally last4Digits has been deprecated in favor of the more appropriately named lastDigits.
1 parent 7f0a3d3 commit 3631909

7 files changed

Lines changed: 81 additions & 24 deletions

File tree

CHANGELOG.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,22 @@ CHANGELOG
4646
* `PAYVISION`
4747
* `TRUSTLY`
4848
* `WINDCAVE`
49+
* `com.maxmind.minfraud.request.CreditCard.last4Digits` has been deprecated in
50+
favor of `lastDigits` and will be removed in a future release. `lastDigits`
51+
/ `last4Digits` also now supports two digit values in addition to the
52+
previous four digit values.
53+
* Eight digit `com.maxmind.minfraud.request.CreditCard.issuerIdNumber` inputs are
54+
now supported in addition to the previously accepted six digit `issuerIdNumber`.
55+
In most cases, you should send the last four digits for
56+
`com.maxmind.minfraud.request.CreditCard.last4Digits`. If you send a
57+
`issuerIdNumber` that contains an eight digit IIN, and if the credit card brand
58+
is not one of the following, you should send the last two digits for
59+
`lastDigits`:
60+
* `Discover`
61+
* `JCB`
62+
* `Mastercard`
63+
* `UnionPay`
64+
* `Visa`
4965

5066
1.18.0 (2021-08-31)
5167
-------------------

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ Transaction request = new Transaction.Builder(
162162
.bankPhoneNumber("313-231-3213")
163163
.cvvResult('Y')
164164
.issuerIdNumber("213312")
165-
.last4Digits("3211")
165+
.lastDigits("3211")
166166
.was3dSecureSuccessful(true)
167167
.build()
168168
).email(

src/main/java/com/maxmind/minfraud/request/CreditCard.java

Lines changed: 40 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.maxmind.minfraud.request;
22

3+
import com.fasterxml.jackson.annotation.JsonIgnore;
34
import com.fasterxml.jackson.annotation.JsonProperty;
45
import com.maxmind.minfraud.AbstractModel;
56

@@ -10,7 +11,7 @@
1011
*/
1112
public final class CreditCard extends AbstractModel {
1213
private final String issuerIdNumber;
13-
private final String last4Digits;
14+
private final String lastDigits;
1415
private final String bankName;
1516
private final String bankPhoneCountryCode;
1617
private final String bankPhoneNumber;
@@ -21,7 +22,7 @@ public final class CreditCard extends AbstractModel {
2122

2223
private CreditCard(CreditCard.Builder builder) {
2324
issuerIdNumber = builder.issuerIdNumber;
24-
last4Digits = builder.last4Digits;
25+
lastDigits = builder.lastDigits;
2526
bankName = builder.bankName;
2627
bankPhoneCountryCode = builder.bankPhoneCountryCode;
2728
bankPhoneNumber = builder.bankPhoneNumber;
@@ -36,12 +37,12 @@ private CreditCard(CreditCard.Builder builder) {
3637
* from values set by the builder's methods.
3738
*/
3839
public static final class Builder {
39-
private static final Pattern IIN_PATTERN = Pattern.compile("^[0-9]{6}$");
40-
private static final Pattern LAST_4_PATTERN = Pattern.compile("^[0-9]{4}$");
40+
private static final Pattern IIN_PATTERN = Pattern.compile("^(?:[0-9]{6}|[0-9]{8})$");
41+
private static final Pattern LAST_DIGITS_PATTERN = Pattern.compile("^(?:[0-9]{2}|[0-9]{4})$");
4142
private static final Pattern TOKEN_PATTERN = Pattern.compile("^(?![0-9]{1,19}$)[\\x21-\\x7E]{1,255}$");
4243

4344
String issuerIdNumber;
44-
String last4Digits;
45+
String lastDigits;
4546
String bankName;
4647
String bankPhoneCountryCode;
4748
String bankPhoneNumber;
@@ -52,7 +53,7 @@ public static final class Builder {
5253

5354
/**
5455
* @param number The issuer ID number for the credit card. This is the
55-
* first 6 digits of the credit card number. It
56+
* first 6 or 8 digits of the credit card number. It
5657
* identifies the issuing bank.
5758
* @return The builder object.
5859
* @throws IllegalArgumentException when number is not a six digit
@@ -67,16 +68,30 @@ public CreditCard.Builder issuerIdNumber(String number) {
6768
}
6869

6970
/**
70-
* @param digits The last four digits of the credit card number.
71+
* @deprecated
72+
* Use lastDigits instead.
73+
*
74+
* @param digits The last two or four digits of the credit card number.
7175
* @return The builder object.
72-
* @throws IllegalArgumentException when number is not a four digit
76+
* @throws IllegalArgumentException when number is not a two or four digit
7377
* string.
7478
*/
79+
@Deprecated
7580
public CreditCard.Builder last4Digits(String digits) {
76-
if (!LAST_4_PATTERN.matcher(digits).matches()) {
77-
throw new IllegalArgumentException("The last 4 credit card digits " + digits + " are of the wrong format.");
81+
return this.lastDigits(digits);
82+
}
83+
84+
/**
85+
* @param digits The last two or four digits of the credit card number.
86+
* @return The builder object.
87+
* @throws IllegalArgumentException when number is not a two or four digit
88+
* string.
89+
*/
90+
public CreditCard.Builder lastDigits(String digits) {
91+
if (!LAST_DIGITS_PATTERN.matcher(digits).matches()) {
92+
throw new IllegalArgumentException("The last credit card digits " + digits + " are of the wrong format.");
7893
}
79-
last4Digits = digits;
94+
lastDigits = digits;
8095
return this;
8196
}
8297

@@ -188,11 +203,22 @@ public String getIssuerIdNumber() {
188203
}
189204

190205
/**
191-
* @return The last 4 digits of the credit card number.
206+
* @deprecated
207+
*
208+
* @return The last two or four digits of the credit card number.
192209
*/
193-
@JsonProperty("last_4_digits")
210+
@Deprecated
211+
@JsonIgnore
194212
public String getLast4Digits() {
195-
return last4Digits;
213+
return this.getLastDigits();
214+
}
215+
216+
/**
217+
* @return The last two or four digits of the credit card number.
218+
*/
219+
@JsonProperty("last_digits")
220+
public String getLastDigits() {
221+
return lastDigits;
196222
}
197223

198224
/**

src/test/java/com/maxmind/minfraud/request/CreditCardTest.java

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ public class CreditCardTest {
1616
public void testIssuerIdNumber() {
1717
CreditCard cc = new Builder().issuerIdNumber("123456").build();
1818
assertEquals("123456", cc.getIssuerIdNumber());
19+
20+
cc = new Builder().issuerIdNumber("12345678").build();
21+
assertEquals("12345678", cc.getIssuerIdNumber());
1922
}
2023

2124
@Test(expected = IllegalArgumentException.class)
@@ -37,21 +40,33 @@ public void testIssuerIdNumberThatHasLetters() {
3740
public void testLast4Digits() {
3841
CreditCard cc = new Builder().last4Digits("1234").build();
3942
assertEquals("1234", cc.getLast4Digits());
43+
assertEquals("1234", cc.getLastDigits());
44+
}
45+
46+
@Test
47+
public void testLastDigits() {
48+
CreditCard cc = new Builder().lastDigits("1234").build();
49+
assertEquals("1234", cc.getLast4Digits());
50+
assertEquals("1234", cc.getLastDigits());
51+
52+
cc = new Builder().lastDigits("12").build();
53+
assertEquals("12", cc.getLast4Digits());
54+
assertEquals("12", cc.getLastDigits());
4055
}
4156

4257
@Test(expected = IllegalArgumentException.class)
43-
public void testLast4DigitsThatIsTooLong() {
44-
new Builder().last4Digits("12345").build();
58+
public void testLastDigitsThatIsTooLong() {
59+
new Builder().lastDigits("12345").build();
4560
}
4661

4762
@Test(expected = IllegalArgumentException.class)
48-
public void testLast4DigitsThatIsTooShort() {
49-
new Builder().last4Digits("123").build();
63+
public void testLastDigitsThatIsTooShort() {
64+
new Builder().lastDigits("123").build();
5065
}
5166

5267
@Test(expected = IllegalArgumentException.class)
53-
public void testLast4DigitsThatHasLetters() {
54-
new Builder().last4Digits("123a").build();
68+
public void testLastDigitsThatHasLetters() {
69+
new Builder().lastDigits("123a").build();
5570
}
5671

5772
@Test

src/test/java/com/maxmind/minfraud/request/RequestTestHelper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ private static Transaction makeTransaction(Email e) throws Exception {
109109
.bankPhoneNumber("123-456-1234")
110110
.avsResult('Y')
111111
.cvvResult('N')
112-
.last4Digits("7643")
112+
.lastDigits("7643")
113113
.token("123456abc1234")
114114
.was3dSecureSuccessful(true)
115115
.build()

src/test/resources/test-data/full-request-email-md5.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
},
4848
"credit_card": {
4949
"issuer_id_number": "411111",
50-
"last_4_digits": "7643",
50+
"last_digits": "7643",
5151
"bank_name": "Bank of No Hope",
5252
"bank_phone_country_code": "1",
5353
"bank_phone_number": "123-456-1234",

src/test/resources/test-data/full-request.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
},
4848
"credit_card": {
4949
"issuer_id_number": "411111",
50-
"last_4_digits": "7643",
50+
"last_digits": "7643",
5151
"bank_name": "Bank of No Hope",
5252
"bank_phone_country_code": "1",
5353
"bank_phone_number": "123-456-1234",

0 commit comments

Comments
 (0)