kakaocert 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/kakaocert.rb +250 -0
  3. metadata +58 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7f88291f71923172a25f95327b61fe030ac82a1e
4
+ data.tar.gz: efeb76a1f4b75e05989e96e6dae23715b85498d9
5
+ SHA512:
6
+ metadata.gz: 9f2b92f874b2dd5e03ba3650b4bf93ead8d81c0c47fd5a8320abc9722c0141caf543862aad7f8c2f39306b67afe77acdb5c1c9337fc2fa29982038d6f82f7354
7
+ data.tar.gz: 4af284b38aca3a60cb8084cadd09b6cb1f27758575fcfe3857e97e12da858b2a84050bd0acfcf95c9b6466862a9b0b2c9d797e87d3bd0c51e448716c7d8b5364
@@ -0,0 +1,250 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'net/http'
3
+ require 'uri'
4
+ require 'json'
5
+ require 'date'
6
+ require "digest"
7
+ require "base64"
8
+ require 'zlib'
9
+ require 'stringio'
10
+ require 'linkhub'
11
+
12
+ # Kakaocert API BaseService class
13
+ class KakaocertService
14
+
15
+ ServiceID_REAL = "KAKAOCERT"
16
+ ServiceURL_REAL = "https://kakaocert-api.linkhub.co.kr"
17
+ KAKAOCERT_APIVersion = "1.0"
18
+ BOUNDARY = "==KAKAOCERT_RUBY_SDK=="
19
+
20
+ attr_accessor :token_table, :scopes, :linkhub, :ipRestrictOnOff
21
+
22
+ # Generate Linkhub Class Singleton Instance
23
+ class << self
24
+ def instance(linkID, secretKey)
25
+ @instance ||= new
26
+ @instance.token_table = {}
27
+ @instance.linkhub = Linkhub.instance(linkID, secretKey)
28
+ @instance.scopes = ["member","310","320","330"]
29
+ @instance.ipRestrictOnOff = true
30
+
31
+ return @instance
32
+ end
33
+
34
+ private :new
35
+ end
36
+
37
+
38
+ # add Service Scope array
39
+ def addScope(scopeValue)
40
+ @scopes.push(scopeValue)
41
+ end
42
+
43
+ def setIpRestrictOnOff(value)
44
+ @ipRestrictOnOff = value
45
+ end
46
+
47
+
48
+ # Get Session Token by checking token-cached hash or token Request
49
+ def getSession_Token(corpNum)
50
+ targetToken = nil
51
+ refresh = false
52
+
53
+ # check already cached CorpNum's SessionToken
54
+ if @token_table.key?(corpNum.to_sym)
55
+ targetToken = @token_table[corpNum.to_sym]
56
+ end
57
+
58
+ if targetToken.nil?
59
+ refresh = true
60
+ else
61
+ # Token's expireTime must use parse() because time format is hh:mm:ss.SSSZ
62
+ expireTime = DateTime.parse(targetToken['expiration'])
63
+ serverUTCTime = DateTime.strptime(@linkhub.getTime())
64
+ refresh = expireTime < serverUTCTime
65
+ end
66
+
67
+ if refresh
68
+ begin
69
+ # getSessionToken from Linkhub
70
+ targetToken = @linkhub.getSessionToken(ServiceID_REAL, corpNum, @scopes, @ipRestrictOnOff ? "" : "*")
71
+
72
+ rescue LinkhubException => le
73
+ raise KakaocertException.new(le.code, le.message)
74
+ end
75
+ # append token to cache hash
76
+ @token_table[corpNum.to_sym] = targetToken
77
+ end
78
+
79
+ targetToken['session_token']
80
+ end
81
+
82
+ # end of getSession_Token
83
+
84
+ def gzip_parse (target)
85
+ sio = StringIO.new(target)
86
+ gz = Zlib::GzipReader.new(sio)
87
+ gz.read()
88
+ end
89
+
90
+ # Kakaocert API http Get Request Func
91
+ def httpget(url, corpNum, userID = '')
92
+ headers = {
93
+ "x-pb-version" => KAKAOCERT_APIVersion,
94
+ "Accept-Encoding" => "gzip,deflate",
95
+ }
96
+
97
+ if corpNum.to_s != ''
98
+ headers["Authorization"] = "Bearer " + getSession_Token(corpNum)
99
+ end
100
+
101
+ if userID.to_s != ''
102
+ headers["x-pb-userid"] = userID
103
+ end
104
+
105
+ uri = URI(ServiceURL_REAL + url)
106
+ request = Net::HTTP.new(uri.host, 443)
107
+ request.use_ssl = true
108
+
109
+ Net::HTTP::Get.new(uri)
110
+
111
+ res = request.get(uri.request_uri, headers)
112
+
113
+ if res.code == "200"
114
+ if res.header['Content-Encoding'].eql?('gzip')
115
+ JSON.parse(gzip_parse(res.body))
116
+ else
117
+ JSON.parse(res.body)
118
+ end
119
+ else
120
+ raise KakaocertException.new(JSON.parse(res.body)["code"],
121
+ JSON.parse(res.body)["message"])
122
+ end
123
+ end
124
+
125
+ #end of httpget
126
+
127
+ # Request HTTP Post
128
+ def httppost(url, corpNum, postData, action = '', userID = '', contentsType = '')
129
+
130
+ headers = {
131
+ "x-lh-version" => KAKAOCERT_APIVersion,
132
+ "Accept-Encoding" => "gzip,deflate",
133
+ }
134
+
135
+ apiServerTime = @linkhub.getTime()
136
+
137
+ hmacTarget = "POST\n"
138
+ hmacTarget += Base64.strict_encode64(Digest::MD5.digest(postData)) + "\n"
139
+ hmacTarget += apiServerTime + "\n"
140
+
141
+ hmacTarget += KAKAOCERT_APIVersion + "\n"
142
+
143
+ key = Base64.decode64(@linkhub._secretKey)
144
+
145
+ data = hmacTarget
146
+ digest = OpenSSL::Digest.new("sha1")
147
+ hmac = Base64.strict_encode64(OpenSSL::HMAC.digest(digest, key, data))
148
+
149
+ headers["x-kc-auth"] = @linkhub._linkID+' '+hmac
150
+ headers["x-lh-date"] = apiServerTime
151
+
152
+ if contentsType == ''
153
+ headers["Content-Type"] = "application/json; charset=utf8"
154
+ else
155
+ headers["Content-Type"] = contentsType
156
+ end
157
+
158
+ headers["Authorization"] = "Bearer " + getSession_Token(corpNum)
159
+
160
+
161
+ uri = URI(ServiceURL_REAL + url)
162
+
163
+ https = Net::HTTP.new(uri.host, 443)
164
+ https.use_ssl = true
165
+ Net::HTTP::Post.new(uri)
166
+
167
+ res = https.post(uri.request_uri, postData, headers)
168
+
169
+ if res.code == "200"
170
+ if res.header['Content-Encoding'].eql?('gzip')
171
+ JSON.parse(gzip_parse(res.body))
172
+ else
173
+ JSON.parse(res.body)
174
+ end
175
+ else
176
+ raise KakaocertException.new(JSON.parse(res.body)["code"],
177
+ JSON.parse(res.body)["message"])
178
+ end
179
+ end
180
+
181
+ #end of httppost
182
+
183
+ def requestCMS(clientCode, cmsRequestInfo, userID = "")
184
+ if clientCode.to_s == ''
185
+ raise KakaocertException.new('-99999999', '이용기관코드가 입력되지 않았습니다.')
186
+ end
187
+ httppost("/SignDirectDebit/Request", clientCode, cmsRequestInfo.to_json, "", userID)
188
+ end
189
+
190
+ def requestESign(clientCode, esignRequestInfo, userID = "")
191
+ if clientCode.to_s == ''
192
+ raise KakaocertException.new('-99999999', '이용기관코드가 입력되지 않았습니다.')
193
+ end
194
+ httppost("/SignToken/Request", clientCode, esignRequestInfo.to_json, "", userID)
195
+ end
196
+
197
+ def requestVerifyAuth(clientCode, verifyAuthRequestInfo, userID = "")
198
+ if clientCode.to_s == ''
199
+ raise KakaocertException.new('-99999999', '이용기관코드가 입력되지 않았습니다.')
200
+ end
201
+ httppost("/SignIdentity/Request", clientCode, verifyAuthRequestInfo.to_json, "", userID)
202
+ end
203
+
204
+ def getCMSResult(clientCode, receiptID, userID = '')
205
+ if clientCode.to_s == ''
206
+ raise KakaocertException.new('-99999999', '이용기관코드가 입력되지 않았습니다.')
207
+ end
208
+ if receiptID.to_s == ''
209
+ raise KakaocertException.new('-99999999', '접수아이디가 입력되지 않았습니다.')
210
+ end
211
+
212
+ httpget("/SignDirectDebit/#{receiptID}", clientCode, userID)
213
+ end
214
+
215
+ def getVerifyAuthResult(clientCode, receiptID, userID = '')
216
+ if clientCode.to_s == ''
217
+ raise KakaocertException.new('-99999999', '이용기관코드가 입력되지 않았습니다.')
218
+ end
219
+ if receiptID.to_s == ''
220
+ raise KakaocertException.new('-99999999', '접수아이디가 입력되지 않았습니다.')
221
+ end
222
+
223
+ httpget("/SignIdentity/#{receiptID}", clientCode, userID)
224
+ end
225
+
226
+ def getESignResult(clientCode, receiptID, userID = '')
227
+ if clientCode.to_s == ''
228
+ raise KakaocertException.new('-99999999', '이용기관코드가 입력되지 않았습니다.')
229
+ end
230
+ if receiptID.to_s == ''
231
+ raise KakaocertException.new('-99999999', '접수아이디가 입력되지 않았습니다.')
232
+ end
233
+
234
+ httpget("/SignToken/#{receiptID}", clientCode, userID)
235
+ end
236
+
237
+
238
+ end
239
+
240
+
241
+
242
+ # Kakaocert API Exception Handler class
243
+ class KakaocertException < StandardError
244
+ attr_reader :code, :message
245
+
246
+ def initialize(code, message)
247
+ @code = code
248
+ @message = message
249
+ end
250
+ end
metadata ADDED
@@ -0,0 +1,58 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kakaocert
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Linkhub Dev
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-06-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: linkhub
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 1.2.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 1.2.0
27
+ description: Kakaocert API SDK
28
+ email: code@linkhub.co.kr
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - lib/kakaocert.rb
34
+ homepage: https://github.com/linkhub-sdk/kakaocert.ruby
35
+ licenses:
36
+ - APACHE LICENSE VERSION 2.0
37
+ metadata: {}
38
+ post_install_message:
39
+ rdoc_options: []
40
+ require_paths:
41
+ - lib
42
+ required_ruby_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 2.0.0
47
+ required_rubygems_version: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: '0'
52
+ requirements: []
53
+ rubyforge_project:
54
+ rubygems_version: 2.4.8
55
+ signing_key:
56
+ specification_version: 4
57
+ summary: Kakaocert API SDK
58
+ test_files: []