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