-
Notifications
You must be signed in to change notification settings - Fork 0
/
QRPlatba.php
169 lines (139 loc) · 4.59 KB
/
QRPlatba.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
<?php
class QRPlatba {
const VERSION = '1.0';
private $keys = array(
//PODPORA VSECH BANK
'ACC' => null, // Max. 46 - znaků IBAN, BIC Identifikace protistrany !povinny
'ALT-ACC' => null, // Max. 93 - znaků Seznam alternativnich uctu. odddeleny carkou,
'AM' => null, //Max. 10 znaků - Desetinné číslo Výše částky platby.
'CC' => 'CZK', // Právě 3 znaky - Měna platby.
'DT' => null, // Právě 8 znaků - Datum splatnosti YYYYMMDD.
'MSG' => null, // Max. 60 znaků - Zpráva pro příjemce.
'X-VS' => null, // Max. 10 znaků - Celé číslo - Variabilní symbol
'X-SS' => null, // Max. 10 znaků - Celé číslo - Specifický symbol
'X-KS' => null, // Max. 10 znaků - Celé číslo - Konstantní symbol
// OSTATNI
'RF' => null, // Max. 16 znaků - Identifikátor platby pro příjemce.
'RN' => null, // Max. 35 znaků - Jméno příjemce.
'PT' => null, // Právě 3 znaky - Typ platby.
'PT' => null, // Právě 3 znaky - Typ platby.
'CRC32' => null, // Právě 8 znaků - Kontrolní součet - HEX.
'NT' => null, // Právě 1 znak P|E - Identifikace kanálu pro zaslání notifikace výstavci platby.
'NTA' => null, //Max. 320 znaků - Telefonní číslo v mezinárodním nebo lokálním vyjádření nebo E-mailová adresa
//OSTATNI lokalni
'X-PER' => null, // Max. 2 znaky - Celé číslo - Počet dní, po které se má provádět pokus o opětovné provedení neúspěšné platby
'X-ID' => null, // Max. 20 znaků. - Identifikátor platby na straně příkazce. Jedná se o interní ID, jehož použití a interpretace závisí na bance příkazce.
'X-URL' => null, // Max. 140 znaků. - URL, které je možno využít pro vlastní potřebu
);
public function __construct($account, $amount, $variable = null){
$this->setAccount($account);
$this->setAmount($amount);
if($variable){
$this->setVariableSym($variable);
}
}
/**
*
* Czech account -
* @param String $account - format 235-56469/0546 or 9875667/0100
*/
public function setAccount($account){
$this->keys['ACC'] = $this->accountToIban($account);
return $this;
}
/**
*
* Enter description here ...
* @param float $amount - max 10 digits. 12345678.90
* @return QRPlatba
*/
public function setAmount($amount){
$this->keys['AM'] = sprintf("%.2f",$amount);
return $this;
}
/**
*
* Variable symbol.
* @param String $vs max 10 numbers
* @return QRPlatba
*/
public function setVariableSym($vs){
$this->keys['X-VS'] = $vs;
return $this;
}
/**
*
* Const symbol.
* @param String $cs max 10 numbers
* @return QRPlatba
*/
public function setConstSym($cs){
$this->keys['X-CS'] = $cs;
return $this;
}
/**
*
* Specific symbol.
* @param String $ss max 10 numbers
* @return QRPlatba
*/
public function setSpecificSym($ss){
$this->keys['X-SS'] = $ss;
return $this;
}
/**
*
* Set message. Max 60 chars. Will be cut off!
* @param string $msg
* @return QRPlatba
*/
public function setMessage($msg){
$this->keys['MSG'] = substr($msg, 0, 60);
return $this;
}
/**
*
* Set Due date, datum splatnosti. YYYYMMDD - date('Ymd')
* @param String $date 'Ymd'
* @return QRPlatba
*/
public function setDueDate($date){
$this->keys['DT'] = $date;
return $this;
}
public function __toString(){
$chunks = array('SPD', self::VERSION);
foreach ($this->keys as $key=>$value) {
if($value === null) continue;
$chunks[] = "$key:$value";
}
return implode('*', $chunks);
}
/**
* Converts czech account number to czech IBAN
* @param string $accountNumber account in format 60256-1258614/0800 or 4568779/0300
* @return string
*/
public function accountToIban($accountNumber) {
$accountNumber = explode('/',$accountNumber);
$bank = $accountNumber[1];
$pre = 0;
$acc = 0;
if(strpos($accountNumber[0], '-') === false ){
$acc = $accountNumber[0];
} else {
list($pre, $acc) = explode('-', $accountNumber[0]);
}
$accountPart = sprintf("%06d%010d",$pre,$acc);
$iban = 'CZ00'.$bank.$accountPart;
$alfa = "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z";
$alfa = explode(" ", $alfa);
for($i = 1; $i<27; $i++) {
$alfa_replace[] = $i+9;
}
$controlegetal = str_replace($alfa, $alfa_replace, substr($iban, 4, strlen($iban)-4).substr($iban, 0, 2)."00");
$controlegetal = 98 - (int)bcmod($controlegetal,97);
$iban = sprintf("CZ%02d%04d%06d%010d",$controlegetal,$bank,$pre,$acc);
return $iban;
}
}