Dogoferis
Dogoferis

Reputation: 614

PayPal setExpressCheckout call fails due to invalid RETURN and CANCEL URLs

I am currently integrating PayPal Express Checkout into our website. We are using an installation of osCommerce (PHP) and the SOAP implementation of setExpressCheckout. The puzzling thing is that I have the code for Express Checkouts working properly on my local environment.

However; upon commission to our development server the same code for Express Checkout no longer works.

Below is a successful SOAP request initiated by my local development environment to the PayPal Sandbox endpoint for express checkout.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Header>
  <RequesterCredentials xmlns="urn:ebay:api:PayPalAPI">
    <Credentials xmlns="urn:ebay:apis:eBLBaseComponents">
      <Username>xxxxxxxxxxxxxxxxxxxxxxxxxxx</Username>
      <Password>xxxxxxxxxxxxxxxx</Password>
    </Credentials>
  </RequesterCredentials>
</soap:Header>
<soap:Body>
  <SetExpressCheckoutReq xmlns="urn:ebay:api:PayPalAPI">
    <SetExpressCheckoutRequest>
      <Version xmlns="urn:ebay:apis:eBLBaseComponents">98.0</Version>
      <SetExpressCheckoutRequestDetails xmlns="urn:ebay:apis:eBLBaseComponents">
        <ReturnURL>http://localhost/checkout_shipping.php?action=express_checkout&amp;site=xxxxx</ReturnURL>
        <CancelURL>http://localhost/checkout_shipping.php?ec_cancel=1&amp;site=xxxxx</CancelURL>
        <ReqConfirmShipping>1</ReqConfirmShipping>
        <NoShipping>0</NoShipping>
        <AddressOverride>0</AddressOverride>
        <LocaleCode>US</LocaleCode>
        <PageStyle></PageStyle>
        <cpp-header-image></cpp-header-image>
        <cpp-header-border-color></cpp-header-border-color>
        <cpp-header-back-color></cpp-header-back-color>
        <cpp-payflow-color></cpp-payflow-color>
        <PaymentAction>Sale</PaymentAction>
        <PaymentDetails>
          <OrderTotal currencyID="USD">6.47</OrderTotal>
          <ItemTotal currencyID="USD">2.48</ItemTotal>
          <ShippingTotal currencyID="USD">3.99</ShippingTotal>
          <HandlingTotal currencyID="USD"></HandlingTotal>
          <TaxTotal currencyID="USD">0</TaxTotal>
          <Custom>Phone: xxxxxxxxxx -- Email: [email protected]</Custom>
          <InvoiceID></InvoiceID>
          <NotifyURL></NotifyURL>
          <ButtonSource>PAYPAL_BUTTON_SOURCE</ButtonSource>
          <ShipToAddress>
            <Name></Name>
            <Street1>xxxx Park Forest Circle</Street1>
            <Street2></Street2>
            <CityName>Clermont</CityName> 
            <StateOrProvince>OH</StateOrProvince>
            <PostalCode>xxx03</PostalCode>
            <Country>US</Country>
          </ShipToAddress>
          <PaymentDetailsItem><Name>Product XYZ</Name><Amount currencyID="USD">2.48</Amount><Number>-</Number><Quantity>1</Quantity></PaymentDetailsItem>
        </PaymentDetails>
      </SetExpressCheckoutRequestDetails>
    </SetExpressCheckoutRequest> 
  </SetExpressCheckoutReq>
</soap:Body>
</soap:Envelope>

And below is the response that I retrieve from the API end point

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:cc="urn:ebay:apis:CoreComponentTypes" xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/12/secext" xmlns:ed="urn:ebay:apis:EnhancedDataTypes" xmlns:ebl="urn:ebay:apis:eBLBaseComponents" xmlns:ns="urn:ebay:api:PayPalAPI">
    <SOAP-ENV:Header>
        <Security xmlns="http://schemas.xmlsoap.org/ws/2002/12/secext" xsi:type="wsse:SecurityType"></Security>
        <RequesterCredentials xmlns="urn:ebay:api:PayPalAPI" xsi:type="ebl:CustomSecurityHeaderType">
            <Credentials xmlns="urn:ebay:apis:eBLBaseComponents" xsi:type="ebl:UserIdPasswordType">
                <Username xsi:type="xs:string"></Username>
                <Password xsi:type="xs:string"></Password>
                <Signature xsi:type="xs:string"></Signature>
                <Subject xsi:type="xs:string"></Subject>
            </Credentials>
        </RequesterCredentials>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body id="_0">
        <SetExpressCheckoutResponse xmlns="urn:ebay:api:PayPalAPI">
            <Timestamp xmlns="urn:ebay:apis:eBLBaseComponents">2013-03-27T18:46:35Z</Timestamp>
            <Ack xmlns="urn:ebay:apis:eBLBaseComponents">Success</Ack>
            <CorrelationID xmlns="urn:ebay:apis:eBLBaseComponents">cca293672cf33</CorrelationID>
            <Version xmlns="urn:ebay:apis:eBLBaseComponents">98.0</Version>
            <Build xmlns="urn:ebay:apis:eBLBaseComponents">5551055</Build>
            <Token xsi:type="ebl:ExpressCheckoutTokenType">EC-2CM343011B950025M</Token>
        </SetExpressCheckoutResponse>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

However if I initiate the same type of transaction from the DEV server; it will result in failure. Find below a var_dump() of a request initiated from our development server

Array ( 
    [PAYPAL_ORDER_TOTAL] => 7.84 
    [PAYPAL_ORDER_DESCRIPTION] => Order placed on April 2, 2013, 9:30 am by xxxx xxxxx (ID: xxxxx)  
    [PAYPAL_CUSTOM] => Phone: xxxxxxxxxx -- Email: [email protected] 
    [PAYPAL_SHIPPING_TOTAL] => 0 
    [PAYPAL_HANDLING_TOTAL] => 
    [PAYPAL_TAX_TOTAL] => 0 
    [PAYPAL_ITEM_TOTAL] => 7.84 
    [PAYMENT_DETAILS_ITEM] => Product XYZ 
    [PAYPAL_SHIPPING_NAME] => 
    [PAYPAL_SHIPPING_ADDRESS1] => xxxx Rainbow Springs Ct 
    [PAYPAL_SHIPPING_ADDRESS2] =>  
    [PAYPAL_SHIPPING_CITY] => Louisville 
    [PAYPAL_SHIPPING_STATE] => KY 
    [PAYPAL_SHIPPING_ZIP] => 40213 
    [PAYPAL_SHIPPING_COUNTRY] => US 
    [PAYPAL_NOTIFY_URL] => 
    [PAYPAL_INVOICE_ID] => 
    [PAYPAL_PAGE_STYLE] => 
    [PAYPAL_CPP_HEADER_IMAGE] => 
    [PAYPAL_CPP_HEADER_BORDER_COLOR] => 
    [PAYPAL_CPP_HEADER_BACK_COLOR] => 
    [PAYPAL_CPP_PAYFLOW_COLOR] => 
    [PAYPAL_RETURN_URL] => http://wpp_mod.testosc.storename.com/checkout_shipping.php?action=express_checkout&site=xxxxx 
    [PAYPAL_CANCEL_URL] => http://wpp_mod.testosc.storename.com/checkout_shipping.php?ec_cancel=1&site=xxxxx        
    [PAYPAL_REQUIRE_CONFIRM_SHIPPING] => 1 
    [PAYPAL_LOCALE_CODE] => US 
    [PAYPAL_NO_SHIPPING] => 0 
    [PAYPAL_ADDRESS_OVERRIDE] => 0 
) 

This request results in the follow response (again, var_dump() of the return):

Array (
    [Security] => 
    [RequesterCredentials] => 
        Array ( [0] => 
            Array ( 
                [Credentials] => 
                    Array ( [0] => 
                        Array ( 
                            [Username] => 
                            [Password] => 
                            [Signature] => 
                            [Subject] => 
                        ) 
                    ) 
                ) 
            ) 
    [SetExpressCheckoutResponse] => 
        Array ( [0] => 
            Array ( 
                [Timestamp] => 2013-04-02T14:30:46Z 
                [Ack] => Failure 
                [CorrelationID] => 44f876829f4cb 
                [Errors] => 
                    Array ( [0] => Array ( 
                            [ShortMessage] => Transaction refused because of an invalid argument. See additional error messages for details. 
                            [LongMessage] => ReturnURL is invalid. 
                            [ErrorCode] => 10471 
                            [SeverityCode] => Error ) 
                        [1] => Array ( 
                            [ShortMessage] => Transaction refused because of an invalid argument. See additional error messages for details. 
                            [LongMessage] => CancelURL is invalid. 
                            [ErrorCode] => 10472 
                            [SeverityCode] => Error ) 
                    ) 
                [Version] => 98.0 
                [Build] => 5613839 
            ) 
        ) 
)

After checking the PayPal API Documentation for setExpressCheckout I was not able to find any particular guidelines as far as what the API endpoint looks for in a valid URL.

I also checked SO1 and SO2 but did not see anything that pertained to my particular issue.

If anyone has any information on what might be wrong with the RETURN and CANCEL URLS or better yet a more detailed explanation of properly formed URLs for the setExpressCheckout API that would be most helpful.

Upvotes: 1

Views: 3398

Answers (1)

Dogoferis
Dogoferis

Reputation: 614

It seems that the PayPal API endpoint does not like underscores in the domain/url so this:

http://localhost/checkout_shipping.php?action=express_checkout&amp;site=xxxxx

Is valid but this

http://wpp_mod.testosc.storename.com/checkout_shipping.php?action=express_checkout&site=xxxxx

Is not; because we have an underscore in the domain name of our development server. That is inconvenient but correctable.

Upvotes: 3

Related Questions