PHPackages                             justcommunication-ru/jcfias-api-php-sdk - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. justcommunication-ru/jcfias-api-php-sdk

ActiveLibrary[API Development](/categories/api)

justcommunication-ru/jcfias-api-php-sdk
=======================================

jcfias API PHP SDK

v1.0.0(4y ago)07MITPHP

Since Aug 13Pushed 2y ago3 watchersCompare

[ Source](https://github.com/JustCommunication-ru/jcfias-api-php-sdk)[ Packagist](https://packagist.org/packages/justcommunication-ru/jcfias-api-php-sdk)[ RSS](/packages/justcommunication-ru-jcfias-api-php-sdk/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (1)Dependencies (2)Versions (3)Used By (0)

JcFias API PHP SDK
==================

[](#jcfias-api-php-sdk)

[![Latest Stable Version](https://camo.githubusercontent.com/d76ccf3e44b7c25ff3010062cc27df2ea017b5f933df2a7a822afb5509b1bc5f/68747470733a2f2f706f7365722e707567782e6f72672f6a757374636f6d6d756e69636174696f6e2d72752f6a63666961732d6170692d7068702d73646b2f76)](//packagist.org/packages/justcommunication-ru/jcfias-api-php-sdk)[![Total Downloads](https://camo.githubusercontent.com/1526d6b5ad2a21576565fe4b7c83a803ff5514f457578d47f8497959b2af3c97/68747470733a2f2f706f7365722e707567782e6f72672f6a757374636f6d6d756e69636174696f6e2d72752f6a63666961732d6170692d7068702d73646b2f646f776e6c6f616473)](//packagist.org/packages/justcommunication-ru/jcfias-api-php-sdk)

PHP SDK для JcFias API

Установка
---------

[](#установка)

`composer require justcommunication-ru/jcfias-api-php-sdk`

Использование
-------------

[](#использование)

```
$client = new JcFIASClient('login', 'token');
```

Методы
------

[](#методы)

### Токен авторизации

[](#токен-авторизации)

```
$token = JcFIASClient::getToken($login, $password);
```

### Поиск по строке

[](#поиск-по-строке)

```
$defaultParams = [
    'assumptions' => false, // ответ с результатами, которые не были найдены в ФИАС
    'autocomplete' => false, // искаться результаты не по точному совпадению, а со *
    'house_number_not_exact' => false
];

/** @var SearchResponse $response */
$response = $client->sendSearchRequest(new SearchRequest('владивосток', ['assumptions' => true]));
```

### Поиск по строке (batch)

[](#поиск-по-строке-batch)

```
$defaultParams = [
    'assumptions' => false, // ответ с результатами, которые не были найдены в ФИАС
];

/** @var SearchBatchResponse $response */
$response = $client->sendSearchBatchRequest(new SearchBatchRequest(['владивосток', 'москва минская']));
```

### Список регионов

[](#список-регионов)

```
/** @var RegionsResponse $response */
$response = $client->sendRegionsRequest(new RegionsRequest());
```

### Список городов

[](#список-городов)

```
/** @var TownsResponse $response */
$response = $client->sendTownsRequest(new TownsRequest());
```

---

---

---

#### Для использования API без данного SDK необходимо генерировать X-WSSE заголовок самостоятельно

[](#для-использования-api-без-данного-sdk-необходимо-генерировать-x-wsse-заголовок-самостоятельно)

Алгоритм на PHP

```
function generateWsseHeader($username, $token): string
{
    $nonce = hash('sha512', uniqid(true));
    $created = date('c');
    $digest = base64_encode(sha1(base64_decode($nonce) . $created . $token, true));

    return sprintf('UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s"',
        $username,
        $digest,
        $nonce,
        $created
    );
}
```

Алгоритм на JAVA

```
package ru.wiweb.billing.service;

import org.springframework.util.Base64Utils;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.Random;
import java.util.UUID;

/**
 * Утилита для генерации заголовка X-WSSE
 */
public class WsseHeaderGenerator {

    public static SimpleDateFormat isoDateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");

    /**
     * Вызвать этот метод для того, чтобы получить подходящее содержимое заголовка
     * @param username имя пользователя
     * @param token токен пользователя
     * @return
     * @throws NoSuchAlgorithmException
     */
    public static String getWSSEHeader(String username, String token) throws NoSuchAlgorithmException {
        String noncePlain = getUUID();
        String nonce = Base64Utils.encodeToString(noncePlain.getBytes(StandardCharsets.UTF_8));
        String created = isoDateFormatter.format(new Date());
        String digest = Base64Utils.encodeToString(sha1(noncePlain + created + token));
        StringBuilder builder = new StringBuilder();
        builder.append("UsernameToken Username=\"").append(username).append("\", ")
                .append("PasswordDigest=\"").append(digest).append("\", ")
                .append("Nonce=\"").append(nonce).append("\", ")
                .append("Created=\"").append(created).append("\"");
        return builder.toString();
    }

    private static String getUUID() {
        long most64SigBits = get64MostSignificantBitsForVersion1();
        long least64SigBits = get64LeastSignificantBitsForVersion1();
        return new UUID(most64SigBits, least64SigBits).toString();
    }

    private static long get64LeastSignificantBitsForVersion1() {
        Random random = new Random();
        long random63BitLong = random.nextLong() & 0x3FFFFFFFFFFFFFFFL;
        long variant3BitFlag = 0x8000000000000000L;
        return random63BitLong + variant3BitFlag;
    }

    private static long get64MostSignificantBitsForVersion1() {
        LocalDateTime start = LocalDateTime.of(1230, 11, 12, 2, 12, 58);
        Duration duration = Duration.between(start, LocalDateTime.now());
        long seconds = duration.getSeconds();
        long nanos = duration.getNano();
        long timeForUuidIn100Nanos = seconds * 10000000 + nanos * 100;
        long least12SignificatBitOfTime = (timeForUuidIn100Nanos & 0x000000000000FFFFL) >> 4;
        long version = 1
