La simple mention de la «conformité PCI» suscite généralement une combinaison d'apparence confuse et de paumes en sueur des propriétaires d'entreprise qui acceptent les paiements par carte de crédit en ligne. Mais qu'est-ce que cela signifie vraiment?
C'est un sujet compliqué, mais la version courte est que les principales sociétés de cartes de crédit ont fondé un conseil appelé le Payment Card Industry Security Standards Council (PCI SSC) en 2006 afin de créer un ensemble de règles normalisant les politiques et procédures de sécurité Que les commerçants doivent suivre (PCI DSS) lors du traitement et du stockage des informations de carte de crédit sensibles. Afin de déterminer si vos systèmes sont conformes, vous choisissez normalement le questionnaire d'auto-évaluation approprié (SAQ) dans l'une des huit options, puis répondez à une série de questions pour déterminer si vous étiez, en fait, conforme. Les grandes entreprises utilisent souvent les services d'un évaluateur de sécurité qualifié (QSA) pour les aider à remplir SAQ D (le plus impliqué des SAQ), qui peut coûter des centaines de milliers de dollars. Et pour aggraver les choses: si vos systèmes sont compromis et qu'il est déterminé qu'ils n'étaient pas conformes lorsqu'ils ont été violés, vous pourriez être responsable des amendes pouvant aller jusqu'à 500 000 $ par incident.
Alors, qu'est-ce qu'un propriétaire de petite entreprise est censé faire? C’est là que les solutions de paiement Braintree entrent en jeu. Ils proposent deux solutions pour minimiser votre charge de conformité PCI: Redirection transparente et BrainTree.js. Je dois mentionner que ni Braintrene ni aucun autre fournisseur de services conformes PCI DSS ne peuvent vous dire quel SAQ remplir, ou si vos systèmes sont conformes. Mais ils se sont associés à des mesures de sécurité, un QSA de pointe, pour fournir une solution gratuite pour aider tous leurs clients à atteindre et à maintenir la conformité PCI. Et d'après leur expérience, les clients utilisant une redirection transparente ou BrainTree.js ont généralement pu remplir SAQ A, ce qui est beaucoup moins impliqué (et donc coûteux) que SAQ D. Vous pouvez en savoir plus ici.
mais suffisamment de fond; Écrivons du code.
Cet article va se concentrer sur la méthode de redirection transparente. La première chose que nous devons faire est de se diriger vers Braintree pour obtenir nos clés d'API côté serveur. Pour ceux d'entre vous sans compte de production, indiquez votre navigateur vers le bac à sable Braintree et inscrivez-vous à un compte de test. Connectez-vous et cliquez sur «Compte -> Keys API». Ensuite, cliquez sur le bouton «Générer un nouveau» et enfin cliquez sur «Afficher» sous la colonne de clé privée de la touche API nouvellement générée. Vous serez amené à l'écran suivant, qui contient toutes les informations dont vous avez besoin pour configurer la bibliothèque client Braintree.
Vous pouvez le voir a même un outil qui génère le code de configuration pour vous dans une variété de langues.
Il est maintenant temps d'installer la bibliothèque client Braintree PHP réelle. Nous pouvons le faire avec Composer en exécutant la commande suivante:
composer require braintree/braintree:*
L'un des principaux facteurs qui contribuent à déterminer si vous devez remplir SAQ D ou SAQ A est de savoir si les données de carte de crédit sont transmises via votre système. Et au début du modèle de serveur à serveur (S2S) typique, votre serveur Web enverrait un formulaire de paiement au navigateur du client. Après avoir rempli le formulaire, le client appuyerait sur Soumettre, qui publierait les données sur votre serveur Web, ce qui allait à l'avenir, certaines de ces données sur Braintree pour la validation et le traitement. Cela ressemblerait à ceci:
Avec une redirection transparente, cependant, l'action du formulaire est définie de sorte que le formulaire se publie directement sur les serveurs de Braintree, et la réponse est renvoyée au navigateur client. Le navigateur est ensuite redirigé vers un script sur le serveur Web à l'aide d'une redirection HTTP 303. Enfin, le script de serveur Web confirme la transaction avec Braintree et présente les résultats au navigateur client. Donc ce modèle ressemble plus à ceci:
Maintenant que nous avons la théorie à notre actif, allons-y et écrivons du code. Ceux d'entre vous qui souhaitent voir la version complète peuvent le trouver sur GitHub.
La première chose que nous allons faire est de créer un formulaire HTML très basique afin que nous puissions saisir certaines données à envoyer à Braintree pour le traitement. Je vais rendre cela aussi simple que possible afin que nous puissions nous concentrer sur les fonctionnalités.
composer require braintree/braintree:*
Il n'y a rien de compliqué ici. La seule chose que vous remarquerez, c'est que les noms de champ de saisie sont au format de tableau. Vous pouvez voir une liste complète des noms de champ valides ici. L'autre chose que je vais souligner de cette page est que si vous utilisez un framework qui a des problèmes avec l'utilisation des tableaux pour les noms d'entrée (je vous regarde, Zend Framework!), Alors vous pouvez utiliser un autre double soulignement syntaxe. Ainsi, votre entrée de date d'expiration ressemblerait à ceci:
<span><span><!doctype html></span> </span> <span><span><span><html</span> lang<span>="en"</span>></span> </span> <span><span><span><body</span>></span> </span> <span><span><span><div</span> id<span>="wrap"</span>></span> </span> <span><span><span><form</span> method<span>="post"</span> action<span>=""</span> autocomplete<span>="off"</span>></span> </span> <span><span><span><label</span>></span>Name on Card: <span><span><input</span> type<span>="text"</span> name<span>="transaction[credit_card][cardholder_name]"</span>></span><span><span></label</span>></span> </span> <span><span><span><label</span>></span>Card Number: <span><span><input</span> type<span>="text"</span> name<span>="transaction[credit_card][number]"</span>></span><span><span></label</span>></span> </span> <span><span><span><label</span>></span>CVV: <span><span><input</span> type<span>="text"</span> name<span>="transaction[credit_card][cvv]"</span> class<span>="short"</span>></span><span><span></label</span>></span> </span> <span><span><span><label</span>></span>Expiration Date (MM/YYYY): <span><span><input</span> type<span>="text"</span> name<span>="transaction[credit_card][expiration_date]"</span> class<span>="short"</span>></span><span><span></label</span>></span> </span> <span><span><span><input</span> type<span>="submit"</span> value<span>="submit payment"</span>></span> </span> <span><span><span></form</span>></span> </span> <span><span><span></div</span>></span> </span> <span><span><span></body</span>></span> </span> <span><span><span></html</span>></span></span>
La seule autre chose que vous remarquerez, c'est que j'ai ajouté un attribut «assuré automatique» à mon formulaire et que je définis sa valeur sur OFF. Braintree recommande de faire cela, et j'espère que la raison est évidente…
Il y a quelques autres choses que nous devons faire pour exploiter la magie de la redirection transparente sur notre forme. Mais avant de le faire, nous devons configurer notre script pour travailler avec l'API de BrainTree.
Avant de vous dire comment faire cela, je vais simplement mentionner que, pour plus de clarté, j'ai mis tous les PHP et HTML dans le même fichier dans mon exemple de code. J'espère qu'il va sans dire que dans un projet de production, le code de configuration irait dans le fichier bootstrap de mon projet, et que le code de traitement de formulaire irait dans une action de contrôleur ou un autre fichier distinct. Ok, assez de s'excuser - allons installer cette chose!
<span><span><span><input</span> type<span>="text"</span> name<span>="transaction__credit_card__expiration_date"</span>></span></span>
La première ligne nous permet simplement de profiter de l'autoloader du compositeur et d'utiliser la bibliothèque de Braintree sans inclure explicitement de fichiers supplémentaires. J'espère que les quatre lignes suivantes semblent familières, car elles ont été copiées textuellement de l'outil de clé API du panneau de configuration du bac à sable que je vous ai présenté dans la section précédente. De toute évidence, vous remplacerez cela par le code de votre propre compte de panneau de configuration.
La prochaine chose que je veux faire est de définir l'action de formulaire afin que notre client envoie ses données sensibles directement à Braintree, ce qui est l'intérêt de l'utilisation de TR. Heureusement, la bibliothèque Braintree rend cela très facile en fournissant un objet / méthode d'assistance. Donc, modifiez simplement votre code de formulaire comme tel:
composer require braintree/braintree:*
La seule autre chose que nous devons faire est de créer une entrée cachée qui contient une représentation hachée de l'URL que vous souhaitez Braintree pour rediriger le client après avoir soumis le formulaire, ainsi que toutes les informations que vous ne souhaitez pas pour pouvoir spécifier. Par exemple, c'est là que vous pourriez mettre le montant de la transaction. Tout comme un style, j'aime définir l'URL de retour au formulaire de paiement lui-même afin que je puisse afficher les erreurs à l'utilisateur et leur donner la possibilité de soumettre à nouveau. C'est donc à quoi cela ressemblerait:
<span><span><!doctype html></span> </span> <span><span><span><html</span> lang<span>="en"</span>></span> </span> <span><span><span><body</span>></span> </span> <span><span><span><div</span> id<span>="wrap"</span>></span> </span> <span><span><span><form</span> method<span>="post"</span> action<span>=""</span> autocomplete<span>="off"</span>></span> </span> <span><span><span><label</span>></span>Name on Card: <span><span><input</span> type<span>="text"</span> name<span>="transaction[credit_card][cardholder_name]"</span>></span><span><span></label</span>></span> </span> <span><span><span><label</span>></span>Card Number: <span><span><input</span> type<span>="text"</span> name<span>="transaction[credit_card][number]"</span>></span><span><span></label</span>></span> </span> <span><span><span><label</span>></span>CVV: <span><span><input</span> type<span>="text"</span> name<span>="transaction[credit_card][cvv]"</span> class<span>="short"</span>></span><span><span></label</span>></span> </span> <span><span><span><label</span>></span>Expiration Date (MM/YYYY): <span><span><input</span> type<span>="text"</span> name<span>="transaction[credit_card][expiration_date]"</span> class<span>="short"</span>></span><span><span></label</span>></span> </span> <span><span><span><input</span> type<span>="submit"</span> value<span>="submit payment"</span>></span> </span> <span><span><span></form</span>></span> </span> <span><span><span></div</span>></span> </span> <span><span><span></body</span>></span> </span> <span><span><span></html</span>></span></span>
Évidemment, je codant dur le montant ici, mais dans une application de production, vous généreriez cela en utilisant une logique côté serveur, ou dans le cas d'un formulaire de don avec un total non spécifié, vous créeriez un champ de formulaire et permettre à l'utilisateur d'en fournir un. Je définis également généralement l'option «Soumettre pour le règlement». Sinon, cette transaction sera simplement
Maintenant, j'ai juste besoin d'ajouter ceci comme un champ caché à ma forme comme ça:
<span><span><span><input</span> type<span>="text"</span> name<span>="transaction__credit_card__expiration_date"</span>></span></span>
Maintenant que nous sommes prêts à soumettre nos données à Braintree, nous devons ajouter du code pour traiter la réponse de redirection transparente réelle.
<span><span><?php </span></span><span> <span>require('vendor/autoload.php'); </span></span><span> </span><span> <span>Braintree_Configuration<span>::</span>environment('sandbox'); </span></span><span> <span>Braintree_Configuration<span>::</span>merchantId('YOUR_MERCHANT_ID'); </span></span><span> <span>Braintree_Configuration<span>::</span>publicKey('YOUR_PUBLIC_KEY'); </span></span><span> <span>Braintree_Configuration<span>::</span>privateKey('YOUR_PRIVATE_KEY'); </span></span><span> </span><span> <span>?></span></span>
Maintenant, découvrons ce que nous venons de faire. Lorsque l'utilisateur appuie sur le bouton Soumettre, le formulaire publié directement sur Braintree et toutes les informations sensibles du client sont stockées en toute sécurité sur leurs serveurs conformes PCI CSS. Ensuite, une redirection HTTP 303 est envoyée au navigateur, qui envoie l'utilisateur à l'URL que vous avez spécifié lors de la génération de la variable $ tr_data, et ajoute plusieurs paramètres à la chaîne de requête de l'URL.
Lorsque les données sont soumises avec succès, l'un de ces paramètres sera HTTP_STATUS, et si tout fonctionne en douceur avec les serveurs de Braintree, il sera défini sur 200. De toute évidence, vous voudriez également gérer les codes de réponse non 200, non. Mais pour l'instant, nous nous assurons simplement d'exécuter le code à l'intérieur de cette déclaration si nous avons réussi à soumettre nos informations de paiement à leur système.
La prochaine chose qui se produit est que nous devons prendre la chaîne de requête de notre redirection transparente et la renvoyer à Braintree pour terminer la transaction. Nous exécutons donc une autre fonction de bibliothèque (BrainTree_TransparentRedirect :: Confirm) et lui fournissons notre chaîne de requête URL, afin de dire à Braintree d'aller de l'avant et de traiter notre paiement. Une fois que cela se produit, Braintree renvoie notre script un objet de résultat. En interne, cet objet peut être un cerveau de cervelle_result_error ou un cerveau_result_successful, mais les deux objets ont une propriété de réussite booléenne afin que vous puissiez voir si la transaction a réussi ou non.
Vous avez également probablement remarqué que j'ai enveloppé toute la confirmation dans un bloc d'essai / capture. Le seul inconvénient de l'utilisation de la même page pour afficher le formulaire et traiter les résultats est que vous ne pouvez confirmer une chaîne de requête TR qu'une seule fois. Cela signifie que si quelqu'un frappe le bouton de rechargement après une transaction échouée, votre code essaiera de reconfirmer une chaîne de requête expirée, et Braintree lancera une exception.
Maintenant que nous avons tout ce dont nous avons besoin, nous pouvons aller de l'avant et exécuter certaines transactions de test. La documentation complète sur l'utilisation du bac à sable peut être trouvée ici, mais si vous êtes vraiment excité et que vous souhaitez exécuter une transaction réussie immédiatement, allez-y et entrez votre nom dans le «nom sur carte», 41111111111111 (4 suivi de quinze) En tant que «numéro de carte», 123 dans la boîte CVV et toute date à l'avenir comme date d'expiration. Si tout se passe bien, vous devriez pouvoir retourner au bac à sable, cliquez sur «Transactions» sous «Recherche avancée», et après avoir cliqué sur le bouton «Rechercher», consultez votre première transaction réussie.
La redirection transparente est un excellent moyen d'aider à minimiser votre charge de conformité PCI, mais il a quelques bizarreries auxquelles vous devrez vous habituer. Tout d'abord, si vous souhaitez inclure des données sur votre formulaire de paiement qui ne correspondent pas à l'une des transactions, clients ou objets de carte de crédit de Braintree, vous devez utiliser leur fonctionnalité «champ personnalisé». Disons que je voulais capturer la couleur préférée d'un utilisateur. La première chose que je ferais est de me diriger vers le panneau de configuration et de cliquer sur «Paramètres -> Traitement». Faites défiler jusqu'à la section «Fields personnalisés» et cliquez sur «Nouveau». Vous vous retrouverez sur l'écran suivant:
Le nom de l'API est ce que vous référerez dans l'attribut de nom de l'entrée du formulaire. Le nom d'affichage est pour votre référence, et vous pouvez spécifier si vous souhaitez stocker la valeur de votre champ personnalisé sur Braintree avec votre transaction, ou simplement la transmettre à votre serveur.
la collectionner est alors simplement une question d'ajouter le champ suivant à votre formulaire.
composer require braintree/braintree:*
Si vous essayez de le faire sans ajouter le champ personnalisé dans le panneau de configuration de Braintree, vous déclencheriez une erreur de validation.
En parlant de validation, TR peut compliquer la validation côté serveur de votre formulaire de paiement. Disons que je voulais exiger l'adresse e-mail de mon client. Je ne saurais pas que l'utilisateur l'avait laissé vide avant la confirmation de la transaction. La solution que j'ai trouvée est d'exécuter ma validation dans le bloc de réussite de mon script TR, puis d'annuler la transaction si mes validations ne passent pas. Cela allait donc modifier notre code comme ceci:
<span><span><!doctype html></span> </span> <span><span><span><html</span> lang<span>="en"</span>></span> </span> <span><span><span><body</span>></span> </span> <span><span><span><div</span> id<span>="wrap"</span>></span> </span> <span><span><span><form</span> method<span>="post"</span> action<span>=""</span> autocomplete<span>="off"</span>></span> </span> <span><span><span><label</span>></span>Name on Card: <span><span><input</span> type<span>="text"</span> name<span>="transaction[credit_card][cardholder_name]"</span>></span><span><span></label</span>></span> </span> <span><span><span><label</span>></span>Card Number: <span><span><input</span> type<span>="text"</span> name<span>="transaction[credit_card][number]"</span>></span><span><span></label</span>></span> </span> <span><span><span><label</span>></span>CVV: <span><span><input</span> type<span>="text"</span> name<span>="transaction[credit_card][cvv]"</span> class<span>="short"</span>></span><span><span></label</span>></span> </span> <span><span><span><label</span>></span>Expiration Date (MM/YYYY): <span><span><input</span> type<span>="text"</span> name<span>="transaction[credit_card][expiration_date]"</span> class<span>="short"</span>></span><span><span></label</span>></span> </span> <span><span><span><input</span> type<span>="submit"</span> value<span>="submit payment"</span>></span> </span> <span><span><span></form</span>></span> </span> <span><span><span></div</span>></span> </span> <span><span><span></body</span>></span> </span> <span><span><span></html</span>></span></span>
Comme vous pouvez le voir, si mes validations locales ne réussissent pas, j'utilise la bibliothèque client pour annuler la transaction, en utilisant l'ID de transaction de mon objet BrainTree_Result_Success.
Enfin, dans notre exemple de base, je n'ai pas pris la peine de remplacer les champs de formulaire pour l'utilisateur, car tous nos domaines contiennent des données de carte de crédit sensibles que Braintree se cache de notre serveur. Mais maintenant que nous avons ajouté des données clients, je peux pré-remplir ces champs moins sensibles avec des données de l'objet de résultat Braintree. Vous pouvez voir le code complet dans mon échantillon GitHub, mais l'astuce pour comprendre ce qui se passe est de savoir que l'objet BrainTree_Result_Success stocke les données de formulaire soumises par l'utilisateur dans sa propriété de transaction, tandis que l'embarcation de BrainTree_Result_error le stocke dans une propriété Params. Ainsi, par exemple, la variable de prénom trouvée dans $ result-> transaction-> client ['FirstName'] lorsque la transaction a été réussie, tandis qu'une transaction échouée le stockerait dans $ result-> params ['transaction'] [' Client '] [' FirstName '].
La redirection transparente de Braintree est un moyen de minimiser l'exposition de votre application aux données des clients sensibles, réduisant ainsi votre charge de conformité PCI, et sa bibliothèque client PHP simplifie considérablement le processus d'intégration, mais il est plus difficile de collecter et de valider les non-non-non Informations liées au paiement sur le même formulaire que les informations de carte de crédit de votre client.
La prochaine fois, nous allons jeter un œil à leur autre solution intelligente: Braintree.js.
Les redirections transparentes sont utilisées dans le traitement des paiements pour améliorer la sécurité des transactions. Ils permettent aux données sensibles du client d'être envoyées directement à la passerelle de paiement, en contournant le serveur du marchand. Cela réduit le risque de violations de données et aide les commerçants à se conformer aux normes de sécurité des données de l'industrie des cartes de paiement (PCI DSS).
sur le site Web L'optimisation, une redirection transparente peut aider à réduire le nombre de demandes HTTP, améliorant ainsi la vitesse de chargement du site. Lorsqu'un utilisateur visite une page Web, le serveur envoie une réponse HTTP avec un code d'état. Si le code d'état indique une redirection, le navigateur doit faire une demande HTTP supplémentaire, ce qui peut ralentir le temps de chargement. Une redirection transparente peut éliminer cette étape supplémentaire, ce qui rend le site Web plus rapide et plus efficace.
Une redirection traditionnelle implique le serveur du marchand dans Le processus de transaction, qui peut exposer les données des clients sensibles aux risques de sécurité potentiels. D'un autre côté, une redirection transparente contourne le serveur du marchand et envoie les données directement à la passerelle de paiement, améliorant la sécurité de la transaction.
La mise en œuvre d'une redirection transparente nécessite des connaissances techniques. Vous devrez intégrer votre site Web à l'API de la passerelle de paiement. Cela implique la mise en place d'un formulaire sur votre site Web qui publie les informations de paiement du client directement sur la passerelle. La passerelle traite ensuite la transaction et renvoie une réponse à votre site Web.
Les principaux avantages de l'utilisation d'une redirection transparente sont une sécurité améliorée et améliorée Performance du site Web. En contournant le serveur du marchand, une redirection transparente réduit le risque de violations de données. Cela aide également à améliorer la vitesse de chargement de votre site Web en réduisant le nombre de demandes HTTP.
Un inconvénient potentiel de l'utilisation d'une redirection transparente est que Il peut être plus complexe à mettre en œuvre qu'une redirection traditionnelle. Cela nécessite une compréhension plus approfondie du développement Web et des API de la passerelle de paiement. Cependant, les avantages améliorés de sécurité et de performance l'emportent souvent sur ce défi.
Toutes les passerelles de paiement ne prennent pas en charge les redirections transparentes. Il est important de vérifier auprès de votre fournisseur de passerelle de paiement pour voir s'ils offrent cette fonctionnalité. Certaines passerelles de paiement populaires qui prennent en charge les redirections transparentes incluent Braintree, BlueFin et PayPal.
Du point de vue d'un utilisateur, une redirection transparente est transparente. L'utilisateur entre simplement ses informations de paiement sur le site Web du marchand et clique sur «Soumettre». La redirection se produit en arrière-plan, de sorte que l'utilisateur ne remarque aucune différence par rapport à un processus de transaction traditionnel.
Oui, une redirection transparente peut Aide à la conformité PCI. En envoyant les informations de paiement du client directement à la passerelle de paiement, une redirection transparente réduit la portée de la conformité PCI pour le marchand. Cela peut permettre aux commerçants de respecter plus facilement les normes de sécurité strictes fixées par l'industrie des cartes de paiement.
Si une redirection transparente échoue, la transaction ne sera pas être traité. La réponse exacte dépendra de l'API de la passerelle de paiement. Dans la plupart des cas, la passerelle renverra un message d'erreur sur le site Web du marchand, qui peut ensuite être affiché à l'utilisateur. Il est important de gérer ces erreurs gracieusement pour assurer une bonne expérience utilisateur.
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!