La versión v3 es muy diferente de la versión v2 en el nivel inferior. La infraestructura se ha rediseñado para que sea más fácil de expandir y más cómoda de usar.
Después de desarrollar Alipay y WeChat Pay muchas veces, naturalmente sentí una sensación de disgusto y pereza. Quería buscar ruedas relacionadas en línea, pero nunca encontré una con la que me sintiera satisfecho o que fuera demasiado difícil de entender. para usar O la estructura del archivo es demasiado complicada y tienes que arremangarte y hacerlo tú mismo.
¡Bienvenida Star, bienvenida PR!
Por favor envíe el paquete de extensión Hyperf aquí
Por favor envíe el paquete de extensión laravel aquí
Por favor envíe el paquete de expansión yii aquí
Soporte para múltiples inquilinos
Soporte de lana
Mecanismo de conexión flexible
Rico sistema de eventos
Nombrar es menos confuso
Ocultar detalles a los que los desarrolladores no necesitan prestar atención
Desarrollado en base a las últimas API de Alipay y WeChat
Clases altamente abstractas, que eliminan la dificultad de escribir json y xml
La estructura de archivos es clara y fácil de entender. Puede agregar pasarelas de pago que no están incluidas en este proyecto como desee.
Los métodos son más elegantes de usar y ya no es necesario estudiar para qué sirven esos extraños nombres de métodos o nombres de clases.
Existe un método integrado para obtener automáticamente el certificado público de WeChat, por lo que ya no tendrá que preocuparse por obtener el certificado por primera vez.
Al cumplir con PSR2, PSR3, PSR4, PSR7, PSR11, PSR14, PSR18 y otros estándares, puede integrarse fácilmente con su marco
https://pay.yansongda.cn/docs/v3/overview/planning
https://pay.yansongda.cn
yansongda/pay es 100% compatible con todas las funciones de Alipay/WeChat/UnionPay (incluidas las funciones del proveedor de servicios) y se puede introducir a través del "mecanismo de complemento".
Al mismo tiempo, el SDK admite directamente los siguientes complementos integrados. Consulte la documentación para obtener más detalles.
Pago por computadora
Pago por sitio web móvil
pago de la aplicación
pagar con tarjeta
Escanear código para pagar
Transferencia de cuenta
Pago del mini programa
...
Pago de cuenta oficial
Pago del mini programa
pago H5
Escanear código para pagar
pago de la aplicación
pagar con tarjeta
...
Pago del mini programa
...
Pago por sitio web móvil
Pago del sitio web de la computadora
pagar con tarjeta
Escanear código para pagar
...
Pago con código de escaneo integrado (WeChat, Alipay, UnionPay, e-finance)
...
el compositor requiere yansongda/pay:~3.7.0 -vvv
<?phpnamespace AppHttpControllers;use YansongdaPayPay;clase AlipayController {protected $config = ['alipay' => ['default' => [// Requerido - app_id asignado por Alipay 'app_id' => '2016082000295641', // Requerido - cadena de clave privada de la aplicación o ruta 'app_secret_cert ' => '89iZ2iC16H6/6a3YcP+hDZUjiNGQx9cuwi9eJyykvcwhD...',// Requerido - ruta del certificado de clave pública de la aplicación 'app_public_cert_path' => '/Users/yansongda/pay/cert/appCertPublicKey_2016082000295641.crt',// Obligatorio: ruta del certificado de clave pública de Alipay 'alipay_public_cert_path' => '/Users/yansongda/pay/cert/alipayCertPublicKey_RSA2.crt',// Obligatorio: ruta del certificado raíz de 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',// Opcional: token de autorización de aplicación de terceros 'app_auth_token' => '' ,// Opcional: la identificación del proveedor de servicios en el modo de proveedor de servicios, use este parámetro 'service_provider_id' => cuando el modo es Pay::MODE_SERVICE '',// Opcional: por defecto está en modo normal. Las opciones opcionales son: MODE_NORMAL, MODE_SANDBOX, MODE_SERVICE'mode' => Pay::MODE_NORMAL, ], ], 'logger' => [ // opcional'enable' => false,'file' => './logs/alipay.log','level' => 'info', // Se recomienda que la producción el nivel del entorno se ajustará a información, el entorno de desarrollo es debug 'type' => 'single', // opcional, opcional daily.'max_file' => 30, // opcional, válido cuando el tipo es diario, predeterminado 30 días], 'http' = > [ // opcional'timeout' => 5.0,'connect_timeout' => 5.0, // Para obtener más elementos de configuración, consulte [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html )] , ];función pública web() { Pay::config($this->config); $resultado = Pay::alipay()->web(['out_trade_no' => ''.time(),'total_amount' => '0.01','subject' => 'prueba-1 de yansongda', ]); devolver $resultado; }función pública returnCallback() { Pay::config($this->config); $data = Pay::alipay()->callback() // ¡Sí, la verificación de firma es así de simple! // Número de pedido: $data->out_trade_no// Número de transacción de Alipay: $data->trade_no// Monto total del pedido: $data->total_amount} función pública notifyCallback() { Pay::config($this->config); try{$data = Pay::alipay()->callback() // ¡Sí, la verificación de firma es así de simple! // Haga su propio juicio sobre trade_status y otra lógica. En la notificación comercial de Alipay, Alipay considerará que el pago del comprador se realizó correctamente solo cuando el estado de la notificación de la transacción sea TRADE_SUCCESS o TRADE_FINISHED. // 1. El comerciante debe verificar si out_trade_no en los datos de notificación es el número de pedido creado en el sistema comercial; // 2. Determinar si total_amount es realmente el monto real del pedido (es decir, el monto cuando el comerciante se creó el pedido); // 3, Verifique el seller_id (o seller_email) en la notificación. Si es el operador correspondiente del documento out_trade_no (a veces, un comerciante puede tener varios seller_id/seller_email); // 4. Verifique si app_id es el propio comerciante. // 5. Otras situaciones de lógica empresarial} catch (Throwable $e) {dd($e); }return Pay::alipay()->éxito(); } }
<?phpnamespace AppHttpControllers;use YansongdaPayPay;clase WechatController {protected $config = ['wechat' => ['default' => [// Requerido - número de comerciante 'mch_id' => '', // Opcional - clave privada del comerciante v2 'mch_secret_key_v2' => '', // Obligatorio: clave secreta del comerciante v3 'mch_secret_key' => '', // Obligatorio: clave privada del comerciante Cadena o ruta 'mch_secret_cert' => '',// Requerido - ruta del certificado de clave pública comercial 'mch_public_cert_path' => '',// Requerido 'notify_url' => 'https://yansongda.cn/wechat/ notify', // Opcional - el app_id de la cuenta oficial 'mp_app_id' => '',// Opcional - el app_id del mini programa app_id'mini_app_id' => '',// Opcional - el app_id de la aplicación 'app_id' => '',// Opcional - el app_id de la cuenta suboficial en modo proveedor de servicios 'sub_mp_app_id' => '', // Opcional: en el modo de proveedor de servicios, el app_id de la subaplicación 'sub_app_id' => '', // Opcional: en el modo de proveedor de servicios, el app_id de la subaplicación app_id'sub_mini_app_id' => '',// Opcional: en el modo de proveedor de servicios, subcomerciante id'sub_mch_id' => '',// Opcional: ruta del certificado de clave pública de la plataforma WeChat, opcional, se recomienda encarecidamente el modo php-fpm Configure este parámetro en 'wechat_public_cert_path' => ['45F59D4DABF31918AFCEC556D5D2C6E376675D57' => __DIR__.'/Cert/wechatpay_45F***D57.pem', ], // Opcional: por defecto está en modo normal. Las opciones opcionales son: MODE_NORMAL, MODE_SERVICE'mode' => Pay::MODE_NORMAL, ] ],'logger' => [ // opcional'enable' => false,'file' => './logs/wechat.log','level' => 'info', // Se recomienda que la producción el nivel del entorno se ajustará a información, el entorno de desarrollo es debug 'type' => 'single', // opcional, opcional daily.'max_file' => 30, // opcional, válido cuando el tipo es diario, predeterminado 30 días], 'http' = > [ // opcional'timeout' => 5.0,'connect_timeout' => 5.0, // Para obtener más elementos de configuración, consulte [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html )] , ];índice de función pública() { Pay::config($this->config); $order = ['out_trade_no' => time().'','description' => 'subject-test','amount' => [ 'total' => 1, ],'pagador' => [ 'openid' => 'onkVf1FjWS5SBxxxxxxxx', ], ];$pay = Pay::wechat()->mp($order);// $pay->appId// $pay->timeStamp// $pay->nonceStr// $pay->paquete// $ pagar->signType}devolución de llamada de función pública() { Pay::config($this->config); try{$data = Pay::wechat()->callback() // ¡Sí, la verificación de firma es así de simple! } captura (Throwable $e) {dd($e); } return Pago::wechat()->éxito(); } }
<?phpnamespace AppHttpControllers;use YansongdaPayPay;clase DouyinController {protected $config = ['douyin' => ['default' => [// Número de comerciante opcional // Douyin Open Platform --> Detalles de la aplicación --> Información de pago --> Gestión de productos --> No. de comerciante 'mch_id' => '73744242495132490630', // Obligatorio: token de pago, utilizado para la firma de devolución de llamada de pago // Plataforma abierta Douyin --> Detalles de la aplicación --> Información de pago --> Configuración de pago --> Token (token) 'mch_secret_token' => 'douyin_mini_token', // Obligatorio - Pago SALT, utilizado para la firma de pago // Douyin Open Platform --> Detalles de la aplicación --> Información de pago --> Configuración de pago --> SALT'mch_secret_salt' => 'oDxWDBr4U7FAAQ8hnGDm29i4A6pbTMDKme4WLLvA',//Requerido - Mini programa app_id// Douyin Open Platform --> Detalles de la aplicación --> Información de pago --> Configuración de pago --> Mini programa appid 'mini_app_id' => 'tt226e54d3bd581bf801',// Opcional: ID del proveedor de servicios de plataforma abierta de Douyin 'thirdparty_id' => '', // Opcional: dirección de devolución de llamada de pago de Douyin 'notify_url' => 'https://yansongda.cn/douyin/notify', ], ],'logger' => [ // opcional'enable' => false,'file' => './logs/alipay.log','level' => 'info', // Se recomienda que la producción el nivel del entorno se ajustará a información, el entorno de desarrollo es debug 'type' => 'single', // opcional, opcional daily.'max_file' => 30, // opcional, válido cuando el tipo es diario, predeterminado 30 días], 'http' = > [ // opcional'timeout' => 5.0,'connect_timeout' => 5.0, // Para obtener más elementos de configuración, consulte [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html )] , ];pago de función pública() { Pay::config($this->config); $resultado = Pay::douyin()->mini(['out_order_no' => date('YmdHis').mt_rand(1000, 9999),'total_amount' => 1,'sujeto' => 'Yan Songda- prueba - sujeto - 01','cuerpo' => 'Yan Songda - prueba - cuerpo - 01','valid_time' => 600,'expand_order_info' => json_encode(['original_delivery_fee' => 15,'actual_delivery_fee' => 10]) ]); devolver $resultado; }devolución de llamada de función pública() { Pay::config($this->config); try{$data = Pay::douyin()->callback() // ¡Sí, la verificación de firma es así de simple! } captura (tirable $e) {dd($e) }return Pay::douyin()->éxito(); } }
<?phpnamespace AppHttpControllers;use YansongdaPayPay;clase JsbController {protected $config = ['jsb' => ['default' => [// Código de servicio 'svr_code' => '',// Requerido - ID de socio 'partner_id' => '',// Requerido -Público y número de par de clave privada 'public_key_code' => '00', // Obligatorio: clave privada del comerciante (firma cifrada) 'mch_secret_cert_path' => '',// Ruta del certificado de clave pública requerida del comerciante (proporcionada por Jiangsu Bank para la verificación de la firma)'mch_public_cert_path' => '',// Clave pública requerida del banco Jiangsu (utilizada para descifrar los datos devueltos por el Banco Jiangsu) 'jsb_public_cert_path ' => '', //Dirección de notificación de pago 'notify_url' => '', // Opcional: el modo predeterminado es normal. Las opciones opcionales son: MODE_NORMAL: entorno oficial, MODE_SANDBOX: entorno de prueba 'modo' => Pay::MODE_NORMAL, ] ],'logger' => [ // opcional'enable' => false,'file' => './logs/epay.log','level' => 'info', // Se recomienda que la producción el nivel del entorno se ajustará a información, el entorno de desarrollo es debug 'type' => 'single', // opcional, opcional daily.'max_file' => 30, // opcional, válido cuando el tipo es diario, predeterminado 30 días], 'http' = > [ // opcional'timeout' => 5.0,'connect_timeout' => 5.0, // Para obtener más elementos de configuración, consulte [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html )] , ];índice de función pública() { Pay::config($this->config); $order = ['outTradeNo' => time().'','proInfo' => 'subject-test','totalFee'=> 1, ];$pagar = Pagar::jsb()->escanear($pedido); }función pública notificarCallback() { Pay::config($this->config);try{$data = Pay::jsb()->callback() // ¡Sí, la verificación de firma es así de simple! } captura (Throwable $e) {dd($e); } return Pago::jsb()->éxito(); } }
Debido a las limitaciones del entorno de prueba y uso, en este proyecto solo se desarrollaron las pasarelas de pago relevantes de "Alipay", "WeChat Pay", "Douyin Pay", "UnionPay" y "Jiangsu Bank".
Si necesita otras pasarelas de pago o encuentra un código que necesita mejorar en este proyecto, ¡puede bifurcar y enviar un PR!
MIT