636 lines
21 KiB
PHP
636 lines
21 KiB
PHP
|
<?php
|
||
|
/* vim: set expandtab tabstop=4 shiftwidth=4: */
|
||
|
// +----------------------------------------------------------------------+
|
||
|
// | PHP version 4 |
|
||
|
// +----------------------------------------------------------------------+
|
||
|
// | Copyright (c) 1997-2004 The PHP Group |
|
||
|
// +----------------------------------------------------------------------+
|
||
|
// | This source file is subject to version 3.0 of the PHP license, |
|
||
|
// | that is bundled with this package in the file LICENSE, and is |
|
||
|
// | available through the world-wide-web at |
|
||
|
// | http://www.php.net/license/3_0.txt. |
|
||
|
// | If you did not receive a copy of the PHP license and are unable to |
|
||
|
// | obtain it through the world-wide-web, please send a note to |
|
||
|
// | license@php.net so we can mail you a copy immediately. |
|
||
|
// +----------------------------------------------------------------------+
|
||
|
// | Authors: Robin Ericsson <lobbin@localhost.nu> |
|
||
|
// +----------------------------------------------------------------------+
|
||
|
//
|
||
|
// $Id: Bibit.php,v 1.6 2005/07/28 02:52:58 jstump Exp $
|
||
|
|
||
|
require_once('Payment/Process.php');
|
||
|
require_once('Payment/Process/Common.php');
|
||
|
require_once('Net/Curl.php');
|
||
|
require_once('XML/Util.php');
|
||
|
require_once('XML/XPath.php');
|
||
|
|
||
|
define('PAYMENT_PROCESS_ACTION_BIBIT_AUTH', 300);
|
||
|
define('PAYMENT_PROCESS_ACTION_BIBIT_REDIRECT', 400);
|
||
|
define('PAYMENT_PROCESS_ACTION_BIBIT_REFUND', 500);
|
||
|
define('PAYMENT_PROCESS_ACTION_BIBIT_CAPTURE', 600);
|
||
|
|
||
|
// Map actions
|
||
|
$GLOBALS['_Payment_Process_Bibit'] = array(
|
||
|
PAYMENT_PROCESS_ACTION_NORMAL => PAYMENT_PROCESS_ACTION_BIBIT_REDIRECT,
|
||
|
PAYMENT_PROCESS_ACTION_AUTHONLY => PAYMENT_PROCESS_ACTION_BIBIT_AUTH,
|
||
|
PAYMENT_PROCESS_ACTION_CREDIT => PAYMENT_PROCESS_ACTION_BIBIT_REFUND,
|
||
|
PAYMENT_PROCESS_ACTION_SETTLE => PAYMENT_PROCESS_ACTION_BIBIT_CAPTURE,
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
* Payment_Process_Bibit
|
||
|
*
|
||
|
* This is a process for Bibit's merchant payment gateway.
|
||
|
* (http://www.bibit.com)
|
||
|
*
|
||
|
* *** WARNING ***
|
||
|
* This is BETA code, and hos not been fully tested. It is not recommended
|
||
|
* that you use it in a production environment without further testing.
|
||
|
*
|
||
|
* @package Payment_Process
|
||
|
* @author Robin Ericsson <lobbin@localhost.nu>
|
||
|
* @version @version@
|
||
|
*/
|
||
|
class Payment_Process_Bibit extends Payment_Process_Common {
|
||
|
/**
|
||
|
* Front-end -> back-end field map.
|
||
|
*
|
||
|
* This array contains the mapping from front-end fields (defined in
|
||
|
* the Payment_Process class) to the field names Bibit requires.
|
||
|
*
|
||
|
* @see _prepare()
|
||
|
* @access private
|
||
|
*/
|
||
|
var $_fieldMap = array(
|
||
|
// Required
|
||
|
'login' => 'x_login',
|
||
|
'password' => 'x_password',
|
||
|
'ordercode' => 'x_ordercode',
|
||
|
'description' => 'x_descr',
|
||
|
'amount' => 'x_amount',
|
||
|
'currency' => 'x_currency',
|
||
|
'exponent' => 'x_exponent',
|
||
|
'action' => 'x_action',
|
||
|
// Optional
|
||
|
'ordercontent' => 'x_ordercontent',
|
||
|
'shopper_ip_address' => 'shopperIPAddress',
|
||
|
'shopper_email_address' => 'shopperEmailAddress',
|
||
|
'session_id' => 'sessionId',
|
||
|
'authenticated_shopper_id' => 'authenticatedShopperID',
|
||
|
'shipping_address' => 'shippingAddress',
|
||
|
'payment_method_mask' => 'paymentMethodMask',
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
* Default options for this processor.
|
||
|
*
|
||
|
* @see Payment_Process::setOptions()
|
||
|
* @access private
|
||
|
*/
|
||
|
var $_defaultOptions = array(
|
||
|
'authorizeUri' => 'https://secure.bibit.com/jsp/merchant/xml/paymentService.jsp',
|
||
|
'authorizeTestUri' => 'https://secure-test.bibit.com/jsp/merchant/xml/paymentService.jsp',
|
||
|
'x_version' => '1.4'
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
* The reponse body sent back from the gateway.
|
||
|
*
|
||
|
* @access private
|
||
|
*/
|
||
|
var $_responseBody = '';
|
||
|
|
||
|
/**
|
||
|
* The orders unique code
|
||
|
*
|
||
|
* @access private
|
||
|
*/
|
||
|
var $ordercode = '';
|
||
|
|
||
|
/**
|
||
|
* The order amounts currency
|
||
|
*
|
||
|
* @access private
|
||
|
*/
|
||
|
var $currency = '';
|
||
|
|
||
|
/**
|
||
|
* The order amounts exponent
|
||
|
*
|
||
|
* @access private
|
||
|
*/
|
||
|
var $exponent = 0;
|
||
|
|
||
|
/**
|
||
|
* The orders content as displayed at bibit
|
||
|
*
|
||
|
* @access private
|
||
|
*/
|
||
|
var $ordercontent = '';
|
||
|
|
||
|
/**
|
||
|
* The ip-address the order comes from
|
||
|
*
|
||
|
* @access private
|
||
|
*/
|
||
|
var $shopper_ip_address;
|
||
|
|
||
|
/**
|
||
|
* The shoppers email-address
|
||
|
*
|
||
|
* @access private
|
||
|
*/
|
||
|
var $shopper_email_address;
|
||
|
|
||
|
/**
|
||
|
* The unique id of the users session
|
||
|
*
|
||
|
* @access private
|
||
|
*/
|
||
|
var $session_id;
|
||
|
|
||
|
/**
|
||
|
* Unique id of the authenticed shopper
|
||
|
*
|
||
|
* @access private
|
||
|
*/
|
||
|
var $authenticated_shopper_id;
|
||
|
|
||
|
/**
|
||
|
* Shipping address
|
||
|
*
|
||
|
* @access private
|
||
|
*/
|
||
|
var $shipping_address = array();
|
||
|
|
||
|
/**
|
||
|
* Payment method mask
|
||
|
*
|
||
|
* @access private
|
||
|
*/
|
||
|
var $payment_method_mask = array();
|
||
|
|
||
|
/**
|
||
|
* $_typeFieldMap
|
||
|
*
|
||
|
* @access protected
|
||
|
*/
|
||
|
var $_typeFieldMap = array(
|
||
|
'CreditCard' => array(
|
||
|
'cvv' => 'x_card_code',
|
||
|
'expDate' => 'x_exp_date',
|
||
|
'cardNumber' => 'x_card_num',
|
||
|
)
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
* Constructor.
|
||
|
*
|
||
|
* @param array $options Class options to set.
|
||
|
* @see Payment_Process::setOptions()
|
||
|
* @return void
|
||
|
*/
|
||
|
function __construct($options = false)
|
||
|
{
|
||
|
parent::__construct();
|
||
|
$this->_driver = 'Bibit';
|
||
|
$this->_makeRequired('login', 'password', 'ordercode', 'description', 'amount', 'currency', 'exponent', 'cardNumber', 'expDate', 'action');
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Process the transaction.
|
||
|
*
|
||
|
* @return mixed Payment_Process_Result on success, PEAR_Error on failure
|
||
|
*/
|
||
|
function &process()
|
||
|
{
|
||
|
// Sanity check
|
||
|
$result = $this->validate();
|
||
|
if(PEAR::isError($result)) {
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
// Prepare the data
|
||
|
$result = $this->_prepare();
|
||
|
if (PEAR::isError($result)) {
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
// Don't die partway through
|
||
|
PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
|
||
|
|
||
|
$fields = $this->_prepareQueryString();
|
||
|
$curl = new Net_Curl(isset($this->_options['live']) ? $this->_options['authorizeUri'] : $this->_options['authorizeTestUri']);
|
||
|
if (PEAR::isError($curl)) {
|
||
|
PEAR::popErrorHandling();
|
||
|
return $curl;
|
||
|
}
|
||
|
|
||
|
$curl->type = 'PUT';
|
||
|
$curl->fields = $fields;
|
||
|
$curl->userAgent = 'PEAR Payment_Process_Bibit 0.1';
|
||
|
$curl->username = $this->_data['x_login'];
|
||
|
$curl->password = $this->_data['x_password'];
|
||
|
|
||
|
$result = &$curl->execute();
|
||
|
if (PEAR::isError($result)) {
|
||
|
PEAR::popErrorHandling();
|
||
|
return $result;
|
||
|
} else {
|
||
|
$curl->close();
|
||
|
}
|
||
|
|
||
|
$this->_responseBody = trim($result);
|
||
|
$this->_processed = true;
|
||
|
|
||
|
// Restore error handling
|
||
|
PEAR::popErrorHandling();
|
||
|
|
||
|
$response = &Payment_Process_Result::factory($this->_driver,
|
||
|
$this->_responseBody,
|
||
|
$this);
|
||
|
if (!PEAR::isError($response)) {
|
||
|
$response->parse();
|
||
|
}
|
||
|
|
||
|
return $response;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Prepare the PUT query xml.
|
||
|
*
|
||
|
* @access private
|
||
|
* @return string The query xml
|
||
|
*/
|
||
|
function _prepareQueryString()
|
||
|
{
|
||
|
$data = array_merge($this->_options,$this->_data);
|
||
|
|
||
|
$doc = XML_Util::getXMLDeclaration();
|
||
|
$doc .= '<!DOCTYPE paymentService PUBLIC "-//Bibit//DTD Bibit PaymentService v1//EN" "http://dtd.bibit.com/paymentService_v1.dtd">';
|
||
|
|
||
|
$doc .= XML_Util::createStartElement('paymentService', array('version' => $data['x_version'], 'merchantCode' => $data['x_login']));
|
||
|
if ($data['x_action'] == PAYMENT_PROCESS_ACTION_BIBIT_CAPTURE || $data['x_action'] == PAYMENT_PROCESS_ACTION_BIBIT_REFUND) {
|
||
|
$doc .= XML_Util::createStartElement('modify');
|
||
|
$doc .= XML_Util::createStartElement('orderModification', array('orderCode' => $data['x_ordercode']));
|
||
|
if ($data['x_action'] == PAYMENT_PROCESS_ACTION_BIBIT_CAPTURE) {
|
||
|
$doc .= XML_Util::createStartElement('capture');
|
||
|
|
||
|
$d = array();
|
||
|
$t = time() - 86400;
|
||
|
$d['dayOfMonth'] = date('d', $t);
|
||
|
$d['month'] = date('m', $t);
|
||
|
$d['year'] = date('Y', $t);
|
||
|
$d['hour'] = date('H', $t);
|
||
|
$d['minute'] = date('i', $t);
|
||
|
$d['second'] = date('s', $t);
|
||
|
$doc .= XML_Util::createTag('date', $d);
|
||
|
$doc .= XML_Util::createTag('amount', array('value' => $data['x_amount'],
|
||
|
'currencyCode' => $data['x_currency'],
|
||
|
'exponent' => $data['x_exponent']));
|
||
|
|
||
|
$doc .= XML_Util::createEndElement('capture');
|
||
|
} else if ($data['x_action'] == PAYMENT_PROCESS_ACTION_BIBIT_REFUND) {
|
||
|
$doc .= XML_Util::createStartElement('refund');
|
||
|
$doc .= XML_Util::createTag('amount', array('value' => $data['x_amount'],
|
||
|
'currencyCode' => $data['x_currency'],
|
||
|
'exponent' => $data['x_exponent']));
|
||
|
$doc .= XML_Util::createEndElement('refund');
|
||
|
}
|
||
|
|
||
|
$doc .= XML_Util::createEndElement('orderModification');
|
||
|
$doc .= XML_Util::createEndElement('modify');
|
||
|
} else {
|
||
|
$doc .= XML_Util::createStartElement('submit');
|
||
|
$doc .= XML_Util::createStartElement('order', array('orderCode' => $data['x_ordercode']));
|
||
|
|
||
|
$doc .= XML_Util::createTag('description', null, $data['x_descr']);
|
||
|
$doc .= XML_Util::createTag('amount', array('value' => $data['x_amount'],
|
||
|
'currencyCode' => $data['x_currency'],
|
||
|
'exponent' => $data['x_exponent']));
|
||
|
if (isset($data['x_ordercontent'])) {
|
||
|
$doc .= XML_Util::createStartElement('orderContent');
|
||
|
$doc .= XML_Util::createCDataSection($data['x_ordercontent']);
|
||
|
$doc .= XML_Util::createEndElement('orderContent');
|
||
|
}
|
||
|
|
||
|
if ($data['x_action'] == PAYMENT_PROCESS_ACTION_BIBIT_REDIRECT) {
|
||
|
if (is_array($data['paymentMethodMask']) && count($data['paymentMethodMask'] > 0)) {
|
||
|
$doc .= XML_Util::createStartElement('paymentMethodMask');
|
||
|
foreach($data['paymentMethodMask']['include'] as $code) {
|
||
|
$doc .= XML_Util::createTag('include', array('code' => $code));
|
||
|
}
|
||
|
foreach($data['paymentMethodMask']['exclude'] as $code) {
|
||
|
$doc .= XML_Util::createTag('exclude', array('code' => $code));
|
||
|
}
|
||
|
$doc .= XML_Util::createEndElement('paymentMethodMask');
|
||
|
}
|
||
|
} else if ($data['x_action'] == PAYMENT_PROCESS_ACTION_BIBIT_AUTH) {
|
||
|
$doc .= XML_Util::createStartElement('paymentDetails');
|
||
|
switch ($this->_payment->type) {
|
||
|
case PAYMENT_PROCESS_CC_VISA: $cc_type = 'VISA-SSL'; break;
|
||
|
case PAYMENT_PROCESS_CC_MASTERCARD: $cc_type = 'ECMC-SSL'; break;
|
||
|
case PAYMENT_PROCESS_CC_AMEX: $cc_type = 'AMEX-SSL'; break;
|
||
|
}
|
||
|
|
||
|
$doc .= XML_Util::createStartElement($cc_type);
|
||
|
if (isset($data['x_card_num'])) {
|
||
|
$doc .= XML_Util::createTag('cardNumber', null, $data['x_card_num']);
|
||
|
}
|
||
|
if (isset($data['x_exp_date'])) {
|
||
|
$doc .= XML_Util::createStartElement('expiryDate');
|
||
|
$doc .= XML_Util::createTag('date', array('month' => substr($data['x_exp_date'], 0, 2),
|
||
|
'year' => substr($data['x_exp_date'], 3, 4)));
|
||
|
$doc .= XML_Util::createEndElement('expiryDate');
|
||
|
}
|
||
|
if (isset($this->_payment->firstName) &&
|
||
|
isset($this->_payment->lastName)) {
|
||
|
$doc .= XML_Util::createTag('cardHolderName', null, $this->_payment->firstName.' '.$this->_payment->lastName);
|
||
|
}
|
||
|
if (isset($data['x_card_code'])) {
|
||
|
$doc .= XML_Util::createTag('cvc', null, $data['x_card_code']);
|
||
|
}
|
||
|
|
||
|
$doc .= XML_Util::createEndElement($cc_type);
|
||
|
|
||
|
if ((isset($data['shopperIPAddress']) || isset($data['sessionId']))
|
||
|
&& ($data['shopperIPAddress'] != '' || $data['sessionId'] != '')) {
|
||
|
$t = array();
|
||
|
if ($data['shopperIPAddress'] != '') {
|
||
|
$t['shopperIPAddress'] = $data['shopperIPAddress'];
|
||
|
}
|
||
|
if ($data['sessionId'] != '') {
|
||
|
$t['id'] = $data['sessionId'];
|
||
|
}
|
||
|
|
||
|
$doc .= XML_Util::createTag('session', $t);
|
||
|
unset($t);
|
||
|
}
|
||
|
|
||
|
$doc .= XML_Util::createEndElement('paymentDetails');
|
||
|
}
|
||
|
|
||
|
if ((isset($data['shopperEmailAddress']) && $data['shopperEmailAddress'] != '')
|
||
|
|| (isset($data['authenticatedShopperID']) && $data['authenticatedShopperID'] != '')) {
|
||
|
$doc .= XML_Util::createStartElement('shopper');
|
||
|
|
||
|
if ($data['shopperEmailAddress'] != '') {
|
||
|
$doc .= XML_Util::createTag('shopperEmailAddress', null, $data['shopperEmailAddress']);
|
||
|
}
|
||
|
if ($data['authenticatedShopperID'] != '') {
|
||
|
$doc .= XML_Util::createTag('authenticatedShopperID', null, $data['authenticatedShopperID']);
|
||
|
}
|
||
|
|
||
|
$doc .= XML_Util::createEndElement('shopper');
|
||
|
}
|
||
|
|
||
|
if (is_array($data['shippingAddress']) && count($data['shippingAddress']) > 0) {
|
||
|
$a = $data['shippingAddress'];
|
||
|
|
||
|
$doc .= XML_Util::createStartElement('shippingAddress');
|
||
|
$doc .= XML_Util::createStartElement('address');
|
||
|
|
||
|
$fields = array('firstName', 'lastName', 'street',
|
||
|
'houseName', 'houseNumber', 'houseNumberExtension',
|
||
|
'postalCode', 'city', 'state',
|
||
|
'countryCode', 'telephoneNumber');
|
||
|
|
||
|
foreach($fields as $field) {
|
||
|
if (isset($a[$field])) {
|
||
|
$doc .= XML_Util::createTag($field, null, $a[$field]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$doc .= XML_Util::createEndElement('address');
|
||
|
$doc .= XML_Util::createEndElement('shippingAddress');
|
||
|
}
|
||
|
|
||
|
$doc .= XML_Util::createEndElement('order');
|
||
|
$doc .= XML_Util::createEndElement('submit');
|
||
|
}
|
||
|
$doc .= XML_Util::createEndElement('paymentService');
|
||
|
|
||
|
$doc1 = domxml_open_mem($doc);
|
||
|
|
||
|
return $doc;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Prepare the ordercontent
|
||
|
*
|
||
|
* Docs says max size is 10k
|
||
|
*
|
||
|
* @access private
|
||
|
*/
|
||
|
function _handleOrdercontent()
|
||
|
{
|
||
|
$specific = $this->_fieldMap['ordercontent'];
|
||
|
if ($this->ordercontent != '') {
|
||
|
$this->_data[$specific] = substr($this->ordercontent, 0, 10240);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Validate the merchant account login.
|
||
|
*
|
||
|
* @access private
|
||
|
* @return boolean true if valid, false otherwise
|
||
|
*/
|
||
|
function _validateLogin()
|
||
|
{
|
||
|
return Validate::string($this->login, array(
|
||
|
'format' => VALIDATE_ALPHA_UPPER,
|
||
|
'min_length' => 1
|
||
|
));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Validate the merchant account password.
|
||
|
*
|
||
|
* @access private
|
||
|
* @return boolean true if valid, false otherwise
|
||
|
*/
|
||
|
function _validatePassword()
|
||
|
{
|
||
|
return Validate::string($this->password, array(
|
||
|
'min_length' => 1
|
||
|
));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Validates the ordercode
|
||
|
*
|
||
|
* Docs says up to 64 characters, no spaces or specials characters allowed
|
||
|
*
|
||
|
* @access private
|
||
|
* @return boolean true if valid, false otherwise
|
||
|
*/
|
||
|
function _validateOrdercode()
|
||
|
{
|
||
|
return Validate::string($this->ordercode, array(
|
||
|
'min_length' => 1,
|
||
|
'max_length' => 64
|
||
|
));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Validate the order description.
|
||
|
*
|
||
|
* Docs says maximum length is 50 characters...
|
||
|
*
|
||
|
* @access private
|
||
|
* @return boolean true if valid, false otherwise
|
||
|
*/
|
||
|
function _validateDescription()
|
||
|
{
|
||
|
return Validate::string($this->description, array(
|
||
|
'min_length' => 1,
|
||
|
'max_length' => 50,
|
||
|
));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Validate the order amount.
|
||
|
*
|
||
|
* Should contain no digits, as those are set with the exponent option.
|
||
|
*
|
||
|
* @access private
|
||
|
* @return boolean true if valid, false otherwise
|
||
|
*/
|
||
|
function _validateAmount()
|
||
|
{
|
||
|
return Validate::number($this->amount, array(
|
||
|
'decimal' => false
|
||
|
));
|
||
|
}
|
||
|
|
||
|
/** Validate the order amount currency
|
||
|
*
|
||
|
* The abbrivation for a currency, usually 2-3 chars
|
||
|
*
|
||
|
* @access private
|
||
|
* @return boolean true if valid, false otherwise
|
||
|
*/
|
||
|
function _validateCurrency()
|
||
|
{
|
||
|
return Validate::string($this->currency, array(
|
||
|
'format' => VALIDATE_ALPHA_UPPER,
|
||
|
'min_length' => 2,
|
||
|
'max_length' => 3
|
||
|
));
|
||
|
}
|
||
|
|
||
|
/** Validate the exponent of the order amount
|
||
|
*
|
||
|
* Occording to the dtd, valid is 0, 2 or 3
|
||
|
*
|
||
|
* @access private
|
||
|
* @return boolean true if valid, false otherwise
|
||
|
*/
|
||
|
function _validateExponent()
|
||
|
{
|
||
|
switch ($this->exponent)
|
||
|
{
|
||
|
case 0:
|
||
|
case 2:
|
||
|
case 3:
|
||
|
return true;
|
||
|
default:
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Payment_Process_Bibit_Result
|
||
|
*
|
||
|
*
|
||
|
* @package Payment_Process
|
||
|
* @author Robin Ericsson <lobbin@localhost.nu>
|
||
|
* @version @version@
|
||
|
*/
|
||
|
class Payment_Process_Result_Bibit extends Payment_Process_Result
|
||
|
{
|
||
|
var $_returnCode = PAYMENT_PROCESS_RESULT_DECLINED;
|
||
|
|
||
|
var $_lastEvent = NULL;
|
||
|
|
||
|
var $_fieldMap = array(
|
||
|
);
|
||
|
|
||
|
function __construct($rawResponse)
|
||
|
{
|
||
|
$this->_rawResponse = $rawResponse;
|
||
|
}
|
||
|
|
||
|
function getErrorCode()
|
||
|
{
|
||
|
return $this->_errorCode;
|
||
|
}
|
||
|
|
||
|
function getCode()
|
||
|
{
|
||
|
return $this->_returnCode;
|
||
|
}
|
||
|
|
||
|
function parse()
|
||
|
{
|
||
|
$doc = new XML_XPath();
|
||
|
|
||
|
$e = $doc->load($this->_rawResponse, 'string');
|
||
|
if (PEAR::isError($e)) {
|
||
|
$this->_returnCode = PAYMENT_PROCESS_RESULT_OTHER;
|
||
|
$this->message = 'Error parsing reply: '.$e->getMessage()."\n";
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
$e = $doc->evaluate('//reply/error/attribute::code');
|
||
|
if (!PEAR::isError($e) && $e->next()) {
|
||
|
$this->_returnCode = PAYMENT_PROCESS_RESULT_OTHER;
|
||
|
$this->_errorCode = $e->getData();
|
||
|
|
||
|
$e = $doc->evaluate('//reply/error/text()');
|
||
|
$this->message = $e->getData();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
$orderType = $this->_request->_data['x_action'];
|
||
|
switch ($orderType) {
|
||
|
case PAYMENT_PROCESS_ACTION_BIBIT_AUTH:
|
||
|
$e = $doc->evaluate('//reply/orderStatus/payment/lastEvent/text()');
|
||
|
if (!PEAR::isError($e) && $e->next()) {
|
||
|
$this->_lastEvent = $e->getData();
|
||
|
}
|
||
|
|
||
|
$amount = $doc->evaluate('//reply/orderStatus/payment/amount/attribute::value');
|
||
|
if (!PEAR::isError($amount) && $amount->next()) {
|
||
|
if ($this->_lastEvent == 'AUTHORISED') {
|
||
|
$this->_returnCode = PAYMENT_PROCESS_RESULT_APPROVED;
|
||
|
$this->message = '';
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case PAYMENT_PROCESS_ACTION_BIBIT_CAPTURE:
|
||
|
$amount = $doc->evaluate('//reply/ok/captureReceived/amount/attribute::value');
|
||
|
if (!PEAR::isError($amount) && $amount->next()) {
|
||
|
$this->_returnCode = PAYMENT_PROCESS_RESULT_APPROVED;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
case PAYMENT_PROCESS_ACTION_BIBIT_REFUND:
|
||
|
$amount = $doc->evaluate('//reply/ok/refundReceived/amount/attribute::value');
|
||
|
if (!PEAR::isError($amount) && $amount->next()) {
|
||
|
$this->_returnCode = PAYMENT_PROCESS_RESULT_APPROVED;
|
||
|
return;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
?>
|