api_banking 0.1.17 → 0.1.18
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 +4 -4
- data/lib/api_banking.rb +1 -0
- data/lib/api_banking/json/json_client.rb +23 -20
- data/lib/api_banking/json/singlePayment.rb +17 -17
- data/lib/api_banking/soap/aadhaarVerificationService.rb +17 -17
- data/lib/api_banking/soap/callbacks.rb +17 -0
- data/lib/api_banking/soap/fundsTransferByCustomerService2.rb +22 -22
- data/lib/api_banking/soap/instantMoneyTransferService.rb +26 -26
- data/lib/api_banking/soap/soap_client.rb +41 -38
- data/lib/api_banking/soap/socialBankingService.rb +13 -13
- data/lib/api_banking/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 95fbde3e678ea25f667e53e871591f9c87f3833f
|
4
|
+
data.tar.gz: 505c9388ea41db462554fb4272e7f9ca22cd04db
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eabe44622b207ae992686c8fdaeab71ebdca06bd3bdfc25e919d971cf8b58c639ad89bf24d29f770eae44bdcffc17b032e9eec4cfcd480f9da13a86431e98ee5
|
7
|
+
data.tar.gz: 698270c990b1d4e8e0f9f6fe841ca406a088b25b135dad4946faf4e8f7a87bdaae2badeba3f462dcf2078953317ff4ca3fd3952a47d5fcdc3af8339903290965
|
data/lib/api_banking.rb
CHANGED
@@ -7,6 +7,7 @@ require_relative "api_banking/environment/ybl/env"
|
|
7
7
|
require_relative "api_banking/environment/qg/env"
|
8
8
|
|
9
9
|
require_relative "api_banking/soap/fault"
|
10
|
+
require_relative "api_banking/soap/callbacks"
|
10
11
|
require_relative "api_banking/soap/soap_client"
|
11
12
|
require_relative "api_banking/soap/fundsTransferByCustomerService"
|
12
13
|
require_relative "api_banking/soap/fundsTransferByCustomerService2"
|
@@ -1,44 +1,47 @@
|
|
1
1
|
require 'json'
|
2
2
|
module ApiBanking
|
3
|
-
|
4
|
-
class JsonClient
|
5
|
-
|
6
|
-
def self.do_remote_call(dataHash)
|
3
|
+
|
4
|
+
class JsonClient
|
5
|
+
|
6
|
+
def self.do_remote_call(dataHash, callbacks = nil)
|
7
7
|
options = {}
|
8
8
|
options[:method] = :post
|
9
|
-
|
9
|
+
|
10
10
|
add_signature(dataHash)
|
11
11
|
options[:body] = JSON.generate(dataHash)
|
12
12
|
|
13
13
|
options[:headers] = {'Content-Type' => "application/json; charset=utf-8"}
|
14
|
-
|
14
|
+
|
15
15
|
options[:proxy] = self.configuration.proxy
|
16
16
|
options[:timeout] = self.configuration.timeout
|
17
|
-
|
17
|
+
|
18
18
|
set_options_for_environment(options)
|
19
19
|
set_params_for_environment(options)
|
20
20
|
|
21
21
|
request = Typhoeus::Request.new(self.configuration.environment.url + uri, options)
|
22
|
+
|
23
|
+
callbacks.before_send.call(request) if (callbacks && callbacks.before_send.respond_to?(:call))
|
22
24
|
response = request.run
|
23
|
-
|
25
|
+
callbacks.on_complete.call(request.response) if (callbacks && callbacks.on_complete.respond_to?(:call))
|
26
|
+
|
24
27
|
parse_response(response)
|
25
28
|
end
|
26
|
-
|
27
29
|
|
28
|
-
|
29
|
-
|
30
|
+
|
31
|
+
private
|
32
|
+
|
30
33
|
def self.add_signature(dataHash)
|
31
|
-
dataHash[:Single_Payment_Corp_Req][:Signature] = {}
|
34
|
+
dataHash[:Single_Payment_Corp_Req][:Signature] = {}
|
32
35
|
dataHash[:Single_Payment_Corp_Req][:Signature][:Signature] = 'Signature'
|
33
36
|
end
|
34
|
-
|
37
|
+
|
35
38
|
def self.set_params_for_environment(options)
|
36
39
|
params = {}
|
37
40
|
params[:client_id] = self.configuration.environment.client_id
|
38
41
|
params[:client_secret] = self.configuration.environment.client_secret
|
39
42
|
options[:params] = params
|
40
43
|
end
|
41
|
-
|
44
|
+
|
42
45
|
def self.set_options_for_environment(options)
|
43
46
|
if self.configuration.environment.kind_of?ApiBanking::Environment::RBL::UAT
|
44
47
|
options[:userpwd] = "#{self.configuration.environment.user}:#{self.configuration.environment.password}"
|
@@ -49,7 +52,7 @@ module ApiBanking
|
|
49
52
|
end
|
50
53
|
puts "#{options}"
|
51
54
|
end
|
52
|
-
|
55
|
+
|
53
56
|
def self.parse_response(response)
|
54
57
|
if response.success?
|
55
58
|
if response.headers['Content-Type'] =~ /json/ then
|
@@ -61,13 +64,13 @@ module ApiBanking
|
|
61
64
|
end
|
62
65
|
elsif response.timed_out?
|
63
66
|
return Fault.new("502", "", "#{response.return_message}")
|
64
|
-
elsif response.code == 0
|
67
|
+
elsif response.code == 0
|
65
68
|
return Fault.new(response.code, "", response.return_message)
|
66
69
|
else
|
67
70
|
# http status indicating error
|
68
71
|
if response.headers['Content-Type'] =~ /xml/ then
|
69
72
|
reply = Nokogiri::XML(response.response_body)
|
70
|
-
|
73
|
+
|
71
74
|
# service failures return a fault
|
72
75
|
unless reply.at_xpath('//soapenv12:Fault', 'soapenv12' => 'http://www.w3.org/2003/05/soap-envelope').nil? then
|
73
76
|
return parse_fault(reply)
|
@@ -77,18 +80,18 @@ module ApiBanking
|
|
77
80
|
unless reply.at_xpath('//errorResponse').nil? then
|
78
81
|
return parse_dp_reply(reply)
|
79
82
|
end
|
80
|
-
|
83
|
+
|
81
84
|
end
|
82
85
|
return Fault.new("#{response.code.to_s}", "", response.status_message)
|
83
86
|
end
|
84
87
|
end
|
85
|
-
|
88
|
+
|
86
89
|
def self.parse_dp_reply(reply)
|
87
90
|
code = content_at(reply.at_xpath('/errorResponse/httpCode'))
|
88
91
|
reasonText = content_at(reply.at_xpath('/errorResponse/moreInformation'))
|
89
92
|
return Fault.new(code, "", reasonText)
|
90
93
|
end
|
91
|
-
|
94
|
+
|
92
95
|
def self.parse_fault(reply)
|
93
96
|
code = content_at(reply.at_xpath('//soapenv12:Fault/soapenv12:Code/soapenv12:Subcode/soapenv12:Value', 'soapenv12' => 'http://www.w3.org/2003/05/soap-envelope'))
|
94
97
|
subcode = content_at(reply.at_xpath('//soapenv12:Fault/soapenv12:Code/soapenv12:Subcode/soapenv12:Subcode/soapenv12:Value', 'soapenv12' => 'http://www.w3.org/2003/05/soap-envelope'))
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module ApiBanking
|
2
2
|
class SinglePayment < JsonClient
|
3
|
-
|
3
|
+
|
4
4
|
SERVICE_VERSION = 1
|
5
|
-
|
5
|
+
|
6
6
|
attr_accessor :request, :result
|
7
7
|
|
8
8
|
#transfer
|
@@ -11,32 +11,32 @@ module ApiBanking
|
|
11
11
|
Request = Struct.new(:uniqueRequestNo, :corpID, :makerID, :checkerID, :approverID, :remitter, :beneficiary, :amount, :issueBranchCode, :modeOfPay, :remarks, :rptCode)
|
12
12
|
|
13
13
|
Result = Struct.new(:status, :errorCode, :errorDescription)
|
14
|
-
|
14
|
+
|
15
15
|
class << self
|
16
16
|
attr_accessor :configuration
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
def self.configure
|
20
20
|
self.configuration ||= Configuration.new
|
21
21
|
yield(configuration)
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
class Configuration
|
25
25
|
attr_accessor :environment, :proxy, :timeout
|
26
26
|
end
|
27
|
-
|
28
|
-
def self.transfer(request)
|
27
|
+
|
28
|
+
def self.transfer(request, callbacks = nil)
|
29
29
|
dataHash = {}
|
30
30
|
dataHash[:Single_Payment_Corp_Req] = {}
|
31
31
|
dataHash[:Single_Payment_Corp_Req][:Header] = {}
|
32
32
|
dataHash[:Single_Payment_Corp_Req][:Body] = {}
|
33
|
-
|
33
|
+
|
34
34
|
dataHash[:Single_Payment_Corp_Req][:Header][:TranID] = request.uniqueRequestNo
|
35
35
|
dataHash[:Single_Payment_Corp_Req][:Header][:Corp_ID] = request.corpID
|
36
36
|
dataHash[:Single_Payment_Corp_Req][:Header][:Maker_ID] = request.makerID
|
37
37
|
dataHash[:Single_Payment_Corp_Req][:Header][:Checker_ID] = request.checkerID
|
38
38
|
dataHash[:Single_Payment_Corp_Req][:Header][:Approver_ID] = request.approverID
|
39
|
-
|
39
|
+
|
40
40
|
dataHash[:Single_Payment_Corp_Req][:Body][:Amount] = request.amount
|
41
41
|
dataHash[:Single_Payment_Corp_Req][:Body][:Debit_Acct_No] = request.remitter.accountNo
|
42
42
|
dataHash[:Single_Payment_Corp_Req][:Body][:Debit_Acct_Name] = request.remitter.accountName
|
@@ -44,7 +44,7 @@ module ApiBanking
|
|
44
44
|
dataHash[:Single_Payment_Corp_Req][:Body][:Debit_Mobile] = request.remitter.mobileNo
|
45
45
|
dataHash[:Single_Payment_Corp_Req][:Body][:Debit_TrnParticulars] = request.remitter.tranParticulars
|
46
46
|
dataHash[:Single_Payment_Corp_Req][:Body][:Debit_PartTrnRmks] = request.remitter.partTranRemarks
|
47
|
-
|
47
|
+
|
48
48
|
dataHash[:Single_Payment_Corp_Req][:Body][:Ben_IFSC] = request.beneficiary.accountIFSC
|
49
49
|
dataHash[:Single_Payment_Corp_Req][:Body][:Ben_Acct_No] = request.beneficiary.accountNo
|
50
50
|
dataHash[:Single_Payment_Corp_Req][:Body][:Ben_Name] = request.beneficiary.fullName
|
@@ -61,15 +61,15 @@ module ApiBanking
|
|
61
61
|
dataHash[:Single_Payment_Corp_Req][:Body][:Remarks] = request.remarks
|
62
62
|
dataHash[:Single_Payment_Corp_Req][:Body][:RptCode] = request.rptCode
|
63
63
|
|
64
|
-
|
65
|
-
reply = do_remote_call(dataHash)
|
66
|
-
|
64
|
+
|
65
|
+
reply = do_remote_call(dataHash, callbacks)
|
66
|
+
|
67
67
|
parse_reply(:transferResponse, reply)
|
68
68
|
end
|
69
|
-
|
70
|
-
|
69
|
+
|
70
|
+
|
71
71
|
private
|
72
|
-
|
72
|
+
|
73
73
|
def self.uri()
|
74
74
|
if self.configuration.environment.kind_of?ApiBanking::Environment::RBL::UAT
|
75
75
|
return '/test/sb/rbl/v1/payments/corp/payment'
|
@@ -77,7 +77,7 @@ module ApiBanking
|
|
77
77
|
return '/sb/rbl/v1/payments/corp/payment'
|
78
78
|
end
|
79
79
|
end
|
80
|
-
|
80
|
+
|
81
81
|
def self.parse_reply(operationName, reply)
|
82
82
|
if reply.kind_of?Fault
|
83
83
|
return reply
|
@@ -1,11 +1,11 @@
|
|
1
1
|
module ApiBanking
|
2
2
|
class AadhaarVerificationService < Soap11Client
|
3
|
-
|
3
|
+
|
4
4
|
SERVICE_NAMESPACE = 'http://xmlns.yesbank.com/WS/EKYCDataElement'
|
5
5
|
SERVICE_VERSION = "1.0"
|
6
|
-
|
6
|
+
|
7
7
|
attr_accessor :request, :result
|
8
|
-
|
8
|
+
|
9
9
|
#verification
|
10
10
|
module Verification
|
11
11
|
Request = Struct.new(:getDemoAuthDataReq)
|
@@ -15,10 +15,10 @@ module ApiBanking
|
|
15
15
|
ServiceContext = Struct.new(:serviceName, :reqRefNum, :reqRefTimeStamp, :serviceVersionNo)
|
16
16
|
ReqBody = Struct.new(:demographicDataModel)
|
17
17
|
DemographicDataModel = Struct.new(:aadhaarName, :aadhaarNo, :agentID, :dob, :gender, :loginKey, :merchantId, :merchantTransactionId, :pincode, :terminalID)
|
18
|
-
|
18
|
+
|
19
19
|
Result = Struct.new(:getDemoAuthDataRes)
|
20
20
|
GetDemoAuthDataRes = Struct.new(:resHdr)
|
21
|
-
ResHdr = Struct.new(:consumerContext, :serviceContext, :serviceResponse, :errorDetails)
|
21
|
+
ResHdr = Struct.new(:consumerContext, :serviceContext, :serviceResponse, :errorDetails)
|
22
22
|
ServiceResponse = Struct.new(:esbResTimeStamp, :esbResStatus)
|
23
23
|
ErrorDetails = Struct.new(:errorInfo)
|
24
24
|
ErrorInfo = Struct.new(:errSrc, :hostErrCode, :hostErrDesc)
|
@@ -27,18 +27,18 @@ module ApiBanking
|
|
27
27
|
class << self
|
28
28
|
attr_accessor :configuration
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
def self.configure
|
32
32
|
self.configuration ||= Configuration.new
|
33
33
|
yield(configuration)
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
36
|
class Configuration
|
37
37
|
attr_accessor :environment, :proxy, :timeout
|
38
38
|
end
|
39
|
-
|
40
|
-
def self.getDemoAuthData(env, request)
|
41
|
-
reply = do_remote_call(env, "http://xmlns.yesbank.com/WS/EKYCService/GetDemoAuthData") do |xml|
|
39
|
+
|
40
|
+
def self.getDemoAuthData(env, request, callbacks)
|
41
|
+
reply = do_remote_call(env, callbacks, "http://xmlns.yesbank.com/WS/EKYCService/GetDemoAuthData") do |xml|
|
42
42
|
xml.GetDemoAuthDataReq("xmlns:eky" => SERVICE_NAMESPACE ) do
|
43
43
|
xml.parent.namespace = xml.parent.namespace_definitions.first
|
44
44
|
xml['eky'].ReqHdr do |header|
|
@@ -74,7 +74,7 @@ module ApiBanking
|
|
74
74
|
end
|
75
75
|
parse_reply(:getDemoAuthData, reply)
|
76
76
|
end
|
77
|
-
|
77
|
+
|
78
78
|
private
|
79
79
|
|
80
80
|
def self.uri()
|
@@ -83,7 +83,7 @@ module ApiBanking
|
|
83
83
|
|
84
84
|
Result = Struct.new(:getDemoAuthDataRes)
|
85
85
|
getDemoAuthDataRes = Struct.new(:resHdr)
|
86
|
-
ResHdr = Struct.new(:consumerContext, :serviceContext, :serviceResponse, :errorDetails)
|
86
|
+
ResHdr = Struct.new(:consumerContext, :serviceContext, :serviceResponse, :errorDetails)
|
87
87
|
ServiceResponse = Struct.new(:esbResTimeStamp, :esbResStatus)
|
88
88
|
ConsumerContext = Struct.new(:requesterID)
|
89
89
|
ServiceContext = Struct.new(:serviceName, :reqRefNum, :reqRefTimeStamp, :serviceVersionNo)
|
@@ -121,15 +121,15 @@ module ApiBanking
|
|
121
121
|
consumer_context,
|
122
122
|
service_context,
|
123
123
|
service_response,
|
124
|
-
error_details
|
124
|
+
error_details
|
125
125
|
)
|
126
126
|
res = Verification::GetDemoAuthDataRes.new(
|
127
|
-
header
|
127
|
+
header
|
128
128
|
)
|
129
129
|
return Verification::Result.new(
|
130
130
|
res
|
131
|
-
)
|
132
|
-
end
|
131
|
+
)
|
132
|
+
end
|
133
133
|
end
|
134
134
|
end
|
135
135
|
|
@@ -138,4 +138,4 @@ module ApiBanking
|
|
138
138
|
end
|
139
139
|
|
140
140
|
end
|
141
|
-
end
|
141
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module ApiBanking
|
2
|
+
class Callbacks
|
3
|
+
def initialize
|
4
|
+
yield(self) if block_given?
|
5
|
+
end
|
6
|
+
|
7
|
+
def before_send(&block)
|
8
|
+
@before_send = block if block_given?
|
9
|
+
@before_send
|
10
|
+
end
|
11
|
+
|
12
|
+
def on_complete(&block)
|
13
|
+
@on_complete = block if block_given?
|
14
|
+
@on_complete
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
module ApiBanking
|
2
2
|
class FundsTransferByCustomerService2 < Soap12Client
|
3
|
-
|
3
|
+
|
4
4
|
SERVICE_NAMESPACE = 'http://www.quantiguous.com/services'
|
5
5
|
SERVICE_VERSION = 1
|
6
|
-
|
6
|
+
|
7
7
|
attr_accessor :request, :result
|
8
8
|
|
9
9
|
#transfer
|
@@ -11,26 +11,26 @@ module ApiBanking
|
|
11
11
|
Address = Struct.new(:address1, :address2, :address3, :postalCode, :city, :stateOrProvince, :country)
|
12
12
|
Beneficiary = Struct.new(:fullName, :address, :accountNo, :accountIFSC, :mobileNo, :mmid, :beneCode)
|
13
13
|
Request = Struct.new(:uniqueRequestNo, :appID, :customerID, :debitAccountNo, :beneficiary, :transferAmount, :transferType, :purposeCode, :remitterToBeneficiaryInfo)
|
14
|
-
|
14
|
+
|
15
15
|
TransactionStatus = Struct.new(:statusCode, :subStatusCode, :bankReferenceNo, :beneficiaryReferenceNo)
|
16
16
|
Result = Struct.new(:version, :uniqueResponseNo, :attemptNo, :transferType, :lowBalanceAlert, :transactionStatus)
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
#getStatus
|
20
20
|
module GetStatus
|
21
21
|
Request = Struct.new(:version, :appID, :customerID, :requestReferenceNo)
|
22
22
|
TransactionStatus = Struct.new(:statusCode, :subStatusCode, :bankReferenceNo, :beneficiaryReferenceNo)
|
23
23
|
Result = Struct.new(:version, :transferType, :reqTransferType, :transactionDate, :transferAmount, :transferCurrencyCode, :transactionStatus)
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
#getBalance
|
27
27
|
module GetBalance
|
28
28
|
Request = Struct.new(:version, :appID, :customerID, :AccountNumber)
|
29
29
|
Result = Struct.new(:Version, :accountCurrencyCode, :accountBalanceAmount, :lowBalanceAlert)
|
30
30
|
end
|
31
|
-
|
32
|
-
def self.transfer(env, request)
|
33
|
-
reply = do_remote_call(env) do |xml|
|
31
|
+
|
32
|
+
def self.transfer(env, request, callbacks = nil)
|
33
|
+
reply = do_remote_call(env, callbacks) do |xml|
|
34
34
|
xml.transfer("xmlns:ns" => SERVICE_NAMESPACE ) do
|
35
35
|
xml.parent.namespace = xml.parent.namespace_definitions.first
|
36
36
|
xml['ns'].version SERVICE_VERSION
|
@@ -47,7 +47,7 @@ module ApiBanking
|
|
47
47
|
xml.fullName request.beneficiary.fullName
|
48
48
|
end
|
49
49
|
xml.beneficiaryAddress do |xml|
|
50
|
-
if request.beneficiary.address.kind_of? Transfer::Address
|
50
|
+
if request.beneficiary.address.kind_of? Transfer::Address
|
51
51
|
xml.address1 request.beneficiary.address.address1
|
52
52
|
xml.address2 request.beneficiary.address.address2 unless request.beneficiary.address.address2.nil?
|
53
53
|
xml.address3 request.beneficiary.address.address3 unless request.beneficiary.address.address3.nil?
|
@@ -72,13 +72,13 @@ module ApiBanking
|
|
72
72
|
xml.remitterToBeneficiaryInfo request.remitterToBeneficiaryInfo
|
73
73
|
end
|
74
74
|
end
|
75
|
-
|
75
|
+
|
76
76
|
parse_reply(:transfer, reply)
|
77
77
|
end
|
78
78
|
|
79
|
-
|
80
|
-
def self.get_status(env, request)
|
81
|
-
reply = do_remote_call(env) do |xml|
|
79
|
+
|
80
|
+
def self.get_status(env, request, callbacks = nil)
|
81
|
+
reply = do_remote_call(env, callbacks) do |xml|
|
82
82
|
xml.getStatus("xmlns:ns" => SERVICE_NAMESPACE ) do
|
83
83
|
xml.parent.namespace = xml.parent.namespace_definitions.first
|
84
84
|
xml['ns'].version SERVICE_VERSION
|
@@ -89,9 +89,9 @@ module ApiBanking
|
|
89
89
|
end
|
90
90
|
parse_reply(:getStatus, reply)
|
91
91
|
end
|
92
|
-
|
93
|
-
def self.get_balance(env, request)
|
94
|
-
reply = do_remote_call(env) do |xml|
|
92
|
+
|
93
|
+
def self.get_balance(env, request, callbacks = nil)
|
94
|
+
reply = do_remote_call(env, callbacks) do |xml|
|
95
95
|
xml.getBalance("xmlns:ns" => SERVICE_NAMESPACE ) do
|
96
96
|
xml.parent.namespace = xml.parent.namespace_definitions.first
|
97
97
|
xml['ns'].version SERVICE_VERSION
|
@@ -104,11 +104,11 @@ module ApiBanking
|
|
104
104
|
end
|
105
105
|
|
106
106
|
private
|
107
|
-
|
107
|
+
|
108
108
|
def self.uri()
|
109
109
|
return '/fundsTransferByCustomerService2'
|
110
110
|
end
|
111
|
-
|
111
|
+
|
112
112
|
def self.parse_reply(operationName, reply)
|
113
113
|
if reply.kind_of?Fault
|
114
114
|
return reply
|
@@ -144,18 +144,18 @@ module ApiBanking
|
|
144
144
|
content_at(reply.at_xpath('//ns:getStatusResponse/ns:transferAmount', 'ns' => SERVICE_NAMESPACE)),
|
145
145
|
content_at(reply.at_xpath('//ns:getStatusResponse/ns:transferCurrencyCode', 'ns' => SERVICE_NAMESPACE)),
|
146
146
|
transactionStatus
|
147
|
-
)
|
147
|
+
)
|
148
148
|
when :getBalance
|
149
149
|
return GetBalance::Result.new(
|
150
150
|
content_at(reply.at_xpath('//ns:getBalanceResponse/ns:Version', 'ns' => SERVICE_NAMESPACE)),
|
151
151
|
content_at(reply.at_xpath('//ns:getBalanceResponse/ns:accountCurrencyCode', 'ns' => SERVICE_NAMESPACE)),
|
152
152
|
content_at(reply.at_xpath('//ns:getBalanceResponse/ns:accountBalanceAmount', 'ns' => SERVICE_NAMESPACE)),
|
153
153
|
content_at(reply.at_xpath('//ns:getBalanceResponse/ns:lowBalanceAlert', 'ns' => SERVICE_NAMESPACE))
|
154
|
-
)
|
155
|
-
end
|
154
|
+
)
|
155
|
+
end
|
156
156
|
end
|
157
157
|
end
|
158
|
-
|
158
|
+
|
159
159
|
def url
|
160
160
|
return '/fundsTransferByCustomerService2'
|
161
161
|
end
|
@@ -1,11 +1,11 @@
|
|
1
1
|
module ApiBanking
|
2
2
|
class InstantMoneyTransferService < Soap12Client
|
3
|
-
|
3
|
+
|
4
4
|
SERVICE_NAMESPACE = 'http://www.quantiguous.com/services'
|
5
5
|
SERVICE_VERSION = 1
|
6
|
-
|
6
|
+
|
7
7
|
attr_accessor :request, :result
|
8
|
-
|
8
|
+
|
9
9
|
module AddBeneficiary
|
10
10
|
Request = Struct.new(:uniqueRequestNo, :appID, :customerID, :beneficiaryMobileNo, :beneficiaryName, :beneficiaryAddress)
|
11
11
|
Address = Struct.new(:addressLine, :cityName, :postalCode)
|
@@ -27,8 +27,8 @@ module ApiBanking
|
|
27
27
|
|
28
28
|
module GetBeneficiaries
|
29
29
|
Request = Struct.new(:uniqueRequestNo, :appID, :customerID, :dateRange, :numBeneficiaries)
|
30
|
-
|
31
|
-
DateRange = Struct.new(:fromDate, :toDate)
|
30
|
+
|
31
|
+
DateRange = Struct.new(:fromDate, :toDate)
|
32
32
|
Beneficiary = Struct.new(:beneficiaryName, :beneficiaryMobileNo, :registrationDate, :addressLine, :postalCode)
|
33
33
|
BeneficiariesArray = Struct.new(:beneficiary)
|
34
34
|
|
@@ -41,22 +41,22 @@ module ApiBanking
|
|
41
41
|
Result = Struct.new(:uniqueResponseNo, :initiateTransferResult)
|
42
42
|
TransferResult = Struct.new(:bankReferenceNo, :imtReferenceNo)
|
43
43
|
end
|
44
|
-
|
44
|
+
|
45
45
|
class << self
|
46
46
|
attr_accessor :configuration
|
47
47
|
end
|
48
|
-
|
48
|
+
|
49
49
|
def self.configure
|
50
50
|
self.configuration ||= Configuration.new
|
51
51
|
yield(configuration)
|
52
52
|
end
|
53
|
-
|
53
|
+
|
54
54
|
class Configuration
|
55
55
|
attr_accessor :environment, :proxy, :timeout
|
56
56
|
end
|
57
|
-
|
58
|
-
def self.transfer(env, request)
|
59
|
-
reply = do_remote_call(env) do |xml|
|
57
|
+
|
58
|
+
def self.transfer(env, request, callbacks = nil)
|
59
|
+
reply = do_remote_call(env, callbacks) do |xml|
|
60
60
|
xml.initiateTransfer("xmlns:ns" => SERVICE_NAMESPACE ) do
|
61
61
|
xml.parent.namespace = xml.parent.namespace_definitions.first
|
62
62
|
xml['ns'].version SERVICE_VERSION
|
@@ -69,12 +69,12 @@ module ApiBanking
|
|
69
69
|
xml['ns'].remitterToBeneficiaryInfo request.remitterToBeneficiaryInfo
|
70
70
|
end
|
71
71
|
end
|
72
|
-
|
72
|
+
|
73
73
|
parse_reply(:initiateTransfer, reply)
|
74
74
|
end
|
75
75
|
|
76
|
-
def self.add_beneficiary(env, request)
|
77
|
-
reply = do_remote_call(env) do |xml|
|
76
|
+
def self.add_beneficiary(env, request, callbacks = nil)
|
77
|
+
reply = do_remote_call(env, callbacks) do |xml|
|
78
78
|
xml.addBeneficiary("xmlns:ns" => SERVICE_NAMESPACE ) do
|
79
79
|
xml.parent.namespace = xml.parent.namespace_definitions.first
|
80
80
|
xml['ns'].version SERVICE_VERSION
|
@@ -84,7 +84,7 @@ module ApiBanking
|
|
84
84
|
xml['ns'].beneficiaryMobileNo request.beneficiaryMobileNo
|
85
85
|
xml['ns'].beneficiaryName request.beneficiaryName
|
86
86
|
xml['ns'].beneficiaryAddress do |xml|
|
87
|
-
if request.beneficiaryAddress.kind_of? AddBeneficiary::Address
|
87
|
+
if request.beneficiaryAddress.kind_of? AddBeneficiary::Address
|
88
88
|
xml.addressLine request.beneficiaryAddress.addressLine
|
89
89
|
xml.cityName request.beneficiaryAddress.cityName unless request.beneficiaryAddress.cityName.nil?
|
90
90
|
xml.postalCode request.beneficiaryAddress.postalCode unless request.beneficiaryAddress.postalCode.nil?
|
@@ -94,12 +94,12 @@ module ApiBanking
|
|
94
94
|
end
|
95
95
|
end
|
96
96
|
end
|
97
|
-
|
97
|
+
|
98
98
|
parse_reply(:addBeneficiary, reply)
|
99
99
|
end
|
100
100
|
|
101
|
-
def self.delete_beneficiary(env, request)
|
102
|
-
reply = do_remote_call(env) do |xml|
|
101
|
+
def self.delete_beneficiary(env, request, callbacks = nil)
|
102
|
+
reply = do_remote_call(env, callbacks) do |xml|
|
103
103
|
xml.deleteBeneficiary("xmlns:ns" => SERVICE_NAMESPACE ) do
|
104
104
|
xml.parent.namespace = xml.parent.namespace_definitions.first
|
105
105
|
xml['ns'].version SERVICE_VERSION
|
@@ -109,12 +109,12 @@ module ApiBanking
|
|
109
109
|
xml['ns'].beneficiaryMobileNo request.beneficiaryMobileNo
|
110
110
|
end
|
111
111
|
end
|
112
|
-
|
112
|
+
|
113
113
|
parse_reply(:deleteBeneficiary, reply)
|
114
114
|
end
|
115
115
|
|
116
|
-
def self.get_beneficiaries(env, request)
|
117
|
-
reply = do_remote_call(env) do |xml|
|
116
|
+
def self.get_beneficiaries(env, request, callbacks = nil)
|
117
|
+
reply = do_remote_call(env, callbacks) do |xml|
|
118
118
|
xml.getBeneficiaries("xmlns:ns" => SERVICE_NAMESPACE ) do
|
119
119
|
xml.parent.namespace = xml.parent.namespace_definitions.first
|
120
120
|
xml['ns'].version SERVICE_VERSION
|
@@ -130,8 +130,8 @@ module ApiBanking
|
|
130
130
|
parse_reply(:getBeneficiaries, reply)
|
131
131
|
end
|
132
132
|
|
133
|
-
def self.cancel_transfer(env, request)
|
134
|
-
reply = do_remote_call(env) do |xml|
|
133
|
+
def self.cancel_transfer(env, request, callbacks = nil)
|
134
|
+
reply = do_remote_call(env, callbacks) do |xml|
|
135
135
|
xml.cancelTransfer("xmlns:ns" => SERVICE_NAMESPACE ) do
|
136
136
|
xml.parent.namespace = xml.parent.namespace_definitions.first
|
137
137
|
xml['ns'].version SERVICE_VERSION
|
@@ -142,12 +142,12 @@ module ApiBanking
|
|
142
142
|
xml['ns'].reasonToCancel request.reasonToCancel
|
143
143
|
end
|
144
144
|
end
|
145
|
-
|
145
|
+
|
146
146
|
parse_reply(:cancelTransfer, reply)
|
147
147
|
end
|
148
|
-
|
148
|
+
|
149
149
|
private
|
150
|
-
|
150
|
+
|
151
151
|
def self.parse_reply(operationName, reply)
|
152
152
|
if reply.kind_of?Fault
|
153
153
|
return reply
|
@@ -1,39 +1,42 @@
|
|
1
1
|
module ApiBanking
|
2
|
-
|
3
|
-
class SoapClient
|
4
|
-
|
2
|
+
|
3
|
+
class SoapClient
|
4
|
+
|
5
5
|
def self.last_response
|
6
6
|
Thread.current[:last_response]
|
7
7
|
end
|
8
|
-
|
9
|
-
def self.do_remote_call(env, soapAction = nil, &block)
|
8
|
+
|
9
|
+
def self.do_remote_call(env, callbacks = nil, soapAction = nil, &block)
|
10
10
|
data = construct_envelope(&block)
|
11
11
|
options = {}
|
12
12
|
options[:method] = :post
|
13
13
|
options[:body] = data.to_xml
|
14
|
-
|
14
|
+
|
15
15
|
# add soap11/12 specific headers
|
16
16
|
add_soap_headers(options, soapAction)
|
17
|
-
|
17
|
+
|
18
18
|
# TODO: configuration removed for thread-safety, the assumption that one app at one time will connect to one environment
|
19
19
|
# isn't valid anymore (starkit)
|
20
20
|
# options[:proxy] = self.configuration.proxy
|
21
21
|
# options[:timeout] = self.configuration.timeout
|
22
|
-
|
22
|
+
|
23
23
|
set_options_for_environment(env, options)
|
24
|
-
|
24
|
+
|
25
25
|
options[:headers]['User-Agent'] = "Quantiguous; API Banking, Ruby Gem #{ApiBanking::VERSION}"
|
26
|
-
|
26
|
+
|
27
27
|
request = Typhoeus::Request.new(env.endpoints[self.name.split('::').last.to_sym], options)
|
28
|
+
|
29
|
+
callbacks.before_send.call(request) if (callbacks && callbacks.before_send.respond_to?(:call))
|
28
30
|
response = request.run
|
29
|
-
|
30
|
-
|
31
|
+
callbacks.on_complete.call(request.response) if (callbacks && callbacks.on_complete.respond_to?(:call))
|
32
|
+
|
33
|
+
Thread.current[:last_response] = response
|
31
34
|
|
32
35
|
parse_response(response)
|
33
36
|
end
|
34
|
-
|
35
37
|
|
36
|
-
|
38
|
+
|
39
|
+
private
|
37
40
|
|
38
41
|
def self.set_options_for_environment(env, options)
|
39
42
|
if env.kind_of?ApiBanking::Environment::YBL::PRD
|
@@ -58,7 +61,7 @@ module ApiBanking
|
|
58
61
|
end
|
59
62
|
|
60
63
|
|
61
|
-
|
64
|
+
|
62
65
|
def self.parse_response(response)
|
63
66
|
if response.success?
|
64
67
|
if response.headers['Content-Type'] =~ /xml/ then
|
@@ -66,41 +69,41 @@ module ApiBanking
|
|
66
69
|
end
|
67
70
|
elsif response.timed_out?
|
68
71
|
return Fault.new("502", "", "#{response.return_message}")
|
69
|
-
elsif response.code == 0
|
72
|
+
elsif response.code == 0
|
70
73
|
return Fault.new(response.code, "", response.return_message)
|
71
74
|
else
|
72
75
|
# http status indicating error, is either a datapower failure or a soap fault
|
73
76
|
if response.headers['Content-Type'] =~ /xml/ then
|
74
77
|
reply = Nokogiri::XML(response.response_body)
|
75
|
-
|
78
|
+
|
76
79
|
# datapower failures return an xml
|
77
80
|
unless reply.at_xpath('//errorResponse').nil? then
|
78
81
|
return parse_dp_reply(reply)
|
79
82
|
end
|
80
|
-
|
83
|
+
|
81
84
|
# has to be a soapfault
|
82
85
|
return parse_fault(reply)
|
83
|
-
|
86
|
+
|
84
87
|
end
|
85
88
|
return Fault.new("#{response.code.to_s}", "", response.status_message)
|
86
89
|
end
|
87
90
|
end
|
88
|
-
|
91
|
+
|
89
92
|
def self.parse_dp_reply(reply)
|
90
93
|
code = content_at(reply.at_xpath('/errorResponse/httpCode'))
|
91
94
|
reasonText = content_at(reply.at_xpath('/errorResponse/moreInformation'))
|
92
95
|
return Fault.new(code, "", reasonText)
|
93
96
|
end
|
94
|
-
|
97
|
+
|
95
98
|
def self.content_at(node)
|
96
99
|
node.content unless node.nil?
|
97
100
|
end
|
98
|
-
|
101
|
+
|
99
102
|
end
|
100
|
-
|
103
|
+
|
101
104
|
class Soap12Client < SoapClient
|
102
|
-
private
|
103
|
-
|
105
|
+
private
|
106
|
+
|
104
107
|
def self.add_soap_headers(options, soapAction)
|
105
108
|
options[:headers] = {'Content-Type' => "application/xml; charset=utf-8"}
|
106
109
|
|
@@ -108,31 +111,31 @@ module ApiBanking
|
|
108
111
|
# options[:headers][:SOAPAction] = data.doc.at_xpath('/soapenv12:Envelope/soapenv12:Body/*', 'soapenv12' => 'http://www.w3.org/2003/05/soap-envelope').name
|
109
112
|
|
110
113
|
end
|
111
|
-
|
114
|
+
|
112
115
|
def self.construct_envelope(&block)
|
113
116
|
Nokogiri::XML::Builder.new do |xml|
|
114
117
|
xml.Envelope("xmlns:soap12" => "http://www.w3.org/2003/05/soap-envelope",
|
115
118
|
"xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance",
|
116
119
|
"xmlns:xsd" => "http://www.w3.org/2001/XMLSchema") do
|
117
120
|
xml.parent.namespace = xml.parent.namespace_definitions.first
|
118
|
-
xml['soap12'].Header
|
121
|
+
xml['soap12'].Header
|
119
122
|
xml['soap12'].Body(&block)
|
120
123
|
end
|
121
124
|
end
|
122
|
-
end
|
123
|
-
|
125
|
+
end
|
126
|
+
|
124
127
|
def self.parse_fault(reply)
|
125
128
|
code = content_at(reply.at_xpath('//soapenv12:Fault/soapenv12:Code/soapenv12:Subcode/soapenv12:Value', 'soapenv12' => 'http://www.w3.org/2003/05/soap-envelope'))
|
126
129
|
subcode = content_at(reply.at_xpath('//soapenv12:Fault/soapenv12:Code/soapenv12:Subcode/soapenv12:Subcode/soapenv12:Value', 'soapenv12' => 'http://www.w3.org/2003/05/soap-envelope'))
|
127
130
|
reasonText = content_at(reply.at_xpath('//soapenv12:Fault/soapenv12:Reason/soapenv12:Text', 'soapenv12' => 'http://www.w3.org/2003/05/soap-envelope'))
|
128
|
-
|
131
|
+
|
129
132
|
code ||= 'ns:E500' # in certain cases, a fault code isn't set by the server
|
130
133
|
return Fault.new(code, subcode, reasonText)
|
131
134
|
end
|
132
135
|
|
133
|
-
|
136
|
+
|
134
137
|
end
|
135
|
-
|
138
|
+
|
136
139
|
class Soap11Client < SoapClient
|
137
140
|
private
|
138
141
|
|
@@ -149,20 +152,20 @@ module ApiBanking
|
|
149
152
|
"xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance",
|
150
153
|
"xmlns:xsd" => "http://www.w3.org/2001/XMLSchema") do
|
151
154
|
xml.parent.namespace = xml.parent.namespace_definitions.first
|
152
|
-
xml['soap11'].Header
|
155
|
+
xml['soap11'].Header
|
153
156
|
xml['soap11'].Body(&block)
|
154
157
|
end
|
155
158
|
end
|
156
|
-
end
|
157
|
-
|
159
|
+
end
|
160
|
+
|
158
161
|
def self.parse_fault(reply)
|
159
162
|
code = nil # soap11 fault codes are meaningless
|
160
163
|
reasonText = content_at(reply.at_xpath('//soapenv11:Fault/faultstring', 'soapenv11' => 'http://schemas.xmlsoap.org/soap/envelope/'))
|
161
|
-
|
164
|
+
|
162
165
|
code ||= 'ns:E500' # in certain cases, a fault code isn't set by the server
|
163
166
|
return Fault.new(code, nil, reasonText)
|
164
167
|
end
|
165
|
-
|
166
|
-
|
168
|
+
|
169
|
+
|
167
170
|
end
|
168
171
|
end
|
@@ -1,11 +1,11 @@
|
|
1
1
|
module ApiBanking
|
2
2
|
class SocialBankingService < Soap12Client
|
3
|
-
|
3
|
+
|
4
4
|
SERVICE_NAMESPACE = 'http://www.quantiguous.com/services'
|
5
5
|
SERVICE_VERSION = 1
|
6
|
-
|
6
|
+
|
7
7
|
attr_accessor :request, :result
|
8
|
-
|
8
|
+
|
9
9
|
#getTransactions
|
10
10
|
module GetTransactions
|
11
11
|
Request = Struct.new(:version, :appID, :customerIdentity, :deviceID, :accountIdentity, :numTransactions)
|
@@ -13,7 +13,7 @@ module ApiBanking
|
|
13
13
|
CustomerAlternateID = Struct.new(:mobileNo, :emailID, :twitterID, :genericID)
|
14
14
|
GenericID = Struct.new(:idType, :idValue)
|
15
15
|
AccountIdentity = Struct.new(:accountNo, :registeredAccount)
|
16
|
-
|
16
|
+
|
17
17
|
Transaction = Struct.new(:transactionID, :recordDate, :transactionType, :currencyCode, :amount, :narrative)
|
18
18
|
Result = Struct.new(:version, :customerID, :accountNo, :numTransactions, :transactionsArray)
|
19
19
|
end
|
@@ -21,18 +21,18 @@ module ApiBanking
|
|
21
21
|
class << self
|
22
22
|
attr_accessor :configuration
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
def self.configure
|
26
26
|
self.configuration ||= Configuration.new
|
27
27
|
yield(configuration)
|
28
28
|
end
|
29
|
-
|
29
|
+
|
30
30
|
class Configuration
|
31
31
|
attr_accessor :environment, :proxy, :timeout
|
32
32
|
end
|
33
|
-
|
34
|
-
def self.getTransactions(env, request)
|
35
|
-
reply = do_remote_call(env) do |xml|
|
33
|
+
|
34
|
+
def self.getTransactions(env, request, callbacks = nil)
|
35
|
+
reply = do_remote_call(env, callbacks) do |xml|
|
36
36
|
xml.getTransactions("xmlns:ns" => SERVICE_NAMESPACE ) do
|
37
37
|
xml.parent.namespace = xml.parent.namespace_definitions.first
|
38
38
|
xml['ns'].version SERVICE_VERSION
|
@@ -63,7 +63,7 @@ module ApiBanking
|
|
63
63
|
end
|
64
64
|
parse_reply(:getTransactions, reply)
|
65
65
|
end
|
66
|
-
|
66
|
+
|
67
67
|
private
|
68
68
|
|
69
69
|
def self.uri()
|
@@ -76,7 +76,7 @@ module ApiBanking
|
|
76
76
|
else
|
77
77
|
case operationName
|
78
78
|
when :getTransactions
|
79
|
-
txnArray = Array.new
|
79
|
+
txnArray = Array.new
|
80
80
|
i = 1
|
81
81
|
numTxns = content_at(reply.at_xpath("//ns:getTransactionsResponse/ns:numTransactions", 'ns' => SERVICE_NAMESPACE)).to_i
|
82
82
|
until i > numTxns
|
@@ -98,7 +98,7 @@ module ApiBanking
|
|
98
98
|
txnArray.size,
|
99
99
|
txnArray
|
100
100
|
)
|
101
|
-
end
|
101
|
+
end
|
102
102
|
end
|
103
103
|
end
|
104
104
|
|
@@ -107,4 +107,4 @@ module ApiBanking
|
|
107
107
|
end
|
108
108
|
|
109
109
|
end
|
110
|
-
end
|
110
|
+
end
|
data/lib/api_banking/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: api_banking
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.18
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- akil
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-01-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -135,6 +135,7 @@ files:
|
|
135
135
|
- lib/api_banking/json/json_client.rb
|
136
136
|
- lib/api_banking/json/singlePayment.rb
|
137
137
|
- lib/api_banking/soap/aadhaarVerificationService.rb
|
138
|
+
- lib/api_banking/soap/callbacks.rb
|
138
139
|
- lib/api_banking/soap/domesticRemittanceByPartnerService.rb
|
139
140
|
- lib/api_banking/soap/fault.rb
|
140
141
|
- lib/api_banking/soap/fundsTransferByCustomerService.rb
|
@@ -169,7 +170,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
169
170
|
version: '0'
|
170
171
|
requirements: []
|
171
172
|
rubyforge_project:
|
172
|
-
rubygems_version: 2.4.
|
173
|
+
rubygems_version: 2.4.5
|
173
174
|
signing_key:
|
174
175
|
specification_version: 4
|
175
176
|
summary: Ruby SDK to Connect to Banks
|