Hi Tomas,

Alertpay is a third-party provider and they host their own payment process. So it is necessary to redirect to their Web site with certain parameters. On their site, the user can create an account and then enter CC details to make a payment. Once the payment process is complete, Alertpay can redirect back to one of two URLs that we have to provide (callback): a URL for payment failure and a URL for payment success.

So the user authorization and payment processing all happens independent of OXID.

What I am doing is, once the user clicks 'submit order' on the final order summary page in OXID, I have written an executePayment() method that sends a redirect header to the client with the necessary alertpay URL. However, because the processing happens on a third-party site, I have no visibility of whether it succeeds or fails - I only know that one of the two URLs will be called back once the payment process is complete.

As per my script, I have set these two URLs for callback:

Failure: http://oxid/index.php?cl=payment&payerror=4
Success: http://oxid/index.php?cl=thankyou

Above works fine, except when the payment fails and the user comes back to OXID. In this case, if the user resubmits the order, then instead of calling executePayment again and going back to alertpay for a second try, OXID bypasses the executePayment method and straight away displays the order confirmation page. This is the problem I am having - I cannot understand why this is happening.

I am not executing finalizeOrder() at all. the only code I have written is that shown below ie. executePayment() method.

My code is below for your reference. Can you let me know what I am doing wrong?

Vikram



Tomas Liubinas wrote:
Hi Vikram,

Developers here were pretty busy with the final touches to eShop 4.1.3 release. 
First of all I see some problems with your order workflow. As far as I can see, 
on successful payment you totally miss cl=order step. I am not sure how about 
alter pay works, but isn't it something like other payment methods which works 
in 2 steps. 1st step - user authorization. 2nd - final processing. This way you 
can first identify user and to actually charge him on the last step. And in any 
case finalizeOrder() should be executed only once.

Regards
Tomas Liubinas

-----Original Message-----
From: [email protected] 
[mailto:[email protected]] On Behalf Of Vikram Vaswani
Sent: Thursday, June 18, 2009 9:37 AM
To: [email protected]
Subject: [oxid-dev-general] [Fwd: Re: Urgent question onpaymentgateway 
integration]

Hi all

I haven't heard back from anyone on my message re: payment gateway redirection posted some days ago? Could someone with experience in this area help? TIA.

Description as below:

1 When the user selects alertpay as the payment method and submits the
order, I am redirecting the user to the alertpay site.

2 When the payment is successful, the user is redirected back to
http://oxiddomain/index.php?cl=thankyou.

3 When there is a payment failure on alertpay.com, the user is redirected
back to http://oxiddomain/index.php?cl=payment&payerror=4. This produces
the payment method page, with an error saying that 'your payment was
unsuccessful'. So far this is fine and the behaviour one would expect.

4 However, if the user again selects Alertpay as the payment method and
submits the order again, the user is NOT redirected to alertpay. Instead
the thankyou page appears immediately. This is clearly a problem. On
debugging, it appears that in this second case, finalizeOrder() is not
calling executePayment() because of the $blRecalculate flag. So the order
controller is somewhere along the line setting this flag.

I'm not sure where or why this is happening, can anyone suggest a solution?

My payment gateway code is as below:

<?php
class alertpay_PaymentGateway extends alertpay_PaymentGateway_parent {

   // set payment method as active
   protected $_blActive = true;

   // set Alertpay merchant name
   protected $loginId = 'XXX';

   // set Alertpay gateway URL
   protected $gatewayUrl = 'https://www.alertpay.com/PayProcess.aspx';

   public function executePayment($dAmount, &$oOrder) {

     if ($oOrder->oxorder__oxpaymenttype->value != 'alertpay') {
       return parent::executePayment($dAmount, $oOrder);
     }

     $oCur = $this->getConfig()->getActShopCurrencyObject();

     $formData = array(
       'ap_purchasetype'   => 'item-goods',
       'ap_merchant'       => $this->loginId,
       'ap_currency'       => $oCur->name,
       'ap_quantity'       => '1',
       'ap_returnurl'      =>
'http://oxid.localhost/index.php?cl=thankyou&sid=' .
$this->getSession()->getId(),
       'ap_itemname'       => 'Shopping Cart',
       'ap_description'    =>
$this->getConfig()->getActiveShop()->oxshops__oxname->value,
       'ap_amount'         => $dAmount,
       'ap_cancelurl'      =>
'http://oxid.localhost/index.php?cl=payment&payerror=4&sid=' .
$this->getSession()->getId(),
       'apc_1'             => $this->getSession()->getId(),
     );

     header('Location:' . $this->gatewayUrl . '?' .
http_build_query($formData));
     exit();
   }
}
?>

--------------------

Let me know if you can help. Thanks.

Vikram












Tomas Liubinas wrote:
Hi Vikram,

I had a quick look and it looks like getTransactionID() is not a standard eShop 
method. I assume the error should be somewhere on module side. Additionally you 
can check EXCEPTION_LOG.txt file for possible more information. Changing iDebug 
constant in confi.inc.php to -1 also could help in this case.

Regards
Tomas Liubinas

-----Original Message-----
From: [email protected] 
[mailto:[email protected]] On Behalf Of Vikram Vaswani
Sent: Monday, June 15, 2009 8:45 PM
To: [email protected]
Subject: Re: [oxid-dev-general] Urgent question on paymentgateway integration

Hi Tomas and others,

Despite many efforts, I'm still not able to get this to work. Here's what I'm doing:

1. In my oxPaymentGateway::executePayment(), I am generating a URL string to alertpay.com and redirecting the user to that site. The URL string is of the form:

https://www.alertpay.com/PayProcess.aspx?ap_purchasetype=item-goods&;
ap_merchant=XXX&ap_currency=GBP&ap_quantity=1
&ap_returnurl=http%3A%2F%2Fmydomain.com%2Findex.php%3Fcl%3Dthankyou%26sid%3Ded2aa7c3716e0943139d2aafee783ad6&
ap_itemname=Shopping+Cart&ap_amount=10.19&ap_cancelurl=
&apc_1=ed2aa7c3716e0943139d2aafee783ad6

Notice that I am passing the SID as part of the return URL.

2. Now, once the user completes the payment process on alertpay.com, he is redirected back to:

http://mydomain.com/index.php?cl=thankyou&sid=ed2aa7c3716e0943139d2aafee783ad6

However, this presents the index page with the message 'Function getTransactionID not defined (thankyou)'.

Any idea what I'm doing wrong?

3. Can you suggest what should be the URL I should direct to for these two cases:

- the user cancels the payment on alertpay.com
- the user's payment fails due to incorrect card details

Thanks for your help - I'm a bit confused by the above situation so would appreciate your advice.

Vikram

Tomas Liubinas wrote:
Hi Vicram,

http://domain/index.php?&cl=thankyou looks ok (index.php?cl=thankyou to be 
precise). One of the reasons it redirects to start page could be empty session 
basket object. Try not to empty basket in your module. I aslo would suggest adding 
sid= param to your url in this case.


Regards
Tomas Liubinas

-----Original Message-----
From: [email protected] 
[mailto:[email protected]] On Behalf Of Vikram Vaswani
Sent: Monday, June 15, 2009 5:45 PM
To: [email protected]
Cc: Dainius Bigelis
Subject: Re: [oxid-dev-general] Urgent question on paymentgateway integration

Hi all

Another question which I am struggling with. One payment gateway requires me to forward the user to a separate site where the user can enter the card information. I have managed to get this to work by setting up a redirection in the executePayment() method.

However, the gateway has asked for a "return URL" to which it will redirect the user once the payment process is complete (whether successful or not). I guess this return URL should be the 'thank you' page. I'm not able to figure out how to do this ie. what is the URL I should specify on the payment site?

Note: I tried using http://domain/index.php?&cl=thankyou, but that doesn't work, it simply sends me back to the index page. Any ideas would be welcome.

Vikram

Arvydas wrote:
Explanation how everything works when user clicks button on last order step:

1. Order::execute():
       - checks if all checkboxes (agb, customer info) were marked;
       - checks if session user is available;
       - creates OxOrder instance;

   2. OxOrder::validateStock():
           - checks if its allowed to order items stored in basket;
- if some problems with stock - oxOutOfStockException exception is thrown;

   3. OxOrder::finalizeOrder():
           - copies user data to order (OxOrder::_setUser());
           - copies basket data to order (OxOrder::_loadFromBasket());
           - copies payment info to order (OxOrder::__setPayment());
           - stores order to db (OxOrder::save());
           - executes payment gateway (OxOrder::_executePayment()):
                * creates payment gateway instance;
* executes payment gateway (OxPaymentGateway::executePayment()); * if gateway execution fails (OxPaymentGateway::executePayment() returns FALSE):
                    - deletes order (OxOrder::delete());
- checks if OxPaymentGateway::getLastError() returns error - if found - returns it; - checks if OxPaymentGateway::getLastErrorNo() returns error number - if found - returns it;
                    - if no error info was found - returns "2";
                * if gateway execution succeded - returns TRUE;
- if payment gateway returns something else than TRUE - stops order execution and returns its value;
           - if payment gateway returns TRUE:
               * sets order status to OK (OxOrder::_setOrderStatus());
               * updates shop stocks (OxOrder::_updateStock());
* substracts wishlists/noticelists (OxOrder::_updateWishlist()/OxOrder::_updateNoticeList()); * sends order email to user and shop owner (OxOrder::_sendOrderByEmail()) and returns email sending state.
4. Order::_getNextStep():
- takes value returned by OxOrder::finalizeOrder(), so here you can manipulate with value returned by payment
             gateway or email sender.
             Standard values returned by OxOrder::finalizeOrder() are:
* 0 - order email sending problems - redirects to "thankyou?mailerror=1"; * 1 - order email was successfully sent - redirects to "thankyou"; * 2 - problems with payment gateway - error happened or something, but no error info provided (OxPaymentGateway::getLastError()/OxPaymentGateway::getLastErrorNo() gave no response) -
                        redirects to "payment?payerror=2"
                 * 3 - means must be kept on save order step;
                 * custom codes provided by user modules:
- numeric value and > 3 - redirects to "payment?payerror="._ERROR_CODE_ - is NOT numeric - redirects to "payment?payerror=-1&payerrortext="._ERROR_TEXT_RETURNED_BY_PAYMENT_GATEWAY_;


One question: if a transaction is approved by the payment gateway, it normally returns an approval code. How do I transfer this approval code from the oxPaymentGateway class to the 'order successful' screen?
Fastest solution:

- write a module for OxPaymentGateway::executePayment()) which writes order approval code to session (e.g. OxSession::setVar('viOrderApprovalCode')); - write a getter for Thankyou e.g. getOrderApprovalCode, which returns approval code (and maybe unsets it
  from session); in template you can call $oView->getOrderApprovalCode();

if you need to write this code to DB, you should create new field in OxOrder table (please use your own prefix for field, do not make regular ox, make e.g. vi_approvalcode) and set this field value in OxPaymentGateway::executePayment() -
second parameter is OxOrder instance;



--------------------------------------------------
From: "Dainius Bigelis" <[email protected]>
Sent: Monday, June 15, 2009 1:13 PM
To: "Arvydas Vapsva" <[email protected]>
Subject: Fw: Re: [oxid-dev-general] Urgent question on paymentgatewayintegration>
-----Ursprüngliche Nachricht-----
Von: [email protected] [mailto:[email protected]] Im Auftrag von Vikram Vaswani
Gesendet: Montag, 15. Juni 2009 09:30
An: [email protected]
Betreff: [!! SPAM] Re: [oxid-dev-general] Urgent question on paymentgateway integration

Hi Marco,

Thanks for this code, it's quite helpful. I'm making progress with this.

One question: if a transaction is approved by the payment gateway, it normally returns an approval code. How do I transfer this approval code from the oxPaymentGateway class to the 'order successful' screen?

Vikram

Marco Steinhaeuser wrote:
Hey Vikram,

3. Are there any "demo" implementation of a payment gateway module which I could use as a starting point?
Check out these extensions for CE:

http://www.oxid-esales.com/en/exchange/extensions/oxid2ipayment-ce?ter
m=2223
http://www.oxid-esales.com/en/exchange/extensions/gate2shop-payment-mo
dul-fuer-oxid-ce?term=2223

Hope that helps ;)

Marco



-----Ursprüngliche Nachricht-----
Von: [email protected]
[mailto:[email protected]] Im Auftrag von Vikram
Vaswani
Gesendet: Samstag, 13. Juni 2009 05:30
An: [email protected]
Betreff: [oxid-dev-general] Urgent question on payment gateway
integration

Hi

I am trying to integrate the authorize.net payment gateway into OXID as a module. Please could someone help with the following questions:

1. From the API docs, it seems that the "core" OXID module to extend for this is oxPaymentGateway. Is this correct? Is it necessary to also extend oxOrder?

2. Currently I am overriding the oxPaymentGateway::executePayment()
method. However, I am not able to understand how to handle payment errors that occur when performing the transaction. Can someone suggest the "best practice" way of raising these errors so that they are visible to the customer on the final checkout page?

3. Are there any "demo" implementation of a payment gateway module which I could use as a starting point?

Thanks,

Vikram
_______________________________________________
dev-general mailing list
[email protected]
http://dir.gmane.org/gmane.comp.php.oxid.general
_______________________________________________
dev-general mailing list
[email protected]
http://dir.gmane.org/gmane.comp.php.oxid.general

_______________________________________________
dev-general mailing list
[email protected]
http://dir.gmane.org/gmane.comp.php.oxid.general
_______________________________________________
dev-general mailing list
[email protected]
http://dir.gmane.org/gmane.comp.php.oxid.general

_______________________________________________
dev-general mailing list
[email protected]
http://dir.gmane.org/gmane.comp.php.oxid.general
_______________________________________________
dev-general mailing list
[email protected]
http://dir.gmane.org/gmane.comp.php.oxid.general
_______________________________________________
dev-general mailing list
[email protected]
http://dir.gmane.org/gmane.comp.php.oxid.general
_______________________________________________
dev-general mailing list
[email protected]
http://dir.gmane.org/gmane.comp.php.oxid.general

_______________________________________________
dev-general mailing list
[email protected]
http://dir.gmane.org/gmane.comp.php.oxid.general
_______________________________________________
dev-general mailing list
[email protected]
http://dir.gmane.org/gmane.comp.php.oxid.general
_______________________________________________
dev-general mailing list
[email protected]
http://dir.gmane.org/gmane.comp.php.oxid.general

Reply via email to