Skip to content

Commit

Permalink
feat: add regex for UnionPay and allow card number checking if cardbr…
Browse files Browse the repository at this point in the history
…and not detected (#882)

Co-authored-by: Pritish Budhiraja <[email protected]>
  • Loading branch information
aritro2002 and PritishBudhiraja authored Jan 31, 2025
1 parent c6fe132 commit 543d4dc
Show file tree
Hide file tree
Showing 6 changed files with 24 additions and 29 deletions.
14 changes: 11 additions & 3 deletions src/CardPattern.res
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ type card = {details: array<patterns>}
let defaultCardPattern = {
issuer: "",
pattern: %re("/^[0-9]/"),
cvcLength: [3],
maxCVCLength: 3,
length: [16],
cvcLength: [3, 4],
maxCVCLength: 4,
length: [13, 14, 15, 16, 17, 18, 19],
pincodeRequired: false,
}
let cardPatterns = [
Expand All @@ -26,6 +26,14 @@ let cardPatterns = [
maxCVCLength: 4,
pincodeRequired: true,
},
{
issuer: "UnionPay",
pattern: %re("/^(6[27]|81)/"),
cvcLength: [3],
length: [16, 17, 18, 19],
maxCVCLength: 3,
pincodeRequired: true,
},
{
issuer: "RuPay",
pattern: %re(
Expand Down
13 changes: 5 additions & 8 deletions src/CardUtils.res
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,7 @@ let formatCardNumber = (val, cardType) => {
| DISCOVER
| SODEXO
| RUPAY
| UNIONPAY
| VISA =>
`${clearValue->slice(0, 4)} ${clearValue->slice(4, 8)} ${clearValue->slice(
8,
Expand Down Expand Up @@ -348,7 +349,7 @@ let getCardBrandIcon = (cardType, paymentType) => {
| RUPAY => <Icon size=brandIconSize name="rupay-card" />
| JCB => <Icon size=brandIconSize name="jcb-card" />
| CARTESBANCAIRES => <Icon size=brandIconSize name="cartesbancaires-card" />
| UNIONPAY => <Icon size=brandIconSize name="card" />
| UNIONPAY => <Icon size=brandIconSize name="union-pay" />
| INTERAC => <Icon size=brandIconSize name="interac" />
| NOTFOUND =>
switch paymentType {
Expand Down Expand Up @@ -469,17 +470,13 @@ let isCardLengthValid = (cardBrand, cardNumberLength) => {

let cardValid = (cardNumber, cardBrand) => {
let clearValueLength = cardNumber->clearSpaces->String.length
if cardBrand == "" && (GlobalVars.isInteg || GlobalVars.isSandbox) {
Utils.checkIsTestCardWildcard(cardNumber)
} else {
isCardLengthValid(cardBrand, clearValueLength) && calculateLuhn(cardNumber)
}
isCardLengthValid(cardBrand, clearValueLength) && calculateLuhn(cardNumber)
}

let focusCardValid = (cardNumber, cardBrand) => {
let clearValueLength = cardNumber->clearSpaces->String.length
if cardBrand == "" && (GlobalVars.isInteg || GlobalVars.isSandbox) {
Utils.checkIsTestCardWildcard(cardNumber)
if cardBrand == "" {
clearValueLength == maxCardLength(cardBrand) && calculateLuhn(cardNumber)
} else {
(clearValueLength == maxCardLength(cardBrand) ||
(cardBrand === "Visa" && clearValueLength == 16)) && calculateLuhn(cardNumber)
Expand Down
13 changes: 4 additions & 9 deletions src/Payment.res
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,7 @@ let make = (~paymentMode, ~integrateError, ~logger) => {
setCardValid(clearValue, setIsCardValid)
if (
focusCardValid(clearValue, cardBrand) &&
(PaymentUtils.checkIsCardSupported(clearValue, supportedCardBrands)->Option.getOr(false) ||
Utils.checkIsTestCardWildcard(clearValue))
PaymentUtils.checkIsCardSupported(clearValue, supportedCardBrands)->Option.getOr(false)
) {
handleInputFocus(~currentRef=cardRef, ~destinationRef=expiryRef)
}
Expand Down Expand Up @@ -225,13 +224,9 @@ let make = (~paymentMode, ~integrateError, ~logger) => {
checkCardExpiry(getCardElementValue(iframeId, "card-expiry"))
| _ => true
}
let cardNetwork = {
if cardBrand != "" {
[("card_network", cardBrand->JSON.Encode.string)]
} else {
[]
}
}
let cardNetwork = [
("card_network", cardBrand != "" ? cardBrand->JSON.Encode.string : JSON.Encode.null),
]
if validFormat {
let body = switch paymentMode->getPaymentMode {
| Card =>
Expand Down
10 changes: 3 additions & 7 deletions src/Payments/CardPayment.res
Original file line number Diff line number Diff line change
Expand Up @@ -150,13 +150,9 @@ let make = (
let (month, year) = CardUtils.getExpiryDates(cardExpiry)

let onSessionBody = [("customer_acceptance", PaymentBody.customerAcceptanceBody)]
let cardNetwork = {
if cardBrand != "" {
[("card_network", cardBrand->JSON.Encode.string)]
} else {
[]
}
}
let cardNetwork = [
("card_network", cardBrand != "" ? cardBrand->JSON.Encode.string : JSON.Encode.null),
]
let defaultCardBody = PaymentBody.cardPaymentBody(
~cardNumber,
~month,
Expand Down
2 changes: 1 addition & 1 deletion src/Utilities/PaymentUtils.res
Original file line number Diff line number Diff line change
Expand Up @@ -559,7 +559,7 @@ let getSupportedCardBrands = (paymentMethodListValue: PaymentMethodsRecord.payme
let checkIsCardSupported = (cardNumber, supportedCardBrands) => {
let cardBrand = cardNumber->CardUtils.getCardBrand
let clearValue = cardNumber->CardUtils.clearSpaces
if cardBrand == "" && (GlobalVars.isInteg || GlobalVars.isSandbox) {
if cardBrand == "" {
Some(CardUtils.cardValid(clearValue, cardBrand))
} else if CardUtils.cardValid(clearValue, cardBrand) {
switch supportedCardBrands {
Expand Down
1 change: 0 additions & 1 deletion src/Utilities/Utils.res
Original file line number Diff line number Diff line change
Expand Up @@ -1428,7 +1428,6 @@ let getFirstAndLastNameFromFullName = fullName => {
}

let isKeyPresentInDict = (dict, key) => dict->Dict.get(key)->Option.isSome
let checkIsTestCardWildcard = val => ["1111222233334444"]->Array.includes(val)

let minorUnitToString = val => (val->Int.toFloat /. 100.)->Float.toString

Expand Down

0 comments on commit 543d4dc

Please sign in to comment.