ar_EG
1 year ago
ar_JO
1 year ago
ar_SA
1 year ago
at_AT
1 year ago
bg_BG
1 year ago
bn_BD
1 year ago
cs_CZ
1 year ago
da_DK
1 year ago
de_AT
1 year ago
de_CH
1 year ago
de_DE
1 year ago
el_CY
1 year ago
el_GR
1 year ago
en_AU
1 year ago
en_CA
1 year ago
en_GB
1 year ago
en_HK
1 year ago
en_IN
1 year ago
en_NG
1 year ago
en_NZ
1 year ago
en_PH
1 year ago
en_SG
1 year ago
en_UG
1 year ago
en_US
1 year ago
en_ZA
1 year ago
es_AR
1 year ago
es_ES
1 year ago
es_PE
1 year ago
es_VE
1 year ago
et_EE
1 year ago
fa_IR
1 year ago
fi_FI
1 year ago
fr_BE
1 year ago
fr_CA
1 year ago
fr_CH
1 year ago
fr_FR
1 year ago
he_IL
1 year ago
hr_HR
1 year ago
hu_HU
1 year ago
hy_AM
1 year ago
id_ID
1 year ago
is_IS
1 year ago
it_CH
1 year ago
it_IT
1 year ago
ja_JP
1 year ago
ka_GE
1 year ago
kk_KZ
1 year ago
ko_KR
1 year ago
lt_LT
1 year ago
lv_LV
1 year ago
me_ME
1 year ago
mn_MN
1 year ago
ms_MY
1 year ago
nb_NO
1 year ago
ne_NP
1 year ago
nl_BE
1 year ago
nl_NL
1 year ago
pl_PL
1 year ago
pt_BR
1 year ago
pt_PT
1 year ago
ro_MD
1 year ago
ro_RO
1 year ago
ru_RU
1 year ago
sk_SK
1 year ago
sl_SI
1 year ago
sr_Cyrl_RS
1 year ago
sr_Latn_RS
1 year ago
sr_RS
1 year ago
sv_SE
1 year ago
th_TH
1 year ago
tr_TR
1 year ago
uk_UA
1 year ago
vi_VN
1 year ago
zh_CN
1 year ago
zh_TW
1 year ago
Address.php
1 year ago
Barcode.php
1 year ago
Base.php
1 year ago
Biased.php
1 year ago
Color.php
1 year ago
Company.php
1 year ago
DateTime.php
1 year ago
File.php
1 year ago
HtmlLorem.php
1 year ago
Image.php
1 year ago
Internet.php
1 year ago
Lorem.php
1 year ago
Medical.php
1 year ago
Miscellaneous.php
1 year ago
Payment.php
1 year ago
Person.php
1 year ago
PhoneNumber.php
1 year ago
Text.php
1 year ago
UserAgent.php
1 year ago
Uuid.php
1 year ago
Payment.php
319 lines
| 1 | <?php |
| 2 | /** |
| 3 | * @license MIT |
| 4 | * |
| 5 | * Modified by impress-org on 07-August-2024 using Strauss. |
| 6 | * @see https://github.com/BrianHenryIE/strauss |
| 7 | */ |
| 8 | |
| 9 | namespace Give\Vendors\Faker\Provider; |
| 10 | |
| 11 | use Give\Vendors\Faker\Calculator\Iban; |
| 12 | use Give\Vendors\Faker\Calculator\Luhn; |
| 13 | |
| 14 | class Payment extends Base |
| 15 | { |
| 16 | public static $expirationDateFormat = 'm/y'; |
| 17 | |
| 18 | protected static $cardVendors = [ |
| 19 | 'Visa', 'Visa', 'Visa', 'Visa', 'Visa', |
| 20 | 'MasterCard', 'MasterCard', 'MasterCard', 'MasterCard', 'MasterCard', |
| 21 | 'American Express', 'Discover Card', 'Visa Retired', 'JCB', |
| 22 | ]; |
| 23 | |
| 24 | /** |
| 25 | * @var array List of card brand masks for generating valid credit card numbers |
| 26 | * |
| 27 | * @see https://en.wikipedia.org/wiki/Payment_card_number Reference for existing prefixes |
| 28 | * @see https://www.mastercard.us/en-us/issuers/get-support/2-series-bin-expansion.html MasterCard 2017 2-Series BIN Expansion |
| 29 | */ |
| 30 | protected static $cardParams = [ |
| 31 | 'Visa' => [ |
| 32 | '4539###########', |
| 33 | '4556###########', |
| 34 | '4916###########', |
| 35 | '4532###########', |
| 36 | '4929###########', |
| 37 | '40240071#######', |
| 38 | '4485###########', |
| 39 | '4716###########', |
| 40 | '4##############', |
| 41 | ], |
| 42 | 'Visa Retired' => [ |
| 43 | '4539########', |
| 44 | '4556########', |
| 45 | '4916########', |
| 46 | '4532########', |
| 47 | '4929########', |
| 48 | '40240071####', |
| 49 | '4485########', |
| 50 | '4716########', |
| 51 | '4###########', |
| 52 | ], |
| 53 | 'MasterCard' => [ |
| 54 | '2221###########', |
| 55 | '23#############', |
| 56 | '24#############', |
| 57 | '25#############', |
| 58 | '26#############', |
| 59 | '2720###########', |
| 60 | '51#############', |
| 61 | '52#############', |
| 62 | '53#############', |
| 63 | '54#############', |
| 64 | '55#############', |
| 65 | ], |
| 66 | 'American Express' => [ |
| 67 | '34############', |
| 68 | '37############', |
| 69 | ], |
| 70 | 'Discover Card' => [ |
| 71 | '6011###########', |
| 72 | ], |
| 73 | 'JCB' => [ |
| 74 | '3528###########', |
| 75 | '3589###########', |
| 76 | ], |
| 77 | ]; |
| 78 | |
| 79 | /** |
| 80 | * @var array list of IBAN formats, source: @see https://www.swift.com/standards/data-standards/iban |
| 81 | */ |
| 82 | protected static $ibanFormats = [ |
| 83 | 'AD' => [['n', 4], ['n', 4], ['c', 12]], |
| 84 | 'AE' => [['n', 3], ['n', 16]], |
| 85 | 'AL' => [['n', 8], ['c', 16]], |
| 86 | 'AT' => [['n', 5], ['n', 11]], |
| 87 | 'AZ' => [['a', 4], ['c', 20]], |
| 88 | 'BA' => [['n', 3], ['n', 3], ['n', 8], ['n', 2]], |
| 89 | 'BE' => [['n', 3], ['n', 7], ['n', 2]], |
| 90 | 'BG' => [['a', 4], ['n', 4], ['n', 2], ['c', 8]], |
| 91 | 'BH' => [['a', 4], ['c', 14]], |
| 92 | 'BR' => [['n', 8], ['n', 5], ['n', 10], ['a', 1], ['c', 1]], |
| 93 | 'CH' => [['n', 5], ['c', 12]], |
| 94 | 'CR' => [['n', 4], ['n', 14]], |
| 95 | 'CY' => [['n', 3], ['n', 5], ['c', 16]], |
| 96 | 'CZ' => [['n', 4], ['n', 6], ['n', 10]], |
| 97 | 'DE' => [['n', 8], ['n', 10]], |
| 98 | 'DK' => [['n', 4], ['n', 9], ['n', 1]], |
| 99 | 'DO' => [['c', 4], ['n', 20]], |
| 100 | 'EE' => [['n', 2], ['n', 2], ['n', 11], ['n', 1]], |
| 101 | 'EG' => [['n', 4], ['n', 4], ['n', 17]], |
| 102 | 'ES' => [['n', 4], ['n', 4], ['n', 1], ['n', 1], ['n', 10]], |
| 103 | 'FI' => [['n', 6], ['n', 7], ['n', 1]], |
| 104 | 'FR' => [['n', 5], ['n', 5], ['c', 11], ['n', 2]], |
| 105 | 'GB' => [['a', 4], ['n', 6], ['n', 8]], |
| 106 | 'GE' => [['a', 2], ['n', 16]], |
| 107 | 'GI' => [['a', 4], ['c', 15]], |
| 108 | 'GR' => [['n', 3], ['n', 4], ['c', 16]], |
| 109 | 'GT' => [['c', 4], ['c', 20]], |
| 110 | 'HR' => [['n', 7], ['n', 10]], |
| 111 | 'HU' => [['n', 3], ['n', 4], ['n', 1], ['n', 15], ['n', 1]], |
| 112 | 'IE' => [['a', 4], ['n', 6], ['n', 8]], |
| 113 | 'IL' => [['n', 3], ['n', 3], ['n', 13]], |
| 114 | 'IS' => [['n', 4], ['n', 2], ['n', 6], ['n', 10]], |
| 115 | 'IT' => [['a', 1], ['n', 5], ['n', 5], ['c', 12]], |
| 116 | 'KW' => [['a', 4], ['n', 22]], |
| 117 | 'KZ' => [['n', 3], ['c', 13]], |
| 118 | 'LB' => [['n', 4], ['c', 20]], |
| 119 | 'LI' => [['n', 5], ['c', 12]], |
| 120 | 'LT' => [['n', 5], ['n', 11]], |
| 121 | 'LU' => [['n', 3], ['c', 13]], |
| 122 | 'LV' => [['a', 4], ['c', 13]], |
| 123 | 'MC' => [['n', 5], ['n', 5], ['c', 11], ['n', 2]], |
| 124 | 'MD' => [['c', 2], ['c', 18]], |
| 125 | 'ME' => [['n', 3], ['n', 13], ['n', 2]], |
| 126 | 'MK' => [['n', 3], ['c', 10], ['n', 2]], |
| 127 | 'MR' => [['n', 5], ['n', 5], ['n', 11], ['n', 2]], |
| 128 | 'MT' => [['a', 4], ['n', 5], ['c', 18]], |
| 129 | 'MU' => [['a', 4], ['n', 2], ['n', 2], ['n', 12], ['n', 3], ['a', 3]], |
| 130 | 'NL' => [['a', 4], ['n', 10]], |
| 131 | 'NO' => [['n', 4], ['n', 6], ['n', 1]], |
| 132 | 'PK' => [['a', 4], ['c', 16]], |
| 133 | 'PL' => [['n', 8], ['n', 16]], |
| 134 | 'PS' => [['a', 4], ['c', 21]], |
| 135 | 'PT' => [['n', 4], ['n', 4], ['n', 11], ['n', 2]], |
| 136 | 'RO' => [['a', 4], ['c', 16]], |
| 137 | 'RS' => [['n', 3], ['n', 13], ['n', 2]], |
| 138 | 'SA' => [['n', 2], ['c', 18]], |
| 139 | 'SE' => [['n', 3], ['n', 16], ['n', 1]], |
| 140 | 'SI' => [['n', 5], ['n', 8], ['n', 2]], |
| 141 | 'SK' => [['n', 4], ['n', 6], ['n', 10]], |
| 142 | 'SM' => [['a', 1], ['n', 5], ['n', 5], ['c', 12]], |
| 143 | 'TN' => [['n', 2], ['n', 3], ['n', 13], ['n', 2]], |
| 144 | 'TR' => [['n', 5], ['n', 1], ['c', 16]], |
| 145 | 'VG' => [['a', 4], ['n', 16]], |
| 146 | ]; |
| 147 | |
| 148 | /** |
| 149 | * @return string Returns a credit card vendor name |
| 150 | * |
| 151 | * @example 'MasterCard' |
| 152 | */ |
| 153 | public static function creditCardType() |
| 154 | { |
| 155 | return static::randomElement(static::$cardVendors); |
| 156 | } |
| 157 | |
| 158 | /** |
| 159 | * Returns the String of a credit card number. |
| 160 | * |
| 161 | * @param string $type Supporting any of 'Visa', 'MasterCard', 'American Express', 'Discover' and 'JCB' |
| 162 | * @param bool $formatted Set to true if the output string should contain one separator every 4 digits |
| 163 | * @param string $separator Separator string for formatting card number. Defaults to dash (-). |
| 164 | * |
| 165 | * @return string |
| 166 | * |
| 167 | * @example '4485480221084675' |
| 168 | */ |
| 169 | public static function creditCardNumber($type = null, $formatted = false, $separator = '-') |
| 170 | { |
| 171 | if (null === $type) { |
| 172 | $type = static::creditCardType(); |
| 173 | } |
| 174 | $mask = static::randomElement(static::$cardParams[$type]); |
| 175 | |
| 176 | $number = static::numerify($mask); |
| 177 | $number .= Luhn::computeCheckDigit($number); |
| 178 | |
| 179 | if ($formatted) { |
| 180 | $p1 = substr($number, 0, 4); |
| 181 | $p2 = substr($number, 4, 4); |
| 182 | $p3 = substr($number, 8, 4); |
| 183 | $p4 = substr($number, 12); |
| 184 | $number = $p1 . $separator . $p2 . $separator . $p3 . $separator . $p4; |
| 185 | } |
| 186 | |
| 187 | return $number; |
| 188 | } |
| 189 | |
| 190 | /** |
| 191 | * @param bool $valid True (by default) to get a valid expiration date, false to get a maybe valid date |
| 192 | * |
| 193 | * @return \DateTime |
| 194 | * |
| 195 | * @example 04/13 |
| 196 | */ |
| 197 | public function creditCardExpirationDate($valid = true) |
| 198 | { |
| 199 | if ($valid) { |
| 200 | return $this->generator->dateTimeBetween('now', '36 months'); |
| 201 | } |
| 202 | |
| 203 | return $this->generator->dateTimeBetween('-36 months', '36 months'); |
| 204 | } |
| 205 | |
| 206 | /** |
| 207 | * @param bool $valid True (by default) to get a valid expiration date, false to get a maybe valid date |
| 208 | * @param string $expirationDateFormat |
| 209 | * |
| 210 | * @return string |
| 211 | * |
| 212 | * @example '04/13' |
| 213 | */ |
| 214 | public function creditCardExpirationDateString($valid = true, $expirationDateFormat = null) |
| 215 | { |
| 216 | return $this->creditCardExpirationDate($valid)->format(null === $expirationDateFormat ? static::$expirationDateFormat : $expirationDateFormat); |
| 217 | } |
| 218 | |
| 219 | /** |
| 220 | * @param bool $valid True (by default) to get a valid expiration date, false to get a maybe valid date |
| 221 | * |
| 222 | * @return array |
| 223 | */ |
| 224 | public function creditCardDetails($valid = true) |
| 225 | { |
| 226 | $type = static::creditCardType(); |
| 227 | |
| 228 | return [ |
| 229 | 'type' => $type, |
| 230 | 'number' => static::creditCardNumber($type), |
| 231 | 'name' => $this->generator->name(), |
| 232 | 'expirationDate' => $this->creditCardExpirationDateString($valid), |
| 233 | ]; |
| 234 | } |
| 235 | |
| 236 | /** |
| 237 | * International Bank Account Number (IBAN) |
| 238 | * |
| 239 | * @see http://en.wikipedia.org/wiki/International_Bank_Account_Number |
| 240 | * |
| 241 | * @param string $countryCode ISO 3166-1 alpha-2 country code |
| 242 | * @param string $prefix for generating bank account number of a specific bank |
| 243 | * @param int $length total length without country code and 2 check digits |
| 244 | * |
| 245 | * @return string |
| 246 | */ |
| 247 | public static function iban($countryCode = null, $prefix = '', $length = null) |
| 248 | { |
| 249 | $countryCode = null === $countryCode ? self::randomKey(self::$ibanFormats) : strtoupper($countryCode); |
| 250 | |
| 251 | $format = !isset(static::$ibanFormats[$countryCode]) ? null : static::$ibanFormats[$countryCode]; |
| 252 | |
| 253 | if ($length === null) { |
| 254 | if ($format === null) { |
| 255 | $length = 24; |
| 256 | } else { |
| 257 | $length = 0; |
| 258 | |
| 259 | foreach ($format as $part) { |
| 260 | [$class, $groupCount] = $part; |
| 261 | $length += $groupCount; |
| 262 | } |
| 263 | } |
| 264 | } |
| 265 | |
| 266 | if ($format === null) { |
| 267 | $format = [['n', $length]]; |
| 268 | } |
| 269 | |
| 270 | $expandedFormat = ''; |
| 271 | |
| 272 | foreach ($format as $item) { |
| 273 | [$class, $length] = $item; |
| 274 | $expandedFormat .= str_repeat($class, $length); |
| 275 | } |
| 276 | |
| 277 | $result = $prefix; |
| 278 | $expandedFormat = substr($expandedFormat, strlen($result)); |
| 279 | |
| 280 | foreach (str_split($expandedFormat) as $class) { |
| 281 | switch ($class) { |
| 282 | default: |
| 283 | case 'c': |
| 284 | $result .= Miscellaneous::boolean() ? static::randomDigit() : strtoupper(static::randomLetter()); |
| 285 | |
| 286 | break; |
| 287 | |
| 288 | case 'a': |
| 289 | $result .= strtoupper(static::randomLetter()); |
| 290 | |
| 291 | break; |
| 292 | |
| 293 | case 'n': |
| 294 | $result .= static::randomDigit(); |
| 295 | |
| 296 | break; |
| 297 | } |
| 298 | } |
| 299 | |
| 300 | $checksum = Iban::checksum($countryCode . '00' . $result); |
| 301 | |
| 302 | return $countryCode . $checksum . $result; |
| 303 | } |
| 304 | |
| 305 | /** |
| 306 | * Return the String of a SWIFT/BIC number |
| 307 | * |
| 308 | * @example 'RZTIAT22263' |
| 309 | * |
| 310 | * @see http://en.wikipedia.org/wiki/ISO_9362 |
| 311 | * |
| 312 | * @return string Swift/Bic number |
| 313 | */ |
| 314 | public static function swiftBicNumber() |
| 315 | { |
| 316 | return self::regexify('^([A-Z]){4}([A-Z]){2}([0-9A-Z]){2}([0-9A-Z]{3})?$'); |
| 317 | } |
| 318 | } |
| 319 |