opay 1.0.0.beta

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.
Files changed (99) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.md +3 -0
  3. data/Rakefile +22 -0
  4. data/app/assets/javascripts/opay/application.js +15 -0
  5. data/app/assets/stylesheets/opay/application.css +13 -0
  6. data/app/controllers/opay/application_controller.rb +4 -0
  7. data/app/controllers/opay/payu_controller.rb +9 -0
  8. data/app/helpers/opay/application_helper.rb +4 -0
  9. data/app/helpers/opay/payu_helper.rb +4 -0
  10. data/app/models/opay/payment.rb +6 -0
  11. data/app/views/layouts/opay/application.html.erb +14 -0
  12. data/config/routes.rb +8 -0
  13. data/db/migrate/20130321114023_create_opay_payments.rb +14 -0
  14. data/lib/generators/opay/config_generator.rb +12 -0
  15. data/lib/generators/opay/templates/opay_config.rb +9 -0
  16. data/lib/opay/configuration.rb +42 -0
  17. data/lib/opay/engine.rb +23 -0
  18. data/lib/opay/form_builder.rb +5 -0
  19. data/lib/opay/helpers/form_helper.rb +14 -0
  20. data/lib/opay/helpers/payu_helper.rb +41 -0
  21. data/lib/opay/helpers.rb +6 -0
  22. data/lib/opay/payable.rb +30 -0
  23. data/lib/opay/providers/payu.rb +76 -0
  24. data/lib/opay/providers.rb +5 -0
  25. data/lib/opay/version.rb +3 -0
  26. data/lib/opay.rb +14 -0
  27. data/lib/tasks/opay_tasks.rake +4 -0
  28. data/spec/dummy/README.rdoc +261 -0
  29. data/spec/dummy/Rakefile +7 -0
  30. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  31. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  32. data/spec/dummy/app/assets/stylesheets/scaffold.css +56 -0
  33. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  34. data/spec/dummy/app/controllers/orders_controller.rb +83 -0
  35. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  36. data/spec/dummy/app/helpers/orders_helper.rb +2 -0
  37. data/spec/dummy/app/models/order.rb +7 -0
  38. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  39. data/spec/dummy/app/views/orders/_form.html.erb +25 -0
  40. data/spec/dummy/app/views/orders/edit.html.erb +6 -0
  41. data/spec/dummy/app/views/orders/index.html.erb +25 -0
  42. data/spec/dummy/app/views/orders/new.html.erb +5 -0
  43. data/spec/dummy/app/views/orders/show.html.erb +15 -0
  44. data/spec/dummy/config/application.rb +76 -0
  45. data/spec/dummy/config/boot.rb +10 -0
  46. data/spec/dummy/config/database.yml +30 -0
  47. data/spec/dummy/config/environment.rb +5 -0
  48. data/spec/dummy/config/environments/development.rb +37 -0
  49. data/spec/dummy/config/environments/production.rb +67 -0
  50. data/spec/dummy/config/environments/test.rb +37 -0
  51. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  52. data/spec/dummy/config/initializers/inflections.rb +15 -0
  53. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  54. data/spec/dummy/config/initializers/opay_config.rb +9 -0
  55. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  56. data/spec/dummy/config/initializers/session_store.rb +8 -0
  57. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  58. data/spec/dummy/config/locales/en.yml +5 -0
  59. data/spec/dummy/config/routes.rb +4 -0
  60. data/spec/dummy/config.ru +4 -0
  61. data/spec/dummy/db/development.sqlite3 +0 -0
  62. data/spec/dummy/db/migrate/20130326152550_create_orders.rb +10 -0
  63. data/spec/dummy/db/schema.rb +36 -0
  64. data/spec/dummy/db/test.sqlite3 +0 -0
  65. data/spec/dummy/log/development.log +1511 -0
  66. data/spec/dummy/log/test.log +1629 -0
  67. data/spec/dummy/opay_config.rb +1 -0
  68. data/spec/dummy/public/404.html +26 -0
  69. data/spec/dummy/public/422.html +26 -0
  70. data/spec/dummy/public/500.html +25 -0
  71. data/spec/dummy/public/favicon.ico +0 -0
  72. data/spec/dummy/script/rails +6 -0
  73. data/spec/dummy/spec/factories/orders.rb +8 -0
  74. data/spec/dummy/spec/models/order_spec.rb +5 -0
  75. data/spec/dummy/tmp/cache/assets/C23/400/sprockets%2F31710301f0d68b89727f5de964446610 +0 -0
  76. data/spec/dummy/tmp/cache/assets/C8C/B80/sprockets%2F371bf96e99717688ed7313a0c53f4212 +0 -0
  77. data/spec/dummy/tmp/cache/assets/CA6/480/sprockets%2F46f1812fd06c1e0802a414931ff82f71 +0 -0
  78. data/spec/dummy/tmp/cache/assets/CB2/7F0/sprockets%2F9d79a842f086f17d3420e5cb88710c10 +0 -0
  79. data/spec/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
  80. data/spec/dummy/tmp/cache/assets/CF0/1D0/sprockets%2F6fc757c2c8329244ca95d6909865bbc2 +0 -0
  81. data/spec/dummy/tmp/cache/assets/D25/7A0/sprockets%2F0c58b40b01f62ed06f75ee2d444a111a +0 -0
  82. data/spec/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
  83. data/spec/dummy/tmp/cache/assets/D39/8F0/sprockets%2F931d437216848cdf2a7bbac6c0f4c426 +0 -0
  84. data/spec/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
  85. data/spec/dummy/tmp/cache/assets/D54/F30/sprockets%2F8ea40d0224e2d772232dcbfbf0fc3005 +0 -0
  86. data/spec/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
  87. data/spec/dummy/tmp/cache/assets/D99/A20/sprockets%2F552b4516be6f766a2da35c26be2f1ecf +0 -0
  88. data/spec/dummy/tmp/cache/assets/DC9/EF0/sprockets%2F508b2ee0aa9ed068a10af6d8cf9d0e19 +0 -0
  89. data/spec/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
  90. data/spec/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
  91. data/spec/factories/opay_payments.rb +10 -0
  92. data/spec/lib/opay/helpers/payu_helper_spec.rb +41 -0
  93. data/spec/lib/opay/payable_spec.rb +18 -0
  94. data/spec/lib/opay/providers/payu_spec.rb +106 -0
  95. data/spec/models/opay/payment_spec.rb +7 -0
  96. data/spec/spec_helper.rb +83 -0
  97. data/spec/support/xml/error.xml.erb +8 -0
  98. data/spec/support/xml/success.xml.erb +24 -0
  99. metadata +379 -0
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2013 YOURNAME
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # Opay
2
+
3
+ [![Build Status](https://travis-ci.org/olownia/opay.png)](https://travis-ci.org/olownia/opay)
data/Rakefile ADDED
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env rake
2
+
3
+ require 'rspec/core/rake_task'
4
+
5
+ begin
6
+ require 'bundler/setup'
7
+ rescue LoadError
8
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
9
+ end
10
+
11
+ APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
12
+ load 'rails/tasks/engine.rake'
13
+
14
+ Bundler::GemHelper.install_tasks
15
+
16
+ desc 'Run all rspec examples'
17
+ RSpec::Core::RakeTask.new(:spec) do |t|
18
+ t.rspec_opts = %w[--color]
19
+ end
20
+
21
+ task default: :spec
22
+
@@ -0,0 +1,15 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // the compiled file.
9
+ //
10
+ // WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
11
+ // GO AFTER THE REQUIRES BELOW.
12
+ //
13
+ //= require jquery
14
+ //= require jquery_ujs
15
+ //= require_tree .
@@ -0,0 +1,13 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the top of the
9
+ * compiled file, but it's generally better to create a new file per style scope.
10
+ *
11
+ *= require_self
12
+ *= require_tree .
13
+ */
@@ -0,0 +1,4 @@
1
+ module Opay
2
+ class ApplicationController < ActionController::Base
3
+ end
4
+ end
@@ -0,0 +1,9 @@
1
+ require_dependency 'opay/application_controller'
2
+
3
+ module Opay
4
+ class PayuController < ApplicationController
5
+ def online
6
+ render text: Providers::Payu.process(params[:pos_id], params[:session_id], params[:ts], params[:sig]) ? 'OK' : ''
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,4 @@
1
+ module Opay
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Opay
2
+ module PayuHelper
3
+ end
4
+ end
@@ -0,0 +1,6 @@
1
+ module Opay
2
+ class Payment < ActiveRecord::Base
3
+ belongs_to :payable, polymorphic: true
4
+ attr_accessible :provider, :amount, :finished, :session_id
5
+ end
6
+ end
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Opay</title>
5
+ <%= stylesheet_link_tag "opay/application", :media => "all" %>
6
+ <%= javascript_include_tag "opay/application" %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+
11
+ <%= yield %>
12
+
13
+ </body>
14
+ </html>
data/config/routes.rb ADDED
@@ -0,0 +1,8 @@
1
+ Opay::Engine.routes.draw do
2
+
3
+ # payu
4
+ scope 'payu' do
5
+ post '/online' => 'payu#online', as: :payu_online
6
+ end
7
+
8
+ end
@@ -0,0 +1,14 @@
1
+ class CreateOpayPayments < ActiveRecord::Migration
2
+ def change
3
+ create_table :opay_payments do |t|
4
+ t.references :payable, polymorphic: true
5
+ t.string :session_id
6
+ t.string :provider
7
+ t.float :amount
8
+ t.boolean :finished, null: false, default: false
9
+
10
+ t.timestamps
11
+ end
12
+ add_index :opay_payments, [:payable_id, :payable_type]
13
+ end
14
+ end
@@ -0,0 +1,12 @@
1
+ module Opay
2
+ module Generators
3
+ class ConfigGenerator < Rails::Generators::Base
4
+ source_root File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
5
+
6
+ desc "Description: Copies Opay configuration file to your application's initializer directory"
7
+ def copy_config_file
8
+ template 'opay_config.rb', 'config/initializers/opay_config.rb'
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,9 @@
1
+ Opay.configure do |config|
2
+ config.provider = :payu
3
+
4
+ # payu configuration
5
+ config.pos_id = 999
6
+ config.pos_auth_key = ''
7
+ config.key1 = ''
8
+ config.key1 = ''
9
+ end
@@ -0,0 +1,42 @@
1
+ module Opay
2
+
3
+ module Configuration
4
+ extend ActiveSupport::Concern
5
+ include ActiveSupport::Configurable
6
+
7
+ included do
8
+ config_accessor :provider
9
+
10
+ # payu configuration
11
+ config_accessor :pos_id
12
+ config_accessor :pos_auth_key
13
+ config_accessor :key1
14
+ config_accessor :key2
15
+
16
+ reset_config
17
+ end
18
+
19
+ module ClassMethods
20
+
21
+ def configure
22
+ yield self
23
+ end
24
+
25
+ # Sets configuration back to default
26
+ def reset_config
27
+ configure do |config|
28
+ config.provider = :payu
29
+
30
+ # payu configuration
31
+ config.pos_id = 999
32
+ config.pos_auth_key = 'pos_auth_key'
33
+ config.key1 = 'key1'
34
+ config.key2 = 'key2'
35
+ end
36
+ end
37
+
38
+ end
39
+
40
+ end
41
+
42
+ end
@@ -0,0 +1,23 @@
1
+ module Opay
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace Opay
4
+
5
+ config.generators do |g|
6
+ g.test_framework :rspec, fixture: true
7
+ g.fixture_replacement :factory_girl, dir: 'spec/factories'
8
+
9
+ g.view_specs false
10
+ g.helper_specs false
11
+
12
+ g.stylesheets = false
13
+ g.javascripts = false
14
+ end
15
+
16
+ initializer 'opay.initialize' do
17
+ ActiveSupport.on_load(:action_view) do
18
+ include Opay::Helpers::FormHelper
19
+ end
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,5 @@
1
+ module Opay
2
+ class FormBuilder < ActionView::Helpers::FormBuilder
3
+ include Opay::Helpers::PayuHelper
4
+ end
5
+ end
@@ -0,0 +1,14 @@
1
+ module Opay
2
+ module Helpers
3
+
4
+ module FormHelper
5
+
6
+ def opay_form_for(record, options = {}, &block)
7
+ # for future purposes
8
+ payu_form_for(record, options, &block)
9
+ end
10
+
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,41 @@
1
+ module Opay
2
+ module Helpers
3
+
4
+ module PayuHelper
5
+
6
+ def payu_form_for(record, options = {}, &block)
7
+ options[:builder] ||= Opay::FormBuilder
8
+
9
+ options[:url] = Opay::Providers::Payu.url(:new_payment)
10
+ options[:html] = { id: "payu_payment_form_#{record.id}", class: 'payu_payment_form' }
11
+
12
+ record.create_payment!(session_id: record.payment_session_id, provider: 'payu', amount: record.amount)
13
+
14
+ form_for(record, options, &block)
15
+ end
16
+
17
+ def payment_info(options = {})
18
+ options[:first_name] ||= object.first_name
19
+ options[:last_name] ||= object.last_name
20
+ options[:email] ||= object.email
21
+
22
+ options[:pos_id] ||= Opay.config.pos_id
23
+ options[:pos_auth_key] ||= Opay.config.pos_auth_key
24
+ options[:session_id] ||= object.payment_session_id
25
+
26
+ options[:amount] ||= object.amount
27
+ options[:desc] ||= object.payment_description
28
+ options[:client_ip] ||= request.env['HTTP_USER_AGENT']
29
+ options[:js] = 0
30
+
31
+
32
+ fields = options.map { |key, val| @template.hidden_field_tag(key, val) }.join("\n")
33
+ js = "<script type=\"text/javascript\"><!-- document.forms['payu_payment_form_#{object.id}'].js.value = 1; --></script>"
34
+
35
+ "#{fields}\n#{js}".html_safe
36
+ end
37
+
38
+ end
39
+
40
+ end
41
+ end
@@ -0,0 +1,6 @@
1
+ module Opay
2
+ module Helpers
3
+ autoload :FormHelper, 'opay/helpers/form_helper'
4
+ autoload :PayuHelper, 'opay/helpers/payu_helper'
5
+ end
6
+ end
@@ -0,0 +1,30 @@
1
+ module Opay
2
+ module Payable
3
+ extend ActiveSupport::Concern
4
+ extend ActiveModel::Callbacks
5
+
6
+ included do
7
+ has_one :payment, as: :payable, class_name: 'Opay::Payment'
8
+ define_model_callbacks :payment, only: :after
9
+ end
10
+
11
+ def finished?
12
+ payment.finished?
13
+ end
14
+
15
+ def finish
16
+ run_callbacks :payment do
17
+ payment.update_attribute(:finished, true)
18
+ end
19
+ end
20
+
21
+ def payment_session_id
22
+ raise 'Resource must be saved before payment' if id.nil?
23
+ Digest::MD5.hexdigest(self.class.name + id.to_s)
24
+ end
25
+
26
+ module ClassMethods
27
+ end
28
+
29
+ end
30
+ end
@@ -0,0 +1,76 @@
1
+ require 'net/http'
2
+ require 'uri'
3
+
4
+ module Opay
5
+ module Providers
6
+
7
+ class Payu
8
+ URL = 'https://www.platnosci.pl/paygw/UTF'
9
+
10
+ def self.process(pos_id, session_id, ts, sig)
11
+ return false unless verify_sig(sig, pos_id, session_id, ts)
12
+
13
+ ts = Time.now.to_i.to_s
14
+
15
+ params = {
16
+ 'pos_id' => pos_id,
17
+ 'session_id' => session_id,
18
+ 'ts' => ts,
19
+ 'sig' => create_sig(pos_id, session_id, ts)
20
+ }
21
+
22
+ connection = Net::HTTP.new('www.platnosci.pl', 443)
23
+ connection.use_ssl = true
24
+
25
+ response = connection.start do |http|
26
+ post = Net::HTTP::Post.new(url(:get_payment_info))
27
+ post.set_form_data(params)
28
+ http.request(post)
29
+ end
30
+
31
+ info = Hash.from_xml(response.body)
32
+
33
+ return false if info['response']['status'] == 'ERROR'
34
+
35
+ pos_id = info['response']['trans']['pos_id']
36
+ session_id = info['response']['trans']['session_id']
37
+ order_id = info['response']['trans']['order_id']
38
+ status = info['response']['trans']['status']
39
+ amount = info['response']['trans']['amount']
40
+ desc = info['response']['trans']['desc']
41
+ ts = info['response']['trans']['ts']
42
+ sig = info['response']['trans']['sig']
43
+
44
+ return false unless verify_sig(sig, pos_id, session_id, order_id, status, amount, desc, ts)
45
+
46
+ if status.to_i == 99
47
+ payment = Opay::Payment.where(session_id: session_id).first!
48
+ payment.payable.finish
49
+
50
+ return true
51
+ end
52
+
53
+ return false
54
+ end
55
+
56
+ def self.url(action)
57
+ case action
58
+ when :new_payment
59
+ "#{URL}/NewPayment"
60
+ when :get_payment_info
61
+ "#{URL}/Payment/get/xml"
62
+ end
63
+ end
64
+
65
+ private
66
+ def self.create_sig(*values)
67
+ Digest::MD5.hexdigest(values.join + Opay.config.key1)
68
+ end
69
+
70
+ def self.verify_sig(sig, *values)
71
+ sig == Digest::MD5.hexdigest(values.join + Opay.config.key2)
72
+ end
73
+ end
74
+
75
+ end
76
+ end
@@ -0,0 +1,5 @@
1
+ module Opay
2
+ module Providers
3
+ autoload :Payu, 'opay/providers/payu'
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ module Opay
2
+ VERSION = '1.0.0.beta'
3
+ end
data/lib/opay.rb ADDED
@@ -0,0 +1,14 @@
1
+ require 'opay/engine'
2
+ require 'opay/configuration'
3
+
4
+ module Opay
5
+ extend ActiveSupport::Autoload
6
+
7
+ include Opay::Configuration
8
+
9
+ autoload :FormBuilder
10
+ autoload :Helpers
11
+ autoload :Providers
12
+ autoload :Payable
13
+
14
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :opay do
3
+ # # Task goes here
4
+ # end