- Destek istenen forum
- http://78.138.31.186/
Arkadaşlar Shopier.com için bir Eklenti geliştirmek istedim ilk eklentim olsun istiyordum ve Xenforo da bir eksik Türk kullanıcılar için her ne ise Eklentiyi Çalışır vaziyete Getirdim fakat Hesap yükseltmeleri Kısmında 2 Farklı satın alına bilir Özellik varsa ve kullanıcı Sırasıyla 1. içeriği seçip işleme devam etmeyip çıkan pencereyi kapatırsa ve 2. içeriği seçip ilerlemek isteyince satın alına bilir içerik misal 1. seçenek 5 tl 2. içerik 10 tl ise kullanıcının hesabını 5 tl lik pakete yükseltip 2. seçenek tutarını karttan çekiyor bunun sorunu xf_purchase_request tablosunda oluşturulan request_key alanının düzgün bir şekilde sql den okutulup işleme dahil edilmemesi bu benim php içeriğim burada nasıl bir düzenleme yapmalıyım da kullanıcının hesap yükseltme aşamasında talep ettiği ilk seçeneğe değil de son talebini işleme aldırabilirim
PHP:
<?php
namespace ShopierPayment\Payment;
use XF;
use XF\Entity\PurchaseRequest;
use XF\Http\Request;
use XF\Mvc\Controller;
use XF\Payment\AbstractProvider;
use XF\Payment\CallbackState;
use XF\Purchasable\Purchase;
class Shopier extends AbstractProvider
{
/**
* @var string[]
*/
protected $supportedCurrencies = [
'TRY', 'USD', 'EUR', 'RUB', 'GBP',
];
/**
* @return string
*/
public function getTitle(): string
{
return 'Shopier Çevrimiçi Ödeme Sistemi';
}
/**
* @param array $options
* @param array $errors
* @return bool
*/
public function verifyConfig(array &$options, &$errors = []): bool
{
if (!$options['merchant_id'] || !$options['merchant_key'])
{
$errors[] = XF::phrase('merchant_id_or_merchant_key_or_merchant_salt_required');
}
return !$errors;
}
/**
* @param Controller $controller
* @param PurchaseRequest $purchaseRequest
* @param Purchase $purchase
* @return XF\Mvc\Reply\View
*/
public function initiatePayment(Controller $controller, PurchaseRequest $purchaseRequest, Purchase $purchase): XF\Mvc\Reply\View
{
$paymentProfile = $purchase->paymentProfile;
$viewParams = $this->getPaymentParams($purchaseRequest, $purchase);
$viewParams['shopier_error_message'] = false;
$viewParams['shopier_display_title'] = $paymentProfile->display_title;
$viewParams['shopier_request_key'] = $purchaseRequest->request_key;
if(!in_array($purchase->currency, $this->supportedCurrencies)){
$viewParams['shopier_error_message'] = XF::phrase('shopier_currency_error');
}else{
$shopier_init = (new ShopierHelper())
->setMerchantId($paymentProfile->options['merchant_id'])
->setMerchantKey($paymentProfile->options['merchant_key'])
->setRandKod(rand(100000,999999))
->setEmail($purchase->purchaser->email)
->setUserName($purchase->purchaser->username)
->setMerchantOkUrl($purchase->returnUrl)
->setMerchantFailUrl($purchase->cancelUrl)
->setPaymentAmount($purchase->cost)
->setUserBasket($purchase->title)
->setMerchantOid($purchaseRequest->purchase_request_id)
->setCurrency($purchase->currency);
$viewParams['shopier'] = $shopier_init->makePostVariables();
$viewParams['cost'] = $purchase->cost;
$viewParams['currency'] = $purchase->currency;
$viewParams['phone_number_description'] = $paymentProfile->options['phone_number_description'];
$viewParams['address_description'] = $paymentProfile->options['address_description'];
$viewParams['iframe_type'] = $paymentProfile->options['iframe_type'];
$viewParams['typeHandlers'] = [
1 => $paymentProfile->options['credit_card_title']
];
}
return $controller->view('ShopierPayment:Payment\Initiate', 'payment_initiate_shopier', $viewParams);
}
/**
* @param Request $request
* @return CallbackState
*/
public function setupCallback(Request $request): CallbackState
{
$state = new CallbackState();
$state->merchant_oid = $request->filter('payment_id', 'str');
$state->hash = $state->request_key;//$request->filter('signature', 'str');
$state->status = $request->filter('status', 'str');
$state->random_nr = $request->filter('random_nr', 'str');
$state->payment_type = $request->filter('platform_order_id', 'str');
$state->UrlYonlendirme = "index.php?account/upgrades";
$state->transactionId = $state->merchant_oid;
$state->requestKey = $this->resolveRequestKey($state->request_key);
return $state;
}
/**
* @param CallbackState $state
* @return bool
*/
public function validateCallback(CallbackState $state): bool
{
if ($state->status !== 'success') {
$state->logType = 'error';
$state->logMessage = 'OK';
return false;
}
return true;
}
/**
* @param CallbackState $state
* @return bool
*/
public function validateTransaction(CallbackState $state): bool
{
if (!$state->transactionId)
{
return false;
}
return true;
}
/**
* @param CallbackState $state
*/
public function getPaymentResult(CallbackState $state)
{
switch ($state->status)
{
case 'success':
$state->paymentResult = CallbackState::PAYMENT_RECEIVED;
break;
case 'failed':
$state->paymentResult = CallbackState::PAYMENT_REINSTATED;
break;
}
}
/**
* @param CallbackState $state
*/
public function completeTransaction(CallbackState $state)
{
if ($state->status == 'success') {
parent::completeTransaction($state);
if ($state->UrlYonlendirme) {
header("Location: " . $state->UrlYonlendirme);
exit;
}
$state->logType = 'info';
$state->logMessage = 'Ödemeniz Alındı Anasayfaya Dönebilirsiniz';
} else {
$state->logType = 'error';
}
$state->logDetails = [
'_GET' => $_GET,
'_POST' => $_POST
];
}
/**
* @param CallbackState $state
*/
public function prepareLogData(CallbackState $state)
{
$state->logDetails = [
'_GET' => $_GET,
'_POST' => $_POST
];
}
/**
* @param $merchant_oid
* @return false|mixed|null
*/
public function resolveRequestKey($merchant_oid){
if(!$merchant_oid){
return false;
}
$merchant_oid = str_replace('SP', '', explode('XF', $merchant_oid)[0]);
$db = XF::db();
return $db->fetchOne('SELECT request_key FROM xf_purchase_request WHERE purchase_request_id = ?', $merchant_oid);
}
}