Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,4 @@ composer.phar
# Environment
.env
dev/.env
docs/
30 changes: 8 additions & 22 deletions Block/System/Config/Form/Field/Webhook.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,32 +23,13 @@
namespace Pstk\Paystack\Block\System\Config\Form\Field;

use Magento\Framework\Data\Form\Element\AbstractElement;
use Magento\Store\Model\Store as Store;

/**
* Backend system config datetime field renderer
*
* @api
* @since 100.0.2
* Backend system config field renderer for displaying the Paystack webhook URL.
*/
class Webhook extends \Magento\Config\Block\System\Config\Form\Field
{

/**
* @param \Magento\Backend\Block\Template\Context $context
* @param Store $store
* @param array $data
*/
public function __construct(
\Magento\Backend\Block\Template\Context $context,
Store $store,
array $data = []
) {
$this->store = $store;

parent::__construct($context, $data);
}

/**
* Returns element html
*
Expand All @@ -57,10 +38,15 @@ public function __construct(
*/
protected function _getElementHtml(AbstractElement $element)
{
$webhookUrl = $this->store->getBaseUrl() . 'paystack/payment/webhook';
try {
$webhookUrl = $this->_storeManager->getStore()->getBaseUrl() . 'paystack/payment/webhook';
} catch (\Exception $e) {
$webhookUrl = '{{store_base_url}}paystack/payment/webhook';
}

$value = "You may login to <a target=\"_blank\" href=\"https://dashboard.paystack.co/#/settings/developer\">Paystack Developer Settings</a> to update your Webhook URL to:<br><br>"
. "<strong style='color:red;'>$webhookUrl</strong>";

$element->setValue($webhookUrl);

return $value;
Expand Down
23 changes: 22 additions & 1 deletion Controller/Payment/AbstractPaystackStandard.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
namespace Pstk\Paystack\Controller\Payment;

use Magento\Payment\Helper\Data as PaymentHelper;
use Magento\Store\Model\StoreManagerInterface;
use Pstk\Paystack\Gateway\PaystackApiClient;


Expand All @@ -42,6 +43,7 @@ abstract class AbstractPaystackStandard extends \Magento\Framework\App\Action\Ac
*/
protected $orderInterface;
protected $checkoutSession;
protected $paymentHelper;
protected $method;
protected $messageManager;

Expand All @@ -51,6 +53,12 @@ abstract class AbstractPaystackStandard extends \Magento\Framework\App\Action\Ac
*/
protected $configProvider;

/**
*
* @var StoreManagerInterface
*/
protected $storeManager;

/**
*
* @var PaystackApiClient
Expand Down Expand Up @@ -89,6 +97,7 @@ public function __construct(
PaymentHelper $paymentHelper,
\Magento\Framework\Message\ManagerInterface $messageManager,
\Pstk\Paystack\Model\Ui\ConfigProvider $configProvider,
StoreManagerInterface $storeManager,
\Magento\Framework\Event\Manager $eventManager,
\Magento\Framework\App\Request\Http $request,
\Psr\Log\LoggerInterface $logger,
Expand All @@ -98,16 +107,28 @@ public function __construct(
$this->orderRepository = $orderRepository;
$this->orderInterface = $orderInterface;
$this->checkoutSession = $checkoutSession;
$this->method = $paymentHelper->getMethodInstance(\Pstk\Paystack\Model\Payment\Paystack::CODE);
$this->paymentHelper = $paymentHelper;
$this->messageManager = $messageManager;
$this->configProvider = $configProvider;
$this->storeManager = $storeManager;
$this->eventManager = $eventManager;
$this->request = $request;
$this->logger = $logger;
$this->paystackClient = $paystackClient;

parent::__construct($context);
}

/**
* @return \Magento\Payment\Model\MethodInterface
*/
protected function getMethod()
{
if ($this->method === null) {
$this->method = $this->paymentHelper->getMethodInstance(\Pstk\Paystack\Model\Payment\Paystack::CODE);
}
return $this->method;
}

protected function redirectToFinal($successFul = true, $message="") {
if($successFul){
Expand Down
4 changes: 2 additions & 2 deletions Controller/Payment/Setup.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public function execute() {

$message = '';
$order = $this->orderInterface->loadByIncrementId($this->checkoutSession->getLastRealOrder()->getIncrementId());
if ($order && $this->method->getCode() == $order->getPayment()->getMethod()) {
if ($order && $this->getMethod()->getCode() == $order->getPayment()->getMethod()) {

try {
return $this->processAuthorization($order);
Expand All @@ -55,7 +55,7 @@ protected function processAuthorization(\Magento\Sales\Model\Order $order) {
'email' => $order->getCustomerEmail(), // unique to customers
'reference' => $order->getIncrementId(), // unique to transactions
'currency' => $order->getCurrency(),
'callback_url' => $this->configProvider->getStore()->getBaseUrl() . "paystack/payment/callback",
'callback_url' => $this->storeManager->getStore()->getBaseUrl() . "paystack/payment/callback",
'metadata' => array('custom_fields' => array(
array(
"display_name"=>"Plugin",
Expand Down
29 changes: 22 additions & 7 deletions Gateway/PaystackApiClient.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,31 @@ class PaystackApiClient
{
private const BASE_URL = 'https://api.paystack.co';

/** @var string */
/** @var PaymentHelper */
private $paymentHelper;

/** @var string|null */
private $secretKey;

public function __construct(PaymentHelper $paymentHelper)
{
$method = $paymentHelper->getMethodInstance(PaystackModel::CODE);
$this->secretKey = $method->getConfigData('live_secret_key');
if ($method->getConfigData('test_mode')) {
$this->secretKey = $method->getConfigData('test_secret_key');
$this->paymentHelper = $paymentHelper;
}

/**
* @return string
*/
private function getSecretKey(): string
{
if ($this->secretKey === null) {
$method = $this->paymentHelper->getMethodInstance(PaystackModel::CODE);
$this->secretKey = $method->getConfigData('live_secret_key');
if ($method->getConfigData('test_mode')) {
$this->secretKey = $method->getConfigData('test_secret_key');
}
$this->secretKey = (string) $this->secretKey;
}
return $this->secretKey;
}

/**
Expand Down Expand Up @@ -55,7 +70,7 @@ public function verifyTransaction(string $reference): object
*/
public function validateWebhookSignature(string $rawBody, string $signature): bool
{
$computed = hash_hmac('sha512', $rawBody, $this->secretKey);
$computed = hash_hmac('sha512', $rawBody, $this->getSecretKey());
return hash_equals($computed, $signature);
}

Expand Down Expand Up @@ -104,7 +119,7 @@ private function request(string $method, string $endpoint, ?array $data = null):
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $this->secretKey,
'Authorization: Bearer ' . $this->getSecretKey(),
'Content-Type: application/json',
],
CURLOPT_TIMEOUT => 30,
Expand Down
Loading
Loading