Custom Woocommerce Payment Gateway for Squareup.com

I am Developing Square Connect Payment Gateway for Woocommerce.

Here is gatway documents and credit card form which the give me to embed for gateway.

Read More

https://docs.connect.squareup.com/articles/adding-payment-form/

Now the process is Payment form return card nonce which use to deduct payment from customer.

Here is sample code.

require_once 'SquareConnect/autoload.php';

# Assume you have assigned values to the following variables:
#   $nonce
#   $location_id
#   $access_token

$transaction_api = new SquareConnectApiTransactionApi();

$request_body = array (

  "card_nonce" => $nonce,

  # Monetary amounts are specified in the smallest unit of the applicable currency.
  # This amount is in cents. It's also hard-coded for $1, which is not very useful.
  "amount_money" => array (
    "amount" => 100,
    "currency" => "USD"
  ),

  # Every payment you process for a given business have a unique idempotency key.
  # If you're unsure whether a particular payment succeeded, you can reattempt
  # it with the same idempotency key without worrying about double charging
  # the buyer.
  "idempotency_key" => uniqid()
);

# The SDK throws an exception if a Connect endpoint responds with anything besides 200 (success).
# This block catches any exceptions that occur from the request.
try {
  print_r($transaction_api->charge($access_token, $location_id, $request_body));  
} catch (Exception $e) {
  echo "Caught exception " . $e->getMessage();

Problem is Payment form return nonce with javascript function.

Here is how i embed form in my plugin.

function payment_fields(){
?>
<p  class="form-row form-row form-row-wide">
  <label>Card Number</label>
  <div id="sq-card-number"></div>
</p>
<p  class="form-row form-row form-row-wide">
  <label>CVV</label>
  <div id="sq-cvv"></div>
</p>
<p  class="form-row form-row form-row-wide">
  <label>Expiration Date</label>
  <div id="sq-expiration-date"></div>
</p>
<p  class="form-row form-row form-row-wide">
  <label>Postal Code</label>
  <div id="sq-postal-code"></div>
</p>
<input type="hidden" id="payment_nonce" value="" />
<script src="https://js.squareup.com/v2/paymentform" type="text/javascript"></script>
<script type="text/javascript">
var paymentForm = new SqPaymentForm({
    applicationId: 'sandbox-sq0idp-Yjm9KUoP_AiqDuGgwV6q4A', // <-- REQUIRED: Add Application ID
    inputClass: 'sq-input',
    inputStyles: [
      {
        fontSize: '15px'
      }
    ],
    cardNumber: {
      elementId: 'sq-card-number',
      placeholder: '.... .... .... ....'
    },
    cvv: {
      elementId: 'sq-cvv',
      placeholder: 'CVV'
    },
    expirationDate: {
      elementId: 'sq-expiration-date',
      placeholder: 'MM/YY'
    },
    postalCode: {
      elementId: 'sq-postal-code'
    },
    callbacks: {
      cardNonceResponseReceived: function(errors, nonce, cardData) {
        if (errors) {
          // handle errors
          errors.forEach(function(error) { console.log(error.message); });
        } else {
          // handle nonce
          console.log('Nonce received:');
          console.log(nonce);
        }
      },
      unsupportedBrowserDetected: function() {
        // Alert the buyer that their browser is not supported
      }
    }
  });
  function requestCardNonce() {
    paymentForm.requestCardNonce();
  }
paymentForm.build();
</script>
<?php
    }

This is nonce response

console.log(‘Nonce received:’);
console.log(nonce);

Now not sure how to get this nonce at process payment section of woocomerce?

Related posts

1 comment

  1. Okay i did it my self with ajax and the session variable.

    here is my code.

        function payment_fields(){
    ?>
    
        <p  class="form-row form-row form-row-wide">
          <label>Card Number</label>
          <div id="sq-card-number"></div>
        </p>
        <p  class="form-row form-row form-row-wide">
          <label>CVV</label>
          <div id="sq-cvv"></div>
        </p>
        <p  class="form-row form-row form-row-wide">
    
          <label>Expiration Date</label>
          <div id="sq-expiration-date"></div>
        </p>
        <p  class="form-row form-row form-row-wide">
          <label>Postal Code</label>
          <div id="sq-postal-code"></div>
        </p>
        <input type="hidden" id="payment_nonce" value="" />
        <script src="https://js.squareup.com/v2/paymentform" type="text/javascript"></script>
        <script type="text/javascript">
    
        var paymentForm = new SqPaymentForm({
            applicationId: '<?php echo $this->api_id; ?>', // <-- REQUIRED: Add Application ID
            inputClass: 'sq-input',
            inputStyles: [
              {
                fontSize: '15px'
              }
            ],
            cardNumber: {
              elementId: 'sq-card-number',
              placeholder: '.... .... .... ....'
            },
            cvv: {
              elementId: 'sq-cvv',
              placeholder: 'CVV'
            },
            expirationDate: {
              elementId: 'sq-expiration-date',
              placeholder: 'MM/YY'
            },
            postalCode: {
              elementId: 'sq-postal-code'
            },
            callbacks: {
              cardNonceResponseReceived: function(errors, nonce, cardData) {
                if (errors) {
                  // handle errors
                  errors.forEach(function(error) { console.log(error.message); });
                } else {
                  // handle nonce
                  console.log('Nonce received:');
                  console.log(nonce);
                    //localStorage.setItem('card_nonce',nonce);
    
                      var ajaxurl = "<?php echo admin_url( 'admin-ajax.php' ); ?>";
                          var data = {
                            'action': 'payment_nonce',
                            'nonce_recived': nonce,
                        };
                          jQuery.post(ajaxurl, data, function(response) {
                            });
                }
              },
              unsupportedBrowserDetected: function() {
                // Alert the buyer that their browser is not supported
              }
            }
          });
    
          function requestCardNonce() {
            paymentForm.requestCardNonce();
          }
        paymentForm.build();
    
        jQuery(document).ready(function ($) {
    
          $("form.woocommerce-checkout")
          .on('submit', function() { return requestCardNonce(); } ); 
    
        });
    
        </script>
        <style type="text/css">
            .sq-input {
              border: 1px solid rgb(223, 223, 223);
              outline-offset: -2px;
              margin-bottom: 5px;
            }
            .sq-input--focus {
              /* how your inputs should appear when they have focus */
              outline: 5px auto rgb(59, 153, 252);
            }
            .sq-input--error {
              /* how your inputs should appear when invalid */
              outline: 5px auto rgb(255, 97, 97);
            }
          </style>
    
        <?php
            }
            // Submit payment and handle response
            public function process_payment( $order_id ) {
                session_start();
                global $woocommerce;
                sleep(8);
                // Get this Order's information so that we know
                // who to charge and how much
                    $customer_order = new WC_Order( $order_id );
                    $amount = floatval( preg_replace( '#[^d.]#', '', $customer_order->order_total ) ); 
                   //$cart_total = number_format((int)$customer_order->order_total, 2, '.', ''); 
                    $nonce = $_SESSION['nonce_recived']; 
    
                    $access_token = $this->access_token;
                    $location_api = new SquareConnectApiLocationApi();
                    $location_id = $location_api->listLocations($access_token); 
                    $location_arr = json_decode ($location_id);
    
                    $location_id = $location_arr->locations[0]->id; 
    
                    $transaction_api = new SquareConnectApiTransactionApi();
    
                    $request_body = array (
    
                      "card_nonce" => $nonce,
    
                      # Monetary amounts are specified in the smallest unit of the applicable currency.
                      # This amount is in cents. It's also hard-coded for $1, which is not very useful.
                      "amount_money" => array (
                        "amount" => round($amount),
                        "currency" => "USD"
                      ),
    
                      # Every payment you process for a given business have a unique idempotency key.
                      # If you're unsure whether a particular payment succeeded, you can reattempt
                      # it with the same idempotency key without worrying about double charging
                      # the buyer.
                      "idempotency_key" => uniqid()
                    );
    
                    # The SDK throws an exception if a Connect endpoint responds with anything besides 200 (success).
                    # This block catches any exceptions that occur from the request.
                    try {
                      $payment_sucess = $transaction_api->charge($access_token, $location_id, $request_body);  
    
                        // Payment has been successful
                        $customer_order->add_order_note( __( 'payment completed.', 'spyr-square-gateway' ) );
    
                        // Mark order as Paid
                        $customer_order->payment_complete();
    
                        // Empty the cart (Very important step)
                        $woocommerce->cart->empty_cart();
    
                        // Redirect to thank you page
                        return array(
                            'result'   => 'success',
                            'redirect' => $this->get_return_url( $customer_order ),
                        );
                    } catch (Exception $e) {
                      $error = "Caught exception " . $e->getMessage();
                    // Transaction was not succesful
                    // Add notice to the cart
                    wc_add_notice( $error, 'error' );
                    // Add note to the order for your reference
                    $customer_order->add_order_note( 'Error: '. $error);
                    }
    
            }
    

Comments are closed.