Версия v3 сильно отличается от версии v2 на нижнем уровне. Инфраструктура была переработана, чтобы ее было проще расширять и было удобнее использовать.
После многократных разработок Alipay и WeChat Pay я, естественно, почувствовал чувство отвращения и лени. Я хотел поискать в Интернете соответствующие колеса, но так и не нашел ни одного, который бы меня удовлетворил, или это было слишком сложно понять. Либо файловая структура слишком беспорядочна, и вам придется засучить рукава и сделать это самостоятельно.
Добро пожаловать, Звезда, добро пожаловать, пиар!
Пожалуйста, пришлите сюда пакет расширений Hyperf.
Пожалуйста, отправьте пакет расширения laravel сюда
Пожалуйста, отправьте пакет расширения yii сюда.
Мультитенантная поддержка
Поддержка Swoole
Гибкий механизм подключения
Богатая система событий
Именование менее запутанно
Скрыть детали, на которые разработчикам не нужно обращать внимание
Разработано на основе новейших API Alipay и WeChat.
Высокоабстрактные классы, избавляющие от необходимости писать json и xml.
Структура файлов понятна и понятна. Вы можете добавлять платежные шлюзы, не включенные в этот проект, по своему усмотрению.
Методы более элегантны в использовании, и вам больше не нужно изучать, для чего нужны эти странные имена методов или классов.
Существует встроенный метод автоматического получения общедоступного сертификата WeChat, поэтому вам больше не придется беспокоиться о получении сертификата в первый раз.
Соответствуя PSR2, PSR3, PSR4, PSR7, PSR11, PSR14, PSR18 и другим стандартам, вы можете легко интегрироваться с вашей платформой.
https://pay.yansongda.cn/docs/v3/overview/planning
https://pay.yansongda.cn
yansongda/pay на 100% совместим со всеми функциями Alipay/WeChat/UnionPay (включая функции поставщика услуг) и может быть внедрен через «механизм плагинов».
В то же время SDK напрямую поддерживает следующие встроенные плагины. Подробную информацию см. в документации.
Компьютерная оплата
Оплата мобильного сайта
Приложение оплаты
Оплата картой
Сканируйте код для оплаты
Перенос аккаунта
Оплата мини-программы
...
Официальная оплата счета
Оплата мини-программы
оплата H5
Сканируйте код для оплаты
Приложение оплаты
Оплата картой
...
Оплата мини-программы
...
Оплата мобильного сайта
Оплата через компьютерный сайт
Оплата картой
Сканируйте код для оплаты
...
Интегрированная оплата с помощью скан-кода (WeChat, Alipay, UnionPay, электронные финансы)
...
композитору требуется yansongda/pay:~3.7.0 -vvv
<?phpnamespace AppHttpControllers;используйте YansongdaPayPay;класс AlipayController {protected $config = ['alipay' => ['default' => [//Обязательно — app_id, назначенный Alipay 'app_id' => '2016082000295641', //Обязательно – строка закрытого ключа приложения или путь 'app_secret_cert' => '89iZ2iC16H6/6a3YcP+hDZUjiNGQx9cuwi9eJyykvcwhD...',// Обязательно - путь сертификата открытого ключа приложения 'app_public_cert_path' => '/Users/yansongda/pay/cert/appCertPublicKey_2016082000295641.crt',// Обязательно — путь сертификата открытого ключа Alipay 'alipay_public_cert_path' => '/Users/yansongda/pay/cert/alipayCertPublicKey_RSA2.crt',// Обязательно – путь корневого сертификата Alipay 'alipay_root_cert_path' => '/Users/yansongda/pay/ cert/ alipayRootCert.crt','return_url' => 'https://yansongda.cn/alipay/return','notify_url' => 'https://yansongda.cn/alipay/notify',// Необязательно — токен авторизации стороннего приложения 'app_auth_token' => '' ,// Необязательно — идентификатор поставщика услуг в режиме поставщика услуг, используйте этот параметр 'service_provider_id' =>, когда режим Pay::MODE_SERVICE '',// Необязательно — по умолчанию используется обычный режим. Дополнительные параметры: MODE_NORMAL, MODE_SANDBOX, MODE_SERVICE'mode' => Pay::MODE_NORMAL, ], ], 'logger' => [ // необязательно'enable' => false,'file' => './logs/alipay.log','level' => 'info', // Рекомендуется, чтобы производство уровень среды может быть скорректирован в соответствии с информацией, среда разработки - отладочная 'type' => 'single', // необязательно, необязательно ежедневно. 'max_file' => 30, // необязательно, действует, если тип - ежедневно, по умолчанию 30 дней], 'http' = > [ // необязательный'timeout' => 5.0,'connect_timeout' => 5.0, // Дополнительные элементы конфигурации см. в [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html )] , ];публичная функция web() { Pay::config($this->config); $result = Pay::alipay()->web(['out_trade_no' => ''.time(),'total_amount' => '0.01','subject' => 'Янсонгда тест-1', ]); вернуть $результат; }публичная функция returnCallback() { Pay::config($this->config); $data = Pay::alipay()->callback(); // Да, проверка подписи — это так просто! // Номер заказа: $data->out_trade_no// Номер транзакции Alipay: $data->trade_no// Общая сумма заказа: $data->total_amount} public function notifyCallback() { Pay::config($this->config); try{$data = Pay::alipay()->callback(); // Да, проверка подписи — это так просто! // Пожалуйста, примите собственное решение по поводу trade_status и другой логики. В бизнес-уведомлении Alipay Alipay будет считать платеж покупателя успешным только в том случае, если статус уведомления о транзакции равен TRADE_SUCCESS или TRADE_FINISHED. // 1. Продавцу необходимо проверить, является ли out_trade_no в данных уведомления номером заказа, созданного в системе продавца. // 2. Определить, действительно ли total_amount является фактической суммой заказа (то есть суммой, когда продавец; заказ был создан); // 3. Проверьте идентификатор продавца (или адрес электронной почты продавца) в уведомлении. Является ли это соответствующим оператором документа out_trade_no (иногда у продавца может быть несколько значений Sell_id/seller_email // 4. Проверьте, является ли app_id самим продавцом); // 5. Другие ситуации с бизнес-логикой} catch (Throwable $e) {dd($e); } return Pay::alipay()->success(); } }
<?phpnamespace AppHttpControllers;use YansongdaPayPay;класс WechatController {protected $config = ['wechat' => ['default' => [// Обязательно - номер продавца 'mch_id' => '', // Необязательно - закрытый ключ продавца v2 'mch_secret_key_v2' => '', // Обязательно – секретный ключ продавца v3 'mch_secret_key' => '', // Обязательно – закрытый ключ продавца Строка или путь 'mch_secret_cert' => '',// Обязательно — путь сертификата открытого ключа продавца 'mch_public_cert_path' => '',// Требуется 'notify_url' => 'https://yansongda.cn/wechat/ notify', // Необязательно - app_id официального аккаунта 'mp_app_id' => '', // Необязательно - app_id мини-программы app_id'mini_app_id' => '',// Необязательно - app_id приложения 'app_id' => '',// Необязательно - app_id субофициального аккаунта в режиме поставщика услуг 'sub_mp_app_id' => '', // Необязательно: в режиме поставщика услуг app_id дочернего приложения 'sub_app_id' => '', // Необязательно: в режиме поставщика услуг app_id дочернего приложения app_id'sub_mini_app_id' => '',// Необязательно: в режиме поставщика услуг id суб-торговца'sub_mch_id' => '',// Необязательно: путь сертификата открытого ключа платформы WeChat, необязательно, режим php-fpm настоятельно рекомендуется Настройте этот параметр в разделе «wechat_public_cert_path» => ['45F59D4DABF31918AFCEC556D5D2C6E376675D57' => __DIR__.'/Cert/wechatpay_45F***D57.pem', ], // Необязательно — по умолчанию используется обычный режим. Дополнительные параметры: MODE_NORMAL, MODE_SERVICE'mode' => Pay::MODE_NORMAL, ] ],'logger' => [ // необязательно'enable' => false,'file' => './logs/wechat.log','level' => 'info', // Рекомендуется, чтобы производство уровень среды может быть скорректирован в соответствии с информацией, среда разработки - отладочная 'type' => 'single', // необязательно, необязательно ежедневно. 'max_file' => 30, // необязательно, действует, если тип - ежедневно, по умолчанию 30 дней], 'http' = > [ // необязательный'timeout' => 5.0,'connect_timeout' => 5.0, // Дополнительные элементы конфигурации см. в [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html )] , ]; индекс публичной функции() { Pay::config($this->config); $order = ['out_trade_no' => time().'','description' => 'subject-test','amount' => [ 'total' => 1, ],'payer' => [ 'openid' => 'onkVf1FjWS5SBxxxxxxxx', ], ];$pay = Pay::wechat()->mp($order);// $pay->appId// $pay->timeStamp// $pay->nonceStr// $pay->package// $ pay->signType}Обратный вызов публичной функции() { Pay::config($this->config); try{$data = Pay::wechat()->callback(); // Да, проверка подписи — это так просто! } catch (Throwable $e) {dd($e); } return Pay::wechat()->success(); } }
<?phpnamespace AppHttpControllers;use YansongdaPayPay;класс DouyinController {protected $config = ['douyin' => ['default' => [// Необязательный номер продавца // Открытая платформа Douyin --> Сведения о приложении --> Информация о платеже --> Управление продуктами --> Номер продавца. 'mch_id' => '73744242495132490630', // Требуется — токен платежа, используемый для подписи обратного вызова платежа // Открытая платформа Douyin --> Сведения о приложении --> Информация о платеже --> Настройки платежа --> Токен (токен) 'mch_secret_token' => 'douyin_mini_token', // Требуется - Платежная SALT, используется для подписи платежа // Открытая платформа Douyin --> Сведения о приложении --> Информация о платеже --> Настройки платежа --> SALT'mch_secret_salt' => 'oDxWDBr4U7FAAQ8hnGDm29i4A6pbTMDKme4WLLvA',//Требуется - Мини-программа app_id// Открытая платформа Douyin --> Сведения о приложении --> Информация о платеже --> Настройки платежа --> Мини-программа appid 'mini_app_id' => 'tt226e54d3bd581bf801',// Необязательно: идентификатор поставщика услуг открытой платформы Douyin ' Thirdparty_id' => '', // Необязательно: адрес обратного вызова платежа Douyin 'notify_url' => 'https://yansongda.cn/douyin/notify', ], ],'logger' => [ // необязательно'enable' => false,'file' => './logs/alipay.log','level' => 'info', // Рекомендуется, чтобы производство уровень среды может быть скорректирован в соответствии с информацией, среда разработки - отладочная 'type' => 'single', // необязательно, необязательно ежедневно. 'max_file' => 30, // необязательно, действует, если тип - ежедневно, по умолчанию 30 дней], 'http' = > [ // необязательный'timeout' => 5.0,'connect_timeout' => 5.0, // Дополнительные элементы конфигурации см. в [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html )] , ];публичная функция pay() { Pay::config($this->config); $result = Pay::douyin()->mini(['out_order_no' => date('YmdHis').mt_rand(1000, 9999),'total_amount' => 1,'subject' => 'Yan Songda- test - subject - 01','body' => 'Янь Сонгда - тест - тело - 01','valid_time' => 600,'expand_order_info' => json_encode(['original_delivery_fee' => 15,'actual_delivery_fee' => 10]) ]); вернуть $результат; }Обратный вызов публичной функции() { Pay::config($this->config); try{$data = Pay::douyin()->callback(); // Да, проверка подписи — это так просто! } catch (Throwable $e) {dd($e) } return Pay::douyin()->success(); } }
<?phpnamespace AppHttpControllers;используйте YansongdaPayPay;класс JsbController {protected $config = ['jsb' => ['default' => [// Сервисный код 'svr_code' => '', // Обязательно - идентификатор партнера 'partner_id' => '', // Обязательно - Public и номер пары закрытых ключей 'public_key_code' => '00', // Требуется — закрытый ключ продавца (зашифрованная подпись) 'mch_secret_cert_path' => '',//Требуемый путь сертификата открытого ключа продавца (предоставляется банком Цзянсу для проверки подписи)'mch_public_cert_path' => '',//Требуется открытый ключ банка Цзянсу (используется для расшифровки данных, возвращаемых банком Цзянсу) 'jsb_public_cert_path ' => '', //Адрес уведомления о платеже 'notify_url' => '', // Необязательно — по умолчанию используется обычный режим. Дополнительные параметры: MODE_NORMAL: официальная среда, MODE_SANDBOX: тестовая среда 'mode' => Pay::MODE_NORMAL, ] ],'logger' => [ // необязательно'enable' => false,'file' => './logs/epay.log','level' => 'info', // Рекомендуется, чтобы производство уровень среды может быть скорректирован в соответствии с информацией, среда разработки - отладочная 'type' => 'single', // необязательно, необязательно ежедневно. 'max_file' => 30, // необязательно, действует, если тип - ежедневно, по умолчанию 30 дней], 'http' = > [ // необязательный'timeout' => 5.0,'connect_timeout' => 5.0, // Дополнительные элементы конфигурации см. в [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html )] , ]; индекс публичной функции() { Pay::config($this->config); $order = ['outTradeNo' => time().'','proInfo' => 'subject-test','totalFee'=> 1, ];$pay = Pay::jsb()->scan($order); }публичная функция notifyCallback() { Pay::config($this->config);try{$data = Pay::jsb()->callback(); // Да, проверка подписи — это так просто! } catch (Throwable $e) {dd($e); } return Pay::jsb()->success(); } }
Из-за ограничений среды тестирования и использования в этом проекте были разработаны только соответствующие платежные шлюзы Alipay, WeChat Pay, Douyin Pay, UnionPay и Jiangsu Bank.
Если у вас есть потребности в других платежных шлюзах или вы нашли код, который нуждается в улучшении в этом проекте, вы можете создать форк и отправить PR!
Массачусетский технологический институт