aurfy 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fa8f0d82429b69e14cc73d05ca8304d710de54e2
4
+ data.tar.gz: 07ac03c1b0622e5bfe4354a4b7a4924d7378c3ff
5
+ SHA512:
6
+ metadata.gz: c7b9ef62157d025a13ddbcba071af0df6358b4bfc535a445c4c20efebbabb486dfbbc522731b085441956adb9b7176580d94d5f2b5472527918825a132caaec7
7
+ data.tar.gz: 8f04055a20aaaf89b31349a596225ba513bbaba3cf274f3ab13874551a530bbe351ea80e4adf67571456a6c928b5ca99faf5ddc18ba22349a9a74646816b2941
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ /Gemfile.lock
2
+ /coverage
3
+ *swp
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'simplecov', require: false, group: :test
4
+
5
+ gemspec
data/README.md ADDED
@@ -0,0 +1,55 @@
1
+ # aurfy
2
+
3
+ Ruby client for [Aurfy](http://www.aurfy.com/)
4
+
5
+ Instration
6
+ ----------
7
+
8
+ Add this line to your application's Gemfile:
9
+
10
+ gem 'aurfy'
11
+
12
+ And then execute:
13
+
14
+ $ bundle
15
+
16
+ Or install it yourself as:
17
+
18
+ $ gem install aurfy
19
+
20
+ Usage
21
+ -----
22
+
23
+ ```rb
24
+ merchantid = "M000000000"
25
+ trade_certificate = "D0123456789012345678901234567789"
26
+ cardnumber = "0123456789012345"
27
+ expirydate = "1701"
28
+ cv2 = "123"
29
+ cardtype = "UP"
30
+ orderamount = "100.00"
31
+ clientip = "192.168.0.1"
32
+
33
+ client = Aurfy::Client.new(
34
+ test: true,
35
+ merchantid: merchantid,
36
+ trade_certificate: trade_certificate
37
+ )
38
+
39
+ client.request(
40
+ ordercurrency: ordercurrency,
41
+ cardnumber: cardnumber,
42
+ expirydate: expirydate,
43
+ cv2: cv2,
44
+ cardtype: cardtype,
45
+ orderamount: orderamount,
46
+ clientip: clientip
47
+ )
48
+ ```
49
+
50
+ Test
51
+ ----
52
+
53
+ ```
54
+ bundle exec rspec
55
+ ```
data/aurfy.gemspec ADDED
@@ -0,0 +1,20 @@
1
+ $:.push File.expand_path('../lib', __FILE__)
2
+ require 'aurfy/version'
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = 'aurfy'
6
+ s.version = Aurfy::VERSION
7
+ s.authors = ['Masahiro Saito']
8
+ s.email = ['camelmasa@gmail.com']
9
+ s.summary = 'Ruby client for Aurfy'
10
+ s.description = 'Ruby client for Aurfy'
11
+ s.homepage = 'https://github.com/camelmasa/aurfy'
12
+ s.license = 'MIT'
13
+
14
+ s.files = `git ls-files`.split($/)
15
+ s.require_paths = ['lib']
16
+
17
+ s.add_runtime_dependency 'faraday', '~> 0.9.0'
18
+ s.add_development_dependency "pry", "~> 0.10.0"
19
+ s.add_development_dependency 'rspec', '~> 3.0', '>= 3.0.0'
20
+ end
data/lib/aurfy.rb ADDED
@@ -0,0 +1,7 @@
1
+ require 'faraday'
2
+
3
+ require 'aurfy/client'
4
+ require 'aurfy/configure'
5
+ require 'aurfy/parser'
6
+ require 'aurfy/response'
7
+ require 'aurfy/version'
@@ -0,0 +1,26 @@
1
+ module Aurfy
2
+ API_URL = "https://pgw.aurfy.com/v2/api/purchase/express"
3
+ TEST_API_URL = "http://test-pgw.comconnpay.com/v2/api/purchase/express"
4
+
5
+ attr_reader :api_url
6
+
7
+ class Client
8
+ def initialize(options = {})
9
+ @api_url = (options.delete :test) ? TEST_API_URL : API_URL
10
+ configure.options = options
11
+ end
12
+
13
+ def request(options = {})
14
+ configure.options = options
15
+
16
+ result = Faraday.post @api_url, configure.params
17
+ Response.new(result)
18
+ end
19
+
20
+ private
21
+
22
+ def configure
23
+ @configure ||= Configure.new
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,51 @@
1
+ module Aurfy
2
+ class Configure
3
+ def self.keys
4
+ [:merchantid, :orderid, :ordertime, :ordercurrency, :orderamount, :orderdescription, :txnremark1, :txnremark2,
5
+ :charset, :clientip, :version, :transtype, :website, :cardtype, :cardnumber, :cv2, :expirydate, :signmethod,
6
+ :trade_certificate]
7
+ end
8
+
9
+ def initialize
10
+ @charset = "UTF-8"
11
+ @ordertime = DateTime.now.strftime("%Y%m%d%H%M%S")
12
+ @orderid = DateTime.now.strftime("%Y%m%d%H%M%S%N")
13
+ @ordercurrency = "USD"
14
+ @orderdescription = ""
15
+ @signmethod = "MD5"
16
+ @transtype = "PURCHASE"
17
+ @txnremark1 = ""
18
+ @txnremark2 = ""
19
+ @version = "1.0"
20
+ @website = ""
21
+ end
22
+
23
+ def params
24
+ sorted_variables.merge({ signature: signature })
25
+ end
26
+
27
+ def options=(options = {})
28
+ options.each_pair do |key, value|
29
+ next unless Configure.keys.include? key
30
+ instance_variable_set(:"@#{key}", value)
31
+ end
32
+ options
33
+ end
34
+
35
+ def sorted_variables
36
+ instance_variables.map { |v| [v.to_s.sub("@", "").to_sym, instance_variable_get(v)] }.delete_if do
37
+ |k, _| k == :trade_certificate
38
+ end.sort.to_h
39
+ end
40
+
41
+ def signature_key
42
+ sorted_variables.delete_if { |k, _| k == :signmethod }.map {|p| "#{p.first}=#{p.last}" }.join("&") + "&#{@trade_certificate}"
43
+ end
44
+
45
+ private
46
+
47
+ def signature
48
+ Digest::MD5.hexdigest(signature_key)
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,15 @@
1
+ module Aurfy
2
+ class Parser
3
+ attr_reader :body
4
+
5
+ def initialize(body)
6
+ @body = body
7
+ end
8
+
9
+ def parse
10
+ params = body.split("&").map { |p| p.split("=") }
11
+ params = params.map { |p| p.length >= 2 ? p : p.push("") }
12
+ params.to_h.each_with_object({}) { |(k, v), a| a[k.to_s.to_sym] = v }
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,31 @@
1
+ module Aurfy
2
+ class Response
3
+ attr_reader :result, :merchantid, :orderamount, :ordercurrency, :orderid, :ordertime, :respcode, :respmsg, :signature, :signmethod,
4
+ :txnid, :txnremark1, :txnremark2, :txnstatus, :txntime
5
+
6
+ def self.keys
7
+ [:merchantid, :orderamount, :ordercurrency, :orderid, :ordertime, :respcode, :respmsg, :signature, :signmethod,
8
+ :txnid, :txnremark1, :txnremark2, :txnstatus, :txntime]
9
+ end
10
+
11
+ def initialize(result)
12
+ @result = result
13
+
14
+ parsed_params = Parser.new(result.body).parse
15
+ assign_variables(parsed_params)
16
+ end
17
+
18
+ def success?
19
+ respcode == "00"
20
+ end
21
+
22
+ private
23
+
24
+ def assign_variables(params)
25
+ params.each_pair do |key, value|
26
+ next unless Response.keys.include? key
27
+ instance_variable_set(:"@#{key}", value)
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,6 @@
1
+ module Aurfy
2
+ MAJOR = 0
3
+ MINOR = 0
4
+ PATCH = 1
5
+ VERSION = [MAJOR, MINOR, PATCH].join('.').freeze
6
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe Aurfy::Client do
4
+ subject { described_class.new }
5
+
6
+ describe "#request" do
7
+ context "with valid credit card" do
8
+ it "returns successful Aurfy::Response instance" do
9
+ response = double(Faraday::Response, body: "merchantid=M000000000&orderamount=600.00&ordercurrency=USD&orderid=20150429115552415102000&ordertime=20150429115552&respcode=00&respmsg=The payment is successful.&signature=d2c4c43a7b2447d512ee3ef3c33754f4&signmethod=MD5&txnid=21150428000000006409&txnremark1=&txnremark2=&txnstatus=0&txntime=")
10
+ allow_any_instance_of(Faraday).to receive(:post) { response }
11
+
12
+ expect(subject.request).to be_a Aurfy::Response
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+
3
+ describe Aurfy::Configure do
4
+ subject { described_class.new }
5
+
6
+ describe ".keys" do
7
+ it "returns configure keys" do
8
+ keys = [:merchantid, :orderid, :ordertime, :ordercurrency, :orderamount, :orderdescription, :txnremark1,
9
+ :txnremark2, :charset, :clientip, :version, :transtype, :website, :cardtype, :cardnumber, :cv2,
10
+ :expirydate, :signmethod, :trade_certificate]
11
+
12
+ expect(described_class.keys).to eq keys
13
+ end
14
+ end
15
+
16
+ describe "#params" do
17
+ it "returns configure params" do
18
+ allow(subject).to receive(:sorted_variables) { {} }
19
+ allow(subject).to receive(:signature) { "signature" }
20
+
21
+ expect(subject.params).to eq({ signature: "signature" })
22
+ end
23
+ end
24
+
25
+ describe "#options=" do
26
+ it "assigns variable for option" do
27
+ expect do
28
+ subject.options = { merchantid: "merchantid" }
29
+ end.to change { subject.instance_variable_get(:"@merchantid") } .from(nil).to("merchantid")
30
+ end
31
+ end
32
+
33
+ describe "#sorted_variables" do
34
+ it "returns sorted instance variables" do
35
+ subject.options = { trade_certificate: "test", cardnumber: "0123456789012345", orderid: "orderid",
36
+ ordertime: "20150429124533" }
37
+ sorted_variables = { cardnumber: "0123456789012345", charset: "UTF-8", ordercurrency: "USD", orderdescription: "",
38
+ orderid: "orderid", ordertime: "20150429124533", signmethod: "MD5",
39
+ transtype: "PURCHASE", txnremark1: "", txnremark2: "", version: "1.0", website: "" }
40
+
41
+ expect(subject.sorted_variables).to eq(sorted_variables)
42
+ end
43
+ end
44
+
45
+ describe "#signature_key" do
46
+ it "returns sorted instance variables" do
47
+ subject.options = { signmethod: "MD5", trade_certificate: "trade_certificate", orderid: "orderid",
48
+ ordertime: "20150429124533" }
49
+ signature_key = "charset=UTF-8&ordercurrency=USD&orderdescription=&orderid=orderid&ordertime=20150429124533&transtype=PURCHASE&txnremark1=&txnremark2=&version=1.0&website=&trade_certificate"
50
+
51
+ expect(subject.signature_key).to eq(signature_key)
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe Aurfy::Parser do
4
+ subject { described_class.new(body) }
5
+ let(:body) { "merchantid=M000000000&orderamount=600.00&ordercurrency=USD&orderid=20150429115552415102000&ordertime=20150429115552&respcode=00&respmsg=The payment is successful.&signature=d2c4c43a7b2447d512ee3ef3c33754f4&signmethod=MD5&txnid=21150428000000006409&txnremark1=&txnremark2=&txnstatus=0&txntime=" }
6
+
7
+ describe "#parse" do
8
+ it "returns parsed params" do
9
+ parsed_params = { merchantid: "M000000000", orderamount: "600.00", ordercurrency: "USD",
10
+ orderid: "20150429115552415102000", ordertime: "20150429115552", respcode: "00",
11
+ respmsg: "The payment is successful.", signature: "d2c4c43a7b2447d512ee3ef3c33754f4",
12
+ signmethod: "MD5", txnid: "21150428000000006409", txnremark1: "", txnremark2: "",
13
+ txnstatus: "0", txntime: "" }
14
+
15
+ expect(subject.parse).to eq parsed_params
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+
3
+ describe Aurfy::Response do
4
+ subject { described_class.new(result) }
5
+
6
+ let(:result) { double(Faraday::Response, body: "merchantid=M000000000&orderamount=600.00&ordercurrency=USD&orderid=20150429115552415102000&ordertime=20150429115552&respcode=00&respmsg=The payment is successful.&signature=d2c4c43a7b2447d512ee3ef3c33754f4&signmethod=MD5&txnid=21150428000000006409&txnremark1=&txnremark2=&txnstatus=0&txntime=") }
7
+
8
+ it "assigns params" do
9
+ expect(subject.merchantid).to eq "M000000000"
10
+ expect(subject.orderamount).to eq "600.00"
11
+ expect(subject.ordercurrency).to eq "USD"
12
+ expect(subject.orderid).to eq "20150429115552415102000"
13
+ expect(subject.ordertime).to eq "20150429115552"
14
+ expect(subject.respcode).to eq "00"
15
+ expect(subject.respmsg).to eq "The payment is successful."
16
+ expect(subject.signature).to eq "d2c4c43a7b2447d512ee3ef3c33754f4"
17
+ expect(subject.signmethod).to eq "MD5"
18
+ expect(subject.txnid).to eq "21150428000000006409"
19
+ expect(subject.txnremark1).to eq ""
20
+ expect(subject.txnremark2).to eq ""
21
+ expect(subject.txnstatus).to eq "0"
22
+ expect(subject.txntime).to eq ""
23
+ end
24
+
25
+ describe ".keys" do
26
+ it "returns response keys" do
27
+ keys = [:merchantid, :orderamount, :ordercurrency, :orderid, :ordertime, :respcode, :respmsg, :signature,
28
+ :signmethod, :txnid, :txnremark1, :txnremark2, :txnstatus, :txntime]
29
+
30
+ expect(described_class.keys).to eq keys
31
+ end
32
+ end
33
+
34
+ describe "#success?" do
35
+ context "with successful result" do
36
+ it "returns true" do
37
+ expect(subject.success?).to be_truthy
38
+ end
39
+ end
40
+
41
+ context "with failure result" do
42
+ let(:result) { double(Faraday::Response, body: "merchantid=M000000000&orderamount=600.00&ordercurrency=USD&orderid=20150429115552415102000&ordertime=20150429115552&respcode=97&respmsg=Internal error.&signature=d2c4c43a7b2447d512ee3ef3c33754f4&signmethod=MD5&txnid=21150428000000006409&txnremark1=&txnremark2=&txnstatus=0&txntime=") }
43
+
44
+ it "returns false" do
45
+ expect(subject.success?).to be_falsey
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,8 @@
1
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
+
3
+ require 'simplecov'
4
+ SimpleCov.start do
5
+ add_filter "spec"
6
+ end
7
+
8
+ require 'aurfy'
metadata ADDED
@@ -0,0 +1,108 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: aurfy
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Masahiro Saito
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-04-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.9.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.9.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: pry
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.10.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.10.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: 3.0.0
51
+ type: :development
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - "~>"
56
+ - !ruby/object:Gem::Version
57
+ version: '3.0'
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 3.0.0
61
+ description: Ruby client for Aurfy
62
+ email:
63
+ - camelmasa@gmail.com
64
+ executables: []
65
+ extensions: []
66
+ extra_rdoc_files: []
67
+ files:
68
+ - ".gitignore"
69
+ - ".rspec"
70
+ - Gemfile
71
+ - README.md
72
+ - aurfy.gemspec
73
+ - lib/aurfy.rb
74
+ - lib/aurfy/client.rb
75
+ - lib/aurfy/configure.rb
76
+ - lib/aurfy/parser.rb
77
+ - lib/aurfy/response.rb
78
+ - lib/aurfy/version.rb
79
+ - spec/aurfy/client_spec.rb
80
+ - spec/aurfy/configure_spec.rb
81
+ - spec/aurfy/parser_spec.rb
82
+ - spec/aurfy/response_spec.rb
83
+ - spec/spec_helper.rb
84
+ homepage: https://github.com/camelmasa/aurfy
85
+ licenses:
86
+ - MIT
87
+ metadata: {}
88
+ post_install_message:
89
+ rdoc_options: []
90
+ require_paths:
91
+ - lib
92
+ required_ruby_version: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ required_rubygems_version: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ requirements: []
103
+ rubyforge_project:
104
+ rubygems_version: 2.4.5
105
+ signing_key:
106
+ specification_version: 4
107
+ summary: Ruby client for Aurfy
108
+ test_files: []