Net-Braintree

 view release on metacpan or  search on metacpan

lib/Net/Braintree/WebhookNotificationGateway.pm  view on Meta::CPAN

package Net::Braintree::WebhookNotificationGateway;

use MIME::Base64;
use Net::Braintree::Digest qw(hexdigest);
use Net::Braintree::Xml qw(xml_to_hash);
use Moose;

has 'gateway' => (is => 'ro');

sub parse {
  my ($self, $signature, $payload) = @_;
  $self->_validate_signature($signature, $payload);
  my $xml_payload = decode_base64($payload);
  my $attributes = xml_to_hash($xml_payload);

  Net::Braintree::WebhookNotification->new($attributes->{notification});
}

sub _matching_signature {
  my ($self, $signature, $payload) = @_;
  foreach my $signature_pair (split("&", $signature)) {
    my @components = split("\\|", $signature_pair);

    if ($components[0] eq $self->gateway->config->public_key) {
      return $components[1];
    }
  }
}

sub _validate_signature {
  my ($self, $signature, $payload) = @_;
  my $matching_signature = $self->_matching_signature($signature, $payload);
  if (defined($matching_signature) && $matching_signature ne hexdigest($self->gateway->config->private_key, $payload)) {
    confess "InvalidSignature";
  }
}

sub verify {
  my ($self, $challenge) = @_;
  if ($challenge !~ /^[a-f0-9]{20,32}$/) {
    confess "InvalidChallenge";
  }
  return $self->gateway->config->public_key . "|" . hexdigest($self->gateway->config->private_key, $challenge);
}

1;



( run in 0.869 second using v1.01-cache-2.11-cpan-39bf76dae61 )