gopay

package module
v0.0.0-...-94cb825 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 10, 2025 License: MIT Imports: 7 Imported by: 0

README

GoPay

Go Reference Go Report Card CI Pipeline

Сервис для управления доступом к цифровым товарам, включающий прием платежей от клиентов и доставку им товаров после оплаты.

Функциональность

  • Платежные провайдеры
    • ЮKassa
      • Создание платежных ссылок и прием платежей
      • Обработка уведомлений о совершении платежей
  • Хранилища данных
    • BoltDB
      • Хранение данных о пользователях и их платежах и товарах
    • MinIO
      • Хранение продаваемых файлов
  • Способы доставки
    • По ссылке в браузере
      • Генерация уникальных ссылок для доступа к цифровым товарам
  • Виды цифровых товаров
    • PDF-файлы

Требования к окружению

  • Go 1.23+
  • GNU Make 3.80+ (опционально, для упрощения сборки)
  • Docker Compose 2.17+ (опционально, для запуска MinIO)

Запуск и тестирование локально

Ниже представлена инструкция по использованию основных команд, для получения списка всех доступных команд воспользуйтесь make help.

Тестирование

Генерация mock-объектов и запуск unit-тестов:

make test
Запуск API

Предварительный запуск MinIO в docker-контейнере:

docker-compose up --build

Ниже приведены доступные настройки запуска API (флаг > переменная):

Флаг Go CLI Переменная окружения Значение по умолчанию Описание
--env ENV dev Окружение (dev/prod)
--gopay-host GOPAY_HOST localhost Хост для HTTP-сервера
--gopay-port/-p GOPAY_PORT 8080 Порт для HTTP-сервера
--db-file-path DB_FILE_PATH data.db Путь к файлу базы данных
--db-open-timeout DB_OPEN_TIMEOUT 10s Таймаут подключения к БД
*--yookassa-checkout-url *YOOKASSA_CHECKOUT_URL - URL для вебхука ЮKassa
*--yookassa-shop-id *YOOKASSA_SHOP_ID - Идентификатор магазина в ЮKassa
*--yookassa-api-token *YOOKASSA_API_TOKEN - Секретный токен API ЮKassa
minio-bucket-name MINIO_BUCKET_NAME geopdfs Название Bucket в MinIO
minio-url MINIO_URL localhost:9000 Базовый URL MinIO
*minio-user *MINIO_USER - Имя пользователя в MinIO
*minio-password *MINIO_PASSWORD - Пароль пользователя в MinIO

Пример сборки и запуска веб-сервера и API:

go run cmd/api/main.go --yookassa-checkout-url <gopay_checkout> --yookassa-shop-id <shop_id> --yookassa-api-token <api_token> --minio-user <user> --minio-password <password>

при локальном запуске (серый IP-адрес) уведомления от платежного сервиса (ЮKassa) приходить не будут

Документация API будет доступна после запуска по адресу: http://<GOPAY_HOST>:<GOPAY_PORT>/swagger/index.html

Запуск бота

Ниже приведены доступные настройки запуска бота (флаг > переменная):

Флаг Go CLI Переменная окружения Значение по умолчанию Описание
--env ENV dev Окружение (dev/prod)
--gopay-server-url GOPAY_SERVER_URL http://127.0.0.1:8080 Базовый URL сервера
*--tg-bot-token *TG_BOT_TOKEN - Токен бота от BotFather
*--tg-admin-ids *TG_ADMIN_IDS - Telegram ID администраторов через запятую

Пример сборки и запуска Telegram-бота для управления сервисом:

go run cmd/bot/main.go --tg-bot-token <token> --tg-admin-ids <id1>,<id2>

Установка библиотеки

Также реализована библиотека для Go, которая предоставляет:

  • PaymentManager
    • Объект с бизнес-логикой GoPay
  • AdminClient
    • HTTP-клиент для GoPay API

Для установки библиотеки в другой проект на Go:

go get github.com/Anton-Kraev/gopay

Затем можно импортировать и использовать в своем проекте:

package main

import "github.com/Anton-Kraev/gopay"

const serverURL = "http://localhost:8080"

func main() {
	client, err := gopay.NewAdminClient(serverURL)
	if err != nil {
		print(err)
		return
	}
	
	statuses, err := client.NewAllPaymentService().Do()
	if err != nil {
		print(err)
		return
	}
	
	for id, status := range statuses {
		println(id, status)
	}
}

Documentation

Index

Constants

This section is empty.

Variables

View Source
var ErrCreatePayment = errors.New("create payment failed")

Functions

This section is empty.

Types

type AdminClient

type AdminClient interface {
	NewNewPaymentService() NewPaymentService
	NewAllPaymentService() AllPaymentService
	NewGetPaymentService() GetPaymentService
}

func NewAdminClient

func NewAdminClient(serverURL string) (AdminClient, error)

type AllPaymentService

type AllPaymentService interface {
	Do() (map[ID]Status, error)
}

type GetPaymentService

type GetPaymentService interface {
	ID(id ID) GetPaymentService
	Do() (Status, error)
}

type ID

type ID string

func (ID) Validate

func (id ID) Validate() bool
type Link string

func (Link) Validate

func (l Link) Validate() bool

type NewPaymentService

type NewPaymentService interface {
	Currency(currency string) NewPaymentService
	Amount(amount uint) NewPaymentService
	Description(description string) NewPaymentService
	ResourceLink(link Link) NewPaymentService
	Do() (Link, error)

	String() string
}

type Payment

type Payment struct {
	User         User   `json:"user"`
	Amount       uint   `json:"amount"`
	Status       Status `json:"status"`
	PaymentLink  Link   `json:"payment_link"`
	ResourceLink Link   `json:"resource_link"`
}

type PaymentManager

type PaymentManager struct {
	// contains filtered or unexported fields
}

func NewPaymentManager

func NewPaymentManager(
	linkGenerator linkGenerator, paymentStorage paymentStorage, paymentService paymentService,
) *PaymentManager

func (*PaymentManager) CreatePayment

func (pm *PaymentManager) CreatePayment(template PaymentTemplate, user User) (Link, error)

func (*PaymentManager) GetAllPaymentsStatuses

func (pm *PaymentManager) GetAllPaymentsStatuses() (map[ID]Status, error)

func (*PaymentManager) GetPaymentStatus

func (pm *PaymentManager) GetPaymentStatus(id ID) (Status, error)
func (pm *PaymentManager) GetRedirectLink(id ID) (Link, error)

func (*PaymentManager) UpdatePaymentStatus

func (pm *PaymentManager) UpdatePaymentStatus(id ID, newStatus Status) error

type PaymentTemplate

type PaymentTemplate struct {
	Currency     string `json:"currency" validate:"required"`
	Amount       uint   `json:"amount" validate:"required"`
	Description  string `json:"description" validate:"required"`
	ResourceLink Link   `json:"resource_link" validate:"required,url"`
}

type Status

type Status string
const (
	StatusPending           Status = "pending"
	StatusWaitingForCapture Status = "waiting_for_capture"
	StatusSucceeded         Status = "succeeded"
	StatusCancelled         Status = "canceled"
)

func (Status) Validate

func (s Status) Validate() bool

type User

type User struct {
	ID    ID     `json:"id" validate:"required"`
	Name  string `json:"name" validate:"required"`
	Email string `json:"email" validate:"required,email"`
}

Directories

Path Synopsis
cmd
api command
bot command
internal

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL