private function prepare_update_order_request( $order ): UpdateOrderRequest {
$request = $this->get_update_order_request_object( $order );
* Filter an update order request object.
* @param UpdateOrderRequest $request Update order request object.
* @param Order $order Order object.
* @param Api $api Api class instance.
return apply_filters( 'wpforms_square_api_prepare_update_order_request', $request, $order, $this ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName
* Prepare a create payment request object for sending to API.
* @param Order $order Order object.
* @param array $args Payment arguments.
* @return CreatePaymentRequest
private function prepare_create_payment_request( $order, array $args ): CreatePaymentRequest {
$request = $this->get_create_payment_request_object();
$request = $this->create_payment_request_set_order( $request, $order );
if ( ! empty( $args['billing'] ) ) {
$address = $this->get_address_object( $args['billing'] );
$request->setBillingAddress( $address );
if ( ! empty( $args['buyer_email'] ) ) {
$request->setBuyerEmailAddress( $args['buyer_email'] );
if ( ! empty( $args['note'] ) ) {
$request->setNote( $args['note'] );
* Filter a create payment request object.
* @param CreateOrderRequest $request Create payment request object.
* @param array $args Payment arguments.
* @param Api $api Api class instance.
return apply_filters( 'wpforms_square_api_prepare_create_payment_request', $request, $args, $this ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName
* Retrieve a create order request object.
* @param array $args Payment arguments.
* @return CreateOrderRequest
private function get_create_order_request_object( array $args ): CreateOrderRequest {
$request = new CreateOrderRequest();
$request->setIdempotencyKey( $this->get_idempotency_key() );
$request->setOrder( new Order( $args['location_id'] ) );
$request->getOrder()->setSource( new OrderSource() );
$request->getOrder()->getSource()->setName( Square::APP_NAME );
* Retrieve an update order request object.
* @param Order $order Order object.
* @return UpdateOrderRequest
private function get_update_order_request_object( $order ): UpdateOrderRequest {
$request = new UpdateOrderRequest();
$request->setIdempotencyKey( $this->get_idempotency_key() );
$request->setOrder( $order );
$request->getOrder()->setState( OrderState::CANCELED );
* Retrieve a create payment request object.
* @return CreatePaymentRequest
private function get_create_payment_request_object(): CreatePaymentRequest {
$request = new CreatePaymentRequest( $this->source_id, $this->get_idempotency_key() );
$request->setAmountMoney( new Money() );
* Send a create order request object to API.
* @param CreateOrderRequest $request Create order request object.
private function send_create_order_request( $request ) {
$this->response = $this->client->getOrdersApi()->createOrder( $request );
if ( ! $this->response->isSuccess() ) {
$this->errors[] = esc_html__( 'Square fail: order was not created.', 'wpforms-lite' );
return $this->response->getResult()->getOrder();
} catch ( ApiException $e ) {
$this->errors[] = esc_html__( 'Square fail: order was not created.', 'wpforms-lite' );
* Send an update order request object to API.
* @param string $order_id The ID of the order to update.
* @param UpdateOrderRequest $request Update order request object.
private function send_update_order_request( string $order_id, $request ) {
$response = $this->client->getOrdersApi()->updateOrder( $order_id, $request );
if ( ! $response->isSuccess() ) {
return $response->getResult()->getOrder();
} catch ( ApiException $e ) {
* Send a create payment request to API.
* @param CreatePaymentRequest $request Create payment request object.
private function send_create_payment_request( $request ) {
$this->response = $this->client->getPaymentsApi()->createPayment( $request );
if ( ! $this->response->isSuccess() ) {
$this->errors[] = esc_html__( 'Square fail: payment was not processed.', 'wpforms-lite' );
$this->add_response_errors_message();
return $this->response->getResult()->getPayment();
} catch ( ApiException $e ) {
$this->errors[] = esc_html__( 'Square fail: payment was not processed.', 'wpforms-lite' );
$this->add_response_errors_message( 'Exception' );
* Set line items to a create order request object.
* @param CreateOrderRequest $request Request to create an order.
* @param array $args Payment arguments.
* @return CreateOrderRequest
private function create_order_request_set_line_items( $request, array $args ): CreateOrderRequest {
foreach ( (array) $args['order_items'] as $item ) {
// Order item without variations.
if ( empty( $item['variations'] ) ) {
$line_items[] = $this->get_order_line_item_object( $item, $args );
// Order item with variations (e.g. Small, Medium and Large).
foreach ( (array) $item['variations'] as $variation ) {
$order_line_item = $this->get_order_line_item_object( $variation, $args );
$order_line_item->setVariationName( $variation['variation_name'] );
$line_items[] = $order_line_item;
$request->getOrder()->setLineItems( $line_items );
* Set discounts to a create order request object.
* @param CreateOrderRequest $request Request to create an order.
* @param array $args Payment arguments.
* @return CreateOrderRequest
private function create_order_request_set_discounts( $request, array $args ): CreateOrderRequest {
if ( empty( $args['discounts'] ) ) {
foreach ( (array) $args['discounts'] as $discount ) {
$discounts[] = $this->get_order_discount_object( $discount, $args );
if ( ! empty( $discounts ) ) {
$request->getOrder()->setDiscounts( $discounts );
* Set order to a create payment request object.
* @param CreatePaymentRequest $request Create payment request object.
* @param Order $order Order object.
* @return CreatePaymentRequest
private function create_payment_request_set_order( $request, $order ): CreatePaymentRequest {
$request->setOrderId( $order->getId() );
$request->setLocationId( $order->getLocationId() );
$amount = $order->getTotalMoney()->getAmount();
$currency = $order->getTotalMoney()->getCurrency();
$request->getAmountMoney()->setAmount( $amount );
$request->getAmountMoney()->setCurrency( $currency );
if ( ! Helpers::is_license_ok() && Helpers::is_application_fee_supported( $currency ) ) {
$request->setAppFeeMoney( new Money() );
$request->getAppFeeMoney()->setAmount( (int) ( round( $amount * 0.03 ) ) );
$request->getAppFeeMoney()->setCurrency( $currency );
* Retrieve a single order line item object.
* @param array $item Order item data.
* @param array $args Payment arguments.
private function get_order_line_item_object( array $item, array $args ): OrderLineItem {
$order_line_items = new OrderLineItem( $item['quantity'] );
$order_line_items->setName( $item['name'] );
$order_line_items->setBasePriceMoney( new Money() );
// Round to the nearest whole number because $item['amount'] can contain a number close to,
// but slightly under it, due to how it is stored in the memory.
$order_line_items->getBasePriceMoney()->setAmount( round( $item['amount'] ) );
$order_line_items->getBasePriceMoney()->setCurrency( $args['currency'] );
return $order_line_items;
* Retrieve a single order discount object.
* @param array $discount Discount data.
* @param array $args Payment arguments.
* @return OrderLineItemDiscount
private function get_order_discount_object( array $discount, array $args ): OrderLineItemDiscount {
$order_discounts = new OrderLineItemDiscount();
$order_discounts->setName( $discount['name'] );
$order_discounts->setAmountMoney( new Money() );
$order_discounts->getAmountMoney()->setAmount( $discount['amount'] );
$order_discounts->getAmountMoney()->setCurrency( $args['currency'] );
* Prepare and retrieve an address object.
* @param array $data Address data.
private function get_address_object( array $data ): Address {
$address = new Address();
// The empty country value may occur API errors.
if ( ! empty( $data['address']['country'] ) ) {
$address->setAddressLine1( $data['address']['address1'] );
$address->setAddressLine2( $data['address']['address2'] );
$address->setLocality( $data['address']['city'] );
$address->setAdministrativeDistrictLevel1( $data['address']['state'] );
$address->setPostalCode( $data['address']['postal'] );
$address->setCountry( $data['address']['country'] );
if ( ! empty( $data['first_name'] ) ) {
$address->setFirstName( $data['first_name'] );
if ( ! empty( $data['last_name'] ) ) {
$address->setLastName( $data['last_name'] );
* Retrieve information of all locations of a business.
* @return array|Location|null
public function get_locations() {
$this->response = $this->client->getLocationsApi()->listLocations();
if ( ! $this->response->isSuccess() ) {
return $this->response->getResult()->getLocations();
} catch ( ApiException $e ) {
* Retrieve a Merchant object with details.
* @param string $id The Merchant ID.
public function get_merchant( string $id ) {
$this->response = $this->client->getMerchantsApi()->retrieveMerchant( $id );
if ( ! $this->response->isSuccess() ) {
return $this->response->getResult()->getMerchant();
} catch ( ApiException $e ) {
* Retrieve an idempotency key.
* @link https://developer.squareup.com/docs/working-with-apis/idempotency
private function get_idempotency_key(): string {
return uniqid( '', false );
public function get_errors() {
* Retrieve last API call errors if are exist.
public function get_response_errors(): array {
if ( $this->response instanceof ApiResponse && ! $this->response->isSuccess() ) {
foreach ( (array) $this->response->getErrors() as $error ) {
$errors[] = $error->jsonSerialize();
if ( $this->exception instanceof ApiException ) {
'code' => $this->exception->getCode(),
'message' => $this->exception->getMessage(),
* Retrieve last API call response resource.
public function get_response_resource(): array {