31 Jan 2018

Alipay error Prestashop

J’ai eu l’occasion de créer un site Prestashop dédié au marché Chinois. En moyen de paiement nous avons donc installé Alipay, le module dispose d’une version gratuite sur addons. Cependant il a beaucoup de mal à fonctionner. Très compliqué de trouver des réponses sur les forums du coup je pose ma solution sur mon blog !

Module Alipay Prestashop : Les erreurs

Pour commencer j’ai été confronté à différentes erreurs, peut-être que vous aussi ?

Voici ce que j’ai pu avoir à partir du moment où il fallait cliquer sur le moyen de paiement Alipay :

error_alipay_module_prestashop

error_access_forbidden_alipay_module_prestashop

error_invalid_parameter_alipay_module_prestashop

Suite à mes différentes modifications j’ai pu avoir le message d’erreur “INVALID_PARAMETER” ou “ACCESS_FORBIDDEN“.

Alipay fonctionne pour une seule devise…

Lors de la création de cette boutique nous avons mis en place avec le client plusieurs devises : Euro, Yuan et Hong Kong Dollar.

Après de longues recherches suite aux différentes erreurs affichées par le module ainsi que plusieurs tickets au SAV d’Alipay, on obtient LA réponse.

1 compte = 1 devise. Donc votre module Prestashop va s’adapter à la devise enregistrée lors de la création de votre compte Alipay.

Bizarre oui, mais chez mon client cela fonctionnait uniquement avec l’euro, nous avons donc désactivé les autres devises.

Modifier alipay.php & PaymentRequest.php

Evidemment le module est gratuit sur Prestashop mais je me demande juste si il a bien fonctionné quelque part avant ?

Suite à une grande fouille sur des forums avec très peu d’informations sur le sujet ainsi que des échanges avec Alipay j’ai pu modifier certains fichiers PHP pour faire fonctionner le module.

Ouvrez le fichier PaymentRequest.php et créez la fonction ProductCode :

	/**
* @getProductCode
*/
public function getProductCode()
{
return $this->product_code;
}

/**
* @setProductCode
*/
public function setProductCode($product_code)
{
$this->product_code = $product_code;
$this->param_list['product_code'] = $product_code;
}

Ouvrez le fichier Alipay.php puis rajoutez dans function hookPayment le ProductCode à la ligne 239 :

public function hookPayment($params)
{
include_once(_PS_MODULE_DIR_.'alipay/api/loader.php');

$currency_id = $params['cart']->id_currency;
$currency = new Currency((int)$currency_id);
$cart = new Cart($params['cart']->id);
if (!ValidateCore::isLoadedObject($cart)) {
return false;
}
if (in_array($currency->iso_code, $this->limited_currencies) == false) {
return false;
}
$service = Configuration::get('ALIPAY_SERVICE_PAYMENT');
$credentials = AlipayTools::getCredentials($service, false);

$alipayapi = new AlipayApi($credentials);
$alipayapi->setReturnUrl($this->getReturnUrl($cart->secure_key, $cart->id));
$alipayapi->setNotifyUrl($this->getNotifyUrl($cart->secure_key, $cart->id));
$alipayapi->setCharset('UTF-8');
date_default_timezone_set('Asia/Hong_Kong');
$payment_request = new PaymentRequest();
$payment_request->setCurrency($currency->iso_code);
$payment_request->setPartnerTransactionId(date('YmdHis').$cart->id);
$payment_request->setGoodsDescription($this->getGoodsDescription());
$payment_request->setGoodsName($this->getGoodsName($cart->id));
$payment_request->setOrderGmtCreate(date('Y-m-d H:i:s'));
$payment_request->setOrderValidTime(21600);
$payment_request->setTotalFee($cart->getOrderTotal());
$payment_request->setProductCode('NEW_OVERSEAS_SELLER');
$alipayapi->prepareRequest($payment_request);
$url = $alipayapi->createUrl();
$this->smarty->assign(
array(
'module_dir' => $this->_path,
'alipay_payment_url' => $url
)
);

return $this->display(__FILE__, 'views/templates/hook/payment.tpl');
}

Dans le code ci-dessus j’ai rajouté “$payment_request->setProductCode(‘NEW_OVERSEAS_SELLER’);” à la ligne 35.

Suite à ces modifications j’ai pu faire fonctionner le module Alipay Prestashop !

Téléchargez mon module Alipay pour Prestashop 1.6