<% $code %> <% $codes{$code} %> <% $id %> <% $v1 %> <% $amount %> <% $currency %> <% $datetime %> <% $sign %> <%doc> сommand Признак того, что идет оповещение о платеже id Уникальный id операции в системе «Иксолла» v1 Уникальный идентификатор заказа, полученный от проекта. В XML-ответе значение этого параметра следует передававть в параметре order. amount Стоимость заказа. Разделитель “.” (2 знака после точки) currency Валюта заказа. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217 datetime Дата в формате ГГГГММДДЧЧММСС test Признак тестовой транзакции. test=1 – система проводит тестовую транзакцию. Реального платежа не было. test=0 – реальный платеж sign Подпись для предотвращения несанкционированного доступа user_sum Размер платежа, совершенного пользователем. Разделитель “.” (2 знака после точки) user_currency Валюта платежа, совершенного пользователем. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217 transfer_sum Сумма выплаты проекту. Разделитель “.” (2 знака после точки) transfer_currency Валюта выплаты проекту. Используется трехбуквенное обозначение валюты согласно стандарту ISO 4217 pid Идентификационный номер платежной системы id_geotype id валюты платежной системы <%once> use Digest::MD5; use Net::Subnet; my @valid_ips = @{$state->{payments}{xsolla_valid_ips}}; my %codes = ( '0' => 'Success', '10' => 'Another delivery attempt', '20' => 'Wrong parameters', '30' => 'Temporary error', '40' => 'Fatal error', ); my @valid_subnets = grep { index($_, '/') > 0 } @valid_ips; my $subnet_matcher; if ( @valid_subnets ) { $subnet_matcher = subnet_matcher @valid_subnets; @valid_ips = grep { index($_, '/') == -1 } @valid_ips; } <%args> $id => undef $v1 => '' $v2 => '' $v3 => '' $amount => undef $currency => undef $datetime => undef $test => undef $sign => undef $user_sum => undef $user_currency => undef $transfer_sum => undef $transfer_currency => undef $pid => undef $id_geotype => undef <%init> my $DEBUG = 1; warn Dumper \%ARGS if $DEBUG; my $str = $v1.$amount.$currency.$id.$state->{payments}{xsolla_app_secret}; my $md5 = Digest::MD5::md5_hex ( $str ); warn "MD5 Check: $md5\n" if $DEBUG; my $code = 0; my $ip = $r->header_in('X-Real-IP'); warn "From IP=$ip\n" if $DEBUG; my $transaction; my $security_check = $md5 eq $sign ? 1 : 0; if ( $security_check ) { if ( grep { $ip eq $_ } @valid_ips ) { } elsif ( @valid_subnets ) { $security_check = $subnet_matcher->($ip); warn "IP [$ip] didn't match any of ".Dumper(\@valid_subnets)." subnets nor ".Dumper(\@valid_ips)." single IPs\n"; } else { $security_check = 0; warn "IP [$ip] didn't match any of ".Dumper(\@valid_ips)." single IPs\n"; } } if ( $security_check ) { my $last = $keeper->{payments}->check( $v1 ); if ( $last->name eq 'cancel' ) { $code = 40; } elsif ( $last->name eq 'suspend' ) { $code = 20; } unless ( $code ) { ($transaction) = $keeper->get_documents( class => 'payments::Transaction', order_id => $v1, operation_id => $id, provider => 'xsolla', limit => 1, ); if ( ref $transaction ) { $code = 10; } else { my $dt = $datetime =~ /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/ ? "$1-$2-$3 $4:$5:$6" : ''; $transaction = payments::Transaction->new( $keeper ); $transaction->status( $test || 0 ); $transaction->provider( 'xsolla' ); $transaction->order_id( $v1 ); $transaction->operation_id( $id ); $transaction->sum( $amount ); $transaction->currency_code( $currency ); $transaction->dtime( $dt ) if $dt; $transaction->custom1( $v2 ); $transaction->custom2( $v3 ); $transaction->name( $v2 || $v3 ); $transaction->store(); if ( $keeper->can('_xsolla_handler') ) { unless ( $keeper->_xsolla_handler( $transaction ) ) { $code = 30; } } } } } else { warn "Wrong transaction parameters: IP=$ip. Available ip list [".Dumper(\@valid_ips)."]. String: $str. MD5: $md5. Sign: $sign\n"; $code = 20; }