Finance-Card-Discover

 view release on metacpan or  search on metacpan

lib/Finance/Card/Discover.pm  view on Meta::CPAN

        my $dump_sub = sub { $_[0]->dump(maxlength => 0); return };
        $self->ua->set_my_handler(request_send  => $dump_sub);
        $self->ua->set_my_handler(response_done => $dump_sub);
    }
    elsif ($self->{compress}) {
        $self->ua->default_header(accept_encoding => 'gzip,deflate');
    }

    return $self;
}

sub ua {
    my ($self, $ua) = @_;
    if ($ua) {
        croak q('ua' must be (or derived from) an LWP::UserAgent')
            unless ref $ua and $ua->isa(q(LWP::UserAgent));
        $self->{ua} = $ua;
    }
    return $self->{ua};
}

sub response { $_[0]->{response} }

sub accounts {
    my ($self) = @_;

    my $data = $self->_request(
        msgnumber => -1,
        request    => 'getcards',
    );
    return unless $data and $data->{Total};

    require Finance::Card::Discover::Account;
    return map {
        Finance::Card::Discover::Account->new($data, $_, card => $self)
    } (1 .. $data->{Total});
}

sub _request {
    my ($self, @params) = @_;

    my $uri = URI->new('https://deskshop.discovercard.com/');
    $uri->path('/cardmembersvcs/orbiscom/WebServlet');

    # Non-standard url encoding- [.-] need escaping, perhaps others.
    (local $URI::uric = $URI::uric) =~ s/\\[.-]//g;
    $uri->query_form(
        version   => '1.0',
        startTime => 20 + int rand 100,
        user      => $self->{username},
        password  => $self->{password},
        @params,
    );

    my $res = $self->{response} = $self->ua->post($uri);
    return unless $res->is_success;

    # The response content is a url-encoded string.
    my %data = do {
        my $u = URI->new;
        $u->query($res->decoded_content);
        $u->query_form
    };
    return if not %data or 'error' eq $data{action};
    return \%data;
}


1;

__END__

=head1 NAME

Finance::Card::Discover - DiscoverCard account information and SOAN creation

=head1 SYNOPSIS

    use Finance::Card::Discover;

    my $card = Finance::Card::Discover->new(
        username => 'Your Username',
        password => 'Your Password',
    );

    for my $account ($card->accounts) {
        my $number     = $account->number;
        my $expiration = $account->expiration;
        printf "account: %s %s\n", $number, $expiration;

        my $balance = $account->balance;
        my $profile = $account->profile;

        my @transactions = $account->transactions;

        if (my $soan = $account->soan) {
            my $number = $soan->number;
            my $cid    = $soan->cid;
            printf "soan: %s %s\n", $number, $cid;
        }
        else {
            # SOAN request failed, see why.
            croak $account->card->response->dump;
        }

        for my $transaction ($account->soan_transactions) {
            my $date     = $transaction->date;
            my $merchant = $transaction->merchant;
            my $amount   = $transaction->amount;
            printf "transaction: %s %s %s\n", $date, $amount, $merchant;
        }
    }

=head1 DESCRIPTION

The C<Finance::Card::Discover> module provides access to DiscoverCard
account information and enables the creation of Secure Online Access
Numbers.

=head1 METHODS



( run in 0.879 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )