4 releases (breaking)

Uses new Rust 2024

new 0.4.0 May 16, 2025
0.3.0 May 16, 2025
0.2.0 May 16, 2025
0.1.0 May 14, 2025

#292 in Web programming

Download history 96/week @ 2025-05-09

96 downloads per month

MIT/Apache

130KB
1.5K SLoC

yandex_pay_api

crates.io docs.rs github

yandex_pay_api — это библиотека на языке Rust для взаимодействия с API Yandex Pay. Она предоставляет удобный и типобезопасный способ интеграции Yandex Pay в ваши приложения на Rust.

Возможности

  • Управление заказами: Создание, отправка и получение заказов.
  • Работа с корзиной: Определение и управление элементами корзины с детализированными атрибутами.
  • Методы оплаты: Указание доступных методов оплаты и предпочтений.
  • Поддержка сериализации: Встроенная поддержка JSON-сериализации/десериализации с использованием serde.
  • Паттерн Builder: Упрощение создания объектов с помощью паттерна Builder.

Features

  • reqwest - use reqwest as http client default
  • rustls - use rustls for reqwest client default
  • native-tls - use native-tls for reqwest client

Установка

Выполните команду

cargo add yandex_pay_api
cargo add tracing-subscriber --features=fmt
cargo add tracing
cargo add tokio --features=full

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

Пример

use yandex_pay_api::*;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    dotenv::dotenv()?;
    tracing_subscriber::fmt::init();

    // Инициализация клиента API
    let client = reqwest::Client::new();
    let api = YandexPayApi::new(
        "https://sandbox.pay.yandex.ru".into(),
        std::env::var("YANDEX_MERCHANT_ID")?.into(),
        client,
    );

    // Создание корзины
    let cart = RenderedCart::new()
        .items(vec![
            RenderedCartItem::new()
                .product_id("prod_123")
                .quantity(ItemQuantity::new().count(1.0).available(5.0).build())
                .title("Смартфон")
                .total(29999.99)
                .build(),
        ])
        .total(CartTotal::new().amount(29999.99).build())
        .external_id("cart_001")
        .build();

    // Создание запроса на заказ
    let request = CreateOrderRequest::new()
        .cart(cart)
        .order_id("order_123")
        .currency_code(CurrencyCode::Rub)
        .available_payment_methods(vec![AvailablePaymentMethod::Card])
        .redirect_urls(Some(
            MerchantRedirectUrls::new()
                .on_error("https://example.com/error")
                .on_success("https://example.com/success")
                .on_abort(Some("https://example.com/abort".into()))
                .build(),
        ))
        .preferred_payment_method(Some(PreferredPaymentMethod::FullPayment))
        .ttl(Some(1800))
        .build();

    // Отправка запроса
    let response = api.create_order(request).await?;
    println!("Ссылка на оплату: {}", response.payment_url);

    Ok(())
}

Пример для своего http клиента

Выполните команду

cargo add yandex_pay_api --no-default-features
cargo add reqwest --no-default-features --features=rustls-tls
cargo add tracing-subscriber --features=fmt
cargo add tracing
cargo add tokio --features=full

main.rs

use yandex_pay_api::*;

struct MyHttpClient(reqwest::Client);

impl HttpClient for MyHttpClient {
    fn send<T: serde::de::DeserializeOwned>(
        &self,
        request: YandexPayApiRequest,
    ) -> impl Future<Output = R<T>> {
        let client = self.0.clone();

        async move {
            let body = request.body.clone();
            let response = client
                .post(&*request.url)
                .header("Authorization", format!("Api-Key {}", request.api_key))
                .header("X-Request-Id", &*request.request_id)
                .header("X-Request-Timeout", request.request_timeout.to_string())
                .header("X-Request-Attempt", request.request_attempt.to_string())
                .header("Content-Type", "application/json")
                .body(body)
                .send()
                .await?;

            if response.status().is_success() {
                let result = response.text().await?;
                let result = serde_json::from_str::<YandexPayApiResponse<T>>(&result)?;
                Ok(result.data)
            } else {
                let error_message = response.text().await?;
                tracing::error!("{}", error_message);
                let error = serde_json::from_str::<YandexPayApiResponseError>(&error_message)?;
                Err(YandexPayApiError::Api(error))
            }
        }
    }
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    tracing_subscriber::fmt::init();
    // Инициализация клиента
    let client = MyHttpClient(reqwest::Client::new());
    let api = YandexPayApi::new(
        "https://sandbox.pay.yandex.ru".into(),
        // Ваш API-ключ для sandbox он совпадает с MERCHANT_ID
        std::env::var("YANDEX_MERCHANT_ID")?.into(),
        client,
    );
}

Документация

Для подробной документации посетите API Reference.

Вклад

Мы приветствуем ваши вклады! Пожалуйста, создавайте issue или отправляйте pull request на GitHub.

Лицензия

Этот проект лицензирован на условиях лицензии MIT и Apache 2.0. Подробнее см. в файле [LICENSE-APACHE][LICENSE-APACHE].

Благодарности

Эта библиотека вдохновлена официальной документацией API Yandex Pay.

Dependencies

~6–22MB
~233K SLoC