[Drupal 7] Création d’un module de payment avec une rule

mercredi 23 août 2017

J’ai dû créer pour un site web un module de paiement de type schedule payments lié à Ingénico.

Pour créer ce module qui propose une nouvelle méthode de paiement, il faut savoir que Drupal commerce a besoin d’une rule pour définir si il applique ou non une nouvelle méthode de paiement. Donc dans mon cas il fallait créer un module custom qui interagirait avec une rule dont la condition du module serait custom.

Création d’une rule dans un custom module

Pour cela, il faut donc créé cette rule soit manuellement soit par programmation, ce que je préfère (plus facile à maintenir). J’ai donc d’abord créé un fichier my_modules.rules.inc qui contiendra toutes les méthodes pour définir ma Rule.

Une fonction my_modules_rules_condition_info() qui se charge de créer la condition de notre rule.

function my_modules_schedule_payments_rules_condition_info() {
    return array(
        'my_modules_schedule_payments_condition' => array(
            'label' => t('Add schedule payments method if xxxx'),
            'arguments' => array(
                'order' => array('type' => 'commerce_order', 'label' => t('User\'s shopping cart order')),
            ),
            'module' => 'my_modules_schedule_payments',
            'group' => t('Payment'),
         ),
    );
}

Ici la condition se retrouvera dans le module rule dans le groupe Payment et elle aura un argument à passer à la fonction qui gèrera la condition et cet argument sera l’order en cours.

Il nous reste à créer une méthode (my_modules_schedule_payments) qui retournera un booléen pour dire si la condition est ou non respectée. Et donc cette méthode aura comme paramètre l’argument défini dans my_modules_schedule_payments_rules_condition_info.
Dans notre cas ici:

function my_modules_schedule_payments_condition($order) 

Maintenant que nous avons créé notre condition custom, (il est aussi possible de créer une action custom) il peut être intéressant de créé notre rule dans Drupal au travers du module Rule, afin de ne pas se soucier de devoir la créer manuellement lors de l’installation du module dans un autre environnement.

Pour cela, par faciliter nous allons créé manuellement la rule dans drupal et une fois cette rule en place et tester, il est aussi possible de faire un export de la rule et de copié collé le contenu de l’export dans la fonction my_module_dfault_rules_configuration() qui peut être mis dans le fichier my_module.rules_defaults.inc de votre dossier de module.

function my_module_schedule_payments_default_rules_configuration() {
  $configs = array();
  $rule = '{ "rules_schedule_payments" : {
    "LABEL" : "Schedule Payments",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "my_module_schedule_payments", "commerce_payment" ],
    "ON" : { "commerce_payment_methods" : [] },
    "IF" : [
      { "my_module_schedule_payments_condition" : { "order" : [ "commerce-order" ] } }
    ],
    "DO" : [
      { "commerce_payment_enable_my_module_schedule_payment" : {
          "commerce_order" : [ "commerce_order" ],
          "payment_method" : { "value" : { "method_id" : "my_module_schedule_payment" } }
        }
      }
    ]
  }
}';
  $configs['rules_schedule_payments'] = rules_import($rule);
  return $configs;
}

Maintenant votre rule est embarquée dans le module et donc lorsque vous le mettrez sur un autre serveur, elle sera créé automatiquement lors de l’activation du module.
De plus dans cet export de Rule on voit mieux ce qu’il fait, on retrouve bien par exemple dans l’action (dans le DO) notre method_id !!! Donc la fonction my_module_schedule_payments_rules_condition_info créé notre methode_id mais ne s’affichera que si la rules est validée.

Liste des méthodes à définir pour votre module de payment

  • mymodule_commerce_payment_method_info()
    gère l’affichage de la méthode de paiement dans le checkout pane si la rule est validée
  • mymodule_commerce_payment_method_info_alter()
    permet de modifier l’affichage d’un module qui propose une méthode de paiement. Dans mon cas, j’ai utilisé cette méthode par exemple pour revoir le simple affichage de la méthode de paiement Ogone en y ajoutant les moyens de paiement acceptés par notre compte ogone
  • mymodule_submit_form($payment_method, $pane_values, $checkout_pane, $order)
    permet de modifier l’affichage de la méthode de paiement quand on clique sur la méthode de payment de notre module (checkbox). Attention c’est en ajax et il génère un form utile pour passer des paramètres à notre organisme de payment.
  • mymodule_redirect_form
    cette méthode se charge de définir tous les paramètres à envoyer à notre organisme de paiement
  • mymodule_redirect_form_validate
    cette méthode gère le retour de l’organisme de paiement.

Récupération des settings d’une rule d’un autre module

Il peut aussi être très utile de pouvoir récupérer les settings d’une autre rule dans notre module custom de paiement. Dans mon cas, mon module est intiment lié au module de commerce d’ogone, du coup je ne voulais certainement pas dupliquer les paramètres ogone de mon module avec celui du module ogone par défaut. Du coup, mon module va rechercher ces informations de compte ogone depuis les settings de la rule du module ogone.

$instance = commerce_payment_method_instance_load("ogone|commerce_payment_ogone");
$settings_ogone = $instance["settings"];

Dans mon cas, dans les méthodes ou j’ai besoin des settings de ogone j’utilise ce code pour récupérer les settings de la rule commerce_payment_ogone

Tags: commerce , Drupal 7 , rule