SDK de Pagamento (V3)
Endereço do Projeto
https://github.com/yansongda/pay
Instalação
composer require yansongda/pay ~3.0
Uso
Nota: A documentação a seguir foi elaborada com o ambiente de sandbox do Alipay. Se houver problemas, por favor, forneça feedback!
Arquivo de Configuração
Suponha que há o seguinte arquivo de configuração config/payment.php
<?php
/**
* @desc Arquivo de configuração de pagamento
* @author Tinywan(ShaoBo Wan)
* @date 2022/03/11 20:15
*/
return [
'_force' => true, // Atenção, isso deve ser true
'alipay' => [
'default' => [
// Obrigatório - app_id atribuído pelo Alipay
'app_id' => '20160909004708941',
// Obrigatório - chave privada do aplicativo, string ou caminho
'app_secret_cert' => 'MIIEpAIBAAKCxxxxxxxxxxxxxxP4r3m4OUmD/+XDgCg==',
// Obrigatório - caminho do certificado público do aplicativo
'app_public_cert_path' => base_path().'/payment/appCertPublicKey_2016090900470841.crt',
// Obrigatório - caminho do certificado público do Alipay
'alipay_public_cert_path' => base_path().'/payment/alipayCertPublicKey_RSA2.crt',
// Obrigatório - caminho do certificado raiz do Alipay
'alipay_root_cert_path' => base_path().'/payment/alipayRootCert.crt',
// Opcional - endereço de callback síncrono
'return_url' => 'https://webman.tinywan.cn/payment/alipay-return',
// Opcional - endereço de callback assíncrono
'notify_url' => 'https://webman.tinywan.cn/payment/alipay-notify',
// Opcional - ID do provedor de serviços no modo Provedor de Serviços, usado quando o modo é Pay::MODE_SERVICE
'service_provider_id' => '',
// Opcional - padrão é o modo normal. Pode ser: MODE_NORMAL, MODE_SANDBOX, MODE_SERVICE
'mode' => \Yansongda\Pay\Pay::MODE_SANDBOX,
]
],
'wechat' => [
'default' => [
// Obrigatório - ID do comerciante, no modo Provedor de Serviços, é o ID do comerciante do provedor
'mch_id' => '',
// Obrigatório - chave secreta do comerciante
'mch_secret_key' => '',
// Obrigatório - chave privada do comerciante, string ou caminho
'mch_secret_cert' => '',
// Obrigatório - caminho do certificado público do comerciante
'mch_public_cert_path' => '',
// Obrigatório
'notify_url' => 'https://yansongda.cn/wechat/notify',
// Opcional - app_id do WeChat Official Account
'mp_app_id' => '2016082000291234',
// Opcional - app_id do Mini Program
'mini_app_id' => '',
// Opcional - app_id do App
'app_id' => '',
// Opcional - app_id do Combine
'combine_app_id' => '',
// Opcional - ID do comerciante do Combine
'combine_mch_id' => '',
// Opcional - app_id do sub WeChat Official Account no modo Provedor de Serviços
'sub_mp_app_id' => '',
// Opcional - app_id do sub App no modo Provedor de Serviços
'sub_app_id' => '',
// Opcional - app_id do sub Mini Program no modo Provedor de Serviços
'sub_mini_app_id' => '',
// Opcional - ID do sub comerciante no modo Provedor de Serviços
'sub_mch_id' => '',
// Opcional - caminho do certificado público do WeChat, opcional, é fortemente recomendado configurar esse parâmetro no modo php-fpm
'wechat_public_cert_path' => [
'45F59D4DABF31918AFCEC556D5D2C6E376675D57' => __DIR__.'/Cert/wechatPublicKey.crt',
],
// Opcional - padrão é o modo normal. Pode ser: MODE_NORMAL, MODE_SERVICE
'mode' => \Yansongda\Pay\Pay::MODE_SANDBOX,
]
],
'logger' => [
'enable' => false,
'file' => runtime_path().'/logs/alipay.log',
'level' => 'debug', // Recomenda-se ajustar o nível para info em produção e debug em desenvolvimento
'type' => 'single', // opcional, pode ser daily.
'max_file' => 30, // opcional, válido quando o tipo é daily, padrão é 30 dias
],
'http' => [ // opcional
'timeout' => 5.0,
'connect_timeout' => 5.0,
// Para mais opções de configuração, consulte [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)
]
];
Atenção: o diretório do certificado não é fixo, o exemplo acima coloca na pasta
payment
do framework
├── payment
│ ├── alipayCertPublicKey_RSA2.crt
│ ├── alipayRootCert.crt
│ └── appCertPublicKey_2016090900470841.crt
Inicialização
Chame diretamente o método config
para inicializar
// Obtém o arquivo de configuração config/payment.php
$config = config('payment');
Pay::config($config);
Atenção: Se estiver no modo sandbox do Alipay, certifique-se de ativar a opção no arquivo de configuração
'mode' => \Yansongda\Pay\Pay::MODE_SANDBOX,
que por padrão é o modo normal.
Pagamento (Web)
use support\Request;
use Yansongda\Pay\Pay;
/**
* @param Request $request
* @return string
*/
public function payment(Request $request)
{
// 1. Inicializa a configuração
Pay::config(config('payment'));
// 2. Pagamento na web
$order = [
'out_trade_no' => time(),
'total_amount' => '8888.88',
'subject' => 'pagamento webman',
'_method' => 'get' // Usa o método GET para redirecionar
];
return Pay::alipay()->web($order)->getBody()->getContents();
}
Callback Assíncrono
use support\Request;
use Yansongda\Pay\Pay;
/**
* @desc: Notificação assíncrona do 『Alipay』
* @param Request $request
* @return Response
*/
public function alipayNotify(Request $request): Response
{
// 1. Inicializa a configuração
Pay::config(config('payment'));
// 2. Processa a callback do Alipay
$result = Pay::alipay()->callback($request->post());
// ===================================================================================================
// Verifique o trade_status e outras lógicas, apenas quando o status de notificação da transação é TRADE_SUCCESS ou TRADE_FINISHED, o Alipay considera que o pagamento do comprador foi bem-sucedido.
// 1. O comerciante deve verificar se o out_trade_no nos dados da notificação é realmente o número do pedido criado no sistema do comerciante;
// 2. Verifique se total_amount realmente corresponde ao valor real do pedido (ou seja, o valor no momento da criação do pedido pelo comerciante);
// 3. Verifique se seller_id (ou seller_email) na notificação corresponde à parte responsável pela transação do out_trade_no;
// 4. Verifique se app_id corresponde ao próprio comerciante.
// 5. Outras situações de lógica de negócio
// ===================================================================================================
// 5. Processa a callback do Alipay
return new Response(200, [], 'success');
}
Atenção: não use o retorno próprio do plugin
return Pay::alipay()->success();
para responder ao callback do Alipay, pois isso pode causar problemas em middleware se você o estiver usando. Portanto, para responder ao Alipay, utilize a classe de resposta do webmansupport\Response;
Callback Síncrono
use support\Request;
use Yansongda\Pay\Pay;
/**
* @desc: Notificação síncrona do 『Alipay』
* @param Request $request
* @author Tinywan(ShaoBo Wan)
*/
public function alipayReturn(Request $request)
{
Log::info('Notificação síncrona do 『Alipay』'.json_encode($request->get()));
return 'success';
}
Mais Conteúdos
Acesse a documentação oficial https://pay.yansongda.cn/docs/v3/