Search code examples
javascriptphppaypalpaypal-sandbox

How to properly add headers, paypal tutorial?


Im doing the paypal tutorial server side integration. With PHP. I'm having a problem.

I want to test funding failures,the last part https://developer.paypal.com/docs/business/checkout/server-side-api-calls/handle-funding-failures/

I think I add the mock header in the right place but is doing nothing it keeps saying Transaction completed . Whats the proper way to put it? Paypal says:

In the call to Capture payment for order, include the PayPal-Mock-Response header with the mock_application_codes value set to INSTRUMENT_DECLINED. Sample code: -H "PayPal-Mock-Response: {"mock_application_codes" : "INSTRUMENT_DECLINED"}"
<script>
    // Render the PayPal button into #paypal-button-container
    paypal.Buttons({

      // Call your server to set up the transaction
      createOrder: function() {
        return fetch('examplecreateorder.php', {
          method: 'post',
          headers: {
            'content-type': 'application/json'
          }
        }).then(function(res) {
          return res.json();
        }).then(function(data) {
        
          return data.id;
        });
      },
      // Call your server to finalize the transaction
      onApprove: function(data) {
        return fetch('examplecaptureorder.php', {
            method: 'post',
            headers: {
              'content-type': 'application/json',
              'PayPal-Mock-Response': {
                'mock_application_codes': 'INSTRUMENT_DECLINED'
              }
            },
            body: JSON.stringify({
              orderID: data.orderID
            })

          }

        ).then(function(res) {

          return res.json().catch(error => console.error('Error:', error));
        }).then(function(orderData) {
          // Three cases to handle:
          //   (1) Recoverable INSTRUMENT_DECLINED -> call actions.restart()
          //   (2) Other non-recoverable errors -> Show a failure message
          //   (3) Successful transaction -> Show confirmation or thank you

          // This example reads a v2/checkout/orders capture response, propagated from the server
          // You could use a different API or structure for your 'orderData'
          var errorDetail = Array.isArray(orderData.details) && orderData.details[0];

          if (errorDetail && errorDetail.issue === 'INSTRUMENT_DECLINED') {
            return actions.restart(); // Recoverable state, per:
            // https://developer.paypal.com/docs/checkout/integration-features/funding-failure/
          }

          if (errorDetail) {
            var msg = 'Sorry, your transaction could not be processed.';
            if (errorDetail.description) msg += '\n\n' + errorDetail.description;
            if (orderData.debug_id) msg += ' (' + orderData.debug_id + ')';
            return alert(msg); // Show a failure message
          }

          // Show a success message

          alert('Transaction completed by  + orderData.payer.name.given_name);
 
        })
      }
    }).render('#paypal-button-container');
  </script>

Solution

  • In the headers, the value for PayPal-Mock-Response should just be a string and not an object:

    ... 
    headers: {
        'content-type': 'application/json',
        'PayPal-Mock-Response': '{"mock_application_codes" : "INSTRUMENT_DECLINED" }'
    },
    ...
    

    Note the difference between what was being specified in OPs code as an object literal:

    'PayPal-Mock-Response': {
        'mock_application_codes': 'INSTRUMENT_DECLINED'
    }
    

    And the working code treating the value of PayPal-Mock-Response as a string:

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