Revision 696
Date:
2018/08/14 20:52:12
Author:
ahitrov
Revision Log:
order in init
Files:
Legend:
Added
Removed
Modified
utf8/plugins/payments/lib/payments/Provider/Sber.pm
11
11
use JSON::XS;
12
12
use Data::Dumper;
13
13
14
use constant (
15
REG => 0, # Заказ зарегистрирован, но не оплачен;
16
HOLD => 1, # Предавторизованная сумма захолдирована (для двухстадийных платежей);
17
PAY => 2, # Проведена полная авторизация суммы заказа;
18
CANCEL => 3, # Авторизация отменена;
19
REFUND => 4, # По транзакции была проведена операция возврата;
20
ACS => 5, # Инициирована авторизация через ACS банка-эмитента;
21
REJECT => 6, # Авторизация отклонена.
22
);
23
24
our %STATUS = (
25
0 => 'Ожидание оплаты',
26
1 => 'Предавторизованная сумма захолдирована',
27
2 => 'Успешная оплата',
28
3 => 'Авторизация отменена',
29
4 => 'По транзакции была проведена операция возврата',
30
5 => 'Инициирована авторизация через ACS банка-эмитента',
31
6 => 'Авторизация отклонена',
32
);
33
14
34
sub new {
15
35
my ($proto, %params) = @_;
16
36
my $class = ref($proto) || $proto;
…
…
28
48
$self->{fail_url} = $params{fail_url} || $state->{payments}{$prefix."_fail_url"};
29
49
30
50
$self->{currency} = $state->{payments}{$prefix."_currency_code"};
51
$self->{payment_statuses} = \%STATUS;
31
52
32
53
my $host = 'https://'. ($self->{test_mode} ? '3dsec.sberbank.ru' : 'securepayments.sberbank.ru');
33
54
$self->{api} = {
…
…
78
99
my $self = shift;
79
100
my $opts = shift // {};
80
101
81
unless ( %$opts && exists $opts->{orderNumber} && exists $opts->{amount} ) {
82
$self->{result}{error} = 'Не указаны обязательные параметры: orderNumber или amount';
102
unless ( %$opts && (exists $opts->{order} || exists $opts->{orderNumber} && exists $opts->{amount}) ) {
103
$self->{result}{error} = 'Не указаны обязательные параметры: order, orderNumber или amount';
83
104
return $self;
84
105
}
85
106
my $method = 'init';
…
…
98
119
$opts->{sessionTimeoutSecs} = $self->{session_timeout};
99
120
}
100
121
122
my $order;
123
if ( exists $opts->{order} && ref $opts->{order} eq 'webshop::Order' ) {
124
$order = delete $opts->{order};
125
$opts->{orderNumber} = $order->id;
126
}
127
101
128
my $uid = delete $opts->{uid};
102
129
unless ( $uid ) {
103
$self->{result}{error} = 'Не указан user id';
104
return $self;
130
if ( ref $order ) {
131
$uid = $order->uid;
132
} else {
133
$self->{result}{error} = 'Не указан user id';
134
return $self;
135
}
105
136
}
106
137
107
138
### Сумма должна быть в копейках. Если дробное (рубли.копейки) - преобразуем в копейки
108
my $sum = $opts->{amount};
109
if ( !$sum || $sum !~ /^[\d\,\.]+$/ ) {
110
$self->{result}{error} = 'Не указана или неправильно указана сумма транзакции';
111
return $self;
139
if ( ref $order ) {
140
$opts->{amount} = int($order->sum_total * 100);
141
} else {
142
my $sum = $opts->{amount};
143
if ( !$sum || $sum !~ /^[\d\,\.]+$/ ) {
144
$self->{result}{error} = 'Не указана или неправильно указана сумма транзакции';
145
return $self;
146
}
147
if ( $sum =~ /[,.]/ ) {
148
$sum =~ s/\,/\./;
149
$opts->{amount} = int($sum * 100);
150
}
112
151
}
113
if ( $sum =~ /[,.]/ ) {
114
$sum =~ s/\,/\./;
115
$opts->{amount} = int($sum * 100);
116
}
117
152
$opts->{jsonParams} = {} unless exists $opts->{jsonParams};
118
153
$opts->{jsonParams}{uid} = $uid;
119
154
…
…
127
162
return $self unless ref $operation;
128
163
129
164
my $transaction = $self->get_transaction_by_order_id( $opts->{orderNumber} );
130
if ( ref $transaction && $transaction->name eq 'Init' ) {
165
if ( ref $transaction && $transaction->name ne 'Expired' ) {
131
166
### Transaction already exists
132
167
$self->{result}{success} = 1;
133
168
$self->{result}{session_id} = $transaction->session_id;
…
…
135
170
} else {
136
171
if ( ref $transaction && $transaction->name eq 'Expired' ) {
137
172
$transaction->delete;
173
$transaction = undef;
138
174
}
139
my $req = $self->_createRequestGet( $method, $opts );
140
my $ua = LWP::UserAgent->new;
141
$ua->agent('Mozilla/5.0');
142
my $result = $ua->get( $req );
143
if ( $result->code == 200 ) {
144
warn "Sberbank Init result: [".$result->decoded_content."]\n" if $DEBUG;
145
my $content = JSON::XS->new->decode( $result->decoded_content );
146
warn Dumper $content if $DEBUG;
175
if ( !ref $transaction ) {
176
my $req = $self->_createRequestGet( $method, $opts );
177
my $ua = LWP::UserAgent->new;
178
$ua->agent('Mozilla/5.0');
179
my $result = $ua->get( $req );
180
if ( $result->code == 200 ) {
181
warn "Sberbank Init result: [".$result->decoded_content."]\n" if $DEBUG;
182
my $content = JSON::XS->new->decode( $result->decoded_content );
183
warn Dumper $content if $DEBUG;
147
184
148
if ( ref $content && exists $content->{orderId} ) {
149
my $now = Contenido::DateTime->new;
150
$transaction = payments::Transaction->new( $keeper );
151
$transaction->dtime( $now->ymd('-').' '.$now->hms );
152
$transaction->provider( $self->{payment_system} );
153
$transaction->session_id( $content->{orderId} );
154
$transaction->status( $self->{test_mode} );
155
$transaction->order_id( $opts->{orderNumber} );
156
$transaction->operation_id( $operation->id );
157
$transaction->currency_code( 'RUR' );
158
$transaction->sum( $opts->{amount} );
159
$transaction->form_url( $content->{formUrl} );
160
$transaction->name( 'Init' );
161
$transaction->success( 0 );
162
$transaction->store;
185
if ( ref $content && exists $content->{orderId} ) {
186
my $now = Contenido::DateTime->new;
187
$transaction = payments::Transaction->new( $keeper );
188
$transaction->dtime( $now->ymd('-').' '.$now->hms );
189
$transaction->provider( $self->{payment_system} );
190
$transaction->session_id( $content->{orderId} );
191
$transaction->status( $self->{test_mode} );
192
$transaction->order_id( $opts->{orderNumber} );
193
$transaction->operation_id( $operation->id );
194
$transaction->currency_code( 'RUR' );
195
$transaction->sum( $opts->{amount} );
196
$transaction->form_url( $content->{formUrl} );
197
$transaction->name( 'Init' );
198
$transaction->success( 0 );
199
$transaction->store;
163
200
164
$self->{result}{success} = 1;
165
$self->{result}{session_id} = $content->{orderId};
166
$self->{result}{transaction} = $transaction;
167
} elsif ( ref $content && exists $content->{errorCode} && $content->{errorCode} ) {
168
$self->{result}{error} = Encode::encode('utf-8', $content->{errorMessage});
169
warn "[".$result->decoded_content."]\n";
201
$self->{result}{success} = 1;
202
$self->{result}{session_id} = $content->{orderId};
203
$self->{result}{transaction} = $transaction;
204
} elsif ( ref $content && exists $content->{errorCode} && $content->{errorCode} ) {
205
$self->{result}{error} = Encode::encode('utf-8', $content->{errorMessage});
206
warn "[".$result->decoded_content."]\n";
207
} else {
208
$self->{result}{error} = 'Sberbank Init failed';
209
$self->{result}{responce} = $result->decoded_content;
210
warn $self->{result}{error}."\n";
211
warn "[".$result->decoded_content."]\n";
212
}
170
213
} else {
171
214
$self->{result}{error} = 'Sberbank Init failed';
172
$self->{result}{responce} = $result->decoded_content;
173
warn $self->{result}{error}."\n";
174
warn "[".$result->decoded_content."]\n";
215
$self->{result}{responce} = $result->status_line;
216
warn $self->{result}{error}.": ".$result->status_line."\n";
217
warn Dumper $result;
175
218
}
176
} else {
177
$self->{result}{error} = 'Sberbank Init failed';
178
$self->{result}{responce} = $result->status_line;
179
warn $self->{result}{error}.": ".$result->status_line."\n";
180
warn Dumper $result;
181
219
}
182
220
}
183
221
return $self;
…
…
224
262
my $self = shift;
225
263
my $opts = shift // {};
226
264
227
unless ( exists $opts->{orderNumber} || exists $self->{result} && exists $self->{result}{transaction} && ref $self->{result}{transaction} ) {
265
unless ( exists $opts->{orderNumber}
266
|| exists $self->{result} && exists $self->{result}{transaction} && ref $self->{result}{transaction}
267
|| exists $opts->{transaction} && ref $opts->{transaction} ) {
228
268
$self->{result}{error} = 'Не указан обязательный параметр orderNumber или не получена транзакция';
229
269
return $self;
230
270
}
231
271
my $method = 'status';
232
272
my $transaction;
233
if ( exists $self->{result}{transaction} ) {
273
if ( exists $opts->{transaction} ) {
274
$transaction = delete $opts->{transaction};
275
} elsif ( exists $self->{result}{transaction} ) {
234
276
$transaction = $self->{result}{transaction};
235
$opts->{orderNumber} = $transaction->order_id;
236
277
} else {
237
278
$transaction = $self->get_transaction_by_order_id( $opts->{orderNumber} );
238
279
}
…
…
240
281
$self->{result}{error} = "Не найдена транзакция для order_id=".$opts->{orderNumber};
241
282
return $self;
242
283
}
284
$opts->{orderNumber} = $transaction->order_id;
243
285
$opts->{orderId} = $transaction->session_id;
244
warn "Sberbank Status: ".Dumper($opts) if $DEBUG;
286
warn "Sberbank status opts: ".Dumper($opts) if $DEBUG;
245
287
246
288
my $req = $self->_createRequestGet( $method, $opts );
247
289
my $ua = LWP::UserAgent->new;
Небольшая справка по веткам
cnddist – контейнер, в котором хранятся все дистрибутивы всех библиотек и программных пакетов, которые использовались при построении различных версий Contenido. Если какой-то библиотеки в данном хранилище нет, инсталлятор сделает попытку "подтянуть" ее с веба (например, с CPAN). Если библиотека слишком старая, есть очень большая вероятность, что ее там уже нет. Поэтому мы храним весь хлам от всех сборок. Если какой-то дистрибутив вдруг отсутствует в cnddist - напишите нам, мы положим его туда.
koi8 – отмирающая ветка, чей код, выдача и все внутренние библиотеки заточены на кодировку KOI8-R. Вносятся только те дополнения, которые касаются внешнего вида и функционала админки, баги ядра, обязательные обновления портов и мелочи, которые легко скопипастить. В дальнейшем планируется полная остановка поддержки по данной ветке.
utf8 – актуальная ветка, заточенная под UTF-8.
Внутри каждой ветки: core – исходники ядра; install – скрипт установки инсталляции; plugins – плагины; samples – "готовые к употреблению" проекты, которые можно поставить, запустить и посмотреть, как они работают.