kakaocert 1.0.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 (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: []