This is a simple component that interfaces a CakePHP app with Stripe's PHP API library. Pass the component an array containing at least an amount and a Stripe token id, it will attempt the charge and return an array of the fields you want.
Version 2 adds the ability to create and retrieve customers, optionally subscribing them to a recurring payment plan or just charging them.
Tested with CakePHP 2.2.x, 2.3.x, and 2.4.x. The required Stripe PHP API library requires PHP 5 with cURL support.
In your project composer.json file:
{
"require": {
"chronon/stripe": "dev-master"
},
"config": {
"vendor-dir": "Vendor"
}
}This will install the plugin into Plugin/Stripe, and install the Stripe library
(from Packagist) into your Vendor directory.
In your app's Config/bootstrap.php, import composer's autoload file:
<?php
App::import('Vendor', array('file' => 'autoload'));Using git:
You will need the component (packaged as a plugin), and Stripe's PHP library (not included). The Stripe library needs to be in this plugin's Vendor directory and must be named 'Stripe'. Using git, something like this:
git clone git@github.com:chronon/CakePHP-StripeComponent-Plugin.git APP/Plugin/Stripe
git clone git://github.com/stripe/stripe-php.git APP/Plugin/Stripe/Vendor/Stripe
All configuration is in APP/Config/bootstrap.php.
Required: Load the plugin:
<?php
CakePlugin::load('Stripe');or load all plugins:
<?php
CakePlugin::loadAll();Required: Set your Stripe secret API keys (both testing and live):
<?php
Configure::write('Stripe.TestSecret', 'yourStripeTestingAPIKeyHere');
Configure::write('Stripe.LiveSecret', 'yourStripeLiveAPIKeyHere');Optional: Set Stripe mode, either 'Live' or 'Test'. Defaults to Test if not set.
<?php
Configure::write('Stripe.mode', 'Test');Optional: Set the currency. Defaults to 'usd'. Currently Stripe supports usd only.
<?php
Configure::write('Stripe.currency', 'usd');Optional: fields for the component to return mapped to => Stripe charge object response fields.
Defaults to 'stripe_id' => 'id'. See the Stripe API docs for Stripe_Charge::create() for available fields. For example:
<?php
Configure::write('Stripe.fields', array(
'stripe_id' => 'id',
'stripe_last4' => array('card' => 'last4'),
'stripe_address_zip_check' => array('card' => 'address_zip_check'),
'stripe_cvc_check' => array('card' => 'cvc_check'),
'stripe_amount' => 'amount'
));See Usage below if Stripe.fields is confusing.
Optional: add a logging config:
<?php
CakeLog::config('stripe', array(
'engine' => 'FileLog',
'types' => array('info', 'error'),
'scopes' => array('stripe'),
'file' => 'stripe',
));Make a payment form however you want, see the Stripe docs for sample code or use Stripe's excellent checkout button. Add the component to your controller:
<?php
public $components = array(
'Stripe.Stripe'
);Format your form data so you can send the component an array containing at least an amount, a Stripe
token (with key stripeToken), or a Stripe customer id (with key stripeCustomer):
<?php
$data = array(
'amount' => '7.59',
'stripeToken' => 'tok_0NAEASV7h0m7ny', // either the token
'stripeCustomer' => 'cus_2x62nI9WxHsL37' // or the customer id, not both.
);Optionally you can include a description key (default is null):
An arbitrary string which you can attach to a charge object. It is displayed when in the web interface alongside the charge. It's often a good idea to use an email address as a description for tracking later.
Optionally you can include a capture key set to true or false (default is true):
Whether or not to immediately capture the charge. When false, the charge issues an authorization (or pre-authorization), and will need to be captured later. Uncaptured charges expire in 7 days.
For example:
<?php
$data = array(
'amount' => '7.59',
'stripeToken' => 'tok_0NAEASV7h0m7ny',
'description' => 'Casi Robot - casi@robot.com'
);
$result = $this->Stripe->charge($data);If the charge was successful, $result will be an array as described by the configuration value
of Stripe.fields. If Stripe.fields is not set:
<?php
$result = array(
'stripe_id' => 'ch_0NXLLCydWzSIeE'
);If Stripe.fields is set, using the example described above in the Configuration section would
give you:
<?php
$result = array(
'stripe_id' => 'ch_0NXLLCydWzSIeE',
'stripe_last4' => '4242',
'stripe_address_zip_check' => 'pass',
'stripe_cvc_check' => 'pass',
'stripe_amount' => 769
);If the charge was not successful, $result will be a string containing an error message, and
log the error.
Creating a customer with a card attached can be used for recurring billing/subscriptions, or can be charged immediately.
<?php
$data = array(
'stripeToken' => 'tok_0NAEASV7h0m7ny',
'description' => 'Casi Robot - casi@robot.com'
);
$result = $this->StripeComponent->customerCreate($data);If creating the customer was successful, $result will be an array as described by the
configuration value of Stripe.fields. If Stripe.fields is not set:
<?php
$result = array(
'stripe_id' => 'cus_2x62nI9WxHsL37'
);If creating the customer was not successful, $result will be a string containing an error message, and
log the error.
You can pass the customerCreate() method any valid keys/data as described by Stripe's API for
creating a customer. See the API reference for the
list. A customer can be created without a card, but obviously can't be charged or subscribed until
a card is attached.
Example: to create a customer and subscribe them to a plan in one step, you could do something like this:
<?php
$data = array(
'stripeToken' => 'tok_0NAEASV7h0m7ny',
'description' => 'Casi Robot',
'email' => 'casi@robot.com',
'plan' => 'Silver Plan Deluxe'
);
$result = $this->StripeComponent->customerCreate($data);Once a customer has been created, you can retrieve the customer object easily with the customer id.
<?php
$customer = $this->StripeComponent->customerRetrieve('cus_2x62nI9WxHsL37');Once you have the $customer object you can update
and delete as needed. For example, to change the
email address of an existing customer:
<?php
$customer = $this->StripeComponent->customerRetrieve('cus_2x62nI9WxHsL37');
$customer->email = 'new@address.com';
$customer->save();Retrieve and charge a customer:
<?php
$customer = $this->StripeComponent->customerRetrieve('cus_2x62nI9WxHsL37');
$chargeData = array(
'amount' => '14.69',
'stripeCustomer' => $customer['stripe_id']
);
$charge = $this->StripeComponent->charge($chargeData);Retrieve and update a customer's card with a token:
<?php
$customer = $this->StripeComponent->customerRetrieve('cus_2x62nI9WxHsL37');
$customer->card = $this->request->data['stripeToken'];
$customer->save();@louisroy