J'ai du faire des modifications plus profondes car $order->cart->order_payment_params n'est pas un tableau mais un objet et d'autre part le paymentOptions est utilisé un peu plus bas pour remplir les champs de l'interface PayPal.
J'ai donc actuellement cela :
$recurring_unit = false;
if($this->payment_params->debug)
$this->writeToLog("Debug : paymentOptions by Apchea");
// $this->writeToLog($order->cart->paymentOptions);
$this->writeToLog($order->cart);
// if(!empty($order->cart->paymentOptions['recurring'])) {
// $recurring_unit = substr($order->cart->paymentOptions['recurring']['duration'], -1);
$recurring_data = false;
if(!empty($order->cart->paymentOptions['recurring']))
$recurring_data = $order->cart->paymentOptions['recurring'];
else if(!empty($order->cart->order_payment_params->recurring))
$recurring_data = $order->cart->order_payment_params->recurring;
else if(!empty($order->order_payment_params['recurring']))
$recurring_data = $order->order_payment_params['recurring'];
if(!empty($recurring_data)) {
$recurring_unit = substr($recurring_data['duration'], -1);
if(!in_array($recurring_unit, array('d','w','m','y')))
$recurring_unit = false;
}
if(!empty($recurring_unit)) {
$vars['cmd'] = '_xclick-subscriptions';
$vars['txn_type'] = 'subscr_payment';
$vars['item_name'] = JText::_('CART_PRODUCT_TOTAL_PRICE');
$vars['a3'] = number_format($order->cart->full_total->prices[0]->price_value_with_tax, 2, '.', '');
// if(!empty($order->cart->paymentOptions['recurring']['value'])) {
if(!empty($recurring_data['value'])) {
$vars['a1'] = number_format($order->cart->full_total->prices[0]->price_value_with_tax, 2, '.', '');
// $vars['p1'] = (int)$order->cart->paymentOptions['recurring']['duration'];
$vars['p1'] = (int)$recurring_data['duration'];
$vars['t1'] = strtoupper($recurring_unit);
// $vars['a3'] = $order->cart->paymentOptions['recurring']['value'];
$vars['a3'] = $recurring_data['value'];
}
// $vars['p3'] = (int)$order->cart->paymentOptions['recurring']['duration'];
$vars['p3'] = (int)$recurring_data['duration'];
$vars['t3'] = strtoupper($recurring_unit);
$vars['src'] = 1;
$vars['sra'] = !empty($this->payment_params->reattempt) ? 1 : 0;
}
$this->vars = $vars;
Ce qui me donne un dump plus pertinent pour un abonnement :
<pre>Array
(
[cmd] => _xclick-subscriptions
[upload] => 1
[business] => xxxxx@yyyy.fr
[receiver_email] => xxxxx@yyyy.fr
[invoice] => 685
[currency_code] => EUR
[return] => https://www.yyyy.fr/index.php?option=com_hikashop&ctrl=checkout&task=after_end&order_id=685&Itemid=669
[notify_url] => https://www.yyyy.fr/index.php?option=com_hikashop&ctrl=checkout&task=notify¬if_payment=paypal_recurring&tmpl=component&lang=fr&Itemid=669
[cancel_return] => https://www.yyyy.fr/index.php?option=com_hikashop&ctrl=order&task=cancel_order&order_id=685&Itemid=669
[undefined_quantity] => 0
[test_ipn] => 1
[shipping] => 0
[no_shipping] => 1
[no_note] =>
[charset] => utf-8
[rm] => 2
[bn] => HikariSoftware_Cart_WPS
[address_override] => 1
[first_name] => Laurentéèçùü
[last_name] => Colzzzzzzz - APCHEA
[address1] => fghdfg
[address2] =>
[zip] => dfg
[city] => dfg
[state] =>
[country] => FR
[email] => colzzzzzz@apchea.com
[night_phone_b] => 464645
[item_name_1] => Abonnement mensuel - YYYY - Annuaire des prescriptions / Articles / Statistiques
[item_number_1] => ABM_test
[amount_1] => 0.10
[quantity_1] => 1
[txn_type] => subscr_payment
[item_name] => Prix total
[a3] => 0.10
[p3] => 1
[t3] => D
[src] => 1
[sra] => 1
)
</pre>
Et là, cela génère bien un abonnement dans l'interface PayPal conforme aux données Hika et se déroulant sans anicroche.
Par contre en mode debug, pas de passage auto sur l'interface Paypal, il faut cliquer sur le bouton pour passer du last chekout step à l'url PayPal de paiement.
De même on ne reçoit aucune notification. Pas de traces dans les logs non plus. J'ai donc désactivé le mode debug au cas où mais cela ne change rien pour les notifications. Par contre, il passe automatiquement du dernier step du chekout à Paypal.
Côté "fournisseur", le compte est bien crédité par paypal et l'historique des IPN semble "normal" (cf. captures).
J'ai noté aussi que lorsque j'affiche les souscriptions actives dans le dashboard en front (qui fonctionne maintenant
), le bouton "renouveler" contient cette url :
www.yyyy.fr/fr/achat/mon-compte/subscrip...ption-16/product-252
.
Cela correspond bien à la souscription concernée (16) et au produit (252). Par contre en cliquant dessus, cela affiche le catalogue général publique et un message "le panier est vide" sans autre info et sans que la souscription ait été renouvelée (mise au panier).
La seule config "spéciale" que je pourrais avoir c'est que le produit n'est pas public. Il est restreint au "super-user" ....