Как реализовать аутентификацию с помощью API NIMLAB Crypto Exchange в PHP?Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Как реализовать аутентификацию с помощью API NIMLAB Crypto Exchange в PHP?

Сообщение Anonymous »

Я пытаюсь реализовать аутентификацию для подключения к криптобирже NIMLAB, следуя их официальной документации: NIMLAB API Docs.
Однако я продолжаю сталкиваться с проблемами с аутентификацией и подписью. поколение. К сожалению, решения, которые я пробовал до сих пор, не работают.
Команда поддержки NIMLAB предоставила пример Python, который, по их утверждению, работает отлично:
import json
import hashlib
import asyncio
import aiohttp
import logging

from aiohttp.client_exceptions import ContentTypeError, ClientConnectorError
from urllib.parse import urlencode, quote

class NIMLABAPI:
def __init__(self, apiUrl, apiKey, apiSecret):
if not apiUrl:
raise ValueError('apiUrl is required in class ExchangerAPI')
if not apiKey:
raise ValueError('apiKey is required in class ExchangerAPI')
if not apiSecret:
raise ValueError('apiSecret is required in class ExchangerAPI')

self.config = {
"apiUrl": apiUrl,
"apikey": apiKey,
"secret": apiSecret
}

self.session = aiohttp.ClientSession()

def generate_hash(self, get_params, post_params):

for key in get_params:
if isinstance(get_params[key], list):
get_params[key] = [str(value) for value in get_params[key]]
else:
get_params[key] = str(get_params[key])

params = {**get_params, **post_params}
checksum_params = hashlib.sha256(json.dumps(params, ensure_ascii=False, separators=(',', ':')).encode()).hexdigest()
HASH = hashlib.sha256((checksum_params + self.config['secret']).encode()).hexdigest()
return HASH

async def call(self, method, param=None, rewriteConfig=None):
if param is None:
param = {}
get = param.get('get', {})
post = param.get('post', {})
post_out = json.dumps(post, ensure_ascii=False)

if not isinstance(get, dict):
return {"errorCode": 20, "message": 'Error invalid "get" params must be object'}
if not isinstance(post, dict):
return {"errorCode": 21, "message": 'Error invalid "post" params must be object'}

configService = {**self.config, **(rewriteConfig or {})}
method_parts = method.split(':')
typeMethod = 'POST'

if len(method_parts) == 2:
typeMethod, method = method_parts[0].upper(), method_parts[1]
else:
method = method_parts[0]

if typeMethod == 'GET':
get['time'] = int(1000 * asyncio.get_event_loop().time())

url_params = "&".join(f"{key}={value}" if not isinstance(value, list) else "&".join(f"{key}[]={item}" for item in value) for key, value in get.items())

url = f"{configService['apiUrl']}{method}?{url_params}" if url_params else f"{configService['apiUrl']}{method}"

HASH = self.generate_hash(get, post)
print(f"URL: {url}")
async with self.session.request(typeMethod, url, headers={
'cache-control': 'no-cache',
'apikey': configService['apikey'],
'hash': HASH,
'Content-Type': 'application/json'
}, data=post_out) as response:
while True:
try:
if response.status in [502, 504, 409]:
logging.warning(f"Error {response.status}: {response.reason}. Retrying in a while...")
await asyncio.sleep(15)
continue

if response.status != 200:
cf_mitigated = response.headers.get('cf-mitigated')
if cf_mitigated:
ray_id = response.headers.get('cf-ray', 'unknown')
raise Exception(f'CloudFlare mitigation required "{cf_mitigated}". RayID: {ray_id}. '
'Ask support to whitelist your IP.')

reason = response.reason or 'Unknown error'
raise Exception(f'Error API: {response.status} - {reason}')

if 'application/json' not in response.headers.get("content-type", ""):
text = await response.text()
raise Exception(f'Error: Response not JSON: {text}')

text = await response.text()
response_data = json.loads(text)
if not response_data.get('success') or not response_data.get('data'):
error_msg = response_data.get('error', 'Unknown error')
raise Exception(f'Error API: {error_msg}')

return json.dumps(response_data.get('data', {}))

except aiohttp.ClientError as error:
logging.exception("API call error", exc_info=error)

async def close(self):
await self.session.close()


Мне нужно адаптировать эту логику к PHP. Я уже пробовал использовать hash_hmac и различные подходы для создания подписи, но ничего не помогает.
Может ли кто-нибудь помочь мне преобразовать этот код в PHP или руководство узнать, как правильно реализовать аутентификацию с генерацией подписи?
API DOC: https://nimlab.eu/service/api-docs/#/
Заранее спасибо!
Да, Я забыл включить код:




Подробнее здесь: https://stackoverflow.com/questions/792 ... api-in-php
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»