GopaxTechTeam / gopax

고팍스의 REST API 예제를 제공합니다
https://www.gopax.co.kr/
10 stars 9 forks source link

GAS 예시 PR 문의 & Private API 작동 여부 #2

Closed jung-hunsoo closed 5 years ago

jung-hunsoo commented 6 years ago

안녕하세요. 마땅한 문의 경로 및 contribute policy가 없어 이슈로 올려봅니다.

Google Apps Script(GAS)로 간단한 server-less webapp을 만들어 쓰고 있습니다. 유저확대에 도움될 것 같아 샘플 코드를 PR 올려도 되는지 문의드립니다.

아울러 현재 Private API가 작동하고 있는지요? 잔고 조회를 요청하면 자꾸 {errorMessage=Error: Invalid signature, errormsg=Error: Invalid signature}이 리턴됩니다. Node.js와 Python으로 signature는 모두 정상적으로 생성되는 것을 확인하였습니다.

jung-hunsoo commented 6 years ago

업데이트입니다.

잔고 조회는 정상적으로 작동합니다. 시그니처 오류는 서버측이 아닌 제 리퀘스트에서 사용하는 GAS 펑션의 (오래된) 오류 때문으로 확인되었습니다. 인코딩 라이브러리를 변경하니 정상적으로 인코딩 됩니다.

그런데 주문 삭제는 아직 잘 안되는 듯 합니다. 확인 부탁드립니다. 제 개인적인 로직에서는 마이너한 이슈라서 그리 문제되지 않지만 다른 유저에게는 잠재적인 리스크가 될 것 같습니다.

moosylog commented 5 years ago

If I understand correctly from the translation you managed to make a private request to the gopax api from Google App Script (GAS). If so, can you please share your code. I tried both the GAS Utilities.MacAlgorithm.HMAC_SHA_512 function and the jsSHA but it's causing me a headache.

jung-hunsoo commented 5 years ago

@moosylog You got understood correctly. The fn HMAC_SHA_512 doesn't work properly. Instead jsSHA512.gs should be fine; I've been using this for over 1 year without a problem.

First, create a file jsSHA512.gs then copy from the source Caligatio/jsSHA in your project.

Next build a signature then load to headers.

Here's a code snippet.


  fetchPrivateGet: function(requestPath) {
    requestPath = requestPath || '/balances';
    var credential = AlphacoCommon.getMyCredential('gopax');
    var baseUrl = 'https://api.gopax.co.kr';
    var nonce = new Date().getTime().toFixed();
    var params = {};
    var requestUrl = baseUrl + requestPath;
    var message = nonce + 'GET' + requestPath;
    var shaObj = new jsSHA("SHA-512", "TEXT");
    shaObj.setHMACKey(credential.secret, "B64");
    shaObj.update(message);
    var signature = shaObj.getHMAC("B64");
    var headers = {
      'API-KEY': credential.apikey,
      'Signature': signature,
      'Nonce': nonce,
    };
    var options = {
      'method': 'GET',
      'headers': headers,
      'contentType': 'application/json'
    };
    var response = UrlFetchApp.fetch(requestUrl, options);
    if (response.getResponseCode() == 200) {
      return JSON.parse(response.getContentText());
    }
  },

Hope this helps.

moosylog commented 5 years ago

it definitely helps ! thanks a ton