agoalofalife/yandex-mone-payout

此包已被弃用且不再维护。作者建议使用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: 2021-11-10 16:48:35 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的所有法律和技术事宜,并获取与YKassa服务器交互的证书。

配置证书和数据

agentId

从经理处获取agentId——您的YKassa网关标识符。

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证书的密码

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 методы

支付宝转账

✅ 检查支付可能性 (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交互的过程中可能会出现错误

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

等等...

请求 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