SDK de paiement (V3)
Adresse du projet
https://github.com/yansongda/pay
Installation
composer require yansongda/pay ~3.0
Utilisation
Remarque : Le document ci-dessous a été rédigé en utilisant l'environnement de bac à sable d'Alipay. Si vous avez des questions, n'hésitez pas à nous le faire savoir !
Fichier de configuration
Supposons que nous avons le fichier de configuration suivant config/payment.php
<?php
/**
* @desc Fichier de configuration de paiement
* @author Tinywan(ShaoBo Wan)
* @date 2022/03/11 20:15
*/
return [
'_force' => true, // Remarque, cela doit être true
'alipay' => [
'default' => [
// Requis - app_id attribué par Alipay
'app_id' => '20160909004708941',
// Requis - Clé privée de l'application, chaîne ou chemin
'app_secret_cert' => 'MIIEpAIBAAKCxxxxxxxxxxxxxxP4r3m4OUmD/+XDgCg==',
// Requis - Chemin du certificat public de l'application
'app_public_cert_path' => base_path().'/payment/appCertPublicKey_2016090900470841.crt',
// Requis - Chemin du certificat public d'Alipay
'alipay_public_cert_path' => base_path().'/payment/alipayCertPublicKey_RSA2.crt',
// Requis - Chemin du certificat racine d'Alipay
'alipay_root_cert_path' => base_path().'/payment/alipayRootCert.crt',
// Optionnel - URL de retour synchronisé
'return_url' => 'https://webman.tinywan.cn/payment/alipay-return',
// Optionnel - URL de notification asynchrone
'notify_url' => 'https://webman.tinywan.cn/payment/alipay-notify',
// Optionnel - ID du fournisseur de services en mode fournisseur de services, utilisé lorsque mode est Pay::MODE_SERVICE
'service_provider_id' => '',
// Optionnel - Normalement, le mode est normal. Options : MODE_NORMAL, MODE_SANDBOX, MODE_SERVICE
'mode' => \Yansongda\Pay\Pay::MODE_SANDBOX,
]
],
'wechat' => [
'default' => [
// Requis - Numéro de commerçant, numéro de commerçant fournisseur en mode fournisseur de services
'mch_id' => '',
// Requis - Clé secrète du commerçant
'mch_secret_key' => '',
// Requis - Clé privée du commerçant, chaîne ou chemin
'mch_secret_cert' => '',
// Requis - Chemin du certificat public du commerçant
'mch_public_cert_path' => '',
// Requis
'notify_url' => 'https://yansongda.cn/wechat/notify',
// Optionnel - app_id du compte public
'mp_app_id' => '2016082000291234',
// Optionnel - app_id de la mini-application
'mini_app_id' => '',
// Optionnel - app_id de l'application
'app_id' => '',
// Optionnel - app_id de la commande combinée
'combine_app_id' => '',
// Optionnel - Numéro de commerçant combiné
'combine_mch_id' => '',
// Optionnel - app_id du sous-compte public en mode fournisseur de services
'sub_mp_app_id' => '',
// Optionnel - app_id de la sous-application en mode fournisseur de services
'sub_app_id' => '',
// Optionnel - app_id de la sous-mini-application en mode fournisseur de services
'sub_mini_app_id' => '',
// Optionnel - Sous-numéro de commerçant en mode fournisseur de services
'sub_mch_id' => '',
// Optionnel - Chemin du certificat public WeChat, fortement recommandé de configurer ce paramètre en mode php-fpm
'wechat_public_cert_path' => [
'45F59D4DABF31918AFCEC556D5D2C6E376675D57' => __DIR__.'/Cert/wechatPublicKey.crt',
],
// Optionnel - Normalement, le mode est normal. Options : MODE_NORMAL, MODE_SERVICE
'mode' => \Yansongda\Pay\Pay::MODE_SANDBOX,
]
],
'logger' => [
'enable' => false,
'file' => runtime_path().'/logs/alipay.log',
'level' => 'debug', // Il est recommandé d'ajuster le niveau à info en production et à debug en développement.
'type' => 'single', // optionnel, peut être daily.
'max_file' => 30, // optionnel, valide lorsque le type est daily, par défaut 30 jours
],
'http' => [ // optionnel
'timeout' => 5.0,
'connect_timeout' => 5.0,
// Pour plus de configurations, veuillez consulter [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)
]
];
Remarque : Le répertoire des certificats n'est pas spécifié ; l'exemple ci-dessus se trouve dans le répertoire
payment
du cadre.
├── payment
│ ├── alipayCertPublicKey_RSA2.crt
│ ├── alipayRootCert.crt
│ └── appCertPublicKey_2016090900470841.crt
Initialisation
Appelez directement la méthode config
pour initialiser
// Obtenir le fichier de configuration config/payment.php
$config = config('payment');
Pay::config($config);
Remarque : Si c'est en mode bac à sable d'Alipay, n'oubliez pas d'activer le fichier de configuration
'mode' => \Yansongda\Pay\Pay::MODE_SANDBOX,
, cette option est par défaut en mode normal.
Paiement (Web)
use support\Request;
use Yansongda\Pay\Pay;
/**
* @param Request $request
* @return string
*/
public function payment(Request $request)
{
// 1. Initialiser la configuration
Pay::config(config('payment'));
// 2. Paiement par Web
$order = [
'out_trade_no' => time(),
'total_amount' => '8888.88',
'subject' => 'paiement webman',
'_method' => 'get' // Utiliser la méthode get pour rediriger
];
return Pay::alipay()->web($order)->getBody()->getContents();
}
Notification asynchrone
use support\Request;
use Yansongda\Pay\Pay;
/**
* @desc: Notification asynchrone de『Alipay』
* @param Request $request
* @return Response
*/
public function alipayNotify(Request $request): Response
{
// 1. Initialiser la configuration
Pay::config(config('payment'));
// 2. Traitement de retour d'Alipay
$result = Pay::alipay()->callback($request->post());
// ===================================================================================================
// Veuillez vérifier trade_status et d'autres logiques, Alipay ne reconnaît le paiement du client comme réussi que lorsque l'état de notification de transaction est TRADE_SUCCESS ou TRADE_FINISHED.
// 1. Le commerçant doit vérifier si out_trade_no dans ces données de notification correspond au numéro de commande créé dans le système du commerçant ;
// 2. Vérifiez si total_amount correspond bien au montant réel de la commande (c'est-à-dire le montant au moment de la création de la commande par le commerçant) ;
// 3. Vérifiez si seller_id (ou seller_email) dans la notification correspond à l'opérateur du document out_trade_no;
// 4. Vérifiez si app_id correspond au commerçant lui-même.
// 5. Autres logiques commerciales
// ===================================================================================================
// 5. Traitement de retour d'Alipay
return new Response(200, [], 'success');
}
Remarque : Ne pas utiliser la méthode
return Pay::alipay()->success();
pour répondre à la notification d'Alipay, car des problèmes de middleware peuvent survenir. Par conséquent, utilisez la classe de réponse webmansupport\Response;
pour répondre à Alipay.
Notification synchronisée
use support\Request;
use Yansongda\Pay\Pay;
/**
* @desc: Notification synchronisée de『Alipay』
* @param Request $request
* @author Tinywan(ShaoBo Wan)
*/
public function alipayReturn(Request $request)
{
Log::info('Notification synchronisée de『Alipay』'.json_encode($request->get()));
return 'success';
}
Contenu supplémentaire
Visitez la documentation officielle https://pay.yansongda.cn/docs/v3/