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 my @valid_ips = qw( 94.103.26.178 94.103.26.181 159.255.220.254 );
36 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 warn Dumper \%ARGS if $DEBUG;
67
68 my $str = $v1.$v2.$v3.$amount.$currency.$id.$state->{payments}{xsolla_app_secret};
69 my $md5 = Digest::MD5::md5_hex ( $str );
70 warn "MD5 Check: $md5\n" if $DEBUG;
71
72 my $code = 0;
73 my $ip = $r->header_in('X-Real-IP');
74 warn "From IP=$ip\n";
75 my $transaction;
76 if ( $md5 eq $sign && grep { $ip eq $_ } @valid_ips ) {
77 my $last = $keeper->{payments}->check( $v1 );
78 if ( $last->name eq 'cancel' ) {
79 $code = 40;
80 } elsif ( $last->name eq 'suspend' ) {
81 $code = 20;
82 }
83 unless ( $code ) {
84 ($transaction) = $keeper->get_documents(
85 class => 'payments::Transaction',
86 order_id => $v1,
87 operation_id => $id,
88 provider => 'xsolla',
89 limit => 1,
90 );
91 if ( ref $transaction ) {
92 $code = 10;
93 } else {
94 my $dt = $datetime =~ /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/ ? "$1-$2-$3 $4:$5:$6" : '';
95 $transaction = payments::Transaction->new( $keeper );
96 $transaction->status( $test || 0 );
97 $transaction->provider( 'xsolla' );
98 $transaction->order_id( $v1 );
99 $transaction->operation_id( $id );
100 $transaction->sum( $amount );
101 $transaction->currency_code( $currency );
102 $transaction->dtime( $dt ) if $dt;
103 $transaction->custom1( $v2 );
104 $transaction->custom2( $v3 );
105 $transaction->name( $v2 || $v3 );
106 $transaction->store();
107 }
108 }
109 } else {
110 $code = 20;
111 }
112
113 </%init>