dragon-code / card-number
使用Luhn算法生成和验证卡号。
Requires
- php: ^8.1
- archtechx/enums: ^0.3.2
Requires (Dev)
- illuminate/contracts: ^10.14 || ^11.0
- pestphp/pest: ^2.8
- symfony/var-dumper: ^6.3 || ^7.0
Suggests
- dragon-code/translation-set: Translation of validation rules into 78 localizations for Laravel Framework
README
简介
使用Luhn算法生成和验证卡号:信用卡、客户忠诚度等。
安装
要获取最新的Card Number
版本,只需使用Composer要求该项目。
composer require dragon-code/card-number
或者手动更新composer.json
中的require
块,并运行composer update
控制台命令。
{ "require": { "dragon-code/card-number": "^1.5" } }
使用方法
验证
您可以使用任何输入格式使用Luhn算法验证任何数字。
例如
use DragonCode\CardNumber\CardNumber; CardNumber::isValid(18); // true CardNumber::isValid(12); // false CardNumber::isValid('0018'); // true CardNumber::isValid('0019'); // false CardNumber::isValid('123-455'); // true CardNumber::isValid('123-454'); // false CardNumber::isValid('12-3456-1239'); // true CardNumber::isValid('12-3456-1230'); // false CardNumber::isValid('5580 4733 7202 4733'); // true CardNumber::isValid('5580 4733 7202 4732'); // false CardNumber::isValid('5580-4733x7202_47 33'); // true CardNumber::isValid('5580-4733x7202_47 32'); // false
您可以验证银行卡号。为此,将卡类型作为第二个参数传递
use DragonCode\CardNumber\CardNumber; use DragonCode\CardNumber\Enums\CardType; CardNumber::isValid('4026 8434 8316 8683', CardType::visa); // true CardNumber::isValid('4019 1404 0123 4567', CardType::visa); // true CardNumber::isValid('2730 1684 6416 1841', CardType::visa); // false CardNumber::isValid('2201 6868 4646 8444', CardType::visa); // false CardNumber::isValid('4026 8434 8316 8683', 'visa'); // true CardNumber::isValid('4019 1404 0123 4567', 'visa'); // true CardNumber::isValid('2730 1684 6416 1841', 'visa'); // false CardNumber::isValid('2201 6868 4646 8444', 'visa'); // false
您还可以检查无效的数字
use DragonCode\CardNumber\CardNumber; CardNumber::isInvalid(18); // false CardNumber::isInvalid(12); // true CardNumber::isInvalid('0018'); // false CardNumber::isInvalid('0019'); // true CardNumber::isInvalid('123-455'); // false CardNumber::isInvalid('123-454'); // true CardNumber::isInvalid('12-3456-1239'); // false CardNumber::isInvalid('12-3456-1230'); // true CardNumber::isInvalid('5580 4733 7202 4733'); // false CardNumber::isInvalid('5580 4733 7202 4732'); // true CardNumber::isInvalid('5580-4733x7202_47 33'); // false CardNumber::isInvalid('5580-4733x7202_47 32'); // true
除了数值外,您还可以验证数字-字母组合。例如
use DragonCode\CardNumber\CardNumber; use DragonCode\CardNumber\Enums\CardType; CardNumber::isValid('EKN-OSX', CardType::chars); // true CardNumber::isValid('EKN-56X', CardType::chars); // true CardNumber::isValid('ekn-osx', 'chars'); // true CardNumber::isValid('ekn-56x', 'chars'); // true CardNumber::isValid('EKN-OSX'); // false CardNumber::isValid('EKN-56X'); // false
可用的验证类型列表
自定义验证器
在某些情况下,可能没有足够的内置验证器,因此您可以轻松使用自己的验证器。为此,创建一个类,并从抽象类DragonCode\CardNumber\Validators\CardValidator
继承,然后将其引用传递到cardType
参数中
use DragonCode\CardNumber\CardNumber; use DragonCode\CardNumber\Validators\CardValidator; class SomeValidator extends CardValidator { protected static ?string $pattern = '/^[3-5]{3}/'; protected static array $numberLength = [4]; } CardNumber::isValid(3459, SomeValidator::class); // true CardNumber::isValid(2451, SomeValidator::class); // false CardNumber::isInvalid(3459, SomeValidator::class); // false CardNumber::isInvalid(2451, SomeValidator::class); // true
生成
您还可以轻松使用Luhn算法生成任何数字
use DragonCode\CardNumber\CardNumber; CardNumber::generate(1); // 18 CardNumber::generate(2); // 26 CardNumber::generate(10); // 109 CardNumber::generate(90); // 901 CardNumber::generate(908); // 9084
您还可以使用格式化程序来格式化结果值
use DragonCode\CardNumber\CardNumber; use DragonCode\CardNumber\Formatters\BankFormatter; use DragonCode\CardNumber\Formatters\LoyaltyFormatter; $loyalty = LoyaltyFormatter::create(); $bank = BankFormatter::create(); CardNumber::generate(1, $loyalty); // 0018 CardNumber::generate(2, $loyalty); // 0026 CardNumber::generate(12345, $loyalty); // 123-455 CardNumber::generate(23456, $loyalty); // 234-567 CardNumber::generate(123456, $loyalty); // 123-4566 CardNumber::generate(234567, $loyalty); // 234-5676 CardNumber::generate(123456123, $loyalty); // 12-3456-1239 CardNumber::generate(234567123, $loyalty); // 23-4567-1230 CardNumber::generate(558047337202473, $bank); // 5580 4733 7202 4733 CardNumber::generate(529391143678555, $bank); // 5293 9114 3678 5557
格式化程序
您还可以创建自己的格式化程序。为此,创建一个类,并从抽象类DragonCode\CardNumber\Formatters\Formatter
继承
use DragonCode\CardNumber\Formatters\Formatter; class SomeFormatter extends Formatter { protected int $splitLength = 6; protected string $delimiter = '/'; }
然后使用这个类
use App\Cards\Formatters\SomeFormatter; use DragonCode\CardNumber\CardNumber; $formatter = SomeFormatter::create(); CardNumber::generate(558047337202473, $formatter); // 5580/473372/024733
可用的格式化程序列表
DragonCode\CardNumber\Formatters\DefaultFormatter
DragonCode\CardNumber\Formatters\BankFormatter
DragonCode\CardNumber\Formatters\LoyaltyFormatter
DragonCode\CardNumber\Formatters\LoyaltyCharFormatter
除了数字格式化程序外,您还可以使用数字-字母组合。例如,使用DragonCode\CardNumber\Formatters\LoyaltyCharFormatter
格式化程序,您可以生成一个字母代码而不是数字,它在通过Luhn算法验证时将是有效的
use DragonCode\CardNumber\CardNumber; use DragonCode\CardNumber\Formatters\LoyaltyCharFormatter; $formatter = LoyaltyCharFormatter::create(); CardNumber::generate(345678123, $formatter); // KN-OSXY-AEKF
工厂
此外,您还可以将工厂指定为输入标识符参数。这样,您可以使用流畅的方法形成独特的标识规则。
这在例如,您创建客户忠诚度卡号时很有用,并希望在号码中指定发行年份以及其级别。
use DragonCode\CardNumber\CardNumber; use DragonCode\CardNumber\Factories\CustomerFactory; use DragonCode\CardNumber\Formatters\LoyaltyFormatter; $formatter = LoyaltyFormatter::create(); $customer = CustomerFactory::create()->level($user->loyalty_level)->customer($user->id); return CardNumber::generate($customer, $formatter); // For example, 230-4001-2348 // // 23 - year // 04 - loyalty level // 001234 - user id // 8 - control digit
use DragonCode\CardNumber\CardNumber; use DragonCode\CardNumber\Factories\BankFactory; use DragonCode\CardNumber\Formatters\BankFormatter; $formatter = BankFormatter::create(); $customer = BankFactory::create()->paymentType(3)->bank(12, 45, 75)->client(12345); return CardNumber::generate($customer, $formatter); // 3012 4575 0012 3452 // // 3 - payment type // 012 - bank ID // 45 - bank info // 75 - bank's program // 0012345 - client id // 2 - control digit
可用的工厂列表
DragonCode\CardNumber\Factories\BankFactory
DragonCode\CardNumber\Factories\CustomerFactory
Laravel
如果您使用Laravel框架,您还可以使用验证规则
use DragonCode\CardNumber\Laravel\Validation\Rules\CardNumberRule; use Illuminate\Foundation\Http\FormRequest; class SomeRequest extends FormRequest { public function rules(): array { return [ 'number' => ['required', new CardNumberRule()] ]; } }
您还可以检查银行卡
use DragonCode\CardNumber\Enums\CardType; use DragonCode\CardNumber\Laravel\Validation\Rules\CardNumberRule; use Illuminate\Foundation\Http\FormRequest; class SomeRequest extends FormRequest { public function rules(): array { return [ 'visa_card_1' => ['required', new CardNumberRule(CardType::visa)], 'visa_card_2' => ['required', new CardNumberRule('visa')], 'few_cards' => ['required', new CardNumberRule([CardType::visa, CardType::masterCard])], 'few_cards' => ['required', new CardNumberRule(['visa', 'mastercard'])], ]; } }
许可证
本软件包根据MIT许可证授权。