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?
ne devrait-il pas être 'location.href = ...'? – Jeff
@Jeff: A essayé comme vous l'avez suggéré; c'est le même résultat que rapporté ci-dessus. – nyedidikeke
à quoi sert le 'JSON.stringify'? Tu n'as pas besoin de ça! - et c'est probablement le problème -> json ['redirect'] sera faux – Jeff