atpay_ruby 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/.ruby-version +1 -0
- data/Gemfile +2 -0
- data/README.md +277 -0
- data/assets/button/templates/default.liquid +72 -0
- data/assets/button/templates/mailto_body.liquid +8 -0
- data/assets/button/templates/wrap_default.liquid +130 -0
- data/assets/button/templates/wrap_yahoo.liquid +175 -0
- data/assets/button/templates/yahoo.liquid +111 -0
- data/assets/imgs/sample_button.png +0 -0
- data/atpay_ruby.gemspec +27 -0
- data/bin/atpay +58 -0
- data/lib/atpay.rb +14 -0
- data/lib/atpay/button.rb +125 -0
- data/lib/atpay/card.rb +6 -0
- data/lib/atpay/email_address.rb +4 -0
- data/lib/atpay/error.rb +15 -0
- data/lib/atpay/hook.rb +34 -0
- data/lib/atpay/railtie.rb +6 -0
- data/lib/atpay/session.rb +17 -0
- data/lib/atpay/token/bulk.rb +16 -0
- data/lib/atpay/token/core.rb +122 -0
- data/lib/atpay/token/encoder.rb +81 -0
- data/lib/atpay/token/invoice.rb +17 -0
- data/lib/atpay/token/registration.rb +35 -0
- data/spec/button_spec.rb +42 -0
- data/spec/hook_spec.rb +29 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/token/bulk_spec.rb +28 -0
- data/spec/token/core_spec.rb +62 -0
- data/spec/token/encoder_spec.rb +86 -0
- data/spec/token/invoice_spec.rb +20 -0
- data/spec/token/registration.rb +28 -0
- metadata +198 -0
@@ -0,0 +1,175 @@
|
|
1
|
+
<!-- yahoo template with wrap -->
|
2
|
+
|
3
|
+
<style>
|
4
|
+
a.not_yahoo {display:inline; display: inline !important;font-size: 20px !important;}
|
5
|
+
a.not_yahoosm {display:inline; display: inline !important;font-size: 12px !important;}
|
6
|
+
|
7
|
+
a.not_yahoo[fix] {display:inline; display: inline !important;font-size: 20px !important;}
|
8
|
+
a.not_yahoosm[fix] {display:inline; display: inline !important;font-size: 12px !important;}
|
9
|
+
a.yahoo[fix] {display:none; display: none !important;font-size: 0px !important;}
|
10
|
+
</style>
|
11
|
+
|
12
|
+
{% if analytic_url %}
|
13
|
+
<img src="{{analytic_url}}" width="1" height="1" />
|
14
|
+
{% endif %}
|
15
|
+
|
16
|
+
|
17
|
+
<center>
|
18
|
+
<table cellpadding='0' cellspacing='0' style='margin-bottom:20px;'>
|
19
|
+
<tr>
|
20
|
+
<td>
|
21
|
+
<table style='margin: auto; margin-bottom:5px; font-family: Lato; padding-bottom:10px; position:relative; padding-left:5px; padding-right:10px; margin-bottom:0px; margin-top:5px; padding:10px;padding-top:0; border-left: 1px solid #e4e2e2; border-top: 1px solid #e4e2e2; border-right: 1px solid #e4e2e2; '>
|
22
|
+
<tr>
|
23
|
+
<td colspan='3'>
|
24
|
+
<p style='margin-bottom:0px; color: #515050; font-size:12px; margin-top:2px; text-align:center;'>
|
25
|
+
{{wrap_text}}
|
26
|
+
</p>
|
27
|
+
</td>
|
28
|
+
</tr>
|
29
|
+
<tr>
|
30
|
+
<td>
|
31
|
+
|
32
|
+
<center>
|
33
|
+
<a border='0' class='yahoo' fix='email' href='{{yahoo_url}}' style='text-underline:none;'>
|
34
|
+
<table border='0' cellpadding='0' cellspacing='0' style='background-color:{{background_color}};'>
|
35
|
+
<tr class='main'>
|
36
|
+
<td class='main' style='padding:3px 5px 5px 5px;' width='145'>
|
37
|
+
<table>
|
38
|
+
<tr>
|
39
|
+
{% if image %}
|
40
|
+
<td>
|
41
|
+
<a class='yahoo' fix='email' href='{{yahoo_url}}' style='color:{{foreground_color}}; text-decoration:none; border:none; display:inline;'>
|
42
|
+
<img src='{{image}}' style='margin-left: 5px; margin-right:10px; margin-top:8px;'>
|
43
|
+
</a>
|
44
|
+
</td>
|
45
|
+
{% endif %}
|
46
|
+
<td>
|
47
|
+
<table border='0' cellpadding='0' cellspacing='0' style='float:left; margin:0; margin-left:5px;'>
|
48
|
+
<tr>
|
49
|
+
<td style='font-size: 11px; color: {{foreground_color}}; font-family: Tahoma; text-align:center; padding:0; margin:0;'>
|
50
|
+
{{title}}
|
51
|
+
</td>
|
52
|
+
</tr>
|
53
|
+
<tr>
|
54
|
+
<td>
|
55
|
+
<table border='0' cellpadding='0' cellspacing='0' style='margin:0; padding:0;'>
|
56
|
+
<tr>
|
57
|
+
<td style='padding:0; margin:0; font-size: 20px; color: {{foreground_color}}; font-family: Tahoma; vertical-align:top; line-height:25px;' valign='top'>
|
58
|
+
<a class='yahoo' fix='email' href='{{yahoo_url}}' style='color:{{foreground_color}}; text-decoration:none; border:none; display:inline;'>
|
59
|
+
{{dollar}}
|
60
|
+
</a>
|
61
|
+
</td>
|
62
|
+
<td style='padding:0; margin:0; font-size:14px; text-decoration:underline;padding-left:2px; color: {{foreground_color}}; font-family: Tahoma; vertical-align:top;' valign='top'>
|
63
|
+
<a class='yahoosm' fix='email' href='{{yahoo_url}}' style='color:{{foreground_color}}; text-decoration:none; border:none; display:inline;'>
|
64
|
+
{{cents}}
|
65
|
+
</a>
|
66
|
+
</td>
|
67
|
+
</tr>
|
68
|
+
</table>
|
69
|
+
</td>
|
70
|
+
</tr>
|
71
|
+
</table>
|
72
|
+
</td>
|
73
|
+
</tr>
|
74
|
+
</table>
|
75
|
+
</td>
|
76
|
+
</tr>
|
77
|
+
</table>
|
78
|
+
</a>
|
79
|
+
<a border='0' class='not_yahoo' fix='email' href='{{url}}' style='text-underline:none; display:none; font-size:0px; text-indent:-9999999;'>
|
80
|
+
<table border='0' cellpadding='0' cellspacing='0' style='background-color:{{background_color}};'>
|
81
|
+
<tr class='main'>
|
82
|
+
<td class='main' style='padding:3px 5px 5px 5px;' width='145'>
|
83
|
+
<table>
|
84
|
+
<tr>
|
85
|
+
{% if image %}
|
86
|
+
<td>
|
87
|
+
<a class='not_yahoo' href='{{url}}' style='color:{{foreground_color}}; text-decoration:none; border:none;'>
|
88
|
+
<img src='{{image}}' style='margin-left: 5px; margin-right:10px; margin-top:8px;'>
|
89
|
+
</a>
|
90
|
+
</td>
|
91
|
+
{% endif %}
|
92
|
+
<td>
|
93
|
+
<table border='0' cellpadding='0' cellspacing='0' style='float:left; margin:0; margin-left:5px;'>
|
94
|
+
<tr>
|
95
|
+
<td style='font-size: 11px; color: {{foreground_color}}; font-family: Tahoma; text-align:center; padding:0; margin:0;'>
|
96
|
+
{{title}}
|
97
|
+
</td>
|
98
|
+
</tr>
|
99
|
+
<tr>
|
100
|
+
<td>
|
101
|
+
<table border='0' cellpadding='0' cellspacing='0' style='margin:0; padding:0;'>
|
102
|
+
<tr>
|
103
|
+
<td style='padding:0; margin:0; font-size: 20px; color: {{foreground_color}}; font-family: Tahoma; vertical-align:top; line-height:25px;' valign='top'>
|
104
|
+
<a class='not_yahoo' fix='email' href='{{url}}' style='color:{{foreground_color}}; text-decoration:none; border:none;'>
|
105
|
+
{{dollar}}
|
106
|
+
</a>
|
107
|
+
</td>
|
108
|
+
<td style='padding:0; margin:0; font-size:14px; text-decoration:underline;padding-left:2px; color: {{foreground_color}}; font-family: Tahoma; vertical-align:top;' valign='top'>
|
109
|
+
<a class='not_yahoosm' fix='email' href='{{url}}' style='color:{{foreground_color}}; text-decoration:none; border:none;'>
|
110
|
+
{{cents}}
|
111
|
+
</a>
|
112
|
+
</td>
|
113
|
+
</tr>
|
114
|
+
</table>
|
115
|
+
</td>
|
116
|
+
</tr>
|
117
|
+
</table>
|
118
|
+
</td>
|
119
|
+
</tr>
|
120
|
+
</table>
|
121
|
+
</td>
|
122
|
+
</tr>
|
123
|
+
</table>
|
124
|
+
</a>
|
125
|
+
</center>
|
126
|
+
|
127
|
+
|
128
|
+
|
129
|
+
|
130
|
+
|
131
|
+
|
132
|
+
|
133
|
+
|
134
|
+
|
135
|
+
|
136
|
+
|
137
|
+
|
138
|
+
</td>
|
139
|
+
</tr>
|
140
|
+
</table>
|
141
|
+
</td>
|
142
|
+
</tr>
|
143
|
+
<tr>
|
144
|
+
<td>
|
145
|
+
<table cellpadding='0' cellspacing='0' style='width:100%;' width='100%'>
|
146
|
+
<tr>
|
147
|
+
<td valign='top'>
|
148
|
+
<table cellpadding='0' cellspacing='0' height='10' style='font-size: 1px; line-height: 1px; border-left: 1px #e4e2e2 solid; border-bottom: 1px #e4e2e2 solid; height:10px; width: 100%;'>
|
149
|
+
<tr>
|
150
|
+
<td>
|
151
|
+
|
152
|
+
</td>
|
153
|
+
</tr>
|
154
|
+
</table>
|
155
|
+
</td>
|
156
|
+
<td width='155'>
|
157
|
+
<center>
|
158
|
+
<img src='https://atpay.com/wp-content/uploads/2013/05/email_chout_tag.png'>
|
159
|
+
</center>
|
160
|
+
</td>
|
161
|
+
<td valign='top' width='20'>
|
162
|
+
<table cellpadding='0' cellspacing='0' height='10' style='font-size: 1px; line-height: 1px; border-right: 1px #e4e2e2 solid; border-bottom: 1px #e4e2e2 solid; height:10px; width: 100%;'>
|
163
|
+
<tr>
|
164
|
+
<td>
|
165
|
+
|
166
|
+
</td>
|
167
|
+
</tr>
|
168
|
+
</table>
|
169
|
+
</td>
|
170
|
+
</tr>
|
171
|
+
</table>
|
172
|
+
</td>
|
173
|
+
</tr>
|
174
|
+
</table>
|
175
|
+
</center>
|
@@ -0,0 +1,111 @@
|
|
1
|
+
<!-- yahoo template with no wrap -->
|
2
|
+
|
3
|
+
<style>
|
4
|
+
a.not_yahoo {display:inline; display: inline !important;font-size: 20px !important;}
|
5
|
+
a.not_yahoosm {display:inline; display: inline !important;font-size: 12px !important;}
|
6
|
+
|
7
|
+
a.not_yahoo[fix] {display:inline; display: inline !important;font-size: 20px !important;}
|
8
|
+
a.not_yahoosm[fix] {display:inline; display: inline !important;font-size: 12px !important;}
|
9
|
+
a.yahoo[fix] {display:none; display: none !important;font-size: 0px !important;}
|
10
|
+
</style>
|
11
|
+
|
12
|
+
{% if analytic_url %}
|
13
|
+
<img src="{{analytic_url}}" width="1" height="1" />
|
14
|
+
{% endif %}
|
15
|
+
|
16
|
+
|
17
|
+
<center>
|
18
|
+
<a border='0' class='yahoo' fix='email' href='{{yahoo_url}}' style='text-underline:none;'>
|
19
|
+
<table border='0' cellpadding='0' cellspacing='0' style='background-color:{{background_color}};'>
|
20
|
+
<tr class='main'>
|
21
|
+
<td class='main' style='padding:3px 5px 5px 5px;' width='145'>
|
22
|
+
<table>
|
23
|
+
<tr>
|
24
|
+
{% if image %}
|
25
|
+
<td>
|
26
|
+
<a class='yahoo' fix='email' href='{{yahoo_url}}' style='color:{{foreground_color}}; text-decoration:none; border:none; display:inline;'>
|
27
|
+
<img src='{{image}}' style='margin-left: 5px; margin-right:10px; margin-top:8px;'>
|
28
|
+
</a>
|
29
|
+
</td>
|
30
|
+
{% endif %}
|
31
|
+
<td>
|
32
|
+
<table border='0' cellpadding='0' cellspacing='0' style='float:left; margin:0; margin-left:5px;'>
|
33
|
+
<tr>
|
34
|
+
<td style='font-size: 11px; color: {{foreground_color}}; font-family: Tahoma; text-align:center; padding:0; margin:0;'>
|
35
|
+
{{title}}
|
36
|
+
</td>
|
37
|
+
</tr>
|
38
|
+
<tr>
|
39
|
+
<td>
|
40
|
+
<table border='0' cellpadding='0' cellspacing='0' style='margin:0; padding:0;'>
|
41
|
+
<tr>
|
42
|
+
<td style='padding:0; margin:0; font-size: 20px; color: {{foreground_color}}; font-family: Tahoma; vertical-align:top; line-height:25px;' valign='top'>
|
43
|
+
<a class='yahoo' fix='email' href='{{yahoo_url}}' style='color:{{foreground_color}}; text-decoration:none; border:none; display:inline;'>
|
44
|
+
{{dollar}}
|
45
|
+
</a>
|
46
|
+
</td>
|
47
|
+
<td style='padding:0; margin:0; font-size:14px; text-decoration:underline;padding-left:2px; color: {{foreground_color}}; font-family: Tahoma; vertical-align:top;' valign='top'>
|
48
|
+
<a class='yahoosm' fix='email' href='{{yahoo_url}}' style='color:{{foreground_color}}; text-decoration:none; border:none; display:inline;'>
|
49
|
+
{{cents}}
|
50
|
+
</a>
|
51
|
+
</td>
|
52
|
+
</tr>
|
53
|
+
</table>
|
54
|
+
</td>
|
55
|
+
</tr>
|
56
|
+
</table>
|
57
|
+
</td>
|
58
|
+
</tr>
|
59
|
+
</table>
|
60
|
+
</td>
|
61
|
+
</tr>
|
62
|
+
</table>
|
63
|
+
</a>
|
64
|
+
<a border='0' class='not_yahoo' fix='email' href='{{url}}' style='text-underline:none; display:none; font-size:0px; text-indent:-9999999;'>
|
65
|
+
<table border='0' cellpadding='0' cellspacing='0' style='background-color:{{background_color}};'>
|
66
|
+
<tr class='main'>
|
67
|
+
<td class='main' style='padding:3px 5px 5px 5px;' width='145'>
|
68
|
+
<table>
|
69
|
+
<tr>
|
70
|
+
{% if image %}
|
71
|
+
<td>
|
72
|
+
<a class='not_yahoo' href='{{url}}' style='color:{{foreground_color}}; text-decoration:none; border:none;'>
|
73
|
+
<img src='{{image}}' style='margin-left: 5px; margin-right:10px; margin-top:8px;'>
|
74
|
+
</a>
|
75
|
+
</td>
|
76
|
+
{% endif %}
|
77
|
+
<td>
|
78
|
+
<table border='0' cellpadding='0' cellspacing='0' style='float:left; margin:0; margin-left:5px;'>
|
79
|
+
<tr>
|
80
|
+
<td style='font-size: 11px; color: {{foreground_color}}; font-family: Tahoma; text-align:center; padding:0; margin:0;'>
|
81
|
+
{{title}}
|
82
|
+
</td>
|
83
|
+
</tr>
|
84
|
+
<tr>
|
85
|
+
<td>
|
86
|
+
<table border='0' cellpadding='0' cellspacing='0' style='margin:0; padding:0;'>
|
87
|
+
<tr>
|
88
|
+
<td style='padding:0; margin:0; font-size: 20px; color: {{foreground_color}}; font-family: Tahoma; vertical-align:top; line-height:25px;' valign='top'>
|
89
|
+
<a class='not_yahoo' fix='email' href='{{url}}' style='color:{{foreground_color}}; text-decoration:none; border:none;'>
|
90
|
+
{{dollar}}
|
91
|
+
</a>
|
92
|
+
</td>
|
93
|
+
<td style='padding:0; margin:0; font-size:14px; text-decoration:underline;padding-left:2px; color: {{foreground_color}}; font-family: Tahoma; vertical-align:top;' valign='top'>
|
94
|
+
<a class='not_yahoosm' fix='email' href='{{url}}' style='color:{{foreground_color}}; text-decoration:none; border:none;'>
|
95
|
+
{{cents}}
|
96
|
+
</a>
|
97
|
+
</td>
|
98
|
+
</tr>
|
99
|
+
</table>
|
100
|
+
</td>
|
101
|
+
</tr>
|
102
|
+
</table>
|
103
|
+
</td>
|
104
|
+
</tr>
|
105
|
+
</table>
|
106
|
+
</td>
|
107
|
+
</tr>
|
108
|
+
</table>
|
109
|
+
</a>
|
110
|
+
</center>
|
111
|
+
|
Binary file
|
data/atpay_ruby.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
$:.unshift(File.join(File.dirname(__FILE__), 'lib'))
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = 'atpay_ruby'
|
5
|
+
s.version = '0.0.5'
|
6
|
+
s.summary = 'Ruby bindings for the @Pay API'
|
7
|
+
s.description = ""
|
8
|
+
s.authors = ['James Kassemi']
|
9
|
+
s.email = ['james@atpay.com']
|
10
|
+
s.homepage = 'https://atpay.com'
|
11
|
+
s.license = 'MIT'
|
12
|
+
|
13
|
+
s.add_runtime_dependency('rbnacl-libsodium', '~> 0.6.0')
|
14
|
+
s.add_runtime_dependency('trollop', '~> 2.0')
|
15
|
+
s.add_runtime_dependency('liquid', '~> 2.6.1')
|
16
|
+
s.add_runtime_dependency('thor', '~> 0.18.1')
|
17
|
+
s.add_runtime_dependency('httpi')
|
18
|
+
s.add_runtime_dependency('multi_json')
|
19
|
+
|
20
|
+
s.add_development_dependency('rspec', '~> 3.0.0')
|
21
|
+
s.add_development_dependency('rspec-mocks', '~> 3.0.2')
|
22
|
+
|
23
|
+
s.files = `git ls-files`.split($/)
|
24
|
+
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
25
|
+
s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
26
|
+
s.require_paths = ['lib']
|
27
|
+
end
|
data/bin/atpay
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
4
|
+
|
5
|
+
require 'atpay'
|
6
|
+
require 'thor'
|
7
|
+
require 'pry'
|
8
|
+
|
9
|
+
module AtPay
|
10
|
+
module CLI
|
11
|
+
class Token < Thor
|
12
|
+
class_option :private_key, desc: "Your @Pay private key"
|
13
|
+
class_option :public_key, desc: "Your @Pay public key"
|
14
|
+
class_option :partner_id, type: :numeric, desc: "Your @Pay partner ID"
|
15
|
+
|
16
|
+
desc 'invoice', 'Generate an invoice token'
|
17
|
+
option :amount, type: :numeric, required: true, desc: "Dollar amount to process"
|
18
|
+
option :email, type: :string, required: true, desc: "Email address expected to complete the transaction"
|
19
|
+
option :user_data, default: nil, desc: "Additional data to append to transaction details"
|
20
|
+
def invoice
|
21
|
+
puts AtPay::Token::Invoice.new(session, options[:amount], options[:email], options[:user_data]).to_s
|
22
|
+
end
|
23
|
+
|
24
|
+
desc 'bulk', 'Generate a bulk token'
|
25
|
+
option :amount, type: :numeric, required: true, desc: "Dollar amount to process"
|
26
|
+
option :user_data, default: '', desc: "Additional data to append to transaction details"
|
27
|
+
option :url, type: :string, required: true, desc: "URL for customers with no card on file to complete transaction"
|
28
|
+
def bulk
|
29
|
+
puts AtPay::Token::Bulk.new(session, options[:amount], options[:url], options[:user_data]).to_s
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
def session
|
34
|
+
AtPay::Session.new(options[:partner_id], options[:public_key], options[:private_key])
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class Button < Thor
|
39
|
+
desc 'generic', 'Generates a button for a token'
|
40
|
+
option :amount, type: :numeric, required: true, desc: "Display amount"
|
41
|
+
option :merchant, type: :string, required: true, desc: "Merchant name"
|
42
|
+
def generic
|
43
|
+
token = $stdin.read
|
44
|
+
puts AtPay::Button.new(token, options[:amount], options[:merchant]).render
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
class Main < Thor
|
49
|
+
desc 'token [SUBCOMMAND ...ARGS]', 'Token generation functions'
|
50
|
+
subcommand 'token', Token
|
51
|
+
|
52
|
+
desc 'button [SUBCOMMAND ...ARGS]', 'Button generation functions'
|
53
|
+
subcommand 'button', Button
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
AtPay::CLI::Main.start(ARGV)
|
data/lib/atpay.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
$:.unshift(File.join(File.dirname(__FILE__), 'lib'))
|
2
|
+
|
3
|
+
require 'atpay/session'
|
4
|
+
require 'atpay/error'
|
5
|
+
require 'atpay/button'
|
6
|
+
require 'atpay/token/invoice'
|
7
|
+
require 'atpay/token/bulk'
|
8
|
+
require 'atpay/hook'
|
9
|
+
require 'atpay/railtie' if defined?(Rails)
|
10
|
+
require 'base64'
|
11
|
+
|
12
|
+
module AtPay
|
13
|
+
PUBLIC_KEY = Base64.decode64(ENV["ATPAY_PUB_KEY"] || ENV["ATPAY_PUBLIC_KEY"] || "QZuSjGhUz2DKEvjule1uRuW+N6vCOoMuR2PgCl57vB0=")
|
14
|
+
end
|
data/lib/atpay/button.rb
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'liquid'
|
3
|
+
require 'cgi'
|
4
|
+
require 'uri'
|
5
|
+
|
6
|
+
module AtPay
|
7
|
+
class Button
|
8
|
+
OPTIONS = {
|
9
|
+
subject: 'Email Order Form',
|
10
|
+
title: 'Pay',
|
11
|
+
background_color: '#6dbe45',
|
12
|
+
foreground_color: '#ffffff',
|
13
|
+
image: 'https://www.atpay.com/wp-content/themes/atpay/images/bttn_cart.png',
|
14
|
+
processor: ENV['ATPAY_PAYMENT_ADDRESS'] || 'payment@transaction-l4.atpay.com',
|
15
|
+
templates: File.join(File.dirname(__FILE__), '..', '..', 'assets', 'button', 'templates'),
|
16
|
+
analytic_url: nil,
|
17
|
+
wrap: false,
|
18
|
+
wrap_text: 'Made for Mobile'
|
19
|
+
}
|
20
|
+
|
21
|
+
def initialize(token, amount, merchant_name, options={})
|
22
|
+
@token = token
|
23
|
+
@amount = amount
|
24
|
+
@merchant_name = merchant_name
|
25
|
+
@options = OPTIONS.merge(options)
|
26
|
+
@options[:image] = nil if @options[:image] == ''
|
27
|
+
end
|
28
|
+
|
29
|
+
def default_mailto
|
30
|
+
"mailto:#{@options[:processor]}?subject=#{mailto_subject}&body=#{mailto_body}"
|
31
|
+
end
|
32
|
+
|
33
|
+
def render(args={})
|
34
|
+
@options.update args
|
35
|
+
|
36
|
+
template.render({
|
37
|
+
'url' => default_mailto,
|
38
|
+
'outlook_url' => outlook_mailto,
|
39
|
+
'yahoo_url' => yahoo_mailto,
|
40
|
+
'content' => amount,
|
41
|
+
'dollar' => amount.match(/\$\d+(?=\.)/).to_s,
|
42
|
+
'cents' => ".#{amount.match(/(?<=\.)[^.]*/).to_s}",
|
43
|
+
}.update(string_hash @options))
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
def amount
|
48
|
+
"$%.2f" % @amount.to_f
|
49
|
+
end
|
50
|
+
|
51
|
+
def string_hash(hsh)
|
52
|
+
hsh.inject({}) do |result, key|
|
53
|
+
result[key[0].to_s] = key[1]
|
54
|
+
result
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def provider
|
59
|
+
return :default if @options[:email].nil?
|
60
|
+
|
61
|
+
if ["yahoo.com", "ymail.com", "rocketmail.com"].any? { |c| @options[:email].include? c }
|
62
|
+
:yahoo
|
63
|
+
else
|
64
|
+
:default
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def token
|
69
|
+
@token.chars.each_slice(50).map(&:join).join("\n")
|
70
|
+
end
|
71
|
+
|
72
|
+
def mailto_subject
|
73
|
+
URI.encode(@options[:subject])
|
74
|
+
end
|
75
|
+
|
76
|
+
def yahoo_mailto
|
77
|
+
"http://compose.mail.yahoo.com/?to=#{@options[:processor]}&subject=#{mailto_subject}&body=#{mailto_body}"
|
78
|
+
end
|
79
|
+
|
80
|
+
def outlook_mailto
|
81
|
+
"https://www.hotmail.com/secure/start?action=compose&to=#{@options[:processor]}&subject=#{mailto_subject}&body=#{mailto_body}"
|
82
|
+
end
|
83
|
+
|
84
|
+
# Load the mailto body template from the specified location
|
85
|
+
def mailto_body_template
|
86
|
+
Liquid::Template.parse(File.read(File.join(@options[:templates], "mailto_body.liquid")))
|
87
|
+
end
|
88
|
+
|
89
|
+
# Parse the mailto body, this is where we inject the token, merchant_name and amount values we received in
|
90
|
+
# the options.
|
91
|
+
#
|
92
|
+
# @return [String]
|
93
|
+
def mailto_body
|
94
|
+
part_a = URI.encode(mailto_body_template.render({
|
95
|
+
'amount' => amount,
|
96
|
+
'merchant_name' => @merchant_name}))
|
97
|
+
part_b = CGI.escape(token)
|
98
|
+
part_z = "#{part_a}%0A%0A#{part_b}"
|
99
|
+
return part_z
|
100
|
+
end
|
101
|
+
|
102
|
+
# This is processed as liquid - in the future we can allow overwriting the
|
103
|
+
# template here and creating custom buttons.
|
104
|
+
def template
|
105
|
+
Liquid::Template.parse(template_content(template_name))
|
106
|
+
end
|
107
|
+
|
108
|
+
def template_name
|
109
|
+
wrap_prefix = @options[:wrap] ? "wrap_" : ""
|
110
|
+
|
111
|
+
case provider
|
112
|
+
when :yahoo
|
113
|
+
"#{wrap_prefix}yahoo.liquid"
|
114
|
+
when :default
|
115
|
+
"#{wrap_prefix}default.liquid"
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
# Determine which template to load based on the domain of the email address.
|
120
|
+
# This preserves the mailto behavior across email environments.
|
121
|
+
def template_content(template_name)
|
122
|
+
File.read(File.join(@options[:templates], template_name))
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|