====== Payment_Process2 ======
A PHP5 rework of [[pear:packages:payment_process]]
Developers:
doconnor, dbezborodow
===== Migrating =====
To migrate code which uses [[pear:packages:payment_process]]
- Find and replace ''Payment_Process'' to ''Payment_Process2''
- Find and replace ''Payment/Process'' to ''Payment/Process2''
- If you set up any driver specific options with curl, you will need to swap to injecting a preconfigured instance of [[pear:packages:HTTP_Request2]].
$payment = Payment_Process::factory('MyDriver');
$payment->setOption('curl_options', array('monkeys' => true));
becomes
$adapter = new HTTP_Request2_Adapter_Curl();
$adapter->setOption('monkies', true);
$request = new HTTP_Request2($adapter);
$payment = Payment_Process2::factory('MyDriver', $request);
===== Implementing a driver =====
You need to implement two classes and some unit tests.
The first is ''Payment_Process2_YourDriver'', which should implement all of the methods in the interface''Payment_Process2_Driver''.
The second is ''Payment_Process2_Result_YourDriver'', which should implement all of the methods in the interface''Payment_Process2_Result_Driver''.
The interface documentation should provide more detail on this.
===== Testing a driver =====
You want to build a small script pointed at a test server which ''var_dump()''s out results. This is used to quickly verify that it actually works. You take that test data and save it in ''tests/data/Driver/foo.html''
To test the driver; implement coverage of:
- It calls the HTTP_Request object to send off a request via ''process()''
- It reads the response from the server and makes a result object via ''process()''
- It renders a request correctly via ''process()''
- It builds any request data correctly via ''prepareRequestData()''
public function testShouldSendPaymentsAndReturnResults() {
$response = new HTTP_Request2_Response('HTTP/1.1 200 OK');
$response->appendBody(file_get_contents(dirname(__FILE__) . '/tests/data/Driver/foo.html'));
$adapter = new HTTP_Request2_Adapter_Mock();
$adapter->addResponse($response);
$request = new HTTP_Request2($adapter);
$payment = Payment_Process2::factory('Driver', $request);
$result = $payment->process();
$this->assertSame($expected_code, $result->getCode());
$this->assertSame($expected_message, $result->getMessage());
}
You also want very good coverage of your result object, which a variety of test cases like:
public function testShouldParseDataAndPopulateResultObject() {
$data = file_get_contents(dirname(__FILE__) . '/tests/data/Driver/foo.html');
$fake_driver = new Payment_Process2_YourDriver(new HTTP_Request2());
$result = new Payment_Process2_Result_YourDriver($data, $fake_driver);
$result->parse();
$this->assertSame($expected_code, $result->getCode());
$this->assertSame($expected_message, $result->getMessage());
}
===== Roadmap =====
==== 0.1.0 ====
* Get approval for open sourcing work
* Swap to PHP5, HTTP_Request2
* Swap to Interfaces as needed
* Dropping Paycom/Epoch driver Dropped
* Support people won't give access to test environment
* doconnor has mailed other open source projects which provide paycom drivers to see if he can get test data
* Swap to Exceptions as needed Done.
==== 0.2.0 ====
* Add a new driver for an Australian Bank (Payment_Process2_ANZ) ((needs clearing))
* Add a new driver for Paygea (Payment_Process2_Paygea) Licences
* Fix protected / public properties - dbezborodow
* Unit test coverage (mocked out) for all drivers
* Running into problems here with many providers
* TrustCommerce - simple coverage done.
* Paypal - TBA
* Transfirst - asking original author
* Linkpoint - TBA
* Bibit - TBA
* AuthorizeNet - TBA
* Lots of errors and E_NOTICEs from existing drivers
* Lots of Some failures in test coverage
* Test coverage is not extensive!
* Need to improve the test case loaders and what have you
* Swap to class constants.
=== API changes ===
Anything which used
PAYMENT_PROCESS_SOMETHING_CONSTANT
will be
Payment_Process2::SOMETHING_CONSTANT
Also; setPayment() is now a lot more angry about things.
Finally; Payment_Process2_Type::isValid() doesn't exist anymore.
==== 0.3.0 ====
* Add ANZ driver
* Fix typeMapping concept
* Fix cvvCode concept in results
* Use reflection where appropriate
setLogin('Damo');
$process->setPassword('secret');
$cc = Payment_Process2_Type::factory('CreditCard');
$cc->setType(Payment_Process2_Type_CreditCard::MASTERCARD);
$cc->setCardNumber('5123456789012346');
$cc->setExpDate('05/2011');
$cc->setCvv('123');
$action = Payment_Process2_Action::factory($process, 'Normal');
$action->setPayment($cc);
$action->setOrderInfo('123432');
$action->setTransactionReference('123432/1');
$result = $process->process($action);
/*
Responsibilities:
Processor:
Knows the endpoint, prepares the request from data.
Knows credentials.
Has a translator for the action types.
Has a translator for the base fields such as credentials.
Has a process() method that:
Passes response data into a Result and call the parser method.
Returns the Result.
Action:
Has a translator for the data
Prepares data.
Translator:
Very generic. Is never extended so that we don't litter
the class tree; instead, we set up the translator in
constructor methods.
Result:
Has a parser that transforms the response into data that is given to it
by the processor.
Has a translator for the result data.
*/