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