Line # Revision Author
1 358 ahitrov <?xml version="1.0" encoding="UTF-8"?>
2 <response>
3 <result><% $code %></result>
4 <description><% $codes{$code} %></description>
5 <fields>
6 <id><% $id %></id>
7 <order><% $v1 %></order>
8 <amount><% $amount %></amount>
9 <currency><% $currency %></currency>
10 <datetime><% $datetime %></datetime>
11 <sign><% $sign %></sign>
12 </fields>
13 </response>
14 <%doc>
15
16 сommand Признак того, что идет оповещение о платеже
17 id Уникальный id операции в системе «Иксолла»
18 v1 Уникальный идентификатор заказа, полученный от проекта. В XML-ответе значение этого параметра следует передававть в параметре order.
19 amount Стоимость заказа. Разделитель “.” (2 знака после точки)
20 currency Валюта заказа. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217
21 datetime Дата в формате ГГГГММДДЧЧММСС
22 test Признак тестовой транзакции. test=1 – система проводит тестовую транзакцию. Реального платежа не было. test=0 – реальный платеж
23 sign Подпись для предотвращения несанкционированного доступа
24 user_sum Размер платежа, совершенного пользователем. Разделитель “.” (2 знака после точки)
25 user_currency Валюта платежа, совершенного пользователем. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217
26 transfer_sum Сумма выплаты проекту. Разделитель “.” (2 знака после точки)
27 transfer_currency Валюта выплаты проекту. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217
28 pid Идентификационный номер платежной системы
29 id_geotype id валюты платежной системы
30
31 </%doc>
32 <%once>
33
34 use Digest::MD5;
35 369 ahitrov my @valid_ips = @{$state->{payments}{xsolla_valid_ips}};
36 358 ahitrov my %codes = (
37 '0' => 'Success',
38 '10' => 'Another delivery attempt',
39 '20' => 'Wrong parameters',
40 '30' => 'Temporary error',
41 '40' => 'Fatal error',
42 );
43
44 </%once>
45 <%args>
46
47 $id => undef
48 $v1 => ''
49 $v2 => ''
50 $v3 => ''
51 $amount => undef
52 $currency => undef
53 $datetime => undef
54 $test => undef
55 $sign => undef
56 $user_sum => undef
57 $user_currency => undef
58 $transfer_sum => undef
59 $transfer_currency => undef
60 $pid => undef
61 $id_geotype => undef
62
63 </%args>
64 <%init>
65
66 404 ahitrov my $DEBUG = 1;
67 358 ahitrov warn Dumper \%ARGS if $DEBUG;
68
69 359 ahitrov my $str = $v1.$amount.$currency.$id.$state->{payments}{xsolla_app_secret};
70 358 ahitrov my $md5 = Digest::MD5::md5_hex ( $str );
71 warn "MD5 Check: $md5\n" if $DEBUG;
72
73 my $code = 0;
74 my $ip = $r->header_in('X-Real-IP');
75 369 ahitrov warn "From IP=$ip\n" if $DEBUG;
76 358 ahitrov my $transaction;
77 if ( $md5 eq $sign && grep { $ip eq $_ } @valid_ips ) {
78 my $last = $keeper->{payments}->check( $v1 );
79 if ( $last->name eq 'cancel' ) {
80 $code = 40;
81 } elsif ( $last->name eq 'suspend' ) {
82 $code = 20;
83 }
84 unless ( $code ) {
85 ($transaction) = $keeper->get_documents(
86 class => 'payments::Transaction',
87 order_id => $v1,
88 operation_id => $id,
89 provider => 'xsolla',
90 limit => 1,
91 );
92 if ( ref $transaction ) {
93 $code = 10;
94 } else {
95 my $dt = $datetime =~ /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/ ? "$1-$2-$3 $4:$5:$6" : '';
96 $transaction = payments::Transaction->new( $keeper );
97 $transaction->status( $test || 0 );
98 $transaction->provider( 'xsolla' );
99 $transaction->order_id( $v1 );
100 $transaction->operation_id( $id );
101 $transaction->sum( $amount );
102 $transaction->currency_code( $currency );
103 $transaction->dtime( $dt ) if $dt;
104 $transaction->custom1( $v2 );
105 $transaction->custom2( $v3 );
106 $transaction->name( $v2 || $v3 );
107 $transaction->store();
108 362 ahitrov
109 if ( $keeper->can('_xsolla_handler') ) {
110 unless ( $keeper->_xsolla_handler( $transaction ) ) {
111 $code = 30;
112 }
113 }
114 358 ahitrov }
115 }
116 } else {
117 404 ahitrov warn "Wrong transaction parameters: IP=$ip. Available ip list [".Dumper(\@valid_ips)."]. String: $str. MD5: $md5. Sign: $sign\n";
118 358 ahitrov $code = 20;
119 }
120
121 </%init>

Небольшая справка по веткам

cnddist – контейнер, в котором хранятся все дистрибутивы всех библиотек и программных пакетов, которые использовались при построении различных версий Contenido. Если какой-то библиотеки в данном хранилище нет, инсталлятор сделает попытку "подтянуть" ее с веба (например, с CPAN). Если библиотека слишком старая, есть очень большая вероятность, что ее там уже нет. Поэтому мы храним весь хлам от всех сборок. Если какой-то дистрибутив вдруг отсутствует в cnddist - напишите нам, мы положим его туда.

koi8 – отмирающая ветка, чей код, выдача и все внутренние библиотеки заточены на кодировку KOI8-R. Вносятся только те дополнения, которые касаются внешнего вида и функционала админки, баги ядра, обязательные обновления портов и мелочи, которые легко скопипастить. В дальнейшем планируется полная остановка поддержки по данной ветке.

utf8 – актуальная ветка, заточенная под UTF-8.

Внутри каждой ветки: core – исходники ядра; install – скрипт установки инсталляции; plugins – плагины; samples – "готовые к употреблению" проекты, которые можно поставить, запустить и посмотреть, как они работают.