PHP PayPal REST API Client

mark_paypal_111x69

Today I have published a PHP client for the PayPal REST API. There was an official SDK already, so why another library?

These are the reasons why I have decided to work on a new client:

  1. Using the official SDK felt a bit awkward: a lot of setters, a lot of static methods and a lot of coupling between classes.
  2. I tried to contribute to the official SDK and I failed: I gave myself a week (after work hours) to get a better understanding of the SDK, and to come up with a PR to make the SDK tests run without calling the actual paypal sandbox endpoints. At the end of 6/7 hours of work, I didn’t submit a PR: it would have broken a lot of interfaces and there were still tests calling the sandbox endpoints.
  3. No way of mocking the class making the calls: I was using the official SDK on a side project, and it was not possible to mock only the class that made the real calls – because it was always instantiated with a “new”. I had to implement a class that contained all the logic for using the SDK and mock that.
  4. I didn’t need to call all the endpoints: I only needed to get direct payment working with “paypal” payment method.

So these are the reasons why I delved into the PayPal REST API reference. I played around to make calls and see if I could come up with an OO library that did only what I needed.

Whit PHP PayPal REST API Client you can:

To start using the library just add the following line to your composer.json

"p16/paypal-rest-api-client": "0.1.1"

and then run

composer update p16/paypal-rest-api-client

Giving back to the community much less than what I’ve taken!

Feedback, PR and suggestions are more than welcome!

Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for …

zf-logo-mark

Maybe this is a silly error but still it took me more then 10 minutes to figure it out.

If you are:

  1. using Zend Framework 2
  2. you use the abstract factories to declare how your services should be built
  3. and you get an exception that states “Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for […]”

chances are you are missing a little bit of configuration in your factory.

In my case I was missing the name of the service I wantend to use in the $validNames array, at the beginning of the AbstractFactory.

use Zend\ServiceManager\AbstractFactoryInterface;

class MyAbstractFactory implements AbstractFactoryInterface
{
    protected $validNames = array(
        'servicename1',
        /* 'servicename2' is missing! */
    );

    public function createServiceWithName(ServiceLocatorInterface $sm, $name, $requestedName)
    {
        switch ($requestedName) {
            case 'servicename1':

                return ...;

            case 'servicename2':

            return ...
        }
    }
}

Hope it helps!

Sometime PHP is magic

/*  Function performed after user login info has been collected.
     Store login data as array:
     array( 'login' => ,
     'password' =
     )
     to session variable EZ_LOGIN_HANDLER_USER_INFO for
     automatic processing of login data.

     \return @see eZUserLoginHandler::checkUser()
*/
function postCollectUserInfo()
{
  return true;
}

You need to believe in it! 😉