$secret, ]; if (!empty($issuer)) { $query['issuer'] = $issuer; } return sprintf('otpauth://totp/%s?%s', $name, http_build_query($query)); } function totp_qrcode(string $uri): string { $options = new QROptions([ 'version' => 5, 'outputType' => QRCode::OUTPUT_IMAGE_PNG, 'eccLevel' => QRCode::ECC_L, ]); $qrcode = new QRCode($options); return $qrcode->render($uri); } // will generate a 26 character code function totp_generate_key(): string { return base32_encode(random_bytes(16)); }