atpay_buttons 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: bc892b9c316fd7e96cc99f42ebe7a0bba1f53949
4
+ data.tar.gz: b8c61bd615e5e89262731cce90b096a188f7e0c7
5
+ SHA512:
6
+ metadata.gz: edc1c99a639364a7ecd3cee17dfe41b2f92cb74174d224c9b3cd43d4e8bdcb21e5e4171b1b16cd66014a1f60a8dd0744f0c88211dab1a66090676ad0b6e7f276
7
+ data.tar.gz: ff483113e4bd40af28c2635c9c720daf2411da5c98a64ad140efbeef6aefa8ac4988ee8806e5f9b4f2adc31fa084b551e71e39215a3124fe5f736aa39367c1e2
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,22 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in atpay-button-generator.gemspec
4
+ gemspec
5
+
6
+ gem 'liquid'
7
+ gem 'atpay_tokens'
8
+ gem 'activesupport', '4.0.0'
9
+ gem 'trollop'
10
+
11
+ # Test-specific gems
12
+ group :test do
13
+ gem 'capybara', '~> 1.1.0'
14
+ end
15
+
16
+ group :development, :test do
17
+ gem 'pry'
18
+ gem 'minitest', '> 3.1.0'
19
+ gem 'minitest-reporters', '>= 0.5.0', :github => "atpay/minitest-reporters", :require => false
20
+ gem 'simplecov'
21
+ gem 'mocha'
22
+ end
data/README.md ADDED
@@ -0,0 +1,210 @@
1
+ # @Pay Payment Button Generator
2
+
3
+ The @Pay payment button generator creates @Pay two-click buttons that you can send
4
+ to your mailing list to collect funds via email.
5
+
6
+ When using two-click buttons in emails, you want to make sure that they are compatible
7
+ in as many environments (clients/browsers/devices) as possible. This can be a painstaking
8
+ task because all environments render buttons differently. Buttons generated with this
9
+ tool are cross-platform and cross-browser compatible. This means that the two-click
10
+ experience can be enjoyed on over 93% of browser, platform, and device combinations.
11
+ The generator uses domain targeting and outputs html from a specific template depending
12
+ on the email parameter. These templates include two sets of buttons. A CSS rule set will
13
+ determine which button will be displayed on the end users device and browser. For more
14
+ information on cross compatibility,
15
+ visit https://www.atpay.com/cross-compatible-mailto-links-mobile-browsers.
16
+
17
+ You can use this library directly from your Ruby-based application, or you can
18
+ interface with it via the command line from most any language.
19
+
20
+ The provided Liquid templates are customizable here, or can be used as
21
+ a starting point for your own implementation.
22
+
23
+ This library is a convenience wrapper around the [@Pay Client
24
+ Library](https://github.com/atpay/atpay-client). You may use both together or
25
+ each independently, though this library does internally depend on the client
26
+ library.
27
+
28
+
29
+ ## Installation
30
+
31
+ If your application is based on Ruby and you use Bundler, add the following line
32
+ to your application's Gemfile:
33
+
34
+ gem 'atpay-button-generator'
35
+
36
+ And then execute:
37
+
38
+ $ bundle
39
+
40
+ If you'd like to use the command line interface, or are not using Bundler, you
41
+ can install the gem on your system with:
42
+
43
+ $ gem install atpay-button-generator
44
+
45
+ ## Requirements
46
+
47
+ Ruby >= 1.9
48
+
49
+ ## Command Line Usage
50
+
51
+ You'll need a partner id, public key and private key from your @Pay signup. More
52
+ advanced implementations may be using OAuth to collect this information from
53
+ multiple partners and can generate buttons on behalf of merchants that use their
54
+ system.
55
+
56
+ After installing the atpay-button-generator gem, you'll have
57
+ `atpay-button-generator` script in your gem binpath. Run it with
58
+ the help flag to get information on how to use it:
59
+
60
+
61
+ $ atpay-button-generator --help
62
+
63
+ The button generator requires a few flags up front:
64
+
65
+ ### Parameters
66
+
67
+ <p><strong>amount (required): </strong> <br />
68
+ <i> &nbsp; &nbsp; &nbsp; The amount a user should be charged for transactions after clicking this button</i></p>
69
+
70
+ <p><strong>private-key (required):</strong> <br />
71
+ <i> &nbsp; &nbsp; &nbsp; The private key given to you by @Pay</i></p>
72
+
73
+ <p><strong>public-key (required):</strong> <br />
74
+ <i> &nbsp; &nbsp; &nbsp; @Pay's public key, given to you by @Pay</i></p>
75
+
76
+ <p><strong>partner-id (required):</strong> <br />
77
+ <i> &nbsp; &nbsp; &nbsp; The partner ID given to you by @Pay</i></p>
78
+
79
+ <p><strong>subject:</strong> <br />
80
+ <i> &nbsp; &nbsp; &nbsp; The subject of the mailto: email <br/> &nbsp; &nbsp; &nbsp; (the message that a user will be sending to @Pay's servers after clicking the button)</i></p>
81
+
82
+ <p><strong>image:</strong> <br />
83
+ <i> &nbsp; &nbsp; &nbsp; The URL to a small thumbnail image to be used in the button <br /> &nbsp; &nbsp; &nbsp; Default: https://www.atpay.com/wp-content/themes/atpay/images/bttn_cart.png</i></p>
84
+
85
+ <p><strong>color:</strong> <br />
86
+ <i> &nbsp; &nbsp; &nbsp; The background color of the button <br /> &nbsp; &nbsp; &nbsp; Default: #6dbe45</i></p>
87
+
88
+ <p><strong>title:</strong> <br />
89
+ <i> &nbsp; &nbsp; &nbsp; The title for each button</i></p>
90
+
91
+ <p><strong>wrap:</strong> <br />
92
+ <i> &nbsp; &nbsp; &nbsp; Will use wrapped (with a styled div container) version of template <br /> &nbsp; &nbsp; &nbsp; Default: false</i></p>
93
+
94
+ <p><strong>templates:</strong> <br />
95
+ <i> &nbsp; &nbsp; &nbsp; Location of button templates <br /> &nbsp; &nbsp; &nbsp; Default: ./lib/atpay/button/templates</i></p>
96
+
97
+ <p><strong>env:</strong> <br />
98
+ <i> &nbsp; &nbsp; &nbsp; The environment you want to generate buttons for; currently sandbox or production<br /> &nbsp; &nbsp; &nbsp; Default: production</i></p>
99
+
100
+ <p><strong>user_data:</strong> <br />
101
+ <i> &nbsp; &nbsp; &nbsp; Optional user data to be passed in as a string for your use </i></p>
102
+
103
+ <p><strong>input: </strong> <br />
104
+ <i> &nbsp; &nbsp; &nbsp; Input File
105
+ <br />&nbsp; &nbsp; &nbsp;Default: $stdin<sup>*</sup></i></p>
106
+
107
+ <sup>*</sup>Reads from STDIN a comma delimmited file with each line containing the
108
+ email address you're sending the button to and the credit card token you've
109
+ received from @Pay for that button:
110
+
111
+ test1@example.com,TL1UwJFXVN7e4p6+0B5N8hy4qQyqeNxVllmC663MLcMupuAWXdHJ9g8PRAnlIh+AMZBgpaIrfWStZ5/3hYi6vCAV7q6+3M6LLqxk
112
+ test2@example.com,XKCF2E9QZPwdOSwfTQJzZC7byLt3PH8Tr1KhmLkfRHwfNJD5XbDRMrxGYOiSnfrLEKNzm9+a4r++bpUG2hNrPyYLpNgph3BXAAfC
113
+ test3@example.com,iQOxdBV4KrFuPFgyywxytfbsD/rURrzmlADmg1QFP2VHd/kTnkXNpnp2Utv4RS0Zz2YeOloilMhljsOcRVA2YwSu9knwF1h6tNjE
114
+
115
+ ### Example
116
+
117
+ $ atpay-button-generator --title "Pay" --amount 50.00 --subject "Payment for fifty bucks" --private-key "" --public-key "" --partner-id 20 --input input.txt
118
+
119
+ Where input.txt contains
120
+
121
+ test1@example.com,TL1UwJFXVN7e4p6+0B5N8hy4qQyqeNxVllmC663MLcMupuAWXdHJ9g8PRAnlIh+AMZBgpaIrfWStZ5/3hYi6vCAV7q6+3M6LLqxk
122
+ test2@example.com,XKCF2E9QZPwdOSwfTQJzZC7byLt3PH8Tr1KhmLkfRHwfNJD5XbDRMrxGYOiSnfrLEKNzm9+a4r++bpUG2hNrPyYLpNgph3BXAAfC
123
+ test3@example.com,iQOxdBV4KrFuPFgyywxytfbsD/rURrzmlADmg1QFP2VHd/kTnkXNpnp2Utv4RS0Zz2YeOloilMhljsOcRVA2YwSu9knwF1h6tNjE
124
+
125
+ will output three buttons, one for each of the email addresses above, in HTML
126
+ format, one per line. If you're sending out one offer per email, you'll simply
127
+ include each line in the outgoing message to the recipient (one to
128
+ test1@example.com, one to test2@example.com, and one to test3@example.com).
129
+
130
+ A button from the example above looks like this:
131
+
132
+ ![Example Button](https://github.com/atpay/button-generator/blob/master/imgs/sample_button.png?raw=true)
133
+
134
+
135
+ ## Library Usage
136
+
137
+ After following the installation instructions above, you'll have the @Pay button
138
+ generator library loaded in your application. Let's create an array containing
139
+ hashes with our users' email address and html code for a button to deliver to
140
+ htem:
141
+
142
+ ```ruby
143
+ require 'rubygems'
144
+ require 'atpay-button-generator'
145
+
146
+ button_maker = AtPay::Button::Generator.new({
147
+ public_key: ATPAY_PUBLIC,
148
+ private_key: ATPAY_PRIVATE,
149
+ partner_id: ATPAY_PARTNER,
150
+ environment: :sandbox,
151
+ amount: 20
152
+ })
153
+
154
+ output = []
155
+
156
+ User.active.each do |user|
157
+ output << {
158
+ email: user.email,
159
+ button_html: button_maker.generate(user.email, user.source)
160
+ }
161
+ end
162
+
163
+ puts output.inspect
164
+ ```
165
+
166
+ ### ActionMailer Example
167
+
168
+ Assume you have a model that represents an offer you'd like to send to a user:
169
+
170
+ ```ruby
171
+ class OfferMailer < ActionMailer::Base
172
+ default from: 'offers@example.com'
173
+
174
+ def offer_email(offer)
175
+ @button = generator.generate({
176
+ email: offer.recipient.email,
177
+ source: offer.recipient.card_token
178
+ })
179
+
180
+ mail({
181
+ to: offer.recipient.email,
182
+ subject: offer.name
183
+ })
184
+ end
185
+
186
+ private
187
+ def generator
188
+ AtPay::Button::Generator.new({
189
+ amount: offer.amount
190
+ }.update(atpay_config))
191
+ end
192
+
193
+ # NOTE: Just throw this in an initializer if you can
194
+ def atpay_config
195
+ {
196
+ public_key: ATPAY_PUBLIC,
197
+ private_key: ATPAY_PRIVATE,
198
+ partner_id: ATPAY_PARTNER,
199
+ environment: (Rails.env != "production") ? :sandbox : :production
200
+ }
201
+ end
202
+ end
203
+ ```
204
+
205
+ ## Templates
206
+
207
+
208
+ The generator uses a set of four default templates located in "lib/atpay/button/templates/". The yahoo.liquid template will be used for yahoo emails. The default.liquid template is for all other email providers. There are also versions prefixed with "wrap_" that will be used if the wrap parameter is set to "true". These "wrapped" templates are simply versions with a styled div that hold the buttons.
209
+
210
+ To use your own custom templates, you can download the provided default versions. After making the desired modifications, set the template parameter to the location of your modified templates.
data/Rakefile ADDED
@@ -0,0 +1,21 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rake/testtask'
3
+
4
+ require "rake/clean"
5
+ require "rbnacl/rake_tasks"
6
+
7
+ file "lib/libsodium.so" => :build_libsodium do
8
+ cp $LIBSODIUM_PATH, "lib/libsodium.so"
9
+ end
10
+
11
+ task "ci:sodium" => "lib/libsodium.so"
12
+
13
+ task :ci => %w(ci:sodium spec)
14
+
15
+ CLEAN.add "lib/libsodium.*"
16
+
17
+ Rake::TestTask.new do |t|
18
+ t.libs << "spec"
19
+ t.test_files = FileList['spec/**/*_spec.rb']
20
+ t.verbose = true
21
+ end
@@ -0,0 +1,23 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "atpay_buttons"
7
+ spec.version = '1.0.0'
8
+ spec.date = '2013-08-02'
9
+ spec.authors = ["Thomas Pastinsky", "Glen Holcomb", "James Kassemi", "Isaiah Baca"]
10
+ spec.email = ["dev@atpay.com"]
11
+ spec.description = 'Atpay button generator'
12
+ spec.summary = 'Command line tool and Ruby library for generating @Pay 2 click email buttons'
13
+ spec.homepage = "http://atpay.com"
14
+
15
+ spec.files = `git ls-files`.split($/)
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+
19
+ spec.add_development_dependency "bundler", "~> 1.3"
20
+ spec.add_development_dependency "rake"
21
+ spec.add_runtime_dependency "atpay_tokens"
22
+ spec.add_runtime_dependency "liquid"
23
+ end
data/bin/atpay_buttons ADDED
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'trollop'
4
+ require_relative '../lib/atpay_buttons.rb'
5
+
6
+
7
+ @opts = Trollop::options do
8
+ version "atpay-button-generator v0.1"
9
+ banner <<-USAGE
10
+ To generate an Atpay Button, follow these steps:
11
+ Create a text file, e.g. data.txt, containing an email address and the associated credit card token separated by a comma. Enter multiple lines for multiple buttons:
12
+
13
+ test1@example.com,TL1UwJFXVN7e4p6+0B5N8hy4qQyqeNxVllmC663MLcMupuAWXdHJ9g8PRAnlIh+AMZBgpaIrfWStZ5/3hYi6vCAV7q6+3M6LLqxk
14
+ test2@example.com,XKCF2E9QZPwdOSwfTQJzZC7byLt3PH8Tr1KhmLkfRHwfNJD5XbDRMrxGYOiSnfrLEKNzm9+a4r++bpUG2hNrPyYLpNgph3BXAAfC
15
+ test3@example.com,iQOxdBV4KrFuPFgyywxytfbsD/rURrzmlADmg1QFP2VHd/kTnkXNpnp2Utv4RS0Zz2YeOloilMhljsOcRVA2YwSu9knwF1h6tNjE
16
+
17
+ Then run the following from the console in the same location as the file you created:
18
+
19
+ $ atpay-button-generator --title "Pay" --amount 50.00 --subject "Payment for fifty bucks" --private-key "plBs9X+Zvr65z6iCa0oLNdAEGYZ85Dzf74Qy1yPTris=" --public-key "06zK82iu9NUUMmDiZsEvoUH25tbIE6R3R+zPnDK8YGQ=" --partner-id 20 --input data.txt
20
+ USAGE
21
+
22
+ opt :amount, "The amount a user should be charged for transactions after clicking the generated button", :default => 5.0, :required => true
23
+ opt :private_key, "The private key given to you by @Pay", :type => :string, :required => true
24
+ opt :public_key, "@Pay's public key, given to you by @Pay", :type => :string, :required => true
25
+ opt :partner_id, "The partner ID given to you by @Pay", :type => :integer, :required => true
26
+ opt :subject, "The subject of the mailto: email (the message that a user will be sending to @Pay's servers after clicking the button", :type => :string
27
+ opt :image_url, "The URL to a small thumbnail image to be used in the button. Default: https://www.atpay.com/wp-content/themes/atpay/images/bttn_cart.png", :type => :string, :default => "https://www.atpay.com/wp-content/themes/atpay/images/bttn_cart.png"
28
+ opt :color, "The background color of the button. Default: #6dbe45", :type => :string, :default => "#6dbe45"
29
+ opt :title, "The title for each button", :type => :string
30
+ opt :wrap, "Will use wrapped (with a styled div container) version of the template. Default: false", :type => :boolean, :default => false
31
+ opt :env, "The environment you want to generate buttons for. Currently sandbox or production", :default => 'production'
32
+ opt :templates, "Location of button templates.", :type => :string, :default => File.dirname(__FILE__) + '/../lib/atpay/button/templates'
33
+ opt :user_data, "Optional user data to be passed in for your use", :type => :string
34
+ opt :type, "Optional the default is payment", :type => :string
35
+ opt :input, "Input File", :default => $stdin
36
+ end
37
+
38
+ Trollop::die :amount, "must not be negative" if @opts[:amount] < 0
39
+ Trollop::die :input, "must exist" unless File.exist?(@opts[:input]) if @opts[:input]
40
+
41
+ def symbolize_values
42
+ @opts[:env] = @opts[:env].to_sym
43
+ @opts[:type] = @opts[:type].to_sym if @opts[:type]
44
+ end
45
+
46
+ def parse
47
+ @targets = []
48
+
49
+ symbolize_values
50
+ @generator = AtPay::Button::Generator.new @opts.dup
51
+
52
+ while !@opts[:input].eof?
53
+ data = @opts[:input].readline.strip.split(',')
54
+
55
+ @generator.build([[data[0], data[1]]]).each do |pair|
56
+ pair[1] = pair[1].gsub(/\s+/, " ")
57
+ puts pair.join(",")
58
+ end
59
+ end
60
+ end
61
+
62
+ parse
data/circle.yml ADDED
@@ -0,0 +1,17 @@
1
+ dependencies:
2
+ pre:
3
+ - curl -O http://download.dnscrypt.org/libsodium/releases/libsodium-0.4.1.tar.gz
4
+ - tar -xvzf libsodium-0.4.1.tar.gz
5
+ - cd libsodium-0.4.1 && ./configure && make
6
+ - cp libsodium-0.4.1/src/libsodium/.libs/libsodium.so ./lib/
7
+
8
+ test:
9
+ override:
10
+ - bundle exec rake test
11
+
12
+ machine:
13
+ environment:
14
+ LD_LIBRARY_PATH: lib
15
+
16
+ ruby:
17
+ version: 2.0.0-p195
Binary file
@@ -0,0 +1,109 @@
1
+ module AtPay
2
+ module Button
3
+ class LengthError < Exception
4
+ end
5
+
6
+ class Generator
7
+ # TODO: This should really move to the underlying token library.
8
+ TOKEN_TYPES = {
9
+ payment: nil,
10
+ validation: 1
11
+ }
12
+
13
+ def initialize(options)
14
+ @options = {
15
+ :title => "Pay",
16
+ :type => :payment,
17
+ :group => nil,
18
+ :user_data => nil,
19
+ :template => {}
20
+ }.update options
21
+
22
+ @options[:version] = TOKEN_TYPES[@options[:type]] if TOKEN_TYPES[@options[:type]]
23
+
24
+ validate_user_data
25
+ @options[:amount] = amount
26
+ end
27
+
28
+ def amount
29
+ @amount ||= @options[:amount].respond_to?(:gsub) ? @options[:amount].gsub(/[^0-9\.]/, "").to_f : @options[:amount]
30
+ end
31
+
32
+ # Custom data that is to be added to the token can't exceed 2,500 characters.
33
+ def validate_user_data
34
+ return unless @options[:user_data]
35
+
36
+ raise LengthError.new "user_data can't be longer than 2,500 characters, you provided #{@options[:user_data].length} characters" if @options[:user_data].length > 2500
37
+ end
38
+
39
+ # Builds an @Pay Payment token for injection into a mailto button.
40
+ #
41
+ # @param type [Symbol] The button type: :email, :card, :member
42
+ # @param source [String] The coresponding type value
43
+ #
44
+ # @return [String]
45
+ def token(type, source)
46
+ session.security_key(@options.merge({type => source})).email_token
47
+ end
48
+
49
+ # Instanciate a button template instance for a specific email address. The email is necessary
50
+ # for selecting the correct template files. There are some special cases depending on the
51
+ # environment that the button is being viewed in.
52
+ #
53
+ # @param email [String] the email address the button is intended for.
54
+ #
55
+ # @return [AtPay::Button::Template]
56
+ def template(email)
57
+ Template.new(@options.update(:email => email, :amount => amount))
58
+ end
59
+
60
+ def to_html(token, email)
61
+ @options.update({:token => token})
62
+ template(email).render(token: token, :email => email)
63
+ end
64
+
65
+ # Generate the actual button HTML. There are three options available :source (the card token),
66
+ # :email (the email address the button is intended for), :type (the type of the source identifier)
67
+ # :type defaults to card.
68
+ #
69
+ # @param options [Hash] there are three options that matter: :source, :email and :type
70
+ #
71
+ # @return [String]
72
+ def generate(options)
73
+ options[:source] ? source = options[:source] : source = options[:email]
74
+ options[:type] ? type = options[:type] : type = :card
75
+ email = options[:email]
76
+
77
+ to_html token(type, source), email
78
+ end
79
+
80
+ # Build buttons for the provided collection. build will accept an array of email addresses ['bob@bob', 'sue@sue'],
81
+ # or any "paired" collection: For example [['bob@bob', 'card_token'], ['sue@sue', 'card_token']] will work,
82
+ # as will 'bob@bob' => 'card_token', 'sue@sue' => 'card_token'. If providing only a list of email
83
+ # addresses build will create email tokens. Only use this behavior if you are sure it is what both you
84
+ # and your customer want. An email token isn't ultra-specific about the card it charges. It will charge
85
+ # the first card for that individual it finds that your @Pay account has permission to use.
86
+ #
87
+ # @param token_map [Enumerable]
88
+ #
89
+ # @return [Array] a list of tuples containing the email address and button code as [String]s
90
+ def build(token_map)
91
+ token_map.collect do |email, card|
92
+ card ? [email, generate(email: email, source: card)] : [email, generate(email: email, type: :email)]
93
+ end
94
+ end
95
+
96
+
97
+ private
98
+
99
+ def session
100
+ @session ||= AtPay::Session.new({
101
+ public_key: @options[:public_key],
102
+ private_key: @options[:private_key],
103
+ partner_id: @options[:partner_id],
104
+ environment: @options[:env]
105
+ })
106
+ end
107
+ end
108
+ end
109
+ end