ruby 2.1.3
Rails 4.2.3
現在あるサービスのAPIを使おうとしており、秘密の鍵などのをPostする所でエラーがでております。
エラー内容はsignatureが間違っているとの事なのですが。。。
私が書いたsignatureを含むPostです。 ※bananceを取得するコードです。
ruby
1 2#秘密の鍵など 3 hogehoge = 'xxxx' 4 public_key = 'xxxx' 5 private_key = 'xxxx' 6 7#balanceのURL 8 uri = URI.parse "https://www.aiueo.com/ccc/balance" 9 nonce = Time.now.to_i.to_s 10 md5prikey = Digest::MD5.hexdigest('private_key') 11 12#messageの部分 13 message = URI.encode() 14 15#signatureの部分 16 signature = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new("sha256"), md5prikey, message) 17 18 https = Net::HTTP.new(uri.host, uri.port) 19 https.use_ssl = true 20 21#Postの部分 22 request = Net::HTTP::Post.new(uri) 23 request.set_form_data({"hogehoge" => hogehoge, "key" => public_key, "nonce" => nonce, "signature" => signature}) 24
API先から頂いたpythonのコード。bananceを取得するコードです。(pythonしか分からないとの事。)
python
1# 秘密の鍵など 2hogehoge = 'aiueo' 3public_key = 'xxxx' 4private_key = 'xxxx' 5 6# send requests 7def request(method, params): 8 Od = OrderedDict() 9 Od['hogehoge'] = hogehoge 10 Od['key'] = public_key 11 Od['nonce'] = long(time.time()) 12 13 for i in params: 14 Od[i] = params[i] 15 16 Od['signature'] = signature(Od) 17 response = requests.post('https://www.aiueo.com/ccc/'+method,data=Od) 18 if response.status_code == 200: 19 print(response.text) 20 21 22# create signature 23def signature(params): 24 message = urllib.urlencode(params) 25 md5prikey = hashlib.md5(private_key).hexdigest() 26 sign = urllib.quote(hmac.new(md5prikey, message, digestmod=hashlib.sha256).hexdigest()) 27 return sign 28 29# get balance 30def balance(): 31 request('balance',{}) 32
プログラム初心者なのでどこが間違っているのか判断出来ていないのですが、
- 私(ruby)のmassageの方法が違うのかなーと考えますが如何でしょうか?
修正点など御座いましたらご指摘頂けると幸いです。
python
1message = urllib.urlencode(params)
↑の(params)がよく分かっていません。
python
1# get balance 2def balance(): 3 request('balance',{}) 4
↑def balanceではmethod に balanceが入り、paramsには何も値が入っていないと考えますが。。。
for i in params: Od[i] = params[i]
↑ここで i が代入されているのでしょうか?
rubyで書くと
ruby
1message = URI.encode("i")
の様な感じですかね?
又は
python
1Od['signature'] = signature(Od)
↑ここで↓以下のものが全てdef signature(params):に渡って処理されているのでしょうか?
python
1#これらの値も全てsignatureのparams? 2Od = OrderedDict() 3 Od['hogehoge'] = hogehoge 4 Od['key'] = public_key 5 Od['nonce'] = long(time.time()) 6 7 for i in params: 8 Od[i] = params[i] 9
- 他にも修正点又は良い書き方など御座いましたらご指摘頂けると助かります。
宜しくお願いします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/12/11 15:04