亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

Maison Applet WeChat Développement WeChat ThinkPHP implémente le paiement WeChat (paiement jsapi)

ThinkPHP implémente le paiement WeChat (paiement jsapi)

Jun 07, 2018 pm 03:52 PM
tp5 Payer

Cet article présente principalement le tutoriel détaillé sur la mise en ?uvre du paiement WeChat (paiement jsapi) dans ThinkPHP. Les amis dans le besoin peuvent s'y référer

J'ai déjà écrit un article sur le processus de mise en ?uvre du paiement WeChat (. jsapi payment) en PHP, voir l'article pour plus de détails : PHP implémente le processus de paiement WeChat (paiement jsapi).

L'environnement de l'époque n'utilisait pas de framework. Il était implémenté en créant directement un nouveau répertoire sous le répertoire pointé par un nom de domaine puis en accédant au répertoire. Cependant, il y avait encore quelques problèmes lors de l'application. au framework. Dans ThinkPHP, en raison des règles de routage, il y a une divergence avec le répertoire d'autorisation de paiement, donc une erreur sera signalée. Cet article parle du processus d'intégration du paiement WeChat dans TP.

Le SDK et la documentation produits par Goose Factory sont si déroutants que vous ne pouvez pas les comprendre. La documentation et le SDK ne devraient-ils pas être aussi simples et compréhensibles que possible?? Est-il possible que seule une refactorisation vigoureuse puisse montrer la superbe technologie des programmeurs de Goose Factory ? Euh... ai-je exposé mes attributs de rookie... En fait, le SDK est assez simple à utiliser, mais comme je l'ai vu dans l'article précédent, la fonction de rappel de fin de paiement est vraiment déroutante.

Pour ceux qui ne veulent pas être contournés par le fonctionnaire et souhaitent utiliser le paiement WeChat dans TP, vous pouvez jeter un ?il au SDK de paiement adapté à TP qui a été restructuré et rationalisé par un ma?tre basé sur les documents officiels. J'ai téléchargé le code source et je l'ai lu. Eh bien, le code est écrit de manière élégante et concise, et le processus est simple et facile à comprendre. Consultez l'article de blog pour plus de détails?: http://baijunyao.com/article/78

J'ai toujours froncé les sourcils, j'ai utilisé le SDK officiel et j'ai réussi à mettre en ?uvre le paiement?:

<.>

1. Téléchargement et modification du SDK

Je n'entrerai pas dans les détails à ce sujet Si vous ne le savez pas, vous pouvez lire mon dernier article : PHP implémente le paiement WeChat (jsapi. paiement), qui détaille les fichiers téléchargés qui doivent être modifiés.

2. Paramètres du compte public

A. Vous devez toujours configurer un nom de domaine autorisé pour la page Web, ce n'est rien de spécial?;

B. Quelque chose à noter ici Répertoire d'autorisation de paiement, utilisant TP, de nombreuses personnes utilisent le mode réécriture (mode REWRITE) ou utilisent le mode pseudo-statique tout en utilisant le mode REWRITE. Le lien généré à ce moment est : http://serverName/Home/Blog/read. /id/1;

Si vous utilisez le mode PATHINFO, le lien généré est?: http://serverName/index.php/Home/Blog/read/id/1, comme sous le module Accueil Utilisation une méthode dans le contr?leur de blog pour payer. Le répertoire autorisé pour notre paiement doit être http://serverName/Home/Blog/ ou http://serverName/index.php/Home/Blog/, qui est basé sur notre propre TP. . Dépend du modèle d'URL défini.

3. Processus de paiement

(1) Commande unifiée

La configuration des paramètres de paiement pour le passage de la commande est fondamentalement différente de la précédente Modification, la chose importante à laquelle il faut prêter attention est le lien de vérification du rappel de paiement. Comme il doit être appelé plusieurs fois, j'ai encapsulé la configuration des paramètres directement dans Application/Common/Common/function.php. Mon SDK est placé dans le répertoire Api sous le. répertoire racine du projet, donc la fonction Vendor n’est pas utilisée lors de l’introduction du SDK.

/** 
 * 微信支付 
 * @param string $openId  openid 
 * @param string $goods  商品名稱 
 * @param string $attach  附加參數(shù),我們可以選擇傳遞一個參數(shù),比如訂單ID 
 * @param string $order_sn 訂單號 
 * @param string $total_fee 金額 
 */ 
function wxpay($openId,$goods,$order_sn,$total_fee,$attach){ 
 require_once APP_ROOT."/Api/wxpay/lib/WxPay.Api.php"; 
 require_once APP_ROOT."/Api/wxpay/payment/WxPay.JsApiPay.php"; 
 require_once APP_ROOT.&#39;/Api/wxpay/payment/log.php&#39;; 
 //初始化日志 
 $logHandler= new CLogFileHandler(APP_ROOT."/Api/wxpay/logs/".date(&#39;Y-m-d&#39;).&#39;.log&#39;); 
 $log = Log::Init($logHandler, 15); 
 $tools = new JsApiPay(); 
 if(empty($openId)) $openId = $tools->GetOpenid(); 
 $input = new WxPayUnifiedOrder(); 
 $input->SetBody($goods);     //商品名稱 
 $input->SetAttach($attach);     //附加參數(shù),可填可不填,填寫的話,里邊字符串不能出現(xiàn)空格 
 $input->SetOut_trade_no($order_sn);   //訂單號 
 $input->SetTotal_fee($total_fee);   //支付金額,單位:分 
 $input->SetTime_start(date("YmdHis"));  //支付發(fā)起時間 
 $input->SetTime_expire(date("YmdHis", time() + 600));//支付超時 
 $input->SetGoods_tag("test3"); 
 //$input->SetNotify_url("http://".$_SERVER[&#39;HTTP_HOST&#39;]."/payment.php"); //支付回調(diào)驗證地址 
 $input->SetNotify_url("http://".$_SERVER[&#39;HTTP_HOST&#39;]."/payment.php/WexinApi/WeixinPay/notify"); 
 $input->SetTrade_type("JSAPI");    //支付類型 
 $input->SetOpenid($openId);     //用戶openID 
 $order = WxPayApi::unifiedOrder($input); //統(tǒng)一下單 
 $jsApiParameters = $tools->GetJsApiParameters($order); 
 return $jsApiParameters; 
}
Attention, attention, veuillez mettre en évidence les points importants au tableau?:

Le lien de vérification du rappel de paiement doit être sans autorisation pour vérifier. Si vous accédez vous-même à ce lien, vous devez toujours vous connecter. Si vous souhaitez vous inscrire pour vérification, n'essayez pas. Il doit s'agir d'un lien accessible et aucune série de paramètres ne doit être transmise.

Le meilleur est simple et brut http://serverName/xxx.php J'ai réécrit un fichier d'entrée spécial pour le rappel de paiement dans le répertoire suivant, similaire à index.php .php. son module (WexinApi), son contr?leur (WeixinPay) et sa méthode (notify) correspondants dans le répertoire Application/?:

// 檢測PHP環(huán)境 
if(version_compare(PHP_VERSION,&#39;5.3.0&#39;,&#39;<&#39;)) die(&#39;require PHP > 5.3.0 !&#39;); 
// $_GET[&#39;m&#39;]=&#39;Admin&#39;; 
// 開啟調(diào)試模式 建議開發(fā)階段開啟 部署階段注釋或者設(shè)為false 
define(&#39;APP_DEBUG&#39;,True); 
//指定模塊控制器和方法 
$_GET[&#39;m&#39;]=&#39;WexinApi&#39;; 
$_GET[&#39;c&#39;]=&#39;WeixinPay&#39;; 
$_GET[&#39;a&#39;]=&#39;notify&#39;; 
// 定義應(yīng)用目錄 
define(&#39;APP_PATH&#39;,&#39;./Application/&#39;); 
define("APP_ROOT",dirname(__FILE__)); 
// 引入ThinkPHP入口文件 
require &#39;./ThinkCore/ThinkCore.php&#39;; 
// 親^_^ 后面不需要任何代碼了 就是如此簡單
Visitez maintenant http://serverName/payment.php, il ira directement sur http ://serverName/payment.php/WexinApi/WeixinPay/notify De cette fa?on, le lien de vérification de rappel peut être écrit sous la forme http://serverName/payment.php ou http://serverName/payment.php/WexinApi /. WeixinPayer/notifier .

(2) Initier le paiement

est toujours très simple :

/** 
* 支付測試 
* 微信訪問:http://daoshi.sdxiaochengxu.com/payment.php/WexinApi/WeixinPay/pay 
*/ 
public function pay(){ 
 $order_sn = getrand_num(true); 
 $openId = &#39;&#39;; 
 $jsApiParameters = wxpay($openId,&#39;江南極客&#39;,$order_sn,1); 
 $this->assign(array( 
  &#39;data&#39; => $jsApiParameters 
 )); 
 $this->display(); 
} 

<html> 
<head> 
 <meta http-equiv="content-type" content="text/html;charset=utf-8"/> 
 <meta name="viewport" content="width=device-width, initial-scale=1"/> 
 <title>小尤支付測試</title> 
 <script type="text/javascript"> 
 //調(diào)用微信JS api 支付 
 function jsApiCall() 
 { 
  var data={$data}; 
  WeixinJSBridge.invoke( 
   &#39;getBrandWCPayRequest&#39;, data, 
   function(res){ 
    WeixinJSBridge.log(res.err_msg); 
    //alert(&#39;err_code:&#39;+res.err_code+&#39;err_desc:&#39;+res.err_desc+&#39;err_msg:&#39;+res.err_msg); 
    //alert(res.err_code+res.err_desc+res.err_msg); 
    //alert(res); 
    if(res.err_msg == "get_brand_wcpay_request:ok"){ 
     alert("支付成功!"); 
     window.location.href="http://m.blog.csdn.net/article/details?id=72765676" rel="external nofollow" ; 
    }else if(res.err_msg == "get_brand_wcpay_request:cancel"){ 
     alert("用戶取消支付!"); 
    }else{ 
     alert("支付失敗!"); 
    } 
   } 
  ); 
 } 
 function callpay() 
 { 
  if (typeof WeixinJSBridge == "undefined"){ 
   if( document.addEventListener ){ 
    document.addEventListener(&#39;WeixinJSBridgeReady&#39;, jsApiCall, false); 
   }else if (document.attachEvent){ 
    document.attachEvent(&#39;WeixinJSBridgeReady&#39;, jsApiCall); 
    document.attachEvent(&#39;onWeixinJSBridgeReady&#39;, jsApiCall); 
   } 
  }else{ 
   jsApiCall(); 
  } 
 } 
 </script> 
</head> 
<body> 
 <br/> 
 <font color="#9ACD32"><b>該筆訂單支付金額為<span style="color:#f00;font-size:50px">1分</span>錢</b></font><br/><br/> 
 <font color="#9ACD32"><b><span style="color:#f00;font-size:50px;margin-left:40%;">1分</span>錢也是愛</b></font><br/><br/> 
 <p align="center"> 
  <button style="width:210px; height:50px; border-radius: 15px;background-color:#FE6714; border:0px #FE6714 solid; cursor: pointer; color:white; font-size:16px;" type="button" onclick="callpay()" >果斷買買買^_^</button> 
 </p> 
</body> 
</html>
Mais vous devez faire attention à l'URL de la page de paiement, car l'URL du paiement La page doit avoir de nombreux paramètres, je viens de mentionner le mode REWRITE utilisé dans TP. Votre lien est similaire à [ http://serverName/Home/Blog/read/id/1 ], qui peut avoir plus de paramètres pour le moment. WeChat Pay pensera que vous Le répertoire d'autorisation de paiement est [http://serverName/Home/Blog/read/id/], mais votre véritable répertoire d'autorisation est [http://serverName/Home/Blog/], donc une erreur sera signalé. La solution est de reconstruire l'URL lors de l'entrée sur la page de paiement et de l'écrire en mode normal, qui est [http://serverName/Home/Blog/read?id=1], et c'est tout.

(3) Prend en charge le rappel de réussite

Maintenant que le paiement est terminé, vous entrerez la méthode correspondant au lien précédemment écrit, c'est-à-dire [ http://serverName/payment.php/WexinApi/WeixinPay/notify]?:

//微信支付回調(diào)驗證 
public function notify(){ 
 $xml = $GLOBALS[&#39;HTTP_RAW_POST_DATA&#39;]; 
 // 這句file_put_contents是用來查看服務(wù)器返回的XML數(shù)據(jù) 測試完可以刪除了 
 file_put_contents(&#39;./Api/wxpay/logs/log.txt&#39;,$xml,FILE_APPEND); 
 //將服務(wù)器返回的XML數(shù)據(jù)轉(zhuǎn)化為數(shù)組 
 //$data = json_decode(json_encode(simplexml_load_string($xml,&#39;SimpleXMLElement&#39;,LIBXML_NOCDATA)),true); 
 $data = xmlToArray($xml); 
 // 保存微信服務(wù)器返回的簽名sign 
 $data_sign = $data[&#39;sign&#39;]; 
 // sign不參與簽名算法 
 unset($data[&#39;sign&#39;]); 
 $sign = $this->makeSign($data); 
 // 判斷簽名是否正確 判斷支付狀態(tài) 
 if ( ($sign===$data_sign) && ($data[&#39;return_code&#39;]==&#39;SUCCESS&#39;) && ($data[&#39;result_code&#39;]==&#39;SUCCESS&#39;) ) { 
  $result = $data; 
  // 這句file_put_contents是用來查看服務(wù)器返回的XML數(shù)據(jù) 測試完可以刪除了 
  file_put_contents(&#39;./Api/wxpay/logs/log1.txt&#39;,$xml,FILE_APPEND); 
  //獲取服務(wù)器返回的數(shù)據(jù) 
  $order_sn = $data[&#39;out_trade_no&#39;]; //訂單單號 
  $order_id = $data[&#39;attach&#39;];  //附加參數(shù),選擇傳遞訂單ID 
  $openid = $data[&#39;openid&#39;];   //付款人openID 
  $total_fee = $data[&#39;total_fee&#39;]; //付款金額 
  //更新數(shù)據(jù)庫 
  $this->updateDB($order_id,$order_sn,$openid,$total_fee); 
 }else{ 
  $result = false; 
 } 
 // 返回狀態(tài)給微信服務(wù)器 
 if ($result) { 
  $str=&#39;<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>&#39;; 
 }else{ 
  $str=&#39;<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[簽名失敗]]></return_msg></xml>&#39;; 
 } 
 echo $str; 
 return $result; 
}
Pour des raisons de sécurité, la signature renvoyée doit être revérifiée?:

/** 
* 生成簽名 
* @return 簽名,本函數(shù)不覆蓋sign成員變量 
*/ 
protected function makeSign($data){ 
 //獲取微信支付秘鑰 
 require_once APP_ROOT."/Api/wxpay/lib/WxPay.Api.php"; 
 $key = \WxPayConfig::KEY; 
 // 去空 
 $data=array_filter($data); 
 //簽名步驟一:按字典序排序參數(shù) 
 ksort($data); 
 $string_a=http_build_query($data); 
 $string_a=urldecode($string_a); 
 //簽名步驟二:在string后加入KEY 
 //$config=$this->config; 
 $string_sign_temp=$string_a."&key=".$key; 
 //簽名步驟三:MD5加密 
 $sign = md5($string_sign_temp); 
 // 簽名步驟四:所有字符轉(zhuǎn)為大寫 
 $result=strtoupper($sign); 
 return $result; 
}

至此,TP中微信支付也就搞定了。這是集成了官方的SDK實現(xiàn)的,如果不使用SDK,可以使用更簡單的方法,見:PHP實現(xiàn)微信支付(jsapi支付)和退款(無需集成支付SDK)

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,更多相關(guān)內(nèi)容請關(guān)注PHP中文網(wǎng)!

相關(guān)推薦:

php服務(wù)端集成支付寶APP支付

基于thinkPHP實現(xiàn)的微信自定義分享功能


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefa?on, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment payer une course en taxi sur Baidu Maps Introduction aux étapes de paiement d'une course en taxi. Comment payer une course en taxi sur Baidu Maps Introduction aux étapes de paiement d'une course en taxi. Mar 13, 2024 am 10:04 AM

Baidu Map APP est désormais devenu le logiciel de navigation de voyage préféré pour de nombreux utilisateurs, de sorte que certaines des fonctions ici sont complètes et peuvent être sélectionnées et utilisées gratuitement pour résoudre certains des problèmes que vous pouvez rencontrer lors de vos déplacements quotidiens. vos propres itinéraires de voyage, planifiez certains de vos propres projets de voyage et après avoir vérifié les itinéraires correspondants, vous pouvez choisir les méthodes de voyage appropriées en fonction de vos propres besoins. Ainsi, que vous choisissiez des transports en commun, le vélo, la marche ou le taxi peuvent tous satisfaire. Il existe des itinéraires de navigation correspondants qui peuvent vous conduire à un certain endroit. Ensuite, tout le monde se sentira plus à l'aise s'il choisit de prendre un taxi. Il existe de nombreux chauffeurs. Ils sont tous capables de prendre des commandes en ligne et il existe des taxis. devenir super

Payez en utilisant PHP et l'API PayPal Payez en utilisant PHP et l'API PayPal Jun 19, 2023 pm 04:13 PM

Avec la popularité croissante des transactions en ligne, les méthodes de paiement se diversifient progressivement, parmi lesquelles PayPal est très populaire en tant que méthode de paiement largement utilisée. Si vous souhaitez utiliser PayPal pour traiter des transactions sur votre site Web ou votre application, vous pouvez utiliser PHP et l'API PayPal pour terminer facilement le processus de paiement. PayPalAPI est un ensemble d'interfaces de programmation permettant d'interagir avec PayPal. Grace à l'API, vous pouvez recevoir des notifications de PayPal, consulter les dernières informations sur les transactions et initier des paiements.

Comment l'application Uniapp implémente la gestion des paiements et des commandes Comment l'application Uniapp implémente la gestion des paiements et des commandes Oct 19, 2023 am 10:37 AM

uniapp est un framework de développement d'applications multiplateforme qui peut développer simultanément de petits programmes, des applications et H5. Dans les applications Uniapp, le paiement et la gestion des commandes sont des besoins très courants. Cet article présentera comment implémenter les fonctions de paiement et la gestion des commandes dans l'application uniapp, et donnera des exemples de code spécifiques. 1. Implémentation de la fonction de paiement La fonction de paiement est la clé pour réaliser des transactions en ligne, et elle nécessite généralement l'intégration du SDK d'une plateforme de paiement tierce. Voici les étapes spécifiques pour mettre en ?uvre la fonction de paiement dans uniapp?: Inscrivez-vous et obtenez une plateforme de paiement tierce.

Comment payer pour prendre le bus à Wuhan Comment payer pour prendre le bus à Wuhan Oct 13, 2022 pm 02:17 PM

Méthodes de paiement pour prendre les bus à Wuhan?: 1. Pour le paiement en espèces, vous devez préparer suffisamment de monnaie à l'avance et mettre l'argent directement dans la fente à monnaie?; 2. Glissez la carte Wuhan Tong. Le nom complet de Wuhan Tong est Wuhan City Card. , qui est une carte à circuit intégré, également appelée carte à puce?; 3. Carte de bus électronique Alipay Obtenez d'abord une carte de bus électronique Wuhan dans Alipay, puis scannez directement le code QR pour déduire l'argent lorsque vous montez dans le bus 4?; . Paiement du code de bus WeChat, ouvrez l'applet WeChat "Ride Code", activez le "Ride Code" de Wuhan et vous pouvez directement scanner le code QR pour déduire le paiement et monter dans le bus.

Que signifie le paiement Paynow ? Que signifie le paiement Paynow ? Sep 30, 2022 am 11:01 AM

Le paiement PayNow est un service de transfert électronique. Les utilisateurs peuvent directement lancer des transferts SGD en temps réel vers le bénéficiaire via le numéro de téléphone mobile, le numéro de carte d'identité/FIN, le numéro UEN ou le code QR PayNow spécifié par le bénéficiaire sans avoir besoin de l'autre partie. Informations sur le compte bancaire.

établir un tableau de paiement des commandes pour le système d'épicerie dans MySQL établir un tableau de paiement des commandes pour le système d'épicerie dans MySQL Nov 01, 2023 pm 03:48 PM

Pour établir le tableau de paiement des commandes du système d'épicerie dans MySQL, des exemples de code spécifiques sont nécessaires. Avec le développement d'Internet, les achats sont devenus de plus en plus pratiques. Dans le processus d'achat, le paiement de la commande constitue une partie importante du processus d'achat. Le système d'épicerie doit non seulement disposer d'une fonction de génération de commandes, mais également d'un processus de paiement complet, car seul un paiement réussi peut être considéré comme l'achèvement d'une transaction. Cet article décrira comment créer un tableau de paiement de commande pour le système d'épicerie dans MySQL et fournira des exemples de code spécifiques. 1. Conception du tableau de paiement des commandes. Le tableau de paiement des commandes dans le système d'épicerie stocke les commandes.

Que signifie le numéro bancaire du système de paiement ? Que signifie le numéro bancaire du système de paiement ? Nov 17, 2022 pm 12:09 PM

Le numéro de banque du système de paiement est la marque d'identification unique d'une banque locale?; le numéro de banque du système de paiement est un numéro différent pour chaque point de vente bancaire, et le nom de la banque peut être interrogé via le numéro de banque. Le numéro de banque est principalement utilisé dans les activités de paiement et de règlement interrégionales. Le numéro de banque se compose de 12 chiffres?: code bancaire à 3 chiffres + code de ville à 4 chiffres + numéro de banque à 4 chiffres + 1 chiffre de contr?le.

Comment fermer le paiement Meituan Takeout Express Comment fermer le paiement Meituan Takeout Express Mar 27, 2024 am 10:41 AM

Dans la vie moderne trépidante, Meituan Takeaway est profondément apprécié par les consommateurs pour ses services pratiques et ses choix riches. Parmi eux, la fonction de paiement ultra-rapide apporte une grande commodité aux utilisateurs. Le paiement peut être effectué en un seul clic, éliminant ainsi les étapes de saisie fastidieuses. Cependant, de nombreux utilisateurs n'aiment pas payer directement sans confirmation et souhaitent donc désactiver cette fonctionnalité. Alors comment désactiver le paiement rapide de Meituan Waimai ? Dans ce qui suit, l'éditeur de ce site vous proposera un tutoriel de configuration détaillé étape par étape, j'espère qu'il pourra vous aider ! 1. Cliquez sur l'ic?ne de raccourci ? Meituan Takeout ? sur le bureau du téléphone mobile. 2. Connectez-vous à l'application de plats à emporter Meituan sur votre téléphone mobile et cliquez sur ? Mon ? dans le coin inférieur droit. 3. Dans l'interface Mon, cliquez sur ??Entrer dans le portefeuille??. 4. Sur l'interface Meituan Wallet, cliquez sur l'ic?ne ? Paramètres ? dans le coin supérieur droit.

See all articles