La version v3 est très différente de la version v2 au niveau inférieur. L'infrastructure a été repensée pour la rendre plus facile à étendre et plus pratique à utiliser.
Après avoir développé Alipay et WeChat Pay à plusieurs reprises, j'ai naturellement ressenti un sentiment de dégoût et de paresse. Je voulais rechercher des roues similaires en ligne, mais je n'en ai jamais trouvé une qui me satisfasse ou qui était trop difficile à comprendre. à utiliser. Soit la structure des fichiers est trop compliquée, et vous devez retrousser vos manches et le faire vous-même.
Bienvenue Star, bienvenue PR !
Veuillez envoyer le package d'extension Hyperf ici
Veuillez envoyer le package d'extension Laravel ici
Veuillez envoyer le package d'extension yii ici
Prise en charge multi-locataires
Prise en charge de Swoole
Mécanisme de connexion flexible
Système d'événements riche
La dénomination est moins déroutante
Masquer les détails auxquels les développeurs n'ont pas besoin de prêter attention
Développé sur la base des dernières API d'Alipay et WeChat
Classes hautement abstraites, éliminant la difficulté d'épeler JSON et XML
La structure du fichier est claire et facile à comprendre. Vous pouvez ajouter des passerelles de paiement qui ne sont pas incluses dans ce projet à votre guise.
Les méthodes sont plus élégantes à utiliser et vous n'avez plus besoin d'étudier à quoi servent ces noms de méthodes ou de classes étranges.
Il existe une méthode intégrée pour obtenir automatiquement le certificat public WeChat, vous n'avez donc plus à vous soucier de l'obtention du certificat pour la première fois.
Conforme aux normes PSR2, PSR3, PSR4, PSR7, PSR11, PSR14, PSR18 et autres, vous pouvez facilement intégrer votre framework
https://pay.yansongda.cn/docs/v3/overview/planning
https://pay.yansongda.cn
yansongda/pay est 100 % compatible avec toutes les fonctions d'Alipay/WeChat/UnionPay (y compris les fonctions de fournisseur de services) et peut être introduit via le « mécanisme de plug-in ».
Dans le même temps, le SDK prend directement en charge les plug-ins intégrés suivants. Veuillez vous référer à la documentation pour plus de détails.
Paiement informatique
Paiement sur site mobile
Paiement par application
Payer par carte
Scannez le code pour payer
Transfert de compte
Paiement du mini-programme
...
Paiement du compte officiel
Paiement du mini-programme
Paiement H5
Scannez le code pour payer
Paiement par application
Payer par carte
...
Paiement du mini-programme
...
Paiement sur site mobile
Paiement sur site informatique
Payer par carte
Scannez le code pour payer
...
Paiement par scan code intégré (WeChat, Alipay, UnionPay, e-finance)
...
le compositeur nécessite yansongda/pay:~3.7.0 -vvv
<?phpnamespace AppHttpControllers;utiliser YansongdaPayPay;class AlipayController {protected $config = ['alipay' => ['default' => [// Obligatoire - app_id attribué par Alipay 'app_id' => '2016082000295641', // Obligatoire - chaîne de clé privée de l'application ou chemin 'app_secret_cert ' => '89iZ2iC16H6/6a3YcP+hDZUjiNGQx9cuwi9eJyykvcwhD...',// Obligatoire - chemin du certificat de clé publique de l'application 'app_public_cert_path' => '/Users/yansongda/pay/cert/appCertPublicKey_2016082000295641.crt',// Obligatoire - Chemin du certificat de clé publique Alipay 'alipay_public_cert_path' => '/Users/yansongda/pay/cert/alipayCertPublicKey_RSA2.crt',// Obligatoire - Chemin du certificat racine 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',// Facultatif - jeton d'autorisation d'application tierce 'app_auth_token' => '' ,// Facultatif - l'identifiant du fournisseur de services en mode fournisseur de services, utilisez ce paramètre 'service_provider_id' => lorsque le mode est Pay::MODE_SERVICE '',// Facultatif - par défaut en mode normal. Les options facultatives sont : MODE_NORMAL, MODE_SANDBOX, MODE_SERVICE'mode' => Pay::MODE_NORMAL, ], ], 'logger' => [ // optionnel'enable' => false,'file' => './logs/alipay.log','level' => 'info', // Il est recommandé que la production le niveau d'environnement doit être ajusté aux informations, l'environnement de développement est debug 'type' => 'single', // facultatif, facultatif daily.'max_file' => 30, // facultatif, valide lorsque le type est quotidien, 30 jours par défaut], 'http' = > [ // optionnel'timeout' => 5.0,'connect_timeout' => 5.0, // Pour plus d'éléments de configuration, veuillez vous référer à [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html )] , ];fonction publique web() { Pay::config($this->config); $result = Pay::alipay()->web(['out_trade_no' => ''.time(),'total_amount' => '0.01','subject' => 'yansongda test-1', ]); renvoie $résultat ; }fonction publique returnCallback() { Pay::config($this->config); $data = Pay::alipay()->callback(); // Oui, la vérification de la signature est aussi simple ! // Numéro de commande : $data->out_trade_no// Numéro de transaction Alipay : $data->trade_no// Montant total de la commande : $data->total_amount} fonction publique notifyCallback() { Pay::config($this->config); try{$data = Pay::alipay()->callback(); // Oui, la vérification de la signature est aussi simple ! // Veuillez faire votre propre jugement sur trade_status et d'autres logiques. Dans la notification commerciale d'Alipay, Alipay considérera le paiement de l'acheteur comme réussi uniquement lorsque le statut de notification de transaction est TRADE_SUCCESS ou TRADE_FINISHED. // 1. Le commerçant doit vérifier si out_trade_no dans les données de notification est le numéro de commande créé dans le système du commerçant ; // 2. Déterminer si le total_amount est bien le montant réel de la commande (c'est-à-dire le montant lorsque le commerçant la commande a été créée); // 3 , Vérifiez le seller_id (ou seller_email) dans la notification S'il s'agit de l'opérateur correspondant du document out_trade_no (parfois, un commerçant peut avoir plusieurs seller_id/seller_email) ; // 4. Vérifiez si l'app_id est le commerçant lui-même ; // 5. Autres situations de logique métier} catch (Throwable $e) {dd($e); }return Pay::alipay()->success(); } }
<?phpnamespace AppHttpControllers;utiliser YansongdaPayPay;class WechatController {protected $config = ['wechat' => ['default' => [// Obligatoire - numéro de commerçant 'mch_id' => '', // Facultatif - clé privée du commerçant v2 'mch_secret_key_v2' => '', // Obligatoire - Clé secrète du marchand v3 'mch_secret_key' => '', // Obligatoire - Clé privée du marchand Chaîne ou chemin 'mch_secret_cert' => '',// Obligatoire - chemin du certificat de clé publique du commerçant 'mch_public_cert_path' => '',// Obligatoire 'notify_url' => 'https://yansongda.cn/wechat/ notify', // Facultatif - l'app_id du compte officiel 'mp_app_id' => '',// Facultatif - l'app_id du mini programme app_id'mini_app_id' => '',// Facultatif - l'app_id de l'application 'app_id' => '',// Facultatif - l'app_id du compte sous-officiel en mode fournisseur de services 'sub_mp_app_id' => '', // Facultatif - En mode fournisseur de services, l'app_id de la sous-application 'sub_app_id' => '', // Facultatif - En mode fournisseur de services, l'app_id de la sous-application app_id'sub_mini_app_id' => '',// Facultatif - En mode fournisseur de services, identifiant du sous-marchand'sub_mch_id' => '',// Facultatif - Chemin du certificat de clé publique de la plateforme WeChat, facultatif, le mode php-fpm est fortement recommandé Configurez ce paramètre sous 'wechat_public_cert_path' => ['45F59D4DABF31918AFCEC556D5D2C6E376675D57' => __DIR__.'/Cert/wechatpay_45F***D57.pem', ], // Facultatif - par défaut en mode normal. Les options facultatives sont : MODE_NORMAL, MODE_SERVICE'mode' => Pay::MODE_NORMAL, ] ],'logger' => [ // optionnel'enable' => false,'file' => './logs/wechat.log','level' => 'info', // Il est recommandé que la production le niveau d'environnement doit être ajusté aux informations, l'environnement de développement est debug 'type' => 'single', // facultatif, facultatif daily.'max_file' => 30, // facultatif, valide lorsque le type est quotidien, 30 jours par défaut], 'http' = > [ // optionnel'timeout' => 5.0,'connect_timeout' => 5.0, // Pour plus d'éléments de configuration, veuillez vous référer à [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html )] , ];index de fonction publique() { Pay::config($this->config); $order = ['out_trade_no' => time().'','description' => 'sujet-test','montant' => [ 'total' => 1, ],'payeur' => [ 'openid' => 'onkVf1FjWS5SBxxxxxxxx', ], ];$pay = Pay::wechat()->mp($order);// $pay->appId// $pay->timeStamp// $pay->nonceStr// $pay->package// $ pay->signType}rappel de fonction publique() { Pay::config($this->config); try{$data = Pay::wechat()->callback(); // Oui, la vérification de la signature est aussi simple ! } catch (Lavable $e) {dd($e); } return Pay::wechat()->success(); } }
<?phpnamespace AppHttpControllers;utiliser YansongdaPayPay;class DouyinController {protected $config = ['douyin' => ['default' => [// Numéro de marchand facultatif // Douyin Open Platform --> Détails de l'application --> Informations de paiement --> Gestion des produits --> Numéro de marchand 'mch_id' => '73744242495132490630', // Obligatoire - Jeton de paiement, utilisé pour la signature de rappel de paiement // Douyin Open Platform --> Détails de l'application --> Informations de paiement --> Paramètres de paiement --> Jeton (jeton) 'mch_secret_token' => 'douyin_mini_token', // Obligatoire - Paiement SALT, utilisé pour la signature du paiement // Douyin Open Platform --> Détails de l'application --> Informations de paiement --> Paramètres de paiement --> SALT'mch_secret_salt' => 'oDxWDBr4U7FAAQ8hnGDm29i4A6pbTMDKme4WLLvA',//Obligatoire - Mini programme app_id// Douyin Open Platform --> Détails de l'application --> Informations de paiement --> Paramètres de paiement --> Mini programme appid 'mini_app_id' => 'tt226e54d3bd581bf801',// Facultatif - Identifiant du fournisseur de services de plateforme ouverte Douyin 'thirdparty_id' => '', // Facultatif - Adresse de rappel de paiement Douyin 'notify_url' => 'https://yansongda.cn/douyin/notify', ], ],'logger' => [ // optionnel'enable' => false,'file' => './logs/alipay.log','level' => 'info', // Il est recommandé que la production le niveau d'environnement doit être ajusté aux informations, l'environnement de développement est debug 'type' => 'single', // facultatif, facultatif daily.'max_file' => 30, // facultatif, valide lorsque le type est quotidien, 30 jours par défaut], 'http' = > [ // optionnel'timeout' => 5.0,'connect_timeout' => 5.0, // Pour plus d'éléments de configuration, veuillez vous référer à [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html )] , ];paiement de la fonction publique() { Pay::config($this->config); $result = Pay::douyin()->mini(['out_order_no' => date('YmdHis').mt_rand(1000, 9999),'total_amount' => 1,'subject' => 'Yan Songda- test - sujet - 01','body' => 'Yan Songda - test - body - 01','valid_time' => 600,'expand_order_info' => json_encode(['original_delivery_fee' => 15,'actual_delivery_fee' => 10]) ]); renvoie $résultat ; }rappel de fonction publique() { Pay::config($this->config); try{$data = Pay::douyin()->callback(); // Oui, la vérification de la signature est aussi simple ! } catch (Lavable $e) {dd($e) }return Pay::douyin()->success(); } }
<?phpnamespace AppHttpControllers;utiliser YansongdaPayPay;class JsbController {protected $config = ['jsb' => ['default' => [// Code de service 'svr_code' => '',// Obligatoire - ID de partenaire 'partner_id' => '',// Obligatoire -Public et numéro de paire de clés privées 'public_key_code' => '00', // Obligatoire - Clé privée du commerçant (signature cryptée) 'mch_secret_cert_path' => '',//Chemin de certificat de clé publique requis du commerçant (fourni par la Banque du Jiangsu pour la vérification de la signature)'mch_public_cert_path' => '',//Clé publique obligatoire de la Banque du Jiangsu (utilisée pour décrypter les données renvoyées par la Banque de Jiangsu) 'jsb_public_cert_path' => '', //Adresse de notification de paiement 'notify_url' => '', // Facultatif - la valeur par défaut est le mode normal. Les options facultatives sont : MODE_NORMAL : environnement officiel, MODE_SANDBOX : environnement de test 'mode' => Pay::MODE_NORMAL, ] ],'logger' => [ // optionnel'enable' => false,'file' => './logs/epay.log','level' => 'info', // Il est recommandé que la production le niveau d'environnement doit être ajusté aux informations, l'environnement de développement est debug 'type' => 'single', // facultatif, facultatif daily.'max_file' => 30, // facultatif, valide lorsque le type est quotidien, 30 jours par défaut], 'http' = > [ // optionnel'timeout' => 5.0,'connect_timeout' => 5.0, // Pour plus d'éléments de configuration, veuillez vous référer à [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html )] , ];index de fonction publique() { Pay::config($this->config); $order = ['outTradeNo' => time().'','proInfo' => 'subject-test','totalFee'=> 1, ];$pay = Pay::jsb()->scan ($order); }fonction publique notifyCallback() { Pay::config($this->config);try{$data = Pay::jsb()->callback(); // Oui, la vérification de signature est aussi simple ! } catch (Lavable $e) {dd($e); } return Pay::jsb()->success(); } }
En raison des limites de l'environnement de test et d'utilisation, seules les passerelles de paiement pertinentes de « Alipay », « WeChat Pay », « Douyin Pay », « UnionPay » et « Jiangsu Bank » ont été développées dans ce projet.
Si vous avez besoin d'autres passerelles de paiement ou si vous trouvez du code qui doit être amélioré dans ce projet, vous êtes invités sur Fork et soumettez un PR !
MIT