agoalofalife/yandex-money-payout

用于集成 YandexMoney Payouts 的模块。请参阅 https://yookassa.ru/docs/payouts

v2.3.2 2021-11-10 16:32 UTC

This package is auto-updated.

Last update: 2024-09-10 22:50:48 UTC


README

描述

此库提供向 Yandex 支付进行货币结算的功能。

此库有两个版本

v1 (旧版本)

支付类型和功能

 ✅ PHP 5

 ✅ На телефон

 ✅ На яндекс кошелек

 ✅ На банковскую карту
 
 ❌ Интеграция с Laravel

 ❌ Автоинкрементирование clientOrderId

 ❌ Сложный API

v2 (新版本)

支付类型和功能

 ✅ PHP >=7.3

 ✅ На телефон

 ✅ На яндекс кошелек

 ❌ На банковскую карту
 
 ✅ Интеграция с Laravel

 ✅ Автоинкрементирование clientOrderId

 ✅ ClientOrderId через модель Eloquent

 ✅ ClientOrderId в формате UUID

 ✅ Легкий API

安装

composer require agoalofalife/yandex-money-payout

如何使用?

要使用此包,您需要与 Yandex 完成所有法律和技术事宜,并获得与 ЮKassa 服务器交互的证书。

证书和数据设置

agentId

从经理那里获得 agentId — 您在 ЮKassa 中的网关标识符。

cert

这是一个组合密钥 - 您需要执行几个命令

openssl pkcs12 -export -out cert.p12 -in 201111.pem -inkey private.pem

201111.pem - 这通常是 201111.cer (只需重命名) - 证书由 Yandex 发送

private.pem - 这是您在发送到 Yandex 之前创建的私有密钥

执行命令后,您将获得 cert.p12

您需要执行以下命令

openssl pkcs12 -in cert.p12 -out keys.pem -nodes

最终,您将获得 keys.pem - 需要将它插入到参数 cert 中(绝对路径)

certPassword

私钥证书的密码

privateKey

文件绝对路径 - 您在您的端创建的私有密钥。请参阅 这里

yaCert

文件绝对路径 - 用于解密 Yandex 服务器消息的证书

证书是根据请求由 Yandex 发放的,它是通用的,每三年更换一次。

您需要插入名为 deposit_verify_new.cer 的文件

  $settings = new Settings();
  $settings->agentId = '';
  $settings->cert = 'keys.pem';
  $settings->certPassword = '';
  $settings->privateKey = 'private.pem';
  $settings->yaCert = '';

生成 clientOrderId

接下来,您需要选择生成 clientOrderId 的方式

ℹ️ UUID

YandexPayout\Generators\ClientOrderUuid

Генерация clientOrderId через uuid version 4,
случайным образом генерируется уникальный id
 $generator = new \YandexPayout\Generators\ClientOrderUuid();

ℹ️ Eloquent Id

YandexPayout\Generators\ClientOrderEloquent

Генерация номера по порядковому номеру id в базе данных через eloquent 
модель laravel
 $generator = new \YandexPayout\Generators\ClientOrderEloquent(new \App\Models\YandexPayout());

ℹ️ 自定义方式

您可以通过接口实现自己的方式

YandexPayout\Contracts\GeneratorClientOrderId

- public function getId(): string;
   Получение текущего id, например для id из базы - это следующий номер 
   после крайнего.  
  
- public function generateNextId(): string;
  Реализация следуеющего номера - это может быть просто порядковый номер 
  или как в случае uuid уникальный - зависит от вас. Метод нужен - если 
  под текущим id - уже есть запись в яндекс и надо повторить запрос с 
  новым clientOrderId

向手机充值

✅ 检查支付可能性 (testDeposition)

        // Передаем настройки
        $settings = new Settings();
        $settings->agentId = '';
        $settings->cert = '';
        $settings->certPassword = '';
        $settings->privateKey = '';
        $settings->yaCert = '';
        
        // Выбираем генератор
        $generator = new \YandexPayout\Generators\ClientOrderEloquent(new \App\Models\Reward\MoneyReward\Drivers\YandexPayout());

        $phone = new \YandexPayout\Accounts\Phone($settings, $generator);
        $phone->setDstAccount('79052075556'); // передаем номер строго так
        $phone->setAmount(1);// сумма - ожидает float
        $phone->setContract('Тестовый платеж');
        
        // Далее несколько стратегий отправки
        $phone->canSend(); // разовый запрос можно ли отправить деньги
        $phone->send(); // сразу попытаться отправить или после информации 
//        от метода выше
        $phone->sendIncrementId(); // будут произвоидится попытки начисления 
//        денег - с последующей генерации следующего clientOrderId, пока 
//        никакаих ограничений нет - будет до победного

        $phone->getReport(); // получение отчета о запросе - где данные об 
//        ответе сервиса и данные из запроса, для получения данных - 
//        предоставлены get методы

向 Yandex 钱包充值

✅ 检查支付可能性 (testDeposition)

        // Передаем настройки
        $settings = new Settings();
        $settings->agentId = '';
        $settings->cert = '';
        $settings->certPassword = '';
        $settings->privateKey = '';
        $settings->yaCert = '';
        
        // Выбираем генератор
        $generator = new \YandexPayout\Generators\ClientOrderUuid();

        $phone = new \YandexPayout\Accounts\YandexPurse($settings, $generator);
        $phone->setDstAccount('4100116075156746'); // передаем номер строго так
        $phone->setAmount(1);// сумма - ожидает float
        $phone->setContract('Тестовый платеж');
        
        // Далее несколько стратегий отправки
        $phone->canSend(); // разовый запрос можно ли отправить деньги
        $phone->send(); // сразу попытаться отправить или после информации 
//        от метода выше
        $phone->sendIncrementId(); // будут произвоидится попытки начисления 
//        денег - с последующей генерации следующего clientOrderId, пока 
//        никакаих ограничений нет - будет до победного

        $phone->getReport(); // получение отчета о запросе - где данные об 
//        ответе сервиса и данные из запроса, для получения данных - 
//        предоставлены get методы

响应结构

响应结构 $phone->getReport()

    // Примерная структура такая
    YandexPayout\ReportOfRequest {#1637 ▼
      -clientOrderId: "1"
      -amount: 1.0
      -dstAccount: "79052075556"
      -contract: "Тестовый платеж"
      -agentId: "201111"
      -currency: 643
      -response: YandexPayout\Response\Response {#1652 ▼ // Объект 
    // response можно получить через метод $phone->getReport()->response()
        -balance: "200.36"
        -processedDT: "2021-10-20T21:29:50.747+03:00"
        -identification: "reviewed"
        -techMessage: null
        -status: "0"
        -error: null
      }
    }

错误处理

在与 Yandex 交互的过程中可能会出现错误

  • Yandex 内部错误
  • 手机问题
  • 证书过期

等等...

命令 sendsendIncrementId 在成功时返回 bool 值。为了更易读,您可以使用 isSuccessRequest

// ....
    $phone->sendIncrementId(); 
 if ($phone->isSuccessRequest()) {
    // save storage
 } else {
   $phone->getReport()->response()->getStatus();// самостоятельная обработка
   $phone->getReport()->response()->getError();// код ошибка
 }

错误代码列表请参阅 这里

与 Laravel 集成

此包在通过 Laravel 容器使用时提供了一些简化

将配置文件复制到 config 文件夹

php artisan vendor:publish --tag= yandex-payouts

接下来,传递所有设置并选择默认生成器

    'cardSynonimUrl' => '',
    'agentId'        => env('YANDEX_MONEY_PAYOUT_AGENT_ID', ''),
    'certPassword'   => env('YANDEX_MONEY_PAYOUT_CERT_PASSWORD', ''),
    'cert' => env('YANDEX_MONEY_PAYOUT_CERT', ''),
     // абсолютный путь keys.pem
    'privateKey' => env('YANDEX_MONEY_PAYOUT_CERT_PRIVATE', ''),
    // абсолютный путь private.pem
    'yaCert' => env('YANDEX_MONEY_PAYOUT_CERT_REQUEST', ''), 
    // абсолютный путь request.cer

    'generator' => [
        'type' => \YandexPayout\Generators\ClientOrderEloquent::class,
        'model' => \App\Models\YandexPayout::class
    ]

然后使用就简化为从容器中获取对象。您可以在其他位置(控制器、队列)获取这些对象,只要有自动解析的地方都可以

  $yandexPurse = new \YandexPayout\Accounts\YandexPurse(app(Settings::class), app(GeneratorClientOrderId::class));
  $yandexPurse->setDstAccount('4100116075156746');
  $yandexPurse->setAmount(1);
  $yandexPurse->setContract('Тестовый платеж');
  dd($yandexPurse->sendIncrementId(), $yandexPurse->getReport());

其他资料

喝杯茶或咖啡 😌

此包旨在帮助开发者节省时间。如果您因此节省了时间,我将很高兴得到您的支持,无论是通过星级或小额捐赠。

这个简单的提示将让我明白,我的努力没有白费。

https://money.yandex.ru/to/410019109036855