netopia/payment

Set of library that give you the means to incorporate NETOPIA Payments functionality into your website applications and mobile apps.

v1.1.2 2024-02-07 09:11 UTC

This package is auto-updated.

Last update: 2024-04-07 09:41:47 UTC


README

Parsedown

NETOPIA Payments

NETOPIA Payments Composer

Installation

Run the following command from root of your project

  • composer require netopia/payment

or

  • add the "netopia/payment" to your composer.json file like the following example

      "require": {
          ...
          "netopia/payment": "^1.1",
          ...
      }
    

    and then run the following command from your Terminal

    composer install

Example

An example of Payment Request in Laravel
...

use Netopia\Payment\Address;
use Netopia\Payment\Invoice;
use Netopia\Payment\Split;
use Netopia\Payment\Request\Card;

...

class ExampleController extends Controller
{
    /**
     * all payment requests will be sent to the NETOPIA Payments server
     * SANDBOX : http://sandboxsecure.mobilpay.ro
     * LIVE : https://secure.mobilpay.ro
     */
    public $paymentUrl;
    /**
     * NETOPIA Payments is working only with Certificate. Each NETOPIA partner (merchant) has a certificate.
     * From your Admin panel you can download the Certificate.
     * is located in Admin -> Conturi de comerciant -> Detalii -> Setari securitate
     * the var $x509FilePath is path of your certificate in your platform
     * i.e: /home/certificates/public.cer
     */
    public $x509FilePath;
    /**
     * Billing Address
     */
    public $billingAddress;
    /**
     * Shipping Address
     */
    public $shippingAddress;
    
    ...
    
    public function index()
    {
        $this->paymentUrl   = 'http://sandboxsecure.mobilpay.ro';
        $this->x509FilePath = '/home/certificates/sandbox.XXXX-XXXX-XXXX-XXXX-XXXX.public.cer';
        try {
            $paymentRequest = new Card();
            $paymentRequest->signature  = 'XXXX-XXXX-XXXX-XXXX-XXXX';//signature - generated by mobilpay.ro for every merchant account
            $paymentRequest->orderId    = md5(uniqid(rand())); // order_id should be unique for a merchant account
            $paymentRequest->confirmUrl = 'https://example.test/card/success'; // is where mobilPay redirects the client once the payment process is finished and is MANDATORY
            $paymentRequest->returnUrl  = 'https://example.test/ipn';// is where mobilPay will send the payment result and is MANDATORY

            /*
             * Invoices info
             */
            $paymentRequest->invoice = new Invoice();
            $paymentRequest->invoice->currency  = 'RON';
            $paymentRequest->invoice->amount    = '20.00';
            $paymentRequest->invoice->tokenId   = null;
            $paymentRequest->invoice->details   = "Payment Via Composer library";

            /*
             * Billing Info
             */
            $this->billingAddress = new Address();
            $this->billingAddress->type         = "person"; //should be "person" / "company"
            $this->billingAddress->firstName    = "Billing name";
            $this->billingAddress->lastName     = "Billing LastName";
            $this->billingAddress->address      = "Bulevardul Ion Creangă, Nr 00";
            $this->billingAddress->email        = "test@billing.com";
            $this->billingAddress->mobilePhone  = "0732123456";
            $paymentRequest->invoice->setBillingAddress($this->billingAddress);

            /*
             * Shipping
             */
            $this->shippingAddress = new Address();
            $this->shippingAddress->type        = "person"; //should be "person" / "company"
            $this->shippingAddress->firstName   = "Shipping Name";
            $this->shippingAddress->lastName    = "Shipping LastName";
            $this->shippingAddress->address     = "Bulevardul Mihai Eminescu, Nr 00";
            $this->shippingAddress->email       = "test@shipping.com";
            $this->shippingAddress->mobilePhone = "0721234567";
            $paymentRequest->invoice->setShippingAddress($this->shippingAddress);

            /**
            * params 
            * The params is optional
            */
            $paymentRequest->params = [
                'framework_name'=>"Laravel",
                'framework_version'=>"9"
            ];

            /**
            * Split payment
            * this option is ONLY for merchants, who already have split payment settings.
            * 'id' Is the SELLERA_CCOUNT_ID
            * 'amount' is the splited amount 
            */
            $paymentRequest->split = new Split();
            $paymentRequest->split->destinations = [
                [
                'id'=>'123456',
                'amount'=>"2.75"
                ]
            ];

            /*
             * encrypting
             */
            $paymentRequest->encrypt($this->x509FilePath);

            /**
             * send the following data to NETOPIA Payments server
             * Method : POST
             * Parameters : env_key, data, cipher, iv
             * URL : $paymentUrl
             */
            $env_key = $paymentRequest->getEnvKey();
            $data   = $paymentRequest->getEncData();
            $cipher = $paymentRequest->getCipher();
            $iv     = $paymentRequest->getIv();
        }catch (\Exception $e)
        {
            return "Oops, There is a problem!";
        }
    }
    ...
}    

An example of IPN in Laravel

...

use Netopia\Payment\Address;
use Netopia\Payment\Invoice;
use Netopia\Payment\Request\Card;
use Netopia\Payment\Request\Notify;
use Netopia\Payment\Request\PaymentAbstract;

...

class IpnsController extends Controller 
{

    ...

    public $errorCode;
    public $errorType;
    public $errorMessage;
    public $paymentUrl;
    public $x509FilePath;
    public $cipher;
    public $iv;

    ...
    
    public function index()
    {
    ...
    
        $this->errorType = PaymentAbstract::CONFIRM_ERROR_TYPE_NONE;
        $this->errorCode = 0;
        $this->errorMessage = '';
        $this->cipher     = 'rc4';
        $this->iv         = null;

        ....

        if(array_key_exists('cipher', $_POST))
        {
            $this->cipher = $_POST['cipher'];
            if(array_key_exists('iv', $_POST))
            {
                $this->iv = $_POST['iv'];
            }
        }

        $this->paymentUrl = 'http://sandboxsecure.mobilpay.ro';
        $this->x509FilePath = '/home/certificates/sandbox.XXXX-XXXX-XXXX-XXXX-XXXXprivate.key';


        if (strcasecmp($_SERVER['REQUEST_METHOD'], 'post') == 0){
            if(isset($_POST['env_key']) && isset($_POST['data'])){
                try {
                    $paymentRequestIpn = PaymentAbstract::factoryFromEncrypted($_POST['env_key'], $_POST['data'], $this->x509FilePath, null, $this->cipher, $this->iv);
                    $rrn = $paymentRequestIpn->objPmNotify->rrn;
                    if ($paymentRequestIpn->objPmNotify->errorCode == 0) {
                        switch($paymentRequestIpn->objPmNotify->action){
                            case 'confirmed':
                                //update DB, SET status = "confirmed/captured"
                                $this->errorMessage = $paymentRequestIpn->objPmNotify->errorMessage;
                                break;
                            case 'confirmed_pending':
                                //update DB, SET status = "pending"
                                $this->errorMessage = $paymentRequestIpn->objPmNotify->errorMessage;
                                break;
                            case 'paid_pending':
                                //update DB, SET status = "pending"
                                $this->errorMessage = $paymentRequestIpn->objPmNotify->errorMessage;
                                break;
                            case 'paid':
                                //update DB, SET status = "open/preauthorized"
                                $this->errorMessage = $paymentRequestIpn->objPmNotify->errorMessage;
                                break;
                            case 'canceled':
                                //update DB, SET status = "canceled"
                                $this->errorMessage = $paymentRequestIpn->objPmNotify->errorMessage;
                                break;
                            case 'credit':
                                //update DB, SET status = "refunded"
                                $this->errorMessage = $paymentRequestIpn->objPmNotify->errorMessage;
                                break;
                            default:
                                $errorType = PaymentAbstract::CONFIRM_ERROR_TYPE_PERMANENT;
                                $this->errorCode = PaymentAbstract::ERROR_CONFIRM_INVALID_ACTION;
                                $this->errorMessage = 'mobilpay_refference_action paramaters is invalid';
                        }
                    }else{
                        //update DB, SET status = "rejected"
                        $this->errorMessage = $paymentRequestIpn->objPmNotify->errorMessage;
                    }
                }catch (\Exception $e) {
                    $this->errorType = PaymentAbstract::CONFIRM_ERROR_TYPE_TEMPORARY;
                    $this->errorCode = $e->getCode();
                    $this->errorMessage = $e->getMessage();
                }

            }else{
                $this->errorType = PaymentAbstract::CONFIRM_ERROR_TYPE_PERMANENT;
                $this->errorCode = PaymentAbstract::ERROR_CONFIRM_INVALID_POST_PARAMETERS;
                $this->errorMessag = 'mobilpay.ro posted invalid parameters';
            }

        } else {
            $this->errorType = PaymentAbstract::CONFIRM_ERROR_TYPE_PERMANENT;
            $this->errorCode = PaymentAbstract::ERROR_CONFIRM_INVALID_POST_METHOD;
            $this->errorMessage = 'invalid request metod for payment confirmation';
        }

        /**
         * Communicate with NETOPIA Payments server
         */

        header('Content-type: application/xml');
        echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
        if($this->errorCode == 0)
        {
            echo "<crc>{$this->errorMessage}</crc>";
        }
        else
        {
            echo "<crc error_type=\"{$this->errorType}\" error_code=\"{$this->errorCode}\">{$this->errorMessage}</crc>";
        }

    }
}
Note / Suggestions
  • if there is issue with namespace in your platform , you can solve it by getting help from Service Providers. for ex. in Laravel you can define a provider and put in your vendor and then set your namespace from the composer.json

  • if in any case the Country , City , Zip code , ... is separated from the Address in your application , please merge it with Address and create full address for Billing/Shipping address.