agoalofalife / yandex-money-payout
用于集成 YandexMoney Payouts 的模块。请参阅 https://yookassa.ru/docs/payouts
Requires
- php: >=7.3
- ramsey/uuid: ^4.2
Requires (Dev)
- phpunit/phpunit: 8.*
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 内部错误
- 手机问题
- 证书过期
等等...
命令 send
或 sendIncrementId
在成功时返回 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());
其他资料
- Yandex 文档 在此
喝杯茶或咖啡 😌
此包旨在帮助开发者节省时间。如果您因此节省了时间,我将很高兴得到您的支持,无论是通过星级或小额捐赠。
这个简单的提示将让我明白,我的努力没有白费。