示例#1
0
 public function createPaypalAgreement(Agreement $agreement, $credtCard = null)
 {
     $this->paypalToken();
     $paymentMehod = array();
     if ($agreement->getPaymentMethod() == 'paypal') {
         $paymentMehod = array("payment_method" => "paypal");
     } elseif ($agreement->getPaymentMethod() == 'credit_card') {
         if (is_null($credtCard)) {
             throw new \Exception('credit card values must be send');
         }
         $paymentMehod = array("payment_method" => "credit_card", "funding_instruments" => array(array("credit_card" => $credtCard)));
     }
     $agreementPayPal = array("name" => $agreement->getName(), "description" => $agreement->getDescription(), "start_date" => date('Y-m-d') . "T" . date('H:i:s') . "Z", "plan" => array("id" => $agreement->getPlan()->getPaypalId()), "payer" => $paymentMehod);
     $host = $this->paypalFactory->getHost();
     $url = $host . '/v1/payments/billing-agreements';
     $json = json_encode($agreementPayPal);
     $answer = $this->paypalCall('POST', $url, $json);
     /**
      * The payment are efective at final of cycle of service
      * so this "status" is just for agreement status
      * any transaction must be created except setup_fee setted in the plan
      **/
     //if some error in response
     if (isset($answer['status']) && $answer['status'] == 'error') {
         $agreement->setStatus($answer['status'] . ':' . json_encode($answer));
     } elseif ($agreement->getPaymentMethod() == 'paypal') {
         if ($this->hasApprovalLink($answer)) {
             //STATUS_PENDING_APPROVAL
             $agreement->setStatus($answer['state']);
         } else {
             //put status pending if paypal payment methods to redirect to approve
             $agreement->setStatus($answer['state'] . '-pending');
         }
     } elseif ($agreement->getPaymentMethod() == 'credit_card') {
         if ($answer['state'] == 'Active') {
             //we need to move this worlflow transaction
             $agreement->setStatus($answer['state']);
             $agreement->setPaypalId($answer['id']);
             $agreement->setOutstandingAmount($answer['agreement_details']['outstanding_balance']['value']);
             $agreement->setCyclesRemaining($answer['agreement_details']['cycles_remaining']);
             $agreement->setNextBillingDate($answer['agreement_details']['next_billing_date']);
             $agreement->setFinalPaymentDate($answer['agreement_details']['final_payment_date']);
             $agreement->setFailedPaymentCount($answer['agreement_details']['failed_payment_count']);
         }
     }
     $this->manager->flush();
     $this->session->set('agreement', json_encode($answer));
     $this->session->save();
     //If setupAmount is diferent than 0
     //get first completed transaction agreement
     //and create transaction
     if ($agreement->getPlan()->getSetupAmount() != 0) {
         $transactions = $this->searchPaypalAgreementTransactions($agreement);
         foreach ($transactions['agreement_transaction_list'] as $transaction) {
             //Created: this is the first paypal transacttion
             //Expired: this is the last paypal transacttion
             //Failed: when transaction not billing
             if ($transaction['status'] == 'Completed') {
                 $transaction = $this->createSale($agreement, $transaction['amount']['value'], $transaction['fee_amount']['value'], $transaction['net_amount']['value'], json_encode($transaction));
             }
         }
     }
     return $answer;
 }