web-dev-qa-db-fra.com

Flux de paiement Magento

Je travaille sur l'implémentation d'un nouveau module de paiement pour Magento et je veux comprendre le concept de base derrière cette logique. Je sais que je dois étendre Mage_Payment_Model_Method_Abstract ou l'une de ses classes enfants, mais mon problème est de savoir quand utiliser et comment utiliser les méthodes de capture et d'autorisation dans mon modèle. Par exemple, si je divise l'ensemble du processus en étapes comme ceci:

  1. L'utilisateur vient dans le panier et choisit un mode de paiement qui est une passerelle.
  2. Le système intercepte la demande, collecte toutes les données soumises et envoie l'utilisateur à l'URL de la passerelle.
  3. L'utilisateur passe sa commande (ou annule) sur le site passerelle qui envoie des informations à ce sujet à ma boutique.
  4. Mon magasin fait quelques modifications supplémentaires à la commande avec les données reçues et enregistre la commande avec le statut terminé ou annulé.

Où dois-je utiliser ces méthodes d'autorisation et de capture dans ces étapes? J'apprécierais que quelqu'un m'explique ce que l'autorisation et la capture signifient?

69
zokibtmkd

Voici la façon dont j'ai toujours compris les concepts et ce que vous devez savoir pour implémenter un module de paiement dans Magento. Les réponses à votre "où cela se produit" sont en gras ci-dessous, bien que ce ne soit pas aussi simple que vous l'espérez.

Les transactions par carte de crédit avant Internet, en brique et en mortier étaient un processus en deux étapes.

Au moment d'une vente, lorsque le commerçant prenait la carte de crédit d'un consommateur pour un achat, il la faisait glisser dans un dispositif de point de vente qui appelait le bureau central de la carte de crédit et demandait "est-ce que cette carte est autorisée pour ce réseau, et la marge de crédit disponible de ce consommateur est-elle suffisamment importante pour permettre cet achat ".

Si l'achat était accepté (et non refusé), le débit serait autorisé . Le consommateur prendrait son produit et le système de point de vente/caisse enregistreuse noterait que la transaction était autorisée. Ensuite, à la fin d'une journée, ou à la fin de la semaine, à un autre horaire régulier prédéterminé, ou lorsque le propriétaire décidait d'arrêter de boire, le commerçant parcourait tous ses reçus autorisés et envoyait n autre demande au bureau central de saisir les fonds du autorisé transaction. La capture des fonds est ce qui met de l'argent dans le compte du marchand.

C'est toujours le modèle utilisé par la plupart des passerelles, et c'est le modèle de domaine que Magento Inc. a choisi d'implémenter pour leurs modules de paiement.

La façon dont les choses sont censées s'exécuter est lorsqu'un consommateur atteint les dernières étapes de paiement dans un système comme Magento, Magento émet une demande d'autorisation à l'API de la passerelle. Si la transaction réussit, la commande est acceptée dans le système et un ID unique de la demande d'autorisation est stocké. Ensuite, lorsque les marchandises du consommateur sont expédiées, un propriétaire de magasin tilise l'administrateur Magento pour créer une facture. La création de cette facture émet une demande de capture (à l'aide d'un identifiant de magasin renvoyé par la demande d'autorisation). C'est là que ces appels de méthode sont émis dans Magento.

Cependant, les choses deviennent délicates car chaque passerelle de paiement interprète ces concepts un peu différemment, et chaque commerçant interprète différemment ses responsabilités "ne pas capturer avant d'avoir expédié". En plus du scénario décrit ci-dessus, les modules de paiement ont une valeur de configuration système appelée Action de paiement . Cela peut être défini sur Autoriser uniquement , ce qui implémentera le flux décrit ci-dessus. Il peut également être défini sur Autoriser et capturer , ce qui autorisera et capturera un paiement lorsque la commande sera passée. Cela devient même plus déroutant car bien que la méthode soit appelée Authorize and Capture, les versions actuelles de Magento émettront uniquement la demande de capture lorsqu'elle est définie dans ce mode (au moins pour Authorize.net) et Authorize.net laissera, en interne, les demandes de capture dans un état autorisé mais non capturé pendant la majeure partie de la journée. La façon dont Magento gère les commandes, les paiements et les factures est un domaine de la base de code qui change beaucoup d'une version à l'autre.

Donc, l'idée derrière le système de module de paiement Magento est de vous protéger du cluster F --- qui programme la logique de la passerelle de paiement. Dans votre méthode authorize, vous implémentez un appel à l'API d'autorisation de votre passerelle de paiement (ou effectuez les vérifications et la logique que vous souhaitez effectuer à ce stade). Cette méthode est passée un objet de paiement et un montant. Si vous vous demandez/exécutez votre logique et déterminez qu'elle est invalide pour quelque raison que ce soit, vous lancez une exception avec

Mage::throwException('...');

Cela indique à Magento que l'autorisation a échoué et il agira en conséquence (afficher un message d'erreur, etc.). Sinon, vous définissez des membres de données sur l'objet Paiement et émettez un

return $this;

Les données membres sont des éléments dont vous aurez besoin plus tard, lors de la capture du paiement. Ce qui nous amène à la méthode capture de votre module de paiement. Cette méthode reçoit également un objet de paiement et un montant. Dans cette méthode, vous émettez votre demande de capture. L'objet de paiement aura cc_trans_id membre de données

$payment->getCcTransId()

qui vous permettra d'émettre une capture sur votre passerelle. Il s'agit de l'un des membres de données dont vous êtes responsable de la sauvegarde dans authorize. Encore une fois, si votre code détermine que la capture a échoué, vous lancez une exception. Sinon, vous return $this.

Le module de paiement authorize.net a de bons exemples de la façon dont cela est fait.

app/code/core/Mage/Paygate/Model/Authorizenet.php

Par exemple, considérez cette partie de la méthode capture

public function capture(Varien_Object $payment, $amount)
{
    if ($payment->getCcTransId()) {
        $payment->setAnetTransType(self::REQUEST_TYPE_PRIOR_AUTH_CAPTURE);
    } else {
        $payment->setAnetTransType(self::REQUEST_TYPE_AUTH_CAPTURE);
    }   

    $payment->setAmount($amount);
    $request= $this->_buildRequest($payment);
    $result = $this->_postRequest($request);
    //...

Ici, la méthode de capture vérifie si le paiement a un cc_trans_id. Selon le résultat, il définit anet_trans_type soit:

self::REQUEST_TYPE_PRIOR_AUTH_CAPTURE
self::REQUEST_TYPE_AUTH_CAPTURE

Cette valeur est ensuite utilisée par l'objet de demande d'API pour envoyer un appel d'API pour

  1. Capture d'une transaction préautorisée
  2. Capture immédiate

En espérant que ça aide et bonne chance!

148
Alan Storm