netopia/payment
最新稳定版本:v1.1.3
Composer 安装命令:
composer require netopia/payment
包简介
Set of library that give you the means to incorporate NETOPIA Payments functionality into your website applications and mobile apps.
README 文档
README
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->errorMessage = '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>";
}
}
}
To place an order, the following parameters must be sent to our server using the POST method
- env_key
- data
- cipher
- iv
An example of view
<form id="paymentForm" action="{{ $paymentData['url'] }}" method="POST">
<input type="hidden" name="env_key" value="{{ $paymentData['env_key'] }}">
<input type="hidden" name="data" value="{{ $paymentData['data'] }}">
<input type="hidden" name="cipher" value="{{ $paymentData['cipher'] }}">
<input type="hidden" name="iv" value="{{ $paymentData['iv'] }}">
</form>
<script>
document.getElementById('paymentForm').submit();
</script>
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.
统计信息
- 总下载量: 98.79k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 13
- 点击次数: 1
- 依赖项目数: 2
- 推荐数: 0
其他信息
- 授权协议: AGPL-3.0-or-later
- 更新时间: 2020-09-02