PHP code example of digitaltunnel / secure-code
1. Go to this page and download the library: Download digitaltunnel/secure-code library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
digitaltunnel / secure-code example snippets
use DigitalTunnel\SecureCode\SecureCode;
use DigitalTunnel\SecureCode\Enums\Charset;
// Generate with defaults (8-char alphanumeric)
$code = SecureCode::generate(); // "a9Kf3mX2"
// 6-digit numeric PIN
$pin = SecureCode::length(6)->charset(Charset::Numeric)->generate(); // "847293"
// Use a preset
$voucher = SecureCode::preset('voucher')->generate(); // "A8K3-M7F2-B9X1-P4J6"
// Pattern-based
$code = SecureCode::pattern('AAA-999-AAA')->generate(); // "KFM-847-XBP"
// Sequential document ID (
return [
'length' => 8,
'charset' => 'Alphanumeric',
'exclude_similar' => false,
'max_attempts' => 1000,
'vault' => [
'ttl' => 300, // seconds
'max_attempts' => 5,
'cache_prefix' => 'secure_code_vault:',
],
'hashid' => [
'salt' => '',
'min_length' => 6,
],
'sequences' => [
'connection' => null, // null = default DB connection
'table' => 'secure_code_sequences',
'pad' => 5, // zero-pad width for sequence numbers
'format' => '{prefix}{sequence}{suffix}',
'reset' => 'never', // 'never', 'daily', 'monthly', 'yearly'
'start_at' => 1,
],
];
use DigitalTunnel\SecureCode\SecureCode;
$code = SecureCode::generate();
// "a9Kf3mX2" (8-char alphanumeric by default)
SecureCode::length(4)->generate(); // "aK3m"
SecureCode::length(32)->generate(); // "a9Kf3mX2bP7nR4jL8wQ5vT6yU1cE0dG"
use DigitalTunnel\SecureCode\Enums\Charset;
SecureCode::charset(Charset::Numeric)->generate(); // "84729361"
SecureCode::charset(Charset::Alpha)->generate(); // "aKfmXbPn"
SecureCode::charset(Charset::AlphaUpper)->generate(); // "AKFMXBPN"
SecureCode::charset(Charset::AlphaLower)->generate(); // "akfmxbpn"
SecureCode::charset(Charset::Alphanumeric)->generate(); // "a9Kf3mX2"
SecureCode::charset(Charset::AlphanumericUpper)->generate(); // "A9KF3MX2"
SecureCode::charset(Charset::AlphanumericLower)->generate(); // "a9kf3mx2"
SecureCode::charset(Charset::Hex)->generate(); // "3a7f1b9e"
SecureCode::charset(Charset::HexUpper)->generate(); // "3A7F1B9E"
SecureCode::charset(Charset::Binary)->generate(); // "10110010"
SecureCode::charset(Charset::Base32)->generate(); // "JBSWY3DP"
SecureCode::charset(Charset::Base58)->generate(); // "4K7nR2jL"
SecureCode::charset(Charset::Base64Safe)->generate(); // "aK3m-X_2b"
SecureCode::pool('ABCDEF123456')->length(8)->generate();
// "B3A6D1F4"
SecureCode::length(8)->prefix('INV-')->generate();
// "INV-a9Kf3mX2"
SecureCode::length(8)->suffix('-2026')->generate();
// "a9Kf3mX2-2026"
SecureCode::length(6)->prefix('ORD-')->suffix('-US')->generate();
// "ORD-847293-US"
SecureCode::length(12)->separator('-', 4)->generate();
// "A8K3-M7F2-B9X1"
SecureCode::length(9)->separator(' ', 3)->generate();
// "847 293 615"
SecureCode::length(10)->charset(Charset::Alpha)->uppercase()->generate();
// "AKFMXBPNRJ"
SecureCode::length(10)->charset(Charset::Alphanumeric)->lowercase()->generate();
// "a9kf3mx2bp"
SecureCode::charset(Charset::Alphanumeric)->excludeSimilar()->generate();
$codes = SecureCode::length(8)->count(10)->generate();
// ['a9Kf3mX2', 'bP7nR4jL', ... ] (array of 10 strings)
$codes = SecureCode::length(10)
->count(50)
->unique(fn (string $code) => ! DB::table('vouchers')->where('code', $code)->exists())
->generate();
use DigitalTunnel\SecureCode\Contracts\UniquenessChecker;
class VoucherUniquenessChecker implements UniquenessChecker
{
public function isUnique(string $code): bool
{
return ! Voucher::where('code', $code)->exists();
}
}
$codes = SecureCode::length(10)
->count(100)
->unique(new VoucherUniquenessChecker())
->generate();
$code = SecureCode::length(10)
->uniqueInTable('vouchers', 'code')
->generate();
// With a specific database connection
$code = SecureCode::length(10)
->uniqueInTable('vouchers', 'code', 'mysql')
->generate();
// Batch of unique codes
$codes = SecureCode::length(10)
->count(500)
->uniqueInTable('promo_codes', 'code')
->generate();
SecureCode::length(4)
->charset(Charset::Numeric)
->unique(fn ($code) => ! in_array($code, $existing))
->maxAttempts(5000)
->generate();
use DigitalTunnel\SecureCode\Enums\Preset;
SecureCode::preset('pin')->generate(); // "847293" (6 numeric digits)
SecureCode::preset('otp')->generate(); // "529184" (6 numeric digits)
SecureCode::preset('voucher')->generate(); // "A8K3-M7F2-B9X1-P4J6" (16 upper, no similar, dashed)
SecureCode::preset('serial')->generate(); // "3A7F-1B9E-4C2D-8F5A-6E0B" (20 hex, dashed)
SecureCode::preset('api-key')->generate(); // "sk_aK3mX2bP7n..." (40 base64-safe, sk_ prefix)
SecureCode::preset('token')->generate(); // 64 alphanumeric chars
SecureCode::preset('invite')->generate(); // 12 base58 chars
SecureCode::preset(Preset::Pin)->length(8)->generate(); // "84729361" (8-digit PIN)
SecureCode::pattern('AAA-999-AAA')->generate(); // "KFM-847-XBP"
SecureCode::pattern('99-AAAA-99')->generate(); // "84-KFMX-72"
SecureCode::pattern('INV-999-AA')->generate(); // "INV-847-KF"
SecureCode::pattern('XXXX-XXXX')->generate(); // "3A7F-1B9E"
SecureCode::pattern('***-***')->generate(); // "a9K-f3m"
// Batch from pattern
$codes = SecureCode::pattern('AAA-999')->count(100)->generate();
use DigitalTunnel\SecureCode\Support\Checksum;
$code = SecureCode::length(7)
->charset(Charset::Numeric)
->withChecksum('luhn')
->generate();
// "84729355" (7 digits + 1 Luhn check digit = 8 chars)
// Verify
SecureCode::verifyChecksum($code, 'luhn'); // true
Checksum::verifyLuhn($code); // true
$code = SecureCode::length(6)
->charset(Charset::AlphanumericUpper)
->withChecksum('mod97')
->generate();
// "A8K3MF42" (6 chars + 2 check digits = 8 chars)
SecureCode::verifyChecksum($code, 'mod97'); // true
Checksum::appendLuhn('123456'); // "1234566"
Checksum::verifyLuhn('1234566'); // true
Checksum::appendMod97('ABC123'); // "ABC12374"
Checksum::verifyMod97('ABC12374'); // true
SecureCode::mask('ABCD-EFGH-IJKL');
// "****-****-IJKL" (last 4 visible, preserves dashes)
SecureCode::mask('ABCD-EFGH-IJKL', visibleEnd: 4, preserve: '-');
// "****-****-IJKL"
SecureCode::mask('ABCDEFGH', visibleStart: 3);
// "ABC*****"
SecureCode::mask('ABCDEFGHIJ', visibleStart: 2, visibleEnd: 2);
// "AB******IJ"
SecureCode::mask('sk_live_abc123def456', character: '#', visibleEnd: 6);
// "##############ef456"
$info = SecureCode::length(8)->charset(Charset::Alphanumeric)->entropy();
// [
// 'bits' => 47.63,
// 'strength' => 'moderate',
// 'pool_size' => 62,
// 'length' => 8,
// 'combinations' => '218340105584896',
// ]
$vault = SecureCode::vault(
length: 6, // code length
charset: Charset::Numeric,
ttl: 300, // expires in 5 minutes
maxAttempts: 5, // lock after 5 wrong guesses
);
// Issue a code
$code = $vault->issue('[email protected] ');
// "847293" -- stored in cache, expires automatically
// Verify (returns true and auto-revokes on success)
$vault->verify('[email protected] ', '847293'); // true
$vault->verify('[email protected] ', '847293'); // false (already used)
// Check if a code is pending
$vault->pending('[email protected] '); // bool
// Remaining attempts before lockout
$vault->remainingAttempts('[email protected] '); // int
// Manually revoke
$vault->revoke('[email protected] ');
$hashid = SecureCode::hashid(salt: 'my-secret-salt', minLength: 8);
$encoded = $hashid->encode(12345); // "X8kN3mBp"
$decoded = $hashid->decode($encoded); // 12345
// Different salts produce different encodings
SecureCode::hashid(salt: 'salt-a')->encode(42); // "aBcDeFgH"
SecureCode::hashid(salt: 'salt-b')->encode(42); // "xYzWvUtS"
// JSON
$json = SecureCode::length(8)->count(100)->toJson();
// '["A8K3M7F2","B9X1P4J6",...]'
$json = SecureCode::length(8)->count(100)->toJson(pretty: true);
// Pretty-printed JSON
// CSV
$csv = SecureCode::preset('voucher')->count(50)->toCsv();
// "code\nA8K3-M7F2-B9X1-P4J6\n..."
$csv = SecureCode::length(8)->count(50)->toCsv('voucher_code');
// Custom header
// Plain text (one per line)
$text = SecureCode::length(8)->count(50)->toText();
// "A8K3M7F2\nB9X1P4J6\n..."
use DigitalTunnel\SecureCode\Events\CodeGenerated;
use DigitalTunnel\SecureCode\Events\CodeBatchGenerated;
// Enable events
$code = SecureCode::length(8)->withEvents()->generate();
// Dispatches CodeGenerated with $event->code
$codes = SecureCode::length(8)->count(10)->withEvents()->generate();
// Dispatches CodeBatchGenerated with $event->codes and $event->count
Event::listen(CodeGenerated::class, function (CodeGenerated $event) {
Log::info('Code generated', ['code' => $event->code]);
});
Event::listen(CodeBatchGenerated::class, function (CodeBatchGenerated $event) {
Log::info('Batch generated', ['count' => $event->count]);
});
use DigitalTunnel\SecureCode\Rules\SecureCodeFormat;
use DigitalTunnel\SecureCode\Enums\Charset;
// Validate length
$request->validate([
'code' => ['set
$request->validate([
'code' => ['de' => ['
$id = SecureCode::sequence('invoice')
->prefix('INV-')
->padSequence(5)
->next();
// "INV-00001"
// Next call: "INV-00002", "INV-00003", ...
$id = SecureCode::sequence('invoice')
->prefix('INV-')
->suffix('-EG')
->format('{prefix}{sequence}{separator}{Y}{m}{d}{suffix}')
->padSequence(5)
->resetEvery('yearly')
->next();
// "INV-00001-20260404-EG"
$ids = SecureCode::sequence('order')
->prefix('ORD-')
->format('{prefix}{sequence}{separator}{Y}{m}{d}')
->padSequence(5)
->next(3);
// ["ORD-00001-20260404", "ORD-00002-20260404", "ORD-00003-20260404"]
$builder = SecureCode::sequence('invoice')->prefix('INV-')->padSequence(5);
// Current value (last allocated), null if never used
$builder->current(); // null
$builder->next(); // "INV-00001"
// Current value after allocation
$builder->current(); // 1
// Preview next without allocating
$builder->preview(); // "INV-00002"
// Resets to 1 every year
SecureCode::sequence('invoice')->resetEvery('yearly')->next();
// Resets to 1 every month
SecureCode::sequence('receipt')->resetEvery('monthly')->next();
// Resets to 1 every day
SecureCode::sequence('ticket')->resetEvery('daily')->next();
// Never resets (default)
SecureCode::sequence('order')->resetEvery('never')->next();
$id = SecureCode::sequence('invoice')
->startAt(1000) // first ever allocation starts at 1000
->connection('mysql') // use a specific DB connection
->next();
// "01000"
use DigitalTunnel\SecureCode\Facades\SecureCode;
SecureCode::length(8)->generate();
$vouchers = SecureCode::length(16)
->charset(Charset::AlphanumericUpper)
->excludeSimilar()
->separator('-', 4)
->prefix('GIFT-')
->suffix('-2026')
->withChecksum('mod97')
->withEvents()
->count(500)
->uniqueInTable('vouchers', 'code')
->maxAttempts(2000)
->generate();
$template = SecureCode::length(12)->charset(Charset::AlphanumericUpper)->separator('-', 4);
$code1 = $template->generate(); // uses template
$code2 = $template->prefix('VIP-')->generate(); // extends template safely
$vault = SecureCode::vault(ttl: 600); // 10 min expiry
$code = $vault->issue($user->email);
Mail::to($user)->send(new VerificationMail($code));
// Later, when user submits the code:
if ($vault->verify($user->email, $request->code)) {
$user->markEmailAsVerified();
}
$card = SecureCode::preset('voucher')
->withChecksum('mod97')
->uniqueInTable('gift_cards', 'code')
->generate();
// When redeeming:
if (! SecureCode::verifyChecksum($request->code, 'mod97')) {
abort(422, 'Invalid gift card format.');
}
$hashid = SecureCode::hashid(salt: config('app.key'));
// Generate URL
$url = route('orders.show', $hashid->encode($order->id));
// /orders/X8kN3mBp
// Resolve in controller
$orderId = $hashid->decode($request->route('order'));
$csv = SecureCode::preset('voucher')
->count(10000)
->uniqueInTable('promo_codes', 'code')
->toCsv('promo_code');
Storage::put('exports/promo-codes.csv', $csv);
$info = SecureCode::length(16)->charset(Charset::Base58)->entropy();
if ($info['bits'] < 80) {
throw new \RuntimeException('Insufficient entropy for production tokens.');
}
$vault = SecureCode::vault(length: 6, ttl: 120, maxAttempts: 3);
$code = $vault->issue($user->id);
// Display masked after generation
SecureCode::mask($code, visibleStart: 1, visibleEnd: 1);
// "8****3"
// Sequential, gap-free invoice numbers that reset yearly
$invoiceId = SecureCode::sequence('invoice')
->prefix('INV-')
->suffix('-EG')
->format('{prefix}{sequence}{separator}{Y}{m}{d}{suffix}')
->padSequence(6)
->resetEvery('yearly')
->next();
// "INV-000001-20260404-EG"
// Next: "INV-000002-20260404-EG"
// Bulk-generate for a batch of orders
$ids = SecureCode::sequence('order')
->prefix('ORD-')
->format('{prefix}{Y}{m}{separator}{sequence}')
->padSequence(5)
->resetEvery('monthly')
->next(10);
// ["ORD-202604-00001", "ORD-202604-00002", ..., "ORD-202604-00010"]
bash
php artisan vendor:publish --tag=secure-code-config
bash
php artisan vendor:publish --tag=secure-code-migrations
php artisan migrate