2017-01-15 2 views
1

Je suis en train de développer un module de paiement OpenCart personnalisé (version: 2.3.0.2). Sur le côté back-end (dossier admin), tout fonctionne parfaitement comme prévu.Impossible de rediriger après avoir écrit dans la base de données (OpenCart)

Contrairement à l'arrière-plan (dossier de catalogue), le flux comportemental fonctionne comme prévu, sauf lorsque je me connecte détails de la transaction à la base de données en utilisant la fonction d'aide $this->model_checkout_order->addOrderHistory(); Je peux écrire avec succès les détails dans la base de données, mais ma redirection après la connexion échoue.
En tant que tel, ma redirection fonctionne efficacement lorsque je commente la fonction d'assistance (que j'utilise pour écrire les détails de paiement dans la base de données) ci-dessus.

Je gère ma redirection avec jQuery, en transmettant l'URL de l'emplacement donné depuis mon extension de paiement de contrôleur de catalogue.

est Ci-dessous le contenu de mon catalogue fichier d'extension de paiement du contrôleur situé à opencart/catalog/controller/extension/payment/my-pay-module.php:

<?php 
class ControllerExtensionPaymentMyPayModule extends Controller { 
    public function index() { 
     $this->load->language('extension/payment/my-pay-module'); 

     $data['text_payment_details'] = $this->language->get('text_payment_details'); 
     $data['text_loading'] = $this->language->get('text_loading'); 

     $data['entry_issuer_hint'] = $this->language->get('entry_issuer_hint'); 
     $data['entry_instrument'] = $this->language->get('entry_instrument'); 

     $data['button_confirm'] = $this->language->get('button_confirm'); 
     $data['button_back'] = $this->language->get('button_back'); 

     return $this->load->view('extension/payment/my-pay-module', $data); 
    } 

    public function send() { 
     $this->load->model('checkout/order'); 

     $order_info = $this->model_checkout_order->getOrder($this->session->data['order_id']); 

     $request = 'merchant_id=' . urlencode($this->config->get('my_pay_module_merchant_id')); 
     $request .= '&order_id=' . urlencode($this->session->data['order_id']); 
     $request .= '&total_amount=' . urlencode($this->currency->format($order_info['total'], $order_info['currency_code'], 1.00000, false)); 
     $request .= '&instrument=' . urlencode($this->request->post['instrument']); 
     $request .= '&issuer_hint=' . urlencode($this->request->post['issuer_hint']); 
     $request .= '&user_phone_no=' . urlencode($order_info['telephone']); 
     $request .= '&user_email=' . urlencode($order_info['email']); 

     $curl = curl_init('https://example.com/v1/api'); 

     curl_setopt($curl, CURLOPT_PORT, 443); 
     curl_setopt($curl, CURLOPT_HEADER, 0); 
     curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); 
     curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($curl, CURLOPT_FORBID_REUSE, 1); 
     curl_setopt($curl, CURLOPT_FRESH_CONNECT, 1); 
     curl_setopt($curl, CURLOPT_POST, 1); 
     curl_setopt($curl, CURLOPT_POSTFIELDS, $request); 

     $response = curl_exec($curl);// JSON response: {"status":"200","success":"true","message":"Payment received successfully."} 

     curl_close($curl); 

     // Create response object 
     $custPayResponse = array(
      'data'  => json_decode($response) 
     ); 

     // Define redirect URL for success 
     $success = array(
      'redirect' => $this->url->link('checkout/success', '', true) 
     ); 

     // Define redirect URL for failure 
     $failed = array(
      'redirect' => $this->url->link('checkout/failed', '', true) 
     ); 

     // Check success and write to OpenCart 
     if ($custPayResponse['data']->success == true) { 

      // Set transaction details 
      $reference = ''; 

      $reference .= 'Issuer Hint: '; 

      if (isset($response)) { 
       $reference .= $this->request->post['issuer_hint'] . "\n"; 
      } 

      $reference .= 'Instrument: '; 

      if (isset($response)) { 
       $reference .= $this->request->post['instrument'] . "\n"; 
      } 

      // Write to database 
      $this->model_checkout_order->addOrderHistory($this->session->data['order_id'], $this->config->get('my_pay_module_order_status_id'), $reference, true); 

      // Merge response object and redirect URL (success) 
      $GLOBALS['params'] = array_merge($custPayResponse, $success); 
     } else { 
      // Merge response object and redirect URL (failure) 
      $GLOBALS['params'] = array_merge($custPayResponse, $failed); 
     } 

     $this->response->addHeader('Content-Type: application/json'); 
     $this->response->setOutput(json_encode($GLOBALS['params'])); 
    } 
} 

et le contenu de mon dossier de vue catalogue qui est situé à: opencart/catalog/view/theme/default/template/extension/payment/my-pay-module.tpl:

<form class="form-horizontal"> 
    <fieldset id="payment"> 
    <legend><?php echo $text_payment_details; ?></legend> 
    <div class="form-group required"> 
     <label class="col-sm-2 control-label" for="input-issuer-hint"><?php echo $entry_issuer_hint; ?></label> 
     <div class="col-sm-10"> 
     <label class="radio-inline"><input type="radio" name="issuer_hint">Option1</label> 
     <label class="radio-inline"><input type="radio" name="issuer_hint">Option2</label> 
     <label class="radio-inline"><input type="radio" name="issuer_hint">Option3</label> 
     </div> 
    </div> 
    <div class="form-group required"> 
     <label class="col-sm-2 control-label" for="input-pymt-instrument"><?php echo $entry_instrument; ?></label> 
     <div class="col-sm-10"> 
     <input type="text" name="instrument" placeholder="<?php echo $entry_instrument; ?>" id="input-instrument" class="form-control" /> 
     </div> 
    </div> 
    </fieldset> 
</form> 
<div class="buttons"> 
    <div class="pull-right"> 
    <input type="button" value="<?php echo $button_confirm; ?>" id="button-confirm" data-loading-text="<?php echo $text_loading; ?>" class="btn btn-primary" /> 
    </div> 
</div> 
<script type="text/javascript"> 
$('#button-confirm').bind('click', function() { 
    $.ajax({ 
     url: 'index.php?route=extension/payment/my-pay-module/send', 
     type: 'post', 
     data: $('#payment :input'), 
     dataType: 'json', 
     cache: false, 
     beforeSend: function() { 
      $('#button-confirm').button('loading'); 
     }, 
     complete: function() { 
      $('#button-confirm').button('reset'); 
     }, 
     success: function(json) { 
      console.log(json); 
      // console.log(JSON.stringify(json)); 

      if (json['redirect']) { 
       // Sample expected result: http://localhost/opencart/index.php?route=checkout/success 
       // Using a full location for that reason; not location.href as result is not as desired. 
       location = json['redirect']; 
      } 
     } 
    }); 
}); 
</script> 

Je n'obtiens aucune erreur dans la console du navigateur et le journal des erreurs OpenCart.

Qu'est-ce que je fais mal et puis-je le réparer?

+0

ne devrait-il pas être 'location.href = ...'? – Jeff

+0

@Jeff: A essayé comme vous l'avez suggéré; c'est le même résultat que rapporté ci-dessus. – nyedidikeke

+0

à quoi sert le 'JSON.stringify'? Tu n'as pas besoin de ça! - et c'est probablement le problème -> json ['redirect'] sera faux – Jeff

Répondre

0

en supposant que le JSON ressemble reçu que:

json = {"redirect": "page2.html", "param2": "foo"}; 

//.... 
success: function(json) { 
    console.log(json); 
    // JSON.stringify(json); // you wanna keep the json, json['redirect'] will return a string anyway 

    if (json['redirect']) { 
     // you need to set location.href here, not the whole location object! 
     location.href = json['redirect']; 
    } 
} 
//... 
+0

Le JSON reçu ressemble à votre extrait ci-dessus. Edité comme vous l'avez suggéré; ça ne marche toujours pas. Le problème persiste car aucune donnée n'est transmise à la vue lorsque j'écris dans la base de données avec ** '$ this-> model_checkout_order-> addOrderHistory ($ this-> session-> data ['order_id'], $ this-> config- > get ('my_pay_module_order_status_id'), $ reference, true); **. Lorsque je commente ce même script dans mon contrôleur, les données sont transmises à la vue et ma redirection fonctionne comme prévu, mais le seul problème est que je n'obtiens aucun détail de transaction enregistré dans la base de données. – nyedidikeke

0

Vous avez un bug dans la méthode addOrderHistory() - probablement causé par un ocmod ou vqmod, ou peut-être vos paramètres de messagerie. Toute erreur fatale peut entraîner le blocage du contrôleur de paiement et ne pas donner de réponse ajax. Je peux presque garantir que vous trouverez des erreurs dans le journal des erreurs de votre serveur Web concernant la source du problème si un niveau de journalisation raisonnable est activé.

+0

J'étais en mesure de le résoudre, mais je n'ai pas encore publié la solution et l'approche; vous avez raison sur les * paramètres mail *, mais je l'ai récupéré, retour de l'erreur fatale d'AJAX (après avoir ajouté ** 'error: function()' **). Pas de bug dans 'addOrderHistory()'. Bonne idée cependant. – nyedidikeke

+0

La méthode 'addOrderHistory()' envoie un e-mail de sorte que, selon toute vraisemblance, le problème dans vos paramètres de messagerie entraîne son blocage. J'ai vu ce genre de chose un tas de fois et le courrier est le suspect habituel – billynoah