Untitled
unknown
plain_text
2 years ago
6.5 kB
10
Indexable
<?php
class Am_Paysystem_Xendit extends Am_Paysystem_Abstract
{
const PLUGIN_STATUS = self::STATUS_DEV;
const PLUGIN_REVISION = '@@VERSION@@';
protected $defaultTitle = "Xendit";
protected $defaultDescription = "Supports Credit Cards, eWallets, etc.";
const
API_URL = 'https://api.xendit.co/v2/',
RECURRING_URL = 'https://api.xendit.co/recurring_payments',
RECURRING_ID = 'xendit-recurring-id';
public function getSupportedCurrencies()
{
return ['IDR', 'PHP'];
}
public function _initSetupForm(Am_Form_Setup $form)
{
$form->addText('api_key',['class' => 'am-el-wide'])
->setLabel("API Key")
->addRule('required');
$form->addText('token',['class' => 'am-el-wide'])
->setLabel("Verification Token")
->addRule('required');
}
function isConfigured()
{
return strlen($this->getConfig('api_key')) && strlen($this->getConfig('token'));
}
public function getRecurringType()
{
return self::REPORTS_REBILL;
}
function _process($invoice, $request, $result)
{
$req = new Am_HttpRequest(self::API_URL . 'invoices', Am_HttpRequest::METHOD_POST);
$req->setAuth($this->getConfig('api_key'));
$req->addPostParameter([
'external_id' => $invoice->public_id,
'amount' => $invoice->first_total,
'description' => $invoice->getLineDescription(),
'customer[given_names]' => $invoice->getName(),
'customer[email]' => $invoice->getEmail(),
'customer[mobile_number]' => $invoice->getPhone(),
'success_redirect_url' => $this->getReturnUrl(),
'failure_redirect_url' => $this->getCancelUrl(),
'currency' => $invoice->currency,
]);
$res = $req->send();
$l = $this->getDi()->invoiceLogRecord;
$l->paysys_id = $this->getId();
$l->title = 'createinvoice';
$l->setInvoice($invoice);
$l->add($req);
$l->add($res);
$vars = json_decode($res->getBody(), true);
if(($res->getStatus() == 200) && (!empty($vars['invoice_url'])))
{
$a = new Am_Paysystem_Action_Redirect($vars['invoice_url']);
$result->setAction($a);
}
else
{
throw new Am_Exception_InputError(___("Payment failed"));
}
}
function getReadme()
{
$url = $this->getPluginUrl('ipn');
return <<<CUT
Set URL in Callback Settings in Xendit Dashboard to:
{$url}
CUT;
}
function createTransaction($request, $response, array $invokeArgs)
{
return new Am_Paysystem_Xendit_Transaction($this, $request, $response, $invokeArgs);
}
}
class Am_Paysystem_Xendit_Transaction extends Am_Paysystem_Transaction_Incoming
{
function __construct($plugin, $request, $response, $invokeArgs)
{
parent::__construct($plugin, $request, $response, $invokeArgs);
$this->vars = json_decode($request->getRawBody(), true);
}
public function validateSource()
{
return $this->request->getHeader('x-callback-token') == $this->plugin->getConfig('token');
}
public function validateTerms()
{
return true;
}
public function validateStatus()
{
return $this->vars['status'] == 'PAID';
}
function getUniqId()
{
return $this->vars['id'];
}
function processValidated()
{
if(($this->invoice->status == Invoice::PENDING) && ($this->invoice->rebill_times))
{
$result = new Am_Paysystem_Result();
$req = new Am_HttpRequest(Am_Paysystem_Xendit::RECURRING_URL, Am_HttpRequest::METHOD_POST);
$req->setAuth($this->plugin->getConfig('api_key'));
$req->addPostParameter([
'external_id' => $this->invoice->public_id,
'payer_email' => $this->invoice->getEmail(),
'description' => $this->invoice->getLineDescription(),
'amount' => $this->invoice->second_total,
'interval' => $this->getInterval($this->invoice),
'interval_count' => $this->getIntervalCount($this->invoice),
'total_recurrence' => $this->invoice->rebill_times,
'start_date' => $this->getStartDate($this->invoice),
'should_send_email' => 'true',
'currency' => $this->invoice->currency
]);
$tr = new Am_Paysystem_Xendit_Transaction_Recurring($this->plugin, $this->invoice, $req, true);
$tr->run($result);
}
parent::processValidated();
}
function findInvoiceId()
{
return $this->vars['external_id'];
}
function getInterval(Invoice $invoice)
{
$p = new Am_Period($invoice->second_period);
switch ($p->getUnit())
{
case 'd':
return 'DAY';
case 'm':
return 'MONTH';
case 'y':
return 'MONTH';
}
}
function getIntervalCount(Invoice $invoice)
{
$p = new Am_Period($invoice->second_period);
$c = $p->getCount();
switch ($p->getUnit())
{
case 'd':
return $c;
case 'm':
return $c;
case 'y':
return $c * 12;
}
}
function getStartDate(Invoice $invoice)
{
$p = new Am_Period($invoice->first_period);
return $p->addTo(Am_Di::getInstance()->sqlDate);
}
}
class Am_Paysystem_Xendit_Transaction_Recurring extends Am_Paysystem_Transaction_CreditCard
{
function __construct(Am_Paysystem_Abstract $plugin, Invoice $invoice, $request, $doFirst)
{
parent::__construct($plugin, $invoice, $request, $doFirst);
}
public function parseResponse()
{
$this->vars = json_decode($this->response->getBody(), true);
}
function getUniqId()
{
}
function processValidated()
{
if($this->vars['status'] == 'ACTIVE')
$this->invoice->data()->set(Am_Paysystem_Xendit::RECURRING_ID, $this->vars['id'])->update();
}
}
Editor is loading...
Leave a Comment