worldnet_tps 0.1.0

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 (52) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.rvmrc +1 -0
  4. data/.travis.yml +6 -0
  5. data/Gemfile +9 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +70 -0
  8. data/Rakefile +6 -0
  9. data/lib/worldnet_tps.rb +12 -0
  10. data/lib/worldnet_tps/const.rb +42 -0
  11. data/lib/worldnet_tps/gateway.rb +71 -0
  12. data/lib/worldnet_tps/gateway.xsd +1909 -0
  13. data/lib/worldnet_tps/request/base.rb +107 -0
  14. data/lib/worldnet_tps/request/payment.rb +89 -0
  15. data/lib/worldnet_tps/request/refund.rb +59 -0
  16. data/lib/worldnet_tps/request/secure_card/registration.rb +71 -0
  17. data/lib/worldnet_tps/request/secure_card/removal.rb +46 -0
  18. data/lib/worldnet_tps/request/secure_card/search.rb +52 -0
  19. data/lib/worldnet_tps/response/error.rb +18 -0
  20. data/lib/worldnet_tps/response/invalid_hash.rb +21 -0
  21. data/lib/worldnet_tps/response/success.rb +25 -0
  22. data/lib/worldnet_tps/version.rb +3 -0
  23. data/lib/worldnet_tps/ws_object.rb +76 -0
  24. data/lib/worldnet_tps/xsd.rb +27 -0
  25. data/spec/fixtures/vcr_cassettes/payment/credit_card/failed.yml +60 -0
  26. data/spec/fixtures/vcr_cassettes/payment/credit_card/success.yml +59 -0
  27. data/spec/fixtures/vcr_cassettes/payment/secure_card/failed.yml +57 -0
  28. data/spec/fixtures/vcr_cassettes/payment/secure_card/success.yml +56 -0
  29. data/spec/fixtures/vcr_cassettes/refund/order_id/failed.yml +47 -0
  30. data/spec/fixtures/vcr_cassettes/refund/order_id/success.yml +46 -0
  31. data/spec/fixtures/vcr_cassettes/refund/unique_ref/failed.yml +47 -0
  32. data/spec/fixtures/vcr_cassettes/refund/unique_ref/success.yml +46 -0
  33. data/spec/fixtures/vcr_cassettes/secure_card/registration/registrarion_failed.yml +49 -0
  34. data/spec/fixtures/vcr_cassettes/secure_card/registration/registration_failed.yml +49 -0
  35. data/spec/fixtures/vcr_cassettes/secure_card/registration/registration_success.yml +48 -0
  36. data/spec/fixtures/vcr_cassettes/secure_card/registration/update_failed.yml +49 -0
  37. data/spec/fixtures/vcr_cassettes/secure_card/registration/update_success.yml +48 -0
  38. data/spec/fixtures/vcr_cassettes/secure_card/registration/update_success_success.yml +48 -0
  39. data/spec/fixtures/vcr_cassettes/secure_card/removal/failed.yml +45 -0
  40. data/spec/fixtures/vcr_cassettes/secure_card/removal/success.yml +44 -0
  41. data/spec/fixtures/vcr_cassettes/secure_card/search/failed.yml +44 -0
  42. data/spec/fixtures/vcr_cassettes/secure_card/search/success.yml +44 -0
  43. data/spec/gateway_spec.rb +42 -0
  44. data/spec/payment_spec.rb +117 -0
  45. data/spec/refund_spec.rb +95 -0
  46. data/spec/secure_card/registration_spec.rb +103 -0
  47. data/spec/secure_card/removal_spec.rb +57 -0
  48. data/spec/secure_card/search_spec.rb +58 -0
  49. data/spec/spec_helper.rb +58 -0
  50. data/spec/xsd_spec.rb +30 -0
  51. data/worldnet_tps.gemspec +28 -0
  52. metadata +205 -0
@@ -0,0 +1,21 @@
1
+ module WorldnetTps
2
+ module Response
3
+ class InvalidHash < WorldnetTps::Response::Success
4
+
5
+ MESSAGE = 'INVALID RESPONSE HASH'.freeze
6
+ CODE = 'ECUSTOM'.freeze
7
+
8
+ def success?
9
+ false
10
+ end
11
+
12
+ def code
13
+ CODE
14
+ end
15
+
16
+ def message
17
+ MESSAGE
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,25 @@
1
+ module WorldnetTps
2
+ module Response
3
+ class Success
4
+
5
+ attr_reader :attributes
6
+
7
+ def initialize(attributes = {}) # :nodoc:
8
+ @attributes = attributes
9
+
10
+ singleton_class.class_eval do
11
+ attributes.each do |key, value|
12
+ define_method key do
13
+ value
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ def success?
20
+ true
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,3 @@
1
+ module WorldnetTps
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,76 @@
1
+ module WorldnetTps
2
+ class WsObject
3
+
4
+ attr_reader :gateway, :request, :response, :date_time, :attributes
5
+
6
+ class InvalidHashError < StandardError
7
+
8
+ end
9
+
10
+ def initialize(gateway, attrs = {})
11
+ @gateway = gateway
12
+ @attributes = attrs.merge(
13
+ currency: gateway.currency,
14
+ date_time: self.class.current_date_time,
15
+ terminal_id: gateway.terminal_id,
16
+ shared_secret: gateway.shared_secret,
17
+
18
+ )
19
+ end
20
+
21
+ def self.current_date_time
22
+ DateTime.now.utc.strftime('%d-%m-%Y:%H:%M:%S:000')
23
+ end
24
+
25
+ protected
26
+
27
+ def []=(name, value)
28
+ @attributes[name] = value
29
+ end
30
+
31
+ alias :assign :[]=
32
+
33
+ def [](name)
34
+ @attributes[name]
35
+ end
36
+
37
+ def normalize_response_attributes(source)
38
+ response_keys.inject(Hash.new) do |hash, el|
39
+ hash[el] = source[prepare_key(el)]
40
+ hash
41
+ end
42
+ end
43
+
44
+ def validate_hash!(response_attrs)
45
+ #check hash
46
+ response_source = self.class.response_check_sum_keys(self, response_attrs).inject("") do |str, el|
47
+ str << (response_attrs[el] || @attributes[el]).to_s
48
+ str
49
+ end
50
+ response_hash = Digest::MD5.hexdigest(response_source)
51
+ raise InvalidHashError.new "invalid HASH value" if response_attrs[:hash] != response_hash
52
+ end
53
+
54
+
55
+ def verify_request_keys!(required_keys, attributes)
56
+ invalid_keys = required_keys - attributes.keys
57
+ if invalid_keys.any?
58
+ keys = invalid_keys.sort_by { |k| k.to_s }.join(", ")
59
+ raise ArgumentError, "#{keys} arguments are mandatory"
60
+ end
61
+ end
62
+
63
+ def request_hash
64
+ Digest::MD5.hexdigest self.class.request_check_sum_keys(self).inject("") { |str, el| str << attributes[el].to_s; str }
65
+ end
66
+
67
+ def add_check_sum!
68
+ @attributes[:hash] = request_hash
69
+ end
70
+
71
+ def prepare_key(k)
72
+ k.to_s.upcase.gsub("_", "")
73
+ end
74
+
75
+ end
76
+ end
@@ -0,0 +1,27 @@
1
+ require 'nokogiri'
2
+ module WorldnetTps
3
+ class XSD
4
+ class Error < StandardError
5
+ ##<Nokogiri::XML::SyntaxError: Element 'REFUND': Missing child element(s). Expected is ( DATETIME ).>
6
+ attr_reader :internal_error
7
+ def initialize(error)
8
+ @internal_error = error
9
+ super(error.to_s)
10
+ end
11
+ end
12
+
13
+ SCHEMA_PATH = File.join(File.dirname(__FILE__),'gateway.xsd')
14
+
15
+ class << self
16
+ def validate!(xml)
17
+ document = Nokogiri::XML(xml)
18
+ error = schema.validate(document).first
19
+ raise Error.new(error) if error
20
+ end
21
+
22
+ def schema
23
+ @schema ||= Nokogiri::XML::Schema(File.read(SCHEMA_PATH))
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,60 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://testpayments.worldnettps.com/merchant/xmlpayment
6
+ body:
7
+ encoding: UTF-8
8
+ string: |
9
+ <?xml version="1.0" encoding="UTF-8"?>
10
+ <PAYMENT>
11
+ <ORDERID>TXN-124-56</ORDERID>
12
+ <TERMINALID>6003</TERMINALID>
13
+ <AMOUNT>10.50</AMOUNT>
14
+ <DATETIME>10-12-2016:12:00:00:000</DATETIME>
15
+ <CARDNUMBER>4000060000000006</CARDNUMBER>
16
+ <CARDTYPE>UNSUPPORTED</CARDTYPE>
17
+ <CARDEXPIRY>1223</CARDEXPIRY>
18
+ <CARDHOLDERNAME>John Doe</CARDHOLDERNAME>
19
+ <HASH>d5c21de35fdebae93b3b78cc2d40966f</HASH>
20
+ <CURRENCY>USD</CURRENCY>
21
+ <TERMINALTYPE>2</TERMINALTYPE>
22
+ <TRANSACTIONTYPE>7</TRANSACTIONTYPE>
23
+ <EMAIL>john.doe@gmail.com</EMAIL>
24
+ <CVV>111</CVV>
25
+ <ADDRESS1>100 MAIN ST</ADDRESS1>
26
+ <ADDRESS2>SEATTLE WA</ADDRESS2>
27
+ <POSTCODE>98104</POSTCODE>
28
+ <PHONE>2064960114</PHONE>
29
+ <CITY>SEATTLE</CITY>
30
+ <COUNTRY>US</COUNTRY>
31
+ </PAYMENT>
32
+ headers:
33
+ Accept-Encoding:
34
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
35
+ Accept:
36
+ - "*/*"
37
+ User-Agent:
38
+ - Ruby
39
+ response:
40
+ status:
41
+ code: 200
42
+ message: OK
43
+ headers:
44
+ Date:
45
+ - Fri, 16 Dec 2016 10:15:49 GMT
46
+ Server:
47
+ - Apache
48
+ Content-Length:
49
+ - '106'
50
+ Strict-Transport-Security:
51
+ - max-age=15768000
52
+ Content-Type:
53
+ - text/xml;charset=UTF-8
54
+ body:
55
+ encoding: UTF-8
56
+ string: "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<ERROR><ERRORSTRING>Order
57
+ Already Processed</ERRORSTRING></ERROR>\n"
58
+ http_version:
59
+ recorded_at: Fri, 16 Dec 2016 10:15:49 GMT
60
+ recorded_with: VCR 3.0.3
@@ -0,0 +1,59 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://testpayments.worldnettps.com/merchant/xmlpayment
6
+ body:
7
+ encoding: UTF-8
8
+ string: |
9
+ <?xml version="1.0" encoding="UTF-8"?>
10
+ <PAYMENT>
11
+ <ORDERID>TXN-124-59</ORDERID>
12
+ <TERMINALID>6003</TERMINALID>
13
+ <AMOUNT>10.50</AMOUNT>
14
+ <DATETIME>10-12-2016:12:00:00:000</DATETIME>
15
+ <CARDNUMBER>4000060000000006</CARDNUMBER>
16
+ <CARDTYPE>VISA</CARDTYPE>
17
+ <CARDEXPIRY>1223</CARDEXPIRY>
18
+ <CARDHOLDERNAME>John Doe</CARDHOLDERNAME>
19
+ <HASH>80949a2820234af449af8320196493bc</HASH>
20
+ <CURRENCY>USD</CURRENCY>
21
+ <TERMINALTYPE>2</TERMINALTYPE>
22
+ <TRANSACTIONTYPE>7</TRANSACTIONTYPE>
23
+ <EMAIL>john.doe@gmail.com</EMAIL>
24
+ <CVV>111</CVV>
25
+ <ADDRESS1>100 MAIN ST</ADDRESS1>
26
+ <ADDRESS2>SEATTLE WA</ADDRESS2>
27
+ <POSTCODE>98104</POSTCODE>
28
+ <PHONE>2064960114</PHONE>
29
+ <CITY>SEATTLE</CITY>
30
+ <COUNTRY>US</COUNTRY>
31
+ </PAYMENT>
32
+ headers:
33
+ Accept-Encoding:
34
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
35
+ Accept:
36
+ - "*/*"
37
+ User-Agent:
38
+ - Ruby
39
+ response:
40
+ status:
41
+ code: 200
42
+ message: OK
43
+ headers:
44
+ Date:
45
+ - Fri, 16 Dec 2016 13:20:44 GMT
46
+ Server:
47
+ - Apache
48
+ Content-Length:
49
+ - '351'
50
+ Strict-Transport-Security:
51
+ - max-age=15768000
52
+ Content-Type:
53
+ - text/xml;charset=UTF-8
54
+ body:
55
+ encoding: UTF-8
56
+ string: "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<PAYMENTRESPONSE><UNIQUEREF>EP8Q218WK1</UNIQUEREF><RESPONSECODE>A</RESPONSECODE><RESPONSETEXT>APPROVAL</RESPONSETEXT><APPROVALCODE>475318</APPROVALCODE><DATETIME>2016-12-16T13:20:44</DATETIME><AVSRESPONSE></AVSRESPONSE><CVVRESPONSE>M</CVVRESPONSE><HASH>ca2854cc92cf181fb7e28920bb621b6a</HASH></PAYMENTRESPONSE>\n"
57
+ http_version:
58
+ recorded_at: Fri, 16 Dec 2016 13:20:44 GMT
59
+ recorded_with: VCR 3.0.3
@@ -0,0 +1,57 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://testpayments.worldnettps.com/merchant/xmlpayment
6
+ body:
7
+ encoding: UTF-8
8
+ string: |
9
+ <?xml version="1.0" encoding="UTF-8"?>
10
+ <PAYMENT>
11
+ <ORDERID>TXN-124-55</ORDERID>
12
+ <TERMINALID>6003</TERMINALID>
13
+ <AMOUNT>10.50</AMOUNT>
14
+ <DATETIME>10-12-2016:12:00:00:000</DATETIME>
15
+ <CARDNUMBER>2967539270368883</CARDNUMBER>
16
+ <CARDTYPE>SECURECARD</CARDTYPE>
17
+ <HASH>bf6396125726d7849c4eab3d270c2afb</HASH>
18
+ <CURRENCY>USD</CURRENCY>
19
+ <TERMINALTYPE>2</TERMINALTYPE>
20
+ <TRANSACTIONTYPE>7</TRANSACTIONTYPE>
21
+ <EMAIL>john.doe@gmail.com</EMAIL>
22
+ <ADDRESS1>100 MAIN ST</ADDRESS1>
23
+ <ADDRESS2>SEATTLE WA</ADDRESS2>
24
+ <POSTCODE>98104</POSTCODE>
25
+ <PHONE>2064960114</PHONE>
26
+ <CITY>SEATTLE</CITY>
27
+ <COUNTRY>US</COUNTRY>
28
+ </PAYMENT>
29
+ headers:
30
+ Accept-Encoding:
31
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
32
+ Accept:
33
+ - "*/*"
34
+ User-Agent:
35
+ - Ruby
36
+ response:
37
+ status:
38
+ code: 200
39
+ message: OK
40
+ headers:
41
+ Date:
42
+ - Fri, 16 Dec 2016 09:36:37 GMT
43
+ Server:
44
+ - Apache
45
+ Content-Length:
46
+ - '112'
47
+ Strict-Transport-Security:
48
+ - max-age=15768000
49
+ Content-Type:
50
+ - text/xml;charset=UTF-8
51
+ body:
52
+ encoding: UTF-8
53
+ string: "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<ERROR><ERRORSTRING>Invalid
54
+ Secure Card Reference</ERRORSTRING></ERROR>\n"
55
+ http_version:
56
+ recorded_at: Fri, 16 Dec 2016 09:36:37 GMT
57
+ recorded_with: VCR 3.0.3
@@ -0,0 +1,56 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://testpayments.worldnettps.com/merchant/xmlpayment
6
+ body:
7
+ encoding: UTF-8
8
+ string: |
9
+ <?xml version="1.0" encoding="UTF-8"?>
10
+ <PAYMENT>
11
+ <ORDERID>TXN-124-55</ORDERID>
12
+ <TERMINALID>6003</TERMINALID>
13
+ <AMOUNT>10.50</AMOUNT>
14
+ <DATETIME>10-12-2016:12:00:00:000</DATETIME>
15
+ <CARDNUMBER>2967539270368883</CARDNUMBER>
16
+ <CARDTYPE>SECURECARD</CARDTYPE>
17
+ <HASH>bf6396125726d7849c4eab3d270c2afb</HASH>
18
+ <CURRENCY>USD</CURRENCY>
19
+ <TERMINALTYPE>2</TERMINALTYPE>
20
+ <TRANSACTIONTYPE>7</TRANSACTIONTYPE>
21
+ <EMAIL>john.doe@gmail.com</EMAIL>
22
+ <ADDRESS1>100 MAIN ST</ADDRESS1>
23
+ <ADDRESS2>SEATTLE WA</ADDRESS2>
24
+ <POSTCODE>98104</POSTCODE>
25
+ <PHONE>2064960114</PHONE>
26
+ <CITY>SEATTLE</CITY>
27
+ <COUNTRY>US</COUNTRY>
28
+ </PAYMENT>
29
+ headers:
30
+ Accept-Encoding:
31
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
32
+ Accept:
33
+ - "*/*"
34
+ User-Agent:
35
+ - Ruby
36
+ response:
37
+ status:
38
+ code: 200
39
+ message: OK
40
+ headers:
41
+ Date:
42
+ - Fri, 16 Dec 2016 09:40:51 GMT
43
+ Server:
44
+ - Apache
45
+ Content-Length:
46
+ - '350'
47
+ Strict-Transport-Security:
48
+ - max-age=15768000
49
+ Content-Type:
50
+ - text/xml;charset=UTF-8
51
+ body:
52
+ encoding: UTF-8
53
+ string: "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<PAYMENTRESPONSE><UNIQUEREF>KR3XSVSZ41</UNIQUEREF><RESPONSECODE>A</RESPONSECODE><RESPONSETEXT>APPROVAL</RESPONSETEXT><APPROVALCODE>475318</APPROVALCODE><DATETIME>2016-12-16T09:40:51</DATETIME><AVSRESPONSE></AVSRESPONSE><CVVRESPONSE></CVVRESPONSE><HASH>3d59bff811e0c3a3e1e13769f1c2ec03</HASH></PAYMENTRESPONSE>\n"
54
+ http_version:
55
+ recorded_at: Fri, 16 Dec 2016 09:40:51 GMT
56
+ recorded_with: VCR 3.0.3
@@ -0,0 +1,47 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://testpayments.worldnettps.com/merchant/xmlpayment
6
+ body:
7
+ encoding: UTF-8
8
+ string: |
9
+ <?xml version="1.0" encoding="UTF-8"?>
10
+ <REFUND>
11
+ <ORDERID>TXN-124-57</ORDERID>
12
+ <TERMINALID>6003</TERMINALID>
13
+ <AMOUNT>10.50</AMOUNT>
14
+ <DATETIME>10-12-2016:12:00:00:000</DATETIME>
15
+ <HASH>02c1305ce3117a89b735e845a46a940e</HASH>
16
+ <OPERATOR>John</OPERATOR>
17
+ <REASON>Product is defective</REASON>
18
+ </REFUND>
19
+ headers:
20
+ Accept-Encoding:
21
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
22
+ Accept:
23
+ - "*/*"
24
+ User-Agent:
25
+ - Ruby
26
+ response:
27
+ status:
28
+ code: 200
29
+ message: OK
30
+ headers:
31
+ Date:
32
+ - Fri, 16 Dec 2016 12:13:21 GMT
33
+ Server:
34
+ - Apache
35
+ Content-Length:
36
+ - '106'
37
+ Strict-Transport-Security:
38
+ - max-age=15768000
39
+ Content-Type:
40
+ - text/xml;charset=UTF-8
41
+ body:
42
+ encoding: UTF-8
43
+ string: "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<ERROR><ERRORSTRING>Invalid
44
+ UNIQUEREF field</ERRORSTRING></ERROR>\n"
45
+ http_version:
46
+ recorded_at: Fri, 16 Dec 2016 12:13:21 GMT
47
+ recorded_with: VCR 3.0.3
@@ -0,0 +1,46 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://testpayments.worldnettps.com/merchant/xmlpayment
6
+ body:
7
+ encoding: UTF-8
8
+ string: |
9
+ <?xml version="1.0" encoding="UTF-8"?>
10
+ <REFUND>
11
+ <ORDERID>TXN-124-57</ORDERID>
12
+ <TERMINALID>6003</TERMINALID>
13
+ <AMOUNT>10.50</AMOUNT>
14
+ <DATETIME>10-12-2016:12:00:00:000</DATETIME>
15
+ <HASH>02c1305ce3117a89b735e845a46a940e</HASH>
16
+ <OPERATOR>John</OPERATOR>
17
+ <REASON>Product is defective</REASON>
18
+ </REFUND>
19
+ headers:
20
+ Accept-Encoding:
21
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
22
+ Accept:
23
+ - "*/*"
24
+ User-Agent:
25
+ - Ruby
26
+ response:
27
+ status:
28
+ code: 200
29
+ message: OK
30
+ headers:
31
+ Date:
32
+ - Fri, 16 Dec 2016 12:13:21 GMT
33
+ Server:
34
+ - Apache
35
+ Content-Length:
36
+ - '106'
37
+ Strict-Transport-Security:
38
+ - max-age=15768000
39
+ Content-Type:
40
+ - text/xml;charset=UTF-8
41
+ body:
42
+ encoding: UTF-8
43
+ string: "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<REFUNDRESPONSE><RESPONSECODE>A</RESPONSECODE><RESPONSETEXT>SUCCESS</RESPONSETEXT><ORDERID>TXN-124-57</ORDERID><DATETIME>16-12-2016:12:21:07:583</DATETIME><HASH>0412aec114c04248815d0864af4126c6</HASH></REFUNDRESPONSE>\n"
44
+ http_version:
45
+ recorded_at: Fri, 16 Dec 2016 12:13:21 GMT
46
+ recorded_with: VCR 3.0.3