Revision 535 (by ahitrov, 2015/11/27 12:24:47) SSL verification test

package payments::Provider::PayTure;

use strict;
use warnings 'all';

use base 'payments::Provider::Base';
use Contenido::Globals;
use payments::Keeper;
use Digest::MD5;
use Data::Dumper;
use URI;
use URI::QueryParam;

our $init_url = '';

sub new {
    my ($proto, %params) = @_;
    my $class = ref($proto) || $proto;
    my $self = {};
    my $prefix = $class =~ /\:\:(\w+)$/ ? lc($1) : undef;
    return      unless $prefix;

    $self->{payment_system} = $prefix;
    $self->{app_id} =           $state->{payments}->{$prefix."_app_id"};
    $self->{secret} =           $state->{payments}->{$prefix."_app_secret"};
    $self->{currency} =         $state->{payments}->{$prefix."_currency_code"};
    $self->{test_mode} =        $state->{payments}->{$prefix."_test_mode"};

    $self->{api}{init} = 'https://sandbox.payture.com/apim/Init';

    bless $self, $class;

    return $self;
}

sub init {
    my $self = shift;
    my (%opts) = @_;

    warn "PayTure Init: ".Dumper(\%opts)		if $DEBUG;

    ### Session Type: Pay or Block
    my $session_type = $opts{session_type} || 'Pay';

    my $order_id = $opts{order_id};
    return 0	unless $order_id;

    ### Сумма в копейках. Если дробное - преобразуем
    my $sum = $opts{sum};
    return 0	unless $sum;
    if ( $sum =~ /[\.\,]/ ) {
	$sum =~ s/\,/\./;
	$sum = int($sum * 100);
    }

    my $ip = $opts{ip};
    return 0	unless $ip && $ip =~ /(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/;
    warn "IP: $ip\n";

    ### Пример: http://yoursite.com/result?orderid={orderid}&result={success}
    my $url = $opts{url};

    my $template = $opts{teplate};
    my $lang = $opts{lang};
    my $params = $opts{params};

    my $ua = LWP::UserAgent->new;
    $ua->agent('Mozilla/5.0');
    $ua->ssl_opts( verify_hostname => 0, SSL_ca_path => '/usr/local/share/certs' );
    my $req = URI->new( $self->{api}{init} );
#    $req->query_param( Key => $self->id );
    my @data = ( "SessionType=$session_type", "OrderId=$order_id", "Amount=$sum", "IP=$ip");
    push @data, "Url=$url"			if $url;
    push @data, "TemplateTag=$template"		if $template;
    push @data, "Url=$url"			if $url;
    push @data, "Language=$lang"		if $lang;
    if ( ref $params eq 'HASH' ) {
	while ( my ($param, $val) = each %$params ) {
		push @data, "$param=$val";
	}
    }
    my $data_unescaped = join ';', @data;
    warn Dumper "PayTure Init data: $data_unescaped\n";
    my $data_str = URI::Escape::uri_escape( $data_unescaped );
#    $req->query_param( Data => $data_str );
    warn "PayTure Init query: ".Dumper($req)		if $DEBUG;

    my $result = $ua->post( $req, Content => { Key => $self->id, Data => $data_str } );
    if ( $result->code == 200 ) {
	warn Dumper $result->content;
	return 1;
    } else {
	warn Dumper $result;
	warn "PayTure Init failed; ".$result->status_line."\n";
    }
    return 0;
}

1;