2016-05-23 10 views
1

Ich versuche eine Kasse zu erstellen, die es einem Benutzer ermöglicht, ein Konto gegen eine Gebühr zu erstellen (Premium-Konten, wenn Sie so wollen). Ein Benutzer erstellt ein Konto (markiert als unbezahlt), der Benutzer zahlt, und bei erfolgreicher Zahlung wird das Konto als bezahlt gekennzeichnet. Ich kann ein Konto erstellen, und ich kann eine Gebühr erheben. Mein Problem ist es, die beiden Dinge miteinander zu verbinden. Ich bin mir nicht sicher, wie ich das erstellte Konto von der erfolgreichen Belastung referenzieren soll. Hier ist was ich bisher habe.Payum Stripe Datenfluss mit Symfony

Payment.php

<?php 
namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Payum\Core\Model\ArrayObject; 

/** 
* @ORM\Table 
* @ORM\Entity 
*/ 
class Payment extends ArrayObject 
{ 
    /** 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    * 
    * @var integer $id 
    */ 
    protected $id; 

    /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 
} 

CreateProfileController.php Create

public function createASquareAction(Request $request, $coupon) 
{ 
    $newUser = new User(); 
    $registrationForm = $this->getRegistrationForm($newUser); 

    $registrationForm->handleRequest($request); 

    if ($registrationForm->isSubmitted() && $registrationForm->isValid()) { 
     $newSquare = new Square(); 
     $newSquare->setProduct($registrationForm->get('product')->getData()); 
     $newUser->addSquare($newSquare); 

     $cost = $this->getTotal($newSquare->getProduct(), $registrationForm->get('coupon')->getData()); 
     $noPayment = $this->isAdmin() || $cost == 0; 

     $em = $this->getDoctrine()->getManager(); 
     $em->persist($newUser); 
     $em->flush(); 

     if ($noPayment) { 
      $newSquare->setVerified(true); 
      $em->persist($newSquare); 
      $em->flush(); 

      return $this->redirectToRoute('edit', array(
       'id' => $newSquare->getMsid() 
      )); 
     } else { 
      $gatewayName = 'stripe_checkout_test'; 
      $storage = $this->get('payum')->getStorage('AppBundle\Entity\Payment'); 
      $payment = $storage->create(); 
      $payment["amount"] = $cost; 
      $payment["currency"] = 'USD'; 
      $payment["description"] = "Memorysquare"; 
      $storage->update($payment); 

      $captureToken = $this->get('payum')->getTokenFactory()->createCaptureToken(
       $gatewayName, 
       $payment, 
       'test_payment_done' // the route to redirect after capture; 
      ); 
      return $this->redirect($captureToken->getTargetUrl()); 
     } 

    } 

    return $this->render('create-a-square/create-a-square.html.twig', [ 
     'registrationForm' => $registrationForm->createView(), 
     'coupon' => $coupon, 
    ]); 
} 

komplette Zahlung Aktion

public function testPaymentDoneAction(Request $request) 
{ 
    $token = $this->get('payum')->getHttpRequestVerifier()->verify($request); 

    $identity = $token->getDetails(); 
    $model = $this->get('payum')->getStorage($identity->getClass())->find($identity); 

    $gateway = $this->get('payum')->getGateway($token->getGatewayName()); 

    // or Payum can fetch the model for you while executing a request (Preferred). 
    $gateway->execute($status = new GetHumanStatus($token)); 
    $details = $status->getFirstModel(); 

    return new JsonResponse(array(
     'status' => $status->getValue(), 
     'details' => iterator_to_array($details), 
    )); 
} 

Jede Hilfe mich auf dem richtigen Weg zu bekommen wäre sehr dankbar.

Antwort

0

Die Antwort auf diese meine Bestellung Einheit wurde hinzugefügt (oder jede Entität Sie möchten) an die Zahlung (oder PaymentDetails) Entität wie so (man beachte die Kaskade bestehen):

Payment.php

// ... all previous code ... // 

/** 
* @ORM\OneToOne(targetEntity="Order", cascade={"persist"}) 
* @ORM\JoinColumn(name="orderid", referencedColumnName="orderid") 
*/ 
private $order; 

/** 
* Set order 
* 
* @param \AppBundle\Entity\Order $order 
* 
* @return Payment 
*/ 
public function setOrder(\AppBundle\Entity\Order $order = null) 
{ 
    $this->order = $order; 

    return $this; 
} 

/** 
* Get order 
* 
* @return \AppBundle\Entity\Order 
*/ 
public function getOrder() 
{ 
    return $this->order; 
} 

Dann in der Zahlungsvorbereitung, füge ich die neue Ordnung auf das Objekt $ Zahlung

public function createASquareAction(Request $request, $coupon) 
{ 
    // ... previous code ... // 

    $newOrder = new Order(); 
    // do some setting on my order 
    $payment->setOrder($newOrder); 
    $storage->update($payment); 

    // ... rest of code ... // 
} 

dies jemand in der Zukunft vielleicht helfen. Ich habe auch einen Event-Abonnenten erstellt, um die Bestellung auf Update zu überprüfen und als bezahlt zu markieren, wenn die Zahlung erfolgreich war.