sakhunzai
sakhunzai

Reputation: 14470

Token Issue with recurring payments with Payum

I am trying to run the example code here

But I am getting this error:

Payum\Core\Exception\InvalidArgumentException: A token with hash `RVpxpP1m3HnTWcj2oL19SQ38NWvCDIz5qeUwfr283kY` could not be found. in /var/www/test/vendor/payum/core/Payum/Core/Security/PlainHttpRequestVerifier.php on line 47

My code looks like this:

namespace Paypal\Model;

use Payum\Core\Model\ArrayObject;

class AgreementDetails extends ArrayObject {

}

namespace Paypal\Model;

use Payum\Core\Model\Token;

class PaymentSecurityToken extends Token
{
}

namespace Paypal\Model;

use Payum\Core\Model\ArrayObject;

class RecurringPaymentDetails extends  ArrayObject{

}

config.php

use Buzz\Client\Curl;
use Payum\Paypal\ExpressCheckout\Nvp\PaymentFactory;
use Payum\Paypal\ExpressCheckout\Nvp\Api;
use Payum\Core\Registry\SimpleRegistry;
use Payum\Core\Storage\FilesystemStorage;
use Payum\Core\Security\PlainHttpRequestVerifier;
use Payum\Core\Security\GenericTokenFactory;

$tokenStorage = new FilesystemStorage('/home/vagrant/tmp', 'Paypal\Model\PaymentSecurityToken');
$requestVerifier = new PlainHttpRequestVerifier($tokenStorage);

$agreementDetailsClass = 'Paypal\Model\AgreementDetails';
$recurringPaymentDetailsClass = 'Paypal\Model\RecurringPaymentDetails';
$storages = array(
    'paypal' => array(
        $agreementDetailsClass => new FilesystemStorage('/home/vagrant/tmp',$agreementDetailsClass),
        $recurringPaymentDetailsClass => new FilesystemStorage('/home/vagrant/tmp',$recurringPaymentDetailsClass)
    )
);

$payments = array(
    'paypal' => PaymentFactory::create(new Api(new Curl, array(
            'username' => 'REPLACE WITH YOURS',
            'password' => 'REPLACE WITH YOURS',
            'signature' => 'REPLACE WITH YOURS',
            'sandbox' => true
        )
    )));

$registry = new SimpleRegistry($payments, $storages, null, null);

$tokenFactory = new GenericTokenFactory(
    $tokenStorage,
    $registry,
    'https://'.$_SERVER['HTTP_HOST'],
    'capture.php',
    'notify.php'
);

prepare.php

use Payum\Paypal\ExpressCheckout\Nvp\Api;

include 'config.php';

$storage = $registry->getStorageForClass($agreementDetailsClass, 'paypal');

$agreementDetails = $storage->createModel();
$agreementDetails['PAYMENTREQUEST_0_AMT'] = 0;
$agreementDetails['L_BILLINGTYPE0'] = Api::BILLINGTYPE_RECURRING_PAYMENTS;
$agreementDetails['L_BILLINGAGREEMENTDESCRIPTION0'] = $subscription['description'];
$agreementDetails['NOSHIPPING'] = 1;
$storage->updateModel($agreementDetails);

$captureToken = $tokenFactory->createCaptureToken('paypal', $agreementDetails, 'create_recurring_payment.php');

$agreementDetails['RETURNURL'] = $captureToken->getTargetUrl();
$agreementDetails['CANCELURL'] = $captureToken->getTargetUrl();
$storage->updateModel($agreementDetails);

header("Location: ".$captureToken->getTargetUrl());

capture.php

use Payum\Core\Request\BinaryMaskStatusRequest;
use Payum\Core\Request\SecuredCaptureRequest;
use Payum\Core\Request\RedirectUrlInteractiveRequest;

include 'config.php';

$token = $requestVerifier->verify($_REQUEST);
$payment = $registry->getPayment($token->getPaymentName());

$payment->execute($status = new BinaryMaskStatusRequest($token));
if (false == $status->isNew()) {
    header('HTTP/1.1 400 Bad Request', true, 400);
    exit;
}

if ($interactiveRequest = $payment->execute(new SecuredCaptureRequest($token), true)) {
    if ($interactiveRequest instanceof RedirectUrlInteractiveRequest) {
        header("Location: ".$interactiveRequest->getUrl());
        die();
    }

    throw new \LogicException('Unsupported interactive request', null, $interactiveRequest);
}

$requestVerifier->invalidate($token);

header("Location: ".$token->getAfterUrl());

create_recurring_payment.php

same as here

I have confirmed that file storage class is able to write data to files, but on capture step it fails to verify the token.

Any sort of help is appreciated to get this code running.

Upvotes: 3

Views: 1579

Answers (1)

Maksim Kotlyar
Maksim Kotlyar

Reputation: 3937

Token storage is not configured correctly (not your fault the doc is wrong too). It has to use hash model field as id. Try:

<?php

$tokenStorage = new FilesystemStorage('/home/vagrant/tmp', 'Paypal\Model\PaymentSecurityToken', 'hash');

About the exception you've gotten. It tries to find token by id and uses for that token's hash. Ofcouce it is could not be found.

Upvotes: 1

Related Questions