2016-05-23 2 views
1

Я пытаюсь создать чек, который позволяет пользователю создать учетную запись за определенную плату (премиум-аккаунты, если хотите). Пользователь будет создавать учетную запись (помечен как неоплачиваемый), пользователь будет платить, а затем при успешном платеже учетная запись будет отмечена как выплаченная. Я могу создать учетную запись, и я могу заплатить. Моя проблема связывает две вещи вместе. Я не уверен, как ссылаться на созданную учетную запись из успешного платежа. Вот что я до сих пор.Поток данных Payum Stripe с 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 CreateAction

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, 
    ]); 
} 

Оплата Полное Действие

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), 
    )); 
} 

Любая помощь, чтобы получить меня на трассе было бы весьма признателен.

ответ

0

Ответа на это добавление моей сущности заказа (или любое юридическое лицо, вы хотите) к оплате (или PaymentDetails) лицам, например, так (Примечание каскада сохраняется):

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; 
} 

Затем в подготовке оплаты, добавить новый заказ на объект $ оплаты

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 ... // 
} 

Может быть, это поможет кому-то в будущем. Я также создал подписчика событий для проверки порядка onUpdate и отметьте как оплаченный, если платеж по полосе был успешным.

Смежные вопросы