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]));
$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());
Алгоритм на 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 << 12;
return (timeForUuidIn100Nanos & 0xFFFFFFFFFFFF0000L) + version + least12SignificatBitOfTime;
}
public static byte[] sha1(String input) throws NoSuchAlgorithmException {
MessageDigest mDigest = MessageDigest.getInstance("SHA1");
return mDigest.digest(input.getBytes());
}
}