blob: 2252dfc2b25eedcf00be5dfb938ac1615b30a9cf [file] [log] [blame]
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +01001<?php
2
3namespace RobThree\Auth\Providers\Qr;
4
5// http://goqr.me/api/doc/create-qr-code/
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +02006class QRServerProvider extends BaseHTTPQRCodeProvider
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +01007{
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +02008 /** @var string */
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +01009 public $errorcorrectionlevel;
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020010
11 /** @var int */
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010012 public $margin;
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020013
14 /** @var int */
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010015 public $qzone;
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020016
17 /** @var string */
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010018 public $bgcolor;
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020019
20 /** @var string */
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010021 public $color;
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020022
23 /** @var string */
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010024 public $format;
25
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020026 /**
27 * @param bool $verifyssl
28 * @param string $errorcorrectionlevel
29 * @param int $margin
30 * @param int $qzone
31 * @param string $bgcolor
32 * @param string $color
33 * @param string $format
34 */
35 public function __construct($verifyssl = false, $errorcorrectionlevel = 'L', $margin = 4, $qzone = 1, $bgcolor = 'ffffff', $color = '000000', $format = 'png')
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010036 {
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020037 if (!is_bool($verifyssl)) {
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010038 throw new QRException('VerifySSL must be bool');
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020039 }
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010040
41 $this->verifyssl = $verifyssl;
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020042
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010043 $this->errorcorrectionlevel = $errorcorrectionlevel;
44 $this->margin = $margin;
45 $this->qzone = $qzone;
46 $this->bgcolor = $bgcolor;
47 $this->color = $color;
48 $this->format = $format;
49 }
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020050
51 /**
52 * {@inheritdoc}
53 */
54 public function getMimeType()
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010055 {
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020056 switch (strtolower($this->format)) {
57 case 'png':
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010058 return 'image/png';
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020059 case 'gif':
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010060 return 'image/gif';
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020061 case 'jpg':
62 case 'jpeg':
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010063 return 'image/jpeg';
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020064 case 'svg':
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010065 return 'image/svg+xml';
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020066 case 'eps':
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010067 return 'application/postscript';
68 }
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020069 throw new QRException(sprintf('Unknown MIME-type: %s', $this->format));
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010070 }
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020071
72 /**
73 * {@inheritdoc}
74 */
75 public function getQRCodeImage($qrtext, $size)
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010076 {
77 return $this->getContent($this->getUrl($qrtext, $size));
78 }
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020079
80 /**
81 * @param string $value
82 *
83 * @return string
84 */
85 private function decodeColor($value)
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010086 {
87 return vsprintf('%d-%d-%d', sscanf($value, "%02x%02x%02x"));
88 }
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020089
90 /**
91 * @param string $qrtext the value to encode in the QR code
92 * @param int|string $size the desired size of the QR code
93 *
94 * @return string file contents of the QR code
95 */
96 public function getUrl($qrtext, $size)
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010097 {
98 return 'https://api.qrserver.com/v1/create-qr-code/'
99 . '?size=' . $size . 'x' . $size
100 . '&ecc=' . strtoupper($this->errorcorrectionlevel)
101 . '&margin=' . $this->margin
102 . '&qzone=' . $this->qzone
103 . '&bgcolor=' . $this->decodeColor($this->bgcolor)
104 . '&color=' . $this->decodeColor($this->color)
105 . '&format=' . strtolower($this->format)
106 . '&data=' . rawurlencode($qrtext);
107 }
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +0200108}