Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using Negative Testing via Paypal Express Checkout client-side JS button implementation

I'm currently working on a PayPal Express checkout integration using the Client-side JS approach for taking payments. I'm looking to utilise their "Negative Testing" feature to try to simulate potential errors and provide appropriate responses to the customer.

Just a reference to the relevant doc page here for reference

It seems to enable negative testing you need to pass an extra header along with the the payment request specifying the particular error you would like to trigger for that payment.

This is my current JS for setting up the transaction:

<script>

//We need to convert our generated json string into a bonified javascript object
var paypal_transaction = JSON.parse(JSON.stringify(<?php echo $paypal_json; ?>));

paypal.Button.render({

    env: 'sandbox', // 'production'/'sandbox',

    commit: true, // Show a 'Pay Now' button - Allows us to capture the payment right away

    client: {
        sandbox:   'Ab_hPp7h70DoFKChLMSynNxacQQbGcb_tP1cDbzW9jC6a0rYIZH0CkEYYfkw6csvmlyTmfLnagelqB85',
        production:''
    },

    //How we want the button to look
    style: {
        size: 'responsive',
        color: 'gold',
        shape: 'rect',
        label: 'pay'
    },

    headers: {
                '{"mock_application_codes":"INSTRUMENT_DECLINED"}'


    }



    payment: function(data,actions) {


        return actions.payment.create({

            //Pass our created transaction to paypal.
            payment:paypal_transaction,

            /**
             * We have to set the following fields to prevent the client from
             * changing their delivery address when they're at PayPal
             */
            experience: {
                input_fields: {
                    no_shipping: 0,
                    address_override:1
                },
            }


        });

    },

    onAuthorize: function(data, actions) {
        /**
         * [description]
         * @param payment   - The authorised transaction returned from paypal
         * @return redirect - We redirect the cutomer to our confirmation page as soon as we return from PayPal as we're confident we have the correct
         */
        return actions.payment.execute().then(function(payment) {

            actions.redirect();

        });



   },


    onError: function(err) {
        console.log(err);
        // Show an error page here, when an error occurs
    },


    onCancel: function(data, actions) {
        return actions.redirect();
        // Show a cancel page or return to cart
    }


}, '#paypal-button');

Essentially my question is where do I specify the mock application codes like this in the above implementation.

In the docs they give an example cURL request with the below as the extra header that needs to be passed:

"PayPal-Mock-Response:{\"mock_application_codes\":\"INSTRUMENT_DECLINED\"}"

I just don't know how to do this via the JS approach. Can negative testing only be used with a server side implementation?

Hope that's all clear enough!

like image 898
ampedwebdev Avatar asked Aug 24 '17 16:08

ampedwebdev


1 Answers

Had similar issue myself, and the official answer I got was that it is not available:

"I understand this is a frustrating situation. Unfortunately we do not have any way to offer negative testing for client side integrations. It may possible for you to do so using Postman, however, we do not have documentation to offer."

This is really sad though, other payment providers have fixed card numbers for certain error scenarios for example, or have special payment value based codes. PayPal only has that for the Payflow integration, and the request header based mocking stuff is also only possible if you are directly calling their REST APIs.

PayPal is really lame in these aspects, as even if you are mocking behavior with server integration (not that hard, for this at least they have proper code examples), this mocking is explicit and you control the error. If it would be implicit, and originate from an actually validated but invalid card for example, it would be more realistic.

like image 118
seekingtheoptimal Avatar answered Nov 20 '22 04:11

seekingtheoptimal