$secret, 'issuer' => $issuer, 'algorithm' => 'SHA1', 'digits' => 6, 'period' => 30, ]); $otpauth = 'otpauth://totp/' . $label . '?' . $params; return 'https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=' . rawurlencode($otpauth); } function base32_decode(string $input): string { $map = array_flip(str_split('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567')); $input = strtoupper(rtrim($input, '=')); $binary = ''; $buffer = 0; $bits = 0; foreach (str_split($input) as $char) { if (!isset($map[$char])) continue; $buffer = ($buffer << 5) | $map[$char]; $bits += 5; if ($bits >= 8) { $binary .= chr(($buffer >> ($bits - 8)) & 0xFF); $bits -= 8; } } return $binary; }