File Coverage

blib/lib/Business/Alipay.pm
Criterion Covered Total %
statement 15 58 25.8
branch 0 22 0.0
condition 0 8 0.0
subroutine 5 9 55.5
pod 0 3 0.0
total 20 100 20.0


line stmt bran cond sub pod time code
1             package Business::Alipay;
2              
3 1     1   34188 use strict;
  1         3  
  1         35  
4 1     1   30 use 5.008_005;
  1         3  
  1         63  
5             our $VERSION = '0.01';
6              
7 1     1   6 use Carp;
  1         8  
  1         552  
8 1     1   1447 use LWP::UserAgent;
  1         95173  
  1         40  
9 1     1   10 use Digest::MD5 'md5_hex';
  1         1  
  1         687  
10              
11             sub new {
12 0     0 0   my $class = shift;
13 0 0         my $args = scalar @_ % 2 ? shift : {@_};
14              
15             # validate
16 0 0         $args->{ALIPAY_KEY} or croak 'ALIPAY_KEY is required';
17 0 0         $args->{ALIPAY_PARTNER} or croak 'ALIPAY_PARTNER is required';
18 0 0         $args->{ALIPAY_SELLER_EMAIL} or croak 'ALIPAY_SELLER_EMAIL is required';
19              
20 0 0         unless ( $args->{ua} ) {
21 0   0       my $ua_args = delete $args->{ua_args} || {};
22 0           $args->{ua} = LWP::UserAgent->new(%$ua_args);
23             }
24              
25 0           bless $args, $class;
26             }
27              
28             sub create_direct_pay_by_user {
29 0     0 0   my $self = shift;
30 0 0         my $args = scalar @_ % 2 ? shift : {@_};
31              
32 0           my $params = {
33             "service" => "create_direct_pay_by_user",
34             "partner" => $self->{ALIPAY_PARTNER},
35             "payment_type" => 1,
36             "notify_url" => $args->{notify_url},
37             "return_url" => $args->{return_url},
38             "seller_email" => $self->{ALIPAY_SELLER_EMAIL},
39             "out_trade_no" => $args->{out_trade_no},
40             "subject" => $args->{subject},
41             "total_fee" => $args->{total_fee},
42             "body" => $args->{body},
43             "show_url" => '',
44             "anti_phishing_key" => '',
45             "exter_invoke_ip" => '',
46             "_input_charset" => 'utf-8',
47             };
48              
49 0           my ($new_params, $prestr) = __params_filter($params);
50 0           my $md5 = md5_hex($prestr . $self->{ALIPAY_KEY});
51              
52 0           $new_params->{sign} = $md5;
53 0           $new_params->{sign_type} = 'MD5';
54 0           $prestr .= '&sign=' . $md5;
55 0           $prestr .= '&sign_type=MD5';
56              
57 0           return 'https://mapi.alipay.com/gateway.do?' . $prestr;
58             }
59              
60             sub notify_verify {
61 0     0 0   my $self = shift;
62 0 0         my $params = scalar @_ % 2 ? shift : {@_};
63              
64 0           my ($new_params, $prestr) = __params_filter($params);
65 0           my $md5 = md5_hex($prestr . $self->{ALIPAY_KEY});
66 0           my $params_sign = $params->{sign};
67              
68 0 0         return 'sign_dismatch' unless $md5 eq $params_sign;
69              
70 0           my $url = "https://www.alipay.com/cooperate/gateway.do?service=notify_verify&partner=" . $self->{ALIPAY_PARTNER} . "¬ify_id=" . $params->{notify_id};
71             # retry few times if HTTP issue
72 0           my $tried_times = 0;
73 0           while (1) {
74 0           my $res = $self->{ua}->get($url);
75 0 0         return $res->content if $res->is_success;
76 0           $tried_times++;
77 0 0         last if $tried_times > 5;
78 0           sleep 1;
79             }
80 0           return 'unknown'; # FAILED
81             }
82              
83             sub __params_filter {
84 0     0     my ($params) = @_;
85              
86 0           my %new_params; my $prestr;
87 0           my @keys = keys %$params;
88 0           foreach my $k (sort keys %$params) {
89 0 0 0       next if ($k eq 'sign' or $k eq 'sign_type' or $params->{$k} eq '');
      0        
90 0           $new_params{$k} = $params->{$k};
91 0           $prestr .= $k . '=' . $params->{$k} . '&';
92             }
93 0           $prestr =~ s/\&$//;
94              
95 0           return (\%new_params, $prestr);
96             }
97              
98             1;
99             __END__