Текущая ветка master содержит разрабатываемую версию v3. Если вы отправляете PR, пожалуйста, отправляйте на ветку v2.
Этот документ относится к версии v2.x. Если вы ищете документацию для версии v1.x, перейдите по ссылке.
Внимание: версии v1.x и v2.x несовместимы.
После нескольких разработок платежей для Alipay и WeChat Pay, естественно возникло отвращение, и снова появилась лень, хотелось найти готовое решение на вебе, но ничего подходящего не нашлось, либо слишком сложно было понять, либо структура файлов была слишком запутанной, пришлось взяться за дело самому.
!! Пожалуйста, ознакомьтесь с документацией Alipay/WeChat Pay !! Пожалуйста, обладайте базовыми навыками отладки !!
Пожалуйста, ставьте звезды, отправляйте PR!расширение для Laravel перейдите по ссылке расширение для Yii перейдите по ссылке
QQ общение: 690027516
Для PHP 5 используйте версию v1.x https://github.com/yansongda/pay/tree/v1.x
method | описание |
---|---|
web | Платеж на компьютере |
wap | Платеж на мобильном сайте |
app | Платеж в приложении |
pos | Платеж с использованием карты |
scan | Платеж с использованием QR-кода |
transfer | Перевод средств на счет |
mini | Платеж в малом приложении |
method | описание |
---|---|
mp | Платеж через официальный аккаунт |
miniapp | Платеж в малом приложении |
wap | Платеж через H5 |
scan | Платеж с использованием QR-кода |
pos | Платеж с использованием карты |
app | Платеж в приложении |
transfer | Перевод средств на счет компании |
redpack | Обычный красный пакет |
groupRedpack | Разделенный красный пакет |
Все шлюзы поддерживают следующие методы
find(array/string $order)
Описание: метод поиска заказа
Параметры: $order
в виде string
передает системный номер заказа, соответствующий out_trade_no
в Алипай или Вейчжуне; в виде array
передает параметры, указанные в официальной документации Алипай или Вейчжун.
Возврат: при успешном поиске возвращает экземпляр Yansongda\Supports\Collection
, доступ к данным сервера можно получить через $collection->xxx
или $collection['xxx']
.
Исключения: GatewayException
или InvalidSignException
- refund(array $order)
Описание: метод возврата средств
Параметры: $order
в виде массива передает параметры возврата.
Возврат: при успешном возврате средств возвращает экземпляр Yansongda\Supports\Collection
, доступ к данным сервера можно получить через $collection->xxx
или $collection['xxx']
.
Исключения: GatewayException
или InvalidSignException
- cancel(array/string $order)
Описание: метод отмены заказа
Параметры: $order
в виде string
передает системный номер заказа, соответствующий out_trade_no
в Alipay или WeChat; в виде array
передает параметры, указанные в официальной документации Alipay или WeChat.
Возврат: при успешной отмене возвращает экземпляр Yansongda\Supports\Collection
, доступ к данным сервера можно получить через $collection->xxx
или $collection['xxx']
.
Исключения: GatewayException
или InvalidSignException
- close(array/string $order)
Описание: Закрытие заказа
Параметры: При типе $order
равном string
, передайте системный номер заказа, соответствующий out_trade_no
в Alipay или WeChat; при типе array
, используйте параметры, указанные в официальной документации Alipay или WeChat.
Возврат: При успешном закрытии заказа, возвращается экземпляр Yansongda\Supports\Collection
, доступ к данным сервера можно получить через $collection->xxx
или $collection['xxx']
.
Исключения: GatewayException
или InvalidSignException
verify()
Описание: Проверка легальности сообщения, возвращенного сервером
Возврат: При успешной проверке, возвращается экземпляр Yansongda\Supports\Collection
, доступ к данным сервера можно получить через $collection->xxx
или $collection['xxx']
.
Исключения: GatewayException
или InvalidSignException
- PAYMETHOD(array $order)
Описание: Выполнение платежа; для конкретных имен методов платежа, обратитесь к разделу «Поддерживаемые методы платежа»
Возврат: При успешном выполнении, возвращается экземпляр Yansongda\Supports\Collection
, доступ к данным сервера можно получить через $collection->xxx
или $collection['xxx']
, или экземпляр Symfony\Component\HttpFoundation\Response
, доступ к которому можно получить через return $response->send()
(в фреймворке Laravel можно использовать return $response
), подробности см. в документации.
Исключения: GatewayException
или InvalidSignException
## Установка
composer require yansongda/pay -vvv
<?php
namespace App\Http\Controllers;
``````php
use Yansongda\Pay\Pay;
use Yansongda\Pay\Log;
```markdown
class PayController
{
protected $config = [
'app_id' => '2016082000295641',
'notify_url' => 'http://yansongda.cn/notify.php',
'return_url' => 'http://yansongda.cn/return.php',
'ali_public_key' => 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuWJKrQ6SWvS6niI+4vEVZiYfjkCfLQfoFI2nCp9ZLDS42QtiL4Ccyx8scgc3nhVwmVRte8f57TFvGhvJD0upT4O5O/lRxmTjechXAorirVdAODpOu0mFfQV9y/T9o9hHnU+VmO5spoVb3umqpq6D/Pt8p25Yk852/w01VTIczrXC4QlrbOEe3sr1E9auoC7rgYjjCO6lZUIDjX/oBmNXZxhRDrYx4Yf5X7y8FRBFvygIE2FgxV4Yw+SL3QAa2m5MLcbusJpxOml9YVQfP8iSurx41PvvXUMo49JG3BDVernaCYXQCoUJv9fJwbnfZd7J5YByC+5KM4sblJTq7bXZWQIDAQAB',
// шифрование: RSA2
'private_key' => 'MIIEpAIBAAKCAQEAs6+F2leOgOrvj9jTeDhb5q46GewOjqLBlGSs/bVL4Z3fMr3p+Q1Tux/6uogeVi/eHd84xvQdfpZ87A1SfoWnEGH5z15yorccxSOwWUI+q8gz51IWqjgZxhWKe31BxNZ+prnQpyeMBtE25fXp5nQZ/pftgePyUUvUZRcAUisswntobDQKbwx28VCXw5XB2A+lvYEvxmMv/QexYjwKK4M54j435TuC3UctZbnuynSPpOmCu45ZhEYXd4YMsGMdZE5/077ZU1aU7wx/gk07PiHImEOCDkzqsFo0Buc/knGcdOiUDvm2hn2y1XvwjyFOThsqCsQYi4JmwZdRa8kvOf57nwIDAQABAoIBAQCw5QCqln4VTrTvcW+msB1ReX57nJgsNfDLbV2dG8mLYQemBa9833DqDK6iynTLNq69y88ylose33o2TVtEccGp8Dqluv6yUAED14G6LexS43KtrXPgugAtsXE253ZDGUNwUggnN1i0MW2RcMqHdQ9ORDWvJUCeZj/AEafgPN8AyiLrZeL07jJz/uaRfAuNqkImCVIarKUX3HBCjl9TpuoMjcMhz/MsOmQ0agtCatO1eoH1sqv5Odvxb1i59c8Hvq/mGEXyRuoiDo05SE6IyXYXr84/Nf2xvVNHNQA6kTckj8shSi+HGM4mO1Y4Pbb7XcnxNkT0Inn6oJMSiy56P+CpAoGBAO1O+5FE1ZuVGuLb48cY+0lHCD+nhSBd66B5FrxgPYCkFOQWR7pWyfNDBlmO3SSooQ8TQXA25blrkDxzOAEGX57EPiipXr/hy5e+WNoukpy09rsO1TMsvC+v0FXLvZ+TIAkqfnYBgaT56ku7yZ8aFGMwdCPL7WJYAwUIcZX8wZ3dAoGBAMHWplAqhe4bfkGOEEpfs6VvEQxCqYMYVyR65K0rI1LiDZn6Ij8fdVtwMjGKFSZZTspmsqnbbuCE/VTyDzF4NpAxdm3cBtZACv1Lpu2Om+aTzhK2PI6WTDVTKAJBYegXaahBCqVbSxieR62IWtmOMjggTtAKWZ1P5LQcRwdkaB2rAoGAWnAPT318Kp7YcDx8whOzMGnxqtCc24jvk2iSUZgb2Dqv+3zCOTF6JUsV0Guxu5bISoZ8GdfSFKf5gBAo97sGFeuUBMsHYPkcLehM1FmLZk1Q+ljcx3P1A/ds3kWXLolTXCrlpvNMBSN5NwOKAyhdPK/qkvnUrfX8sJ5XK2H4J8ECgYAGIZ0HIiE0Y+g9eJnpUFelXvsCEUW9YNK4065SD/BBGedmPHRC3OLgbo8X5A9BNEf6vP7fwpIiRfKhcjqqzOuk6fueA/yvYD04v+Da2MzzoS8+hkcqF3T3pta4I4tORRdRfCUzD80zTSZlRc/h286Y2eTETd+By1onnFFe2X01mwKBgQDaxo4PBcLL2OyVT5DoXiIdTCJ8KNZL9+kV1aiBuOWxnRgkDjPngslzNa1bK+klGgJNYDbQqohKNn1HeFX3mYNfCUpuSnD2Yag53Dd/1DLO+NxzwvTu4D6DCUnMMMBVaF42ig31Bs0jI3JQZVqeeFzSET8fkoFopJf3G6UXlrIEAQ==',
``````php
// Используйте публичный сертификат, пожалуйста, настройте два параметра ниже, при этом измените ali_public_key на путь к публичному сертификату支付宝公钥证书路径,如(. /cert/alipayCertPublicKey_RSA2.crt)
];
}
```php
// 'app_cert_public_key' => '. /cert/appCertPublicKey. crt', // путь к публичному ключу сертификата приложения
// 'alipay_root_cert' => '. /cert/alipayRootCert. crt', // путь к корневому сертификату Alipay
'log' => [ // необязательный параметр
'file' => '. /logs/alipay. log',
'level' => 'info', // рекомендуется установить уровень логирования на info для продакшена и на debug для разработки
'type' => 'single', // необязательный параметр, может быть также daily
'max_file' => 30, // необязательный параметр, действует при type = daily, по умолчанию 30 дней
],
'http' => [ // необязательный параметр
'timeout' => 5.0,
'connect_timeout' => 5.0,
// для более подробной информации о дополнительных параметрах обратитесь к [Guzzle](https://guzzle-cn. readthedocs. io/zh_CN/latest/request-options. html)
],
'mode' => 'dev', // необязательный параметр, установка этого параметра вводит режим песочницы
];```php
<?php
```namespace App\Http\Controllers;
use Yansongda\Pay\Pay;
use Yansongda\Pay\Log;
public function index()
{
$order = [
'out_trade_no' => time(),
'total_amount' => '1',
'subject' => 'test subject - 测试',
];
$alipay = Pay::alipay($this->config)->web($order);
return $alipay->send(); // в Laravel фреймворке, пожалуйста, используйте `return $alipay`
}
public function return()
{
$data = Pay::alipay($this->config)->verify(); // Да, проверка подписи так проста!
// Номер заказа: $data->out_trade_no
// Номер транзакции Alipay: $data->trade_no
// Общая сумма заказа: $data->total_amount
}
public function notify()
{
$alipay = Pay::alipay($this->config);
try{
$data = $alipay->verify(); // Да, проверка подписи так проста!
// Пожалуйста, самостоятельно проверьте состояние транзакции trade_status и другие логические проверки. В уведомлениях от Alipay бизнеса, только когда состояние транзакции равно TRADE_SUCCESS или TRADE_FINISHED, Alipay считает, что покупатель успешно оплатил заказ.
// 1. Магазин должен проверить, является ли out_trade_no в уведомлении номером заказа, созданным в системе магазина.
// 2. Проверьте, совпадает ли total_amount с фактической суммой заказа (той суммой, которая была указана при создании заказа).
// 3. Проверьте, соответствует ли seller_id (или seller_email) продавцу, связанному с этим заказом (иногда у одного продавца может быть несколько seller_id/seller_email).
// 4. Проверьте, соответствует ли app_id текущему магазину.
// 5. Другие бизнес-логические проверки
}```markdown
class PayController
{
protected $config = [
'appid' => 'wxb3fxxxxxxxxxxx', // APP APPID
'app_id' => 'wxb3fxxxxxxxxxxx', // Идентификатор приложения публичного аккаунта
'miniapp_id' => 'wxb3fxxxxxxxxxxx', // Идентификатор приложения мини-чат
'mch_id' => '14577xxxx',
'key' => 'mF2suE9sU6Mk1Cxxxxxxxxxxx',
'notify_url' => 'http://yanda.net.cn/notify.php',
'cert_client' => './cert/apiclient_cert.pem', // Необязательно, используется при возврате средств
'cert_key' => './cert/apiclient_key.pem', // Необязательно, используется при возврате средств
'log' => [ // Необязательно
'file' => './logs/wechat.log',
'level' => 'info', // Рекомендуется установить уровень логирования на info для рабочей среды и на debug для среды разработки
'type' => 'single', // Необязательно, может быть daily.
'max_file' => 30, // Необязательно, действует при type = daily, по умолчанию 30 дней
],
'http' => [ // Необязательно
'timeout' => 5.0,
'connect_timeout' => 5.0,
// Дополнительные параметры конфигурации см. в [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)
],
'mode' => 'dev', // Необязательно, dev/hk; при значении `hk` используется шлюз в Гонконге.
];
}
public function index()
{
$order = [
'out_trade_no' => time(),
'total_fee' => '1', // **Единица: центы**
'body' => 'test body - тест',
'openid' => 'onkVf1FjWS5SBIixxxxxxx',
];
}
// $pay->appId
// $pay->timeStamp
// $pay->nonceStr
// $pay->package
// $pay->signType
}
public function notify()
{
$pay = Pay::wechat($this->config);
try{
$data = $pay->verify(); // Да, проверка подписи так проста!
Log::debug('Wechat notify', $data->all());
} catch (\Exception $e) {
// $e->getMessage();
}
return $pay->success()->send(); // В Laravel фреймворке просто `return $pay->success()`
}
Если при вызове API платежных шлюзов возникают ошибки, будут выброшены исключения GatewayException
, InvalidSignException
. Можно использовать $e->getMessage()
для просмотра сообщения об ошибке, а также $e->raw
для просмотра исходных данных, возвращаемых API, которые представлены в виде массива.
ali_public_key
, private_key
и т.д.В связи с ограничениями тестирования и использования, в данном проекте реализованы только шлюзы платежей для Alipay и Wechat Pay.Если у вас есть требования к другим шлюзам платежей или вы заметили необходимость улучшения кода в данном проекте, добро пожаловать к форку и отправке PR!
MIT
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )