Neler yeni

Foruma hoş geldin 👋, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

  • Forumdan daha fazla yararlanmak için, profilinizi telefon numaranız 📱 ile doğrulayın ve daha ayrıcalıklı olun 😉
    Daha fazla bilgi!

Güncel Shopier Ekletisi Yapmak

Bu sorun halen çözme ulaştırılamamıştır!

lazenes

Sabit kullanıcı
SMS onaylı
Kullanıcı
Katılım
21 Eyl 2017
Mesajlar
72
Çözümler
1
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);
    }
 
}
 
Deniyebilirsin.

Kod:
public function resolveRequestKey($merchant_oid)
{
    if (!$merchant_oid) {
        return false;
    }

    $purchase_request_id = str_replace('SP', '', explode('XF', $merchant_oid)[0]);

    $db = XF::db();
    $request_key = $db->fetchOne(
        'SELECT request_key FROM xf_purchase_request WHERE purchase_request_id = ? ORDER BY purchase_request_date ASC LIMIT 1',
        $purchase_request_id
    );
    return $request_key;
}
 
olursa eklenti halinde banada lazım beklemekteyim teşekkürler
 
purchase_request_date diye bir sütün mevcut değil hocam tablo aşağıdaki gibi ve misal kullanıcı Aynı gün içerisinde id ile denedim yine de Gidiyor tablodaki 12 nolu id deki satırdan işlem yapıyor 1.10 tl çekiyor ama 1.00 tl lik pakete yükselitiyor ve bu shopierde test modu yokmu her denemede 1 tl gidiyor 100 deneme yaptım nerdeyse xenforoyu çözemedim bi

1703100248504.png

Bu da Çalışmıyor:
PHP:
public function resolveRequestKey($userid){
        if(!$userid){
            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 user_id= ? ORDER BY purchase_request_id DESC LIMIT 1', $userid);
    }
 
purchase_request_date diye bir sütün mevcut değil hocam tablo aşağıdaki gibi ve misal kullanıcı Aynı gün içerisinde id ile denedim yine de Gidiyor tablodaki 12 nolu id deki satırdan işlem yapıyor 1.10 tl çekiyor ama 1.00 tl lik pakete yükselitiyor ve bu shopierde test modu yokmu her denemede 1 tl gidiyor 100 deneme yaptım nerdeyse xenforoyu çözemedim bi

Ekli dosyayı görüntüle 24843

Bu da Çalışmıyor:
PHP:
public function resolveRequestKey($userid){
        if(!$userid){
            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 user_id= ? ORDER BY purchase_request_id DESC LIMIT 1', $userid);
    }
Düzelttim test ettim çalışıyor eklentim başka domainlerde de test edeyim emin olayım bir paylaşmayı planlıyorum :) 1703106600595.png



İd den veri Çektirmeyi başardım Shopier de Callback Post verisi kısıtlı olduğu için Kendi Random
purchase_request_id
verimi oluşturdum ve
resolveRequestKey
fonksiyonunu ile set fonksiyonumu ona göre ayarladım yeniden
Kod:
  public function setShopierOrderId($value): ShopierHelper
    {
        
        $this->merchant_oid = 'SP'.$value.'XF'.time();
        return $this;
    }
ve decode Fonksiyonumuzda bu şekilde yapınca son Ödeme isteğini çekiyor
Kod:
public function resolveRequestKey($merchant_oid){
        if(!$merchant_oid){
            return false;
        }
       // $merchant_oid = str_replace($rands, '', $merchant_oid);
          $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);
    }
ve kart dan 1 tl çekip 1 aylık olan paketi doğru şekilde sisteme yansıttı purchase_request_id 54 satırını değil de 55 i çekiyor yani sorunsuz çalıştı


1703106695344.png
 
İlla Shopier mi kullanmak istiyorsunuz? paywant ve PayTR eklentisi hazır var ve çok güzel çalışıyor.
 
İlla Shopier mi kullanmak istiyorsunuz? paywant ve PayTR eklentisi hazır var ve çok güzel çalışıyor.
Shopier Diğer Sanal Pos Sistemleri gibi Prosedürler Yok Shopierden başka Sanal Pos Sistemlerine Dijital İçerik Satışı Diye Belirtince Kapsamıyoruz Veyahut Birkaç Belge Talebinde Bulunuyorlar işi yokuşa sürüyorlar Dijital İçerik Satışı yapan SMM Paneller genelde Bu yüzden Shopier Kullanıyorlar ve Alternatif Pek yok Ülkemizde malesef, Ödeme Sistemleri Paypal gibi Stripe gibi hatta google Pay, Yandex Money gibi Uluslar Arası kurumların hizmetleri yok yerelde kalacaksak da en azından alternatifler olsun komisyon oranları da değişiklik gösteriyor isteyen kendi Anlaşmalı olduğu sanal pos Sağlayıcısından Hizmet Alsın
 
Düzelttim test ettim çalışıyor eklentim başka domainlerde de test edeyim emin olayım bir paylaşmayı planlıyorum :) Ekli dosyayı görüntüle 24845



İd den veri Çektirmeyi başardım Shopier de Callback Post verisi kısıtlı olduğu için Kendi Random

verimi oluşturdum ve

fonksiyonunu ile set fonksiyonumu ona göre ayarladım yeniden
Kod:
  public function setShopierOrderId($value): ShopierHelper
    {
       
        $this->merchant_oid = 'SP'.$value.'XF'.time();
        return $this;
    }
ve decode Fonksiyonumuzda bu şekilde yapınca son Ödeme isteğini çekiyor
Kod:
public function resolveRequestKey($merchant_oid){
        if(!$merchant_oid){
            return false;
        }
       // $merchant_oid = str_replace($rands, '', $merchant_oid);
          $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);
    }
ve kart dan 1 tl çekip 1 aylık olan paketi doğru şekilde sisteme yansıttı purchase_request_id 54 satırını değil de 55 i çekiyor yani sorunsuz çalıştı


Ekli dosyayı görüntüle 24846

Kod:
public function resolveRequestKey($userid) {
    if (!$userid) {
        return false;
    }

    $db = XF::db();
    $requestKey = $db->fetchOne('SELECT request_key FROM xf_purchase_request WHERE user_id = ? ORDER BY purchase_request_id DESC LIMIT 1', $userid);

    return $requestKey;
}

Bu şekildede deniyebilirmisiniz.
 
Kod:
public function resolveRequestKey($userid) {
    if (!$userid) {
        return false;
    }

    $db = XF::db();
    $requestKey = $db->fetchOne('SELECT request_key FROM xf_purchase_request WHERE user_id = ? ORDER BY purchase_request_id DESC LIMIT 1', $userid);

    return $requestKey;
}

Bu şekildede deniyebilirmisiniz.
Eklentiyi Hallettim Dün bir domaine kurdum sorunsuz çalışıyor da Bir Kaç Optimizasyon yapmam gerekecek kullanıcı Adres bilgisi ile GSM bilgisi aldığımız ekranda hatalı post verisi oluşturuyor ve İframe Özelliği aktif olmuyor Kullanıcıyı ille Shopier sayfasına yönlendirilip işlemi tamamlatmak gerekiyor.
 

Foruma hoş geldin 👋, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.