Официальная клиентская библиотека для работы с API Wind. Поддерживает Node.js и TypeScript.
npm install @windmc/jsimport{WindClient}from"@windmc/js";constclient=newWindClient({clientId: "ВАШ_CLIENT_ID",clientSecret: "ВАШ_CLIENT_SECRET",// для OAuthredirectUri: "https://yoursite.example/callback",appToken: "ВАШ_APP_TOKEN",// для BillingwebhookSecret: "ВАШ_WEBHOOK_SECRET",// для проверки вебхуков});// 1. Получить ссылку для входаconsturl=client.getAuthorizeUrl(["identify","bank"]);// → https://windmc.pro/oauth2/authorize?...// 2. Обменять code на токеныconsttokens=awaitclient.exchangeCode(code);// 3. Получить данные пользователяconstuser=awaitclient.getUser(tokens.access_token);console.log(user.nickname,user.avatar);Если ваше приложение не может безопасно хранить clientSecret (браузер, мобильное
приложение), используйте PKCE вместо секрета — clientSecret в конфиге при этом
можно не указывать:
import{WindClient,generatePKCE}from"@windmc/js";constclient=newWindClient({clientId: "ВАШ_CLIENT_ID",redirectUri: "https://yourapp.example/callback",});// 1. Сгенерировать пару и сохранить codeVerifier (например, в сессии/cookie)const{ codeVerifier, codeChallenge }=generatePKCE();consturl=client.getAuthorizeUrl(["identify"],undefined,codeChallenge);// 2. После редиректа обменять code на токены с помощью сохранённого codeVerifierconsttokens=awaitclient.exchangeCode(code,codeVerifier);// 3. refreshToken() и revokeToken() для PKCE-токенов работают без clientSecretconstrefreshed=awaitclient.refreshToken(tokens.refresh_token);| Scope | Описание |
|---|---|
identify | Никнейм, UUID, роли |
bank | Счета и транзакции |
bank:charge | Списание средств (требует подтверждения) |
communities | Список сообществ пользователя |
friends | Список друзей |
client.getAuthorizeUrl(scopes,state?)// URL авторизацииclient.exchangeCode(code)// code → tokensclient.refreshToken(refreshToken)// обновить токенclient.revokeToken(token)// отозвать токенclient.getUser(accessToken)// scope: identifyclient.getBank(accessToken)// scope: bankclient.getBankTransactions(accessToken,limit?)// scope: bankclient.getCommunities(accessToken)// scope: communitiesclient.getFriends(accessToken)// scope: friendsclient.createCharge(accessToken,payload)// scope: bank:chargeclient.getCharge(accessToken,chargeId)// scope: bank:charge// Создать счёт — вернёт payUrl для редиректа пользователяconstbill=awaitclient.createBill({toAccountId: 1001,amount: 500,comment: "Оплата",webhookUrl: "https://yoursite.example/webhooks/wind",returnUrl: "https://yoursite.example/success",});// → { billId, payUrl, expiresAt }// Проверить статус счётаconststatus=awaitclient.getBill(bill.billId);// → { status: "pending" | "paid" | "expired", ... }Счёт действует 10 минут. После оплаты Wind отправляет POST-запрос на webhookUrl с заголовком X-Signature: sha256=<hmac>.
// Express: читать тело как raw bufferapp.use("/webhooks/wind",express.raw({type: "application/json"}));app.post("/webhooks/wind",(req,res)=>{constsignature=req.headers["x-signature"];letpayload;try{payload=client.parseWebhook(req.body.toString(),signature);}catch{returnres.status(401).json({error: "Неверная подпись"});}if(payload.event==="bill.paid"){console.log(`Оплачен счёт ${payload.billId} на сумму ${payload.amount}`);}res.status(200).json({ok: true});});Готовые примеры в директории example/:
oauth-login— OAuth авторизация с Expresscreate-bill— Создание счёта на оплатуwebhook— Обработка вебхуков
npm run build