spree_instamojo 0.0.1.alpha → 0.0.2

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 (38) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +21 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +26 -0
  5. data/Appraisals +29 -0
  6. data/Gemfile +9 -0
  7. data/LICENSE +30 -0
  8. data/README.md +50 -0
  9. data/Rakefile +21 -0
  10. data/app/assets/javascripts/spree/backend/spree_instamojo.js +2 -0
  11. data/app/assets/javascripts/spree/frontend/spree_instamojo.js +2 -0
  12. data/app/assets/stylesheets/spree/backend/spree_instamojo.css +4 -0
  13. data/app/assets/stylesheets/spree/frontend/spree_instamojo.css +4 -0
  14. data/app/controllers/spree/instamojo_controller.rb +106 -0
  15. data/app/controllers/spree/paytm_controller.rb +71 -0
  16. data/app/models/spree/gateway/instamojo.rb +45 -0
  17. data/app/models/spree/gateway/paytm.rb +259 -0
  18. data/app/models/spree/payment_checkout.rb +4 -0
  19. data/app/views/spree/admin/payments/source_views/_instamojo.html.erb +0 -0
  20. data/app/views/spree/admin/payments/source_views/_paytm.html.erb +0 -0
  21. data/app/views/spree/checkout/payment/_instamojo.html.erb +4 -0
  22. data/app/views/spree/checkout/payment/_paytm.html.erb +4 -0
  23. data/app/views/spree/instamojo/confirm.html.erb +17 -0
  24. data/app/views/spree/instamojo/index.html.erb +11 -0
  25. data/app/views/spree/paytm/confirm.html.erb +17 -0
  26. data/app/views/spree/paytm/index.html.erb +13 -0
  27. data/bin/rails +7 -0
  28. data/config/locales/en.yml +7 -0
  29. data/config/routes.rb +12 -0
  30. data/db/migrate/20180308104631_create_spree_instamojo_checkout.rb +13 -0
  31. data/lib/generators/spree_instamojo/install/install_generator.rb +31 -0
  32. data/lib/spree_instamojo.rb +5 -0
  33. data/lib/spree_instamojo/engine.rb +27 -0
  34. data/lib/spree_instamojo/factories.rb +6 -0
  35. data/lib/spree_instamojo/version.rb +17 -0
  36. data/spec/spec_helper.rb +99 -0
  37. data/spree_instamojo.gemspec +28 -0
  38. metadata +43 -217
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0e3f7df9d37b9ad5ede0bffe8951a9fb3202a62e81d5fdae5ddda0b653cb766a
4
- data.tar.gz: cb14a34f65888073fb5743f4e1d80acb6e0a661f68441ee32ac7c496267be17a
3
+ metadata.gz: 0f4962e51ee7822e36169843efcdb6d8257736d7f6a88cac40c30dda78421e0d
4
+ data.tar.gz: fb9be552b425a8e457dca9898e86746d9f044063a0199e25a91cc989438aa542
5
5
  SHA512:
6
- metadata.gz: 20e8c19131ba529053829f8dee00d70b4c52b5fc231256938c58c68976807279c92eded07727d652ff21e64cbd359684aea4e7263b4e7498e2e4eac530d51359
7
- data.tar.gz: 17ab846d07cca00f82a2a59e19f7135245db50efdfaf40df9fcdc66fc94f860d8f89ec9edc4f0f969e659835b581914a3d93a5330ad8b55daa1fe2c7a3769230
6
+ metadata.gz: 4241ca253847bb08adc33766d3263779d3ea12aaff984297cfe4182ad8f45019cf2d75d525cf957ab18364b58e8ebb91c464fba252d81e2879f357523f9771a5
7
+ data.tar.gz: 7417d30b8ddc394b042e2691b3a5142e1c66b6202f44e7d5e2a28aae0b63197390ca9ed5e8830aaaa69a397bab90aff01d08cc1c67ff7e8cab0291c9dd4ab9be
data/.gitignore ADDED
@@ -0,0 +1,21 @@
1
+ \#*
2
+ *~
3
+ .#*
4
+ .DS_Store
5
+ .idea
6
+ .localeapp/locales
7
+ .project
8
+ coverage
9
+ default
10
+ Gemfile.lock
11
+ tmp
12
+ nbproject
13
+ pkg
14
+ *.sw?
15
+ spec/dummy
16
+ .rvmrc
17
+ .sass-cache
18
+ public/spree
19
+ .ruby-version
20
+ .ruby-gemset
21
+ gemfiles/*.gemfile.lock
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --color
2
+ -r spec_helper
3
+ -f documentation
data/.travis.yml ADDED
@@ -0,0 +1,26 @@
1
+ sudo: required
2
+ dist: trusty
3
+
4
+ language: ruby
5
+
6
+ env:
7
+ - DB=postgres
8
+ - DB=mysql
9
+
10
+ gemfile:
11
+ - gemfiles/spree_3_1.gemfile
12
+ - gemfiles/spree_3_2.gemfile
13
+ - gemfiles/spree_3_3.gemfile
14
+ - gemfiles/spree_3_4.gemfile
15
+ - gemfiles/spree_master.gemfile
16
+
17
+ script:
18
+ - bundle exec rake test_app
19
+ - bundle exec rake spec
20
+
21
+ rvm:
22
+ - 2.3.1
23
+ - 2.2.7
24
+
25
+ before_install:
26
+ - mysql -u root -e "GRANT ALL ON *.* TO 'travis'@'%';"
data/Appraisals ADDED
@@ -0,0 +1,29 @@
1
+ appraise 'spree-3-1' do
2
+ gem 'spree', '~> 3.1.0'
3
+ gem 'spree_auth_devise', '~> 3.1.0'
4
+ gem 'rails_test_params_backport', group: :test
5
+ end
6
+
7
+ appraise 'spree-3-2' do
8
+ gem 'spree', '~> 3.2.0'
9
+ gem 'spree_auth_devise', '~> 3.2.0'
10
+ gem 'rails-controller-testing'
11
+ end
12
+
13
+ appraise 'spree-3-3' do
14
+ gem 'spree', '~> 3.3.0'
15
+ gem 'spree_auth_devise', '~> 3.3.0'
16
+ gem 'rails-controller-testing'
17
+ end
18
+
19
+ appraise 'spree-3-4' do
20
+ gem 'spree', '~> 3.4.0'
21
+ gem 'spree_auth_devise', '~> 3.3.0'
22
+ gem 'rails-controller-testing'
23
+ end
24
+
25
+ appraise 'spree-master' do
26
+ gem 'spree', github: 'spree/spree', branch: 'master'
27
+ gem 'spree_auth_devise', github: 'spree/spree_auth_devise', branch: 'master'
28
+ gem 'rails-controller-testing'
29
+ end
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'spree', github: 'spree/spree', branch: 'master'
4
+ # Provides basic authentication functionality for testing parts of your engine
5
+ gem 'spree_auth_devise', github: 'spree/spree_auth_devise', branch: 'master'
6
+ gem 'rails-controller-testing'
7
+ gem "typhoeus"
8
+
9
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,30 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2018, guptalakshya92
4
+ All rights reserved.
5
+
6
+ Redistribution and use in source and binary forms, with or without
7
+ modification, are permitted provided that the following conditions are met:
8
+
9
+ * Redistributions of source code must retain the above copyright notice, this
10
+ list of conditions and the following disclaimer.
11
+
12
+ * Redistributions in binary form must reproduce the above copyright notice,
13
+ this list of conditions and the following disclaimer in the documentation
14
+ and/or other materials provided with the distribution.
15
+
16
+ * Neither the name of the copyright holder nor the names of its
17
+ contributors may be used to endorse or promote products derived from
18
+ this software without specific prior written permission.
19
+
20
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
24
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+
data/README.md ADDED
@@ -0,0 +1,50 @@
1
+ SpreeInstamojo
2
+ ==============
3
+
4
+ Introduction goes here.
5
+
6
+ ## Installation
7
+
8
+ 1. Add this extension to your Gemfile with this line:
9
+ ```ruby
10
+ gem 'spree_instamojo', github: 'guptalakshya92/spree_instamojo'
11
+ ```
12
+
13
+ 2. Install the gem using Bundler:
14
+ ```ruby
15
+ bundle install
16
+ ```
17
+
18
+ 3. Copy & run migrations
19
+ ```ruby
20
+ bundle exec rails g spree_instamojo:install
21
+ ```
22
+
23
+ 4. Restart your server
24
+
25
+ If your server was running, restart it so that it can find the assets properly.
26
+
27
+ ## Testing
28
+
29
+ First bundle your dependencies, then run `rake`. `rake` will default to building the dummy app if it does not exist, then it will run specs. The dummy app can be regenerated by using `rake test_app`.
30
+
31
+ ```shell
32
+ bundle
33
+ bundle exec rake
34
+ ```
35
+
36
+ When testing your applications integration with this extension you may use it's factories.
37
+ Simply add this require statement to your spec_helper:
38
+
39
+ ```ruby
40
+ require 'spree_instamojo/factories'
41
+ ```
42
+
43
+
44
+ ## Contributing
45
+
46
+ If you'd like to contribute, please take a look at the
47
+ [instructions](CONTRIBUTING.md) for installing dependencies and crafting a good
48
+ pull request.
49
+
50
+ Copyright (c) 2018 [name of extension creator], released under the New BSD License
data/Rakefile ADDED
@@ -0,0 +1,21 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rspec/core/rake_task'
5
+ require 'spree/testing_support/extension_rake'
6
+
7
+ RSpec::Core::RakeTask.new
8
+
9
+ task :default do
10
+ if Dir["spec/dummy"].empty?
11
+ Rake::Task[:test_app].invoke
12
+ Dir.chdir("../../")
13
+ end
14
+ Rake::Task[:spec].invoke
15
+ end
16
+
17
+ desc 'Generates a dummy app for testing'
18
+ task :test_app do
19
+ ENV['LIB_NAME'] = 'spree_instamojo'
20
+ Rake::Task['extension:test_app'].invoke
21
+ end
@@ -0,0 +1,2 @@
1
+ // Placeholder manifest file.
2
+ // the installer will append this file to the app vendored assets here: vendor/assets/javascripts/spree/backend/all.js'
@@ -0,0 +1,2 @@
1
+ // Placeholder manifest file.
2
+ // the installer will append this file to the app vendored assets here: vendor/assets/javascripts/spree/frontend/all.js'
@@ -0,0 +1,4 @@
1
+ /*
2
+ Placeholder manifest file.
3
+ the installer will append this file to the app vendored assets here: 'vendor/assets/stylesheets/spree/backend/all.css'
4
+ */
@@ -0,0 +1,4 @@
1
+ /*
2
+ Placeholder manifest file.
3
+ the installer will append this file to the app vendored assets here: 'vendor/assets/stylesheets/spree/frontend/all.css'
4
+ */
@@ -0,0 +1,106 @@
1
+ module Spree
2
+ class InstamojoController < StoreController
3
+ protect_from_forgery only: :index
4
+
5
+ def index
6
+ payment_method = Spree::PaymentMethod.find(params[:payment_method_id])
7
+ order = current_order
8
+ @param_list = Hash.new
9
+ if(address = current_order.bill_address || current_order.ship_address)
10
+ phone = address.phone
11
+ end
12
+ @param_list[:buyer_name] = address.firstname
13
+ @param_list[:purpose] = order.number
14
+ @param_list[:amount] = order.total.to_s
15
+ @param_list[:email] = order.email
16
+ @param_list[:phone] = phone
17
+ @param_list[:redirect_url] = payment_method.redirect_url
18
+ @param_list[:allow_repeated_payments] = false
19
+ @param_list[:send_email] = false
20
+ @param_list[:send_sms] = false
21
+ request = Typhoeus.post(payment_method.get_instamojo_url,
22
+ body: @param_list,
23
+ headers: {'X-Api-Key' => payment_method.preferred_api_key,
24
+ 'X-Auth-Token'=> payment_method.preferred_auth_token})
25
+ response = JSON.parse(request.response_body)
26
+ if response.present? && response["success"] && response["payment_request"]["longurl"].present?
27
+ @instamj_txn_url = response["payment_request"]["longurl"]+"?embed=form"
28
+ else
29
+ flash[:error] = "Payment failed"
30
+ redirect_to checkout_state_path(order.state) and return
31
+ end
32
+ end
33
+
34
+ def confirm
35
+ @payment_method = Spree::PaymentMethod.find_by(type: Spree::Gateway::Instamojo.to_s)
36
+ payment_request_id = params[:payment_request_id]
37
+ @order = current_order
38
+ if payment_request_id.present?
39
+ payment_details_request = Typhoeus.get("https://test.instamojo.com/api/1.1/payment-requests/"+payment_request_id+"/",
40
+ headers: {'X-Api-Key' => @payment_method.preferred_api_key,
41
+ 'X-Auth-Token'=> @payment_method.preferred_auth_token})
42
+ payment_details_response = JSON.parse(payment_details_request.response_body)
43
+ @order = @order || Spree::Order.find_by(number: payment_details_response["payment_request"]["purpose"])
44
+ payment = payment_details_response["payment_request"]["payments"].select { |payment| payment["status"] === 'Credit' && payment["amount"].to_f === @order.total.to_f}.last
45
+ if payment.present? && payment["status"] === "Credit"
46
+ success_payment payment_request_id, payment
47
+ else
48
+ failed_payment payment_request_id
49
+ end
50
+ else
51
+ @error = true
52
+ @message = "There was an error processing your payment"
53
+ @redirect_path = checkout_state_path(@order.state)
54
+ end
55
+
56
+ end
57
+
58
+ def failed_payment payment_request_id
59
+ payment_request_id = payment_request_id
60
+ res_code = "301"
61
+ update_payment(payment_request_id, nil, nil, 'Failed', res_code)
62
+ @payment.state = "failed"
63
+ @payment.save
64
+ @order.update_attributes(payment_state: "failed")
65
+ @error = true
66
+ @message = "There was an error processing your payment"
67
+ @redirect_path = checkout_state_path(@order.state)
68
+ end
69
+
70
+ def success_payment payment_request_id , payment
71
+ payment_request_id = payment_request_id
72
+ payment_id = payment["payment_id"]
73
+ status = payment["status"]
74
+ amount = payment["amount"]
75
+ res_code = "201"
76
+ update_payment(payment_request_id, payment_id, amount, status, res_code)
77
+ @order.next!
78
+ @message = Spree.t(:order_processed_successfully)
79
+ @current_order = nil
80
+ flash.notice = Spree.t(:order_processed_successfully)
81
+ flash['order_completed'] = true
82
+ @error = false
83
+ @redirect_path = order_path(@order)
84
+ end
85
+
86
+
87
+ private
88
+
89
+ def update_payment payment_request_id , payment_id, amount, status, res_code
90
+ @payment = @order.payments.create!(
91
+ payment_method: @payment_method,
92
+ source: Spree::PaymentCheckout.create(
93
+ payment_request_id: payment_request_id,
94
+ payment_id: payment_id,
95
+ order_id: @order.id,
96
+ status: status,
97
+ amount: amount
98
+ ),
99
+ amount: @order.total,
100
+ response_code: res_code
101
+ )
102
+
103
+ end
104
+ end
105
+
106
+ end
@@ -0,0 +1,71 @@
1
+ module Spree
2
+ class PaytmController < StoreController
3
+ protect_from_forgery only: :index
4
+
5
+ def index
6
+ payment_method = Spree::PaymentMethod.find(params[:payment_method_id])
7
+ order = current_order
8
+ @param_list = Hash.new
9
+ @param_list['CALLBACK_URL'] = "#{request.base_url}/paytm/confirm"
10
+ @param_list['MID'] = payment_method.preferred_merchant_id
11
+ @param_list['INDUSTRY_TYPE_ID'] = payment_method.preferred_industry_type_id
12
+ @param_list['CHANNEL_ID'] = payment_method.preferred_channel_id
13
+ @param_list['WEBSITE'] = payment_method.preferred_website
14
+ if @param_list.values.select{ |value| value unless value.present? }.present?
15
+ flash[:error] = Spree.t('paytm.paytm_payment_failed')
16
+ redirect_to checkout_state_path(order.state) and return
17
+ else
18
+ @param_list['REQUEST_TYPE'] = payment_method.request_type
19
+ @param_list['ORDER_ID'] = payment_method.txnid(order)
20
+ @param_list['TXN_AMOUNT'] = order.total.to_s
21
+ if(address = current_order.bill_address || current_order.ship_address)
22
+ phone = address.phone
23
+ end
24
+ #if user is not loggedin, Passing phone as customer id
25
+ cust_id = spree_current_user.nil? ? phone : spree_current_user.id
26
+ @param_list['CUST_ID'] = "CUST-#{cust_id}-ORDER-#{payment_method.txnid(order)}"
27
+ @param_list['MOBILE_NO'] = phone
28
+ @param_list['EMAIL'] = order.email
29
+
30
+ checksum = payment_method.new_pg_checksum(@param_list)
31
+ @param_list['CHECKSUMHASH'] = checksum
32
+ @paytm_txn_url = payment_method.txn_url
33
+ end
34
+ end
35
+
36
+ def confirm
37
+ payment_method = Spree::PaymentMethod.find_by(type: Spree::Gateway::Paytm.to_s)
38
+ checksum_hash = params["CHECKSUMHASH"]
39
+ params.delete("CHECKSUMHASH")
40
+ @status = params["STATUS"]
41
+ @orderid = params["ORDERID"]
42
+ @order = current_order || Spree::Order.find_by(number: @orderid.split("-").last)
43
+ @payment = @order.payments.create!(
44
+ source: Spree::PaymentCheckout.create(
45
+ payment_request_id: params['TXNID'],
46
+ checksum: checksum_hash,
47
+ order_id: @order.id
48
+ ),
49
+ payment_method: payment_method,
50
+ amount: @order.total,
51
+ response_code: params['RESPCODE']
52
+ )
53
+ if @status == "TXN_SUCCESS"
54
+ @order.next
55
+ @message = Spree.t(:order_processed_successfully)
56
+ @current_order = nil
57
+ flash.notice = Spree.t(:order_processed_successfully)
58
+ flash['order_completed'] = true
59
+ @error = false
60
+ @redirect_path = order_path(@order)
61
+ else
62
+ @payment.state = "failed"
63
+ @payment.save
64
+ @order.update_attributes(payment_state: "failed")
65
+ @error = true
66
+ @message = "There was an error processing your payment"
67
+ @redirect_path = checkout_state_path(@order.state)
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,45 @@
1
+ module Spree
2
+ class Gateway::Instamojo < Gateway
3
+
4
+ preference :api_key, :string
5
+ preference :auth_token, :string
6
+ preference :salt, :string
7
+ preference :site_url, :string
8
+
9
+ def supports?(source)
10
+ true
11
+ end
12
+
13
+ def provider_class
14
+ self.class
15
+ end
16
+
17
+ def provider
18
+ self
19
+ end
20
+
21
+ def auto_capture?
22
+ true
23
+ end
24
+
25
+ def method_type
26
+ "instamojo"
27
+ end
28
+
29
+ def purchase(amount, source, gateway_options={})
30
+ ActiveMerchant::Billing::Response.new(true, "paytm success")
31
+ end
32
+ def redirect_url
33
+ preferred_site_url+"/instamojo/confirm"
34
+ end
35
+
36
+ def get_instamojo_url
37
+ if preferred_test_mode
38
+ "https://test.instamojo.com/api/1.1/payment-requests/"
39
+ else
40
+ "https://www.instamojo.com/api/1.1/payment-requests/"
41
+ end
42
+ end
43
+
44
+ end
45
+ end