2013-03-03 17 views
8

Ich versuche, JMSPaymentCoreBundle mit JMSPaymentPaypalBundle zu verwenden, und ich kann kein klares Beispiel irgendwo finden, wie man es macht.PayPal in Symfony2

Ich habe alle in der Dokumentation angegebenen Schritte durchgeführt und bin nicht in der Lage, es zum Laufen zu bringen. Kann mir bitte jemand helfen?

+0

Was meinst du mit nicht funktioniert? Wie weit bist du gekommen? – hacfi

Antwort

8

Die Standardmethode eine Zahlungsanweisung ist durch die jms_choose_payment_method Formular zu erstellen:

$form = $this->getFormFactory()->create('jms_choose_payment_method', null, array(
     'amount' => 12.99, 
     'currency' => 'EUR', 
     'default_method' => 'payment_paypal', // Optional 
     'predefined_data' => array(
      'paypal_express_checkout' => array(
       'return_url' => $this->get('router')->generate('payment_complete', array(
        'number' => $order->getOrderNumber(), 
       ), true), 
       'cancel_url' => $this->get('router')->generate('payment_cancel', array(
        'number' => $order->getOrderNumber(), 
       ), true) 
      ), 
     ), 
    )); 

Sie können auch erstellen Zahlungsanweisung manuell:

 use JMS\Payment\CoreBundle\Entity\ExtendedData; 
     use JMS\Payment\CoreBundle\Entity\Payment; 
     use JMS\Payment\CoreBundle\PluginController\Result; 
     use JMS\Payment\CoreBundle\Plugin\Exception\ActionRequiredException; 
     use JMS\Payment\CoreBundle\Plugin\Exception\Action\VisitUrl; 
     use JMS\Payment\CoreBundle\Entity\PaymentInstruction; 


     $extendedData = new ExtendedData(); 
     $extendedData->set('return_url', $this->get('router')->generate('payment_complete', array(
       'number' => $order->getOrderNumber(), 
      ), true)); 

     $extendedData->set('cancel_url', $this->get('router')->generate('payment_cancel', array(
       'number' => $order->getOrderNumber(), 
      ), true)); 

     $instruction = new PaymentInstruction((float)$order->getCharge() > 0 ? $order->getCharge() : $order->getAmount(), 'EUR', 'paypal_express_checkout', $extendedData); 
     $this->get('payment.plugin_controller')->createPaymentInstruction($instruction); 

     $order->setPaymentInstruction($instruction); 
     $em = $this->get('doctrine.orm.entity_manager'); 
     $em->persist($order); 
     $em->flush(); 

Meine payment_complete Route wie folgt aussieht:

public function completeAction(Booking $order) 
{ 
    $instruction = $order->getPaymentInstruction(); 
    if (($instruction->getAmount() - $instruction->getDepositedAmount()) > 0) { 
     if (null === $pendingTransaction = $instruction->getPendingTransaction()) { 
      $payment = $this->get('payment.plugin_controller')->createPayment($instruction->getId(), $instruction->getAmount() - $instruction->getDepositedAmount()); 
     } else { 
      $payment = $pendingTransaction->getPayment(); 
     } 

     $result = $this->get('payment.plugin_controller')->approveAndDeposit($payment->getId(), $payment->getTargetAmount()); 
     if (Result::STATUS_PENDING === $result->getStatus()) { 
      $ex = $result->getPluginException(); 

      if ($ex instanceof ActionRequiredException) { 
       $action = $ex->getAction(); 

       if ($action instanceof VisitUrl) { 
        return new RedirectResponse($action->getUrl()); 
       } 

       throw $ex; 
      } 
     } else if (Result::STATUS_SUCCESS !== $result->getStatus()) { 
      throw new \RuntimeException('Transaction was not successful: '.$result->getReasonCode()); 
     } 
    } 

    $order->setTransactionAmount((float)$order->getAmount()); 
    $creditPurchased = (float)$order->getCharge() > (float)$order->getAmount() ? (float)$order->getCharge() - (float)$order->getAmount() : 0; 
    $em->persist($order); 
    $em->flush(); 

Ich habe es läuft durch http://jmsyst.com/bundles/JMSPaymentCoreBundle/master/usage

+0

Ich brauche nur ein Formular, wo Sie den Betrag, den Sie zahlen möchten, und eine Schaltfläche "Jetzt bezahlen" sagen: D Ich denke, ich verstehe nicht, was genau ist der Datenfluss für alle diese Zahlung Bundle. Warum eine Zahlungsanweisung ist nicht das gleiche wie eine Bestellung? ist das korrekt? 1- Rendern Sie ein Formular mit einer Eingabe, um den Betrag zu schreiben (Erstellen und Löschen eines Auftrags). 2 - Rendern Sie (innerhalb des vorherigen Formulars) auch die Zahlungsweg-Route mit dem Formular "Zahlungsmethode wählen" und senden Sie die Postdaten und die Bestellnummer. 3- Aktualisieren Sie die Order-Entität und leeren Sie alles andere. – Xavi

19

Payum bundle unterstützt JMS-Zahlungen über die bridge. Der Link beschreibt den Einstieg.

Verwendung des Bündels gibt Ihnen mehrere Vorteile:

  • Gesicherte Capture Aktion.
  • Haben Kreditkartenformular, kann Benutzer für Kreditkarte fragen
  • Fähigkeit zur einfachen Einrichtung IPN. Notify Aktion ist auch gesichert.
  • Integrierte Unterstützung aller Omnipay-Gateways (25 +), Jms-Plugins (+ 10) und payum-nativen Bibliotheken.
  • Payum paypal lib unterstützt wiederkehrende Zahlungen und digitale Waren aus der Box.
  • In den Zahlungsprozess integrierte Speicher, damit Sie sich keine Gedanken über Daten machen müssen, die verloren gehen könnten.
  • Domain freundlich. In der Tat bietet Payum einige Modelle, aber es beschränkt Sie nicht darauf, sie zu verwenden.
  • Es unterstützt bereits PSR-0 Logger. In dev protokolliert es ausgeführte Payum-Aktionen, um das Debuggen zu vereinfachen (Registerkarte Symfony-Profil-Logs aufrufen).
  • Es ist möglich, mehrere Zahlungen (ein PayPal-Konto für EU und eine für US zum Beispiel)
  • Extrem anpassbar. Fügen Sie Ihre benutzerdefinierten Gehaltsaktionen oder Erweiterungen oder Speicher hinzu.
  • Es gibt eine Symfony Sandbox (code | web), die Ihnen beim Start hilft.

P.S. Es ist nicht die vollständige Liste der Funktionen.