Salut à tous!

Je suis en train de développer un petit site avec une gestion d'une petite boutique mais je ne gérerai pas les cartes de crédits sur le site, mais j'enverrai les montants vers paypal ou saferpay (ce mode de paiement étant imposé, je me dois de l'utiliser). Et c'est là que j'ai un petit soucis.

Je vous explique ma configuration pour situer un peu le code:
La structure du site est réalisée sur la base du tutoriel "Développer un site de A à Z". Pas de cakePHP ni d'autre framework, c'est vraiment la structure MVC du tuto.

J'ai donc un ProductsController où je ferai mes différentes actions comme l'envoi du formulaire et la redirection vers paypal ou saferpay selon le choix de l'utilisateur.

En ayant fouillé un peu sur packagist, j'ai trouvé le package "payment/saferpay". C'est au moment de l'inclure que cela fait planter le code.
Dans la doc du package, je dois, comme d'habitude, installer les dépendances avec composer, le tout sera donc autoloadé. Cependant, je dois également ajouter le namespace et c'est cela qui fait planter.
Si je n'indique pas le namespace, j'ai l'erreur suivante qui s'affiche:

Fatal error: Class 'Saferpay' not found

Et si j'ajoute le namespace, c'est cette erreur là:

Fatal error: Class 'Payment\Saferpay\Controller' not found

Du coup je ne comprends par trop cette erreur et comment je peux résoudre ce soucis. Avez-vous une idée ou une direction à prendre?

Merci d'avance pour votre aide. Je joins ci-dessous le fichier ProductsController.php tel que je l'ai actuellement.

Merci d'avance pour votre temps!

<?php
namespace Payment\Saferpay;

use Payment\HttpClient\BuzzClient;
use Payment\Saferpay\Data\PayInitParameter;

/**
* Pages controller
*/
class ProductsController extends Controller
{
    function index() {
        $saferpay = new Saferpay;
        $saferpay->setHttpClient(new BuzzClient());

        // Ce petit bout de code pour vérifier que la classe est bien chargée.
        var_dump($saferpay);
    }
}

J'ai essayé le code de base que le package propose dans un autre dossier uniquement consacré à cela, et tout fonctionne nickel. Dès que j'enlève la déclaration du namespace en début de fichier j'ai la même erreur de classe introuvable. Ci-dessous ce fichier index.php:

<?php

namespace Payment\Saferpay;

require 'vendor/autoload.php';

use Payment\HttpClient\BuzzClient;
use Payment\Saferpay\Data\PayInitParameter;

$saferpay = new Saferpay;
$saferpay->setHttpClient(new BuzzClient());

$amount = 120000;
$currency = 'CHF';

if (getParam('status') == 'success') {
    $payConfirmParameter = $saferpay->verifyPayConfirm(getParam('DATA'), getParam('SIGNATURE'));
    if ($payConfirmParameter->get('AMOUNT') == $amount && $payConfirmParameter->get('CURRENCY') == $currency) {
        $saferpay->payCompleteV2($payConfirmParameter, 'Settlement');
        echo 'payment success!';

        var_dump($payConfirmParameter->get('PROVIDERNAME'));

        var_dump($_SERVER);
    } else {
        $saferpay->payCompleteV2($payConfirmParameter, 'Cancel');
        echo 'payment failed!';
    }
} else {
    $payInitParameter = new PayInitParameter();
    $payInitParameter->setAccountid(PayInitParameter::SAFERPAYTESTACCOUNT_ACCOUNTID);
    $payInitParameter->setAmount($amount);
    $payInitParameter->setCurrency($currency);
    $payInitParameter->setDescription(sprintf('orderID: %s', 'yvesengetschwiler'));
    $payInitParameter->setSuccesslink(requestUrl() . '?status=success');
    $payInitParameter->setFaillink(requestUrl() . '?status=fail');
    $payInitParameter->setBacklink(requestUrl() . '?status=back');
    $payInitParameter->setDelivery('no'); // hide address form
    header('Location: ' . $saferpay->createPayInit($payInitParameter) , 302);
}

function requestUrl()
{
    $protocol = strtolower(substr($_SERVER['SERVER_PROTOCOL'], 0, strpos($_SERVER['SERVER_PROTOCOL'], '/')));

    return $protocol . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
}

function getParam($key, $default = null)
{
    return array_key_exists($key, $_REQUEST) ? $_REQUEST[$key] : $default;
}

9 réponses


beeInteractive
Auteur
Réponse acceptée

Pour info j'ai trouvé la solution. Je vous la publie, cela peut aider d'autres personnes:

Il suffit d'indiquer le "use" de telle manière:

use Payment\HttpClient\BuzzClient;
use Payment\Saferpay\Data\PayInitParameter;
use Payment\Saferpay\Saferpay;

Salut
Question bête mais pourquoi ton ProductsController est dans le namespace Payment\Saferpay ?
Si ce controller est de ton application principale, il devrait hérité du namespace de ton application, non du namespace de la librairie...
As-tu essayé avec un simple use Payment\Saferpay ?

Salut!
Alors oui j'ai essayé et j'ai justement l'erreur de Class not found qui s'affiche. Ce qui est bizarre, c'est que d'habitude je n'ai pas besoin d'indiquer de namespace dans mes fichiers..

Salut, ton namespace est faux, je suppose que ton fichier ProductsController.php est dans le dossier Controller de ton application donc le bon namespace sera

namespace App\Controller;
use Payment\Saferpay;

et pour ton index.php il faut toujours mettre ton require en premier

require 'vendor/autoload.php';
use Payment\Saferpay;

Utilise toujours "use" pour une librairie externe

Si ça marche toujours pas est-ce que tu nous montrer l'architecture de ton application (disposition des dossiers)

Salut! Merci pour ta réponse, malheureusement cela ne fonctionne pas encore. Mais je pense qu'on est pas loin de la solution. Voici la structure de mes dossiers:

Merci d'avance!

As-tu eu la même erreur avec ce que je t'ai donné (si oui donne l'erreur complete) ?
Je vois pas de autoloader dans ton image.
Utilises tu composer ?
Utilises tu les namespaces dans ton application à part dans cette classe (si oui peux tu me montrer) ?
Pourquoi le dossier view est dans public ?
A quoi sert le dossier classes si tu as un dossier Core ?
si tu veux extends Controller, il faut que tu lui dise ou se trouve la class Controller en faisant un

use App\Core\Controller;

avant ta class.

Alors avec ton code, l'erreur qu'il me retourne est la suivante:

Fatal error: Class 'App\Core\Controller' not found in /app/controllers/ProductsController.php on line 20

-J'utilise composer et je n'utilise pas de namespace à part dans cette classe.
La structure des dossiers view et classes n'a pas vraiment été réfléchi mais jusqu'à aujourd'hui je n'ai pas eu de soucis. Le dossier classes regroupe uniquement quelques classes statiques de helper.

Merci de ta réponse, si tu utilise les namespaces utilse les partout.
Puis je voir ton composer.json alors

Voici mon composer .json :-)

{
    "require": {
        "lichtner/fluentpdo": "dev-master",
        "respect/validation": "0.7.*@dev",
        "michelf/php-markdown": "1.3",
        "ircmaxell/password-compat": "dev-master",
        "phpmailer/phpmailer": "dev-master",
        "frameworks/jquery": "dev-master",
        "components/modernizr": "dev-master",
        "kriswallsmith/buzz": "dev-master",
        "kriswallsmith/buzz": "~0.9",
        "kriswallsmith/buzz": "0.9",
        "payment/saferpay": "~3.0",
        "payment/httpclient-buzz": "~1.0",
        "evert/sitemap-php": "dev-master"
    },
    "autoload": {
        "files": [
            "app/classes/Html.php",
            "app/classes/Link.php",
            "app/classes/Form.php"
        ],
        "psr-0": {
            "configuration": "app/classes"
        }
    }
}

Quand tu dis d'utiliser le namespace partout, ça veut dire dans tous les fichiers/classes?