Saturday, August 13, 2016

Paypal Create Recurring Payment Profile From Laravel

Recently one of our Laravel project we have subscriptions management with recurring payment options with Paypal. It took a while for me to integrate it with my Laravel project so here in this blog I am going to explain how to do this. Please note example given here is using sandbox account.

First of all we need Paypal Merchant SDK.

You can find it here from this link https://github.com/paypal/merchant-sdk-php

Import it with composer. Add following line to your composer.json file in require section and run composer update command.

"paypal/merchant-sdk-php":"3.8.*"

Once the composer is updated your local vendor folder will have paypal directory with all the classes. Please note fort this SDK your will need PHP version 6 and on words.

Now first of all we will need a Paypal token to initiate recurring profile creation.

Go to your Laravel controller and add following classes of Paypal merchant SDK.

use PayPal\Service\PayPalAPIInterfaceServiceService;
use PayPal\EBLBaseComponents\PaymentDetailsType;
use PayPal\CoreComponentTypes\BasicAmountType;
use PayPal\EBLBaseComponents\SetExpressCheckoutRequestDetailsType;
use PayPal\EBLBaseComponents\BillingAgreementDetailsType;
use PayPal\PayPalAPI\SetExpressCheckoutRequestType;
use PayPal\PayPalAPI\SetExpressCheckoutReq;
use PayPal\EBLBaseComponents\RecurringPaymentsProfileDetailsType;
use PayPal\EBLBaseComponents\BillingPeriodDetailsType;
use PayPal\EBLBaseComponents\ScheduleDetailsType;
use PayPal\EBLBaseComponents\CreateRecurringPaymentsProfileRequestDetailsType;
use PayPal\PayPalAPI\CreateRecurringPaymentsProfileRequestType;
use PayPal\PayPalAPI\CreateRecurringPaymentsProfileReq;


Now lets first get token. Add following code to your controller function.

        $config = array (
            'mode' => 'sandbox' ,
            'acct1.UserName' => 'yourusername,
            'acct1.Password' => 'yourpassword',
            'acct1.Signature' => 'yourapisignature'
        );
        $paypalService = new PayPalAPIInterfaceServiceService($config);
        $paymentDetails= new PaymentDetailsType();

        $orderTotal = new BasicAmountType();
        $orderTotal->currencyID = 'USD';
        $orderTotal->value = '10.00';//your own value

        $paymentDetails->OrderTotal = $orderTotal;
        $paymentDetails->PaymentAction = 'Sale';

        $setECReqDetails = new SetExpressCheckoutRequestDetailsType();
        $setECReqDetails->PaymentDetails[0] = $paymentDetails;
        $setECReqDetails->CancelURL = 'http://yourcancelurl/cancel-paypal-payment';
        $setECReqDetails->ReturnURL = 'http://yoursuccessurl/qt/success-paypal-payment';

        $billingAgreementDetails = new BillingAgreementDetailsType('RecurringPayments');
        $billingAgreementDetails->BillingAgreementDescription = 'Recurring Billing';
        $setECReqDetails->BillingAgreementDetails = array($billingAgreementDetails);

        $setECReqType = new SetExpressCheckoutRequestType();
        $setECReqType->Version = '104.0';
        $setECReqType->SetExpressCheckoutRequestDetails = $setECReqDetails;

        $setECReq = new SetExpressCheckoutReq();
        $setECReq->SetExpressCheckoutRequest = $setECReqType;

        $setECResponse = $paypalService->SetExpressCheckout($setECReq);

        if($setECResponse->Ack == 'Success'){
            $token = $setECResponse->Token;
            return Redirect::to('https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token='.$token);
        }else{
            return Redirect::to('error')->with('message', 'There is a problem in payment processing.');
        }

As you can see in above code. As soon as we got token we are sending user to Paypal for authorization. Once it is authorized from Paypal you will get payer id and you will return back to your website on the URL specified in above code.

Now we get Payer id we have to create recurring profile.

        $profileDetails = new RecurringPaymentsProfileDetailsType();
        $profileDetails->BillingStartDate = date(DATE_ISO8601, strtotime(date('Y-m-d').' +1 day'));
        //Since date start should be greater than current date.

        $paymentBillingPeriod = new BillingPeriodDetailsType();
        $paymentBillingPeriod->BillingFrequency = 1;//your own value
        $paymentBillingPeriod->BillingPeriod = "Month";//your own value
       

        $paymentBillingPeriod->Amount = new BasicAmountType("USD", "10.00");//your own value

        $scheduleDetails = new ScheduleDetailsType();
        $scheduleDetails->Description = "Recurring Billing";
        $scheduleDetails->PaymentPeriod = $paymentBillingPeriod;

        $createRPProfileRequestDetails = new CreateRecurringPaymentsProfileRequestDetailsType();
        $createRPProfileRequestDetails->Token = $token;

        $createRPProfileRequestDetails->ScheduleDetails = $scheduleDetails;
        $createRPProfileRequestDetails->RecurringPaymentsProfileDetails = $profileDetails;

        $createRPProfileRequest = new CreateRecurringPaymentsProfileRequestType();
        $createRPProfileRequest->CreateRecurringPaymentsProfileRequestDetails = $createRPProfileRequestDetails;

        $createRPProfileReq = new CreateRecurringPaymentsProfileReq();
        $createRPProfileReq->CreateRecurringPaymentsProfileRequest = $createRPProfileRequest;

        $config = array (
            'mode' => 'sandbox' ,
            'acct1.UserName' => 'yourusername,
            'acct1.Password' => 'yourpassword',
            'acct1.Signature' => 'yourapisignature'
        );
        $paypalService = new PayPalAPIInterfaceServiceService($config);
        $createRPProfileResponse = $paypalService->CreateRecurringPaymentsProfile($createRPProfileReq);

Now we have to check if the recurring profile successfully created.

if($createRPProfileResponse->Ack == 'Success'){
            $profileId = $createRPProfileResponse->CreateRecurringPaymentsProfileResponseDetails->ProfileID;
            //your own logic to save details in database.

}else{
            return Redirect::to('error')->with('message', 'There is a problem in payment processing.');
        }

That's it and your recurring payment profile is created.

Hope this helps you.

No comments:

Post a Comment