namespace WPForms\Tasks\Actions;
use WPForms\Integrations\Square\Api\Api;
use WPForms\Integrations\Square\Connection;
* Class SquareSubscriptionTransactionIDTask.
class SquareSubscriptionTransactionIDTask extends Task {
private const ACTION = 'wpforms_process_square_subscription_transaction_id';
public function __construct() {
parent::__construct( self::ACTION );
private function init() {
private function hooks() {
add_action( 'wpforms_process_payment_saved', [ $this, 'add_task' ], 999, 3 );
add_action( self::ACTION, [ $this, 'process' ] );
* @param string $payment_id Payment ID.
* @param array $fields Final/sanitized submitted field data.
* @param array $form_data Form data and settings.
public function add_task( $payment_id, array $fields, array $form_data ) {
$payment_obj = wpforms()->obj( 'payment' );
$payment = $payment_obj->get( (int) $payment_id );
// Bail early if not Square subscription.
if ( $payment->gateway !== 'square' || $payment->type !== 'subscription' ) {
// Bail early if transaction_id is already set via webhooks.
if ( ! empty( $payment->transaction_id ) ) {
// Add task to the queue.
wpforms()->obj( 'tasks' )
->once( time() + MINUTE_IN_SECONDS )
->params( (int) $payment_id )
* @param int $meta_id Meta ID.
public function process( $meta_id ) {
$meta = $task_meta->get( (int) $meta_id );
if ( empty( $meta ) || empty( $meta->data ) ) {
[ $payment_id ] = $meta->data;
$payment = wpforms()->obj( 'payment' )->get( (int) $payment_id );
// Bail early if transaction_id is already set via webhooks.
if ( ! empty( $payment->transaction_id ) ) {
if ( ! Connection::get() ) {
$api = new Api( Connection::get() );
$subscription = $api->retrieve_subscription( $payment->subscription_id );
if ( $subscription === null ) {
$invoice = $api->get_latest_subscription_invoice( $subscription );
if ( $invoice === null ) {
$transaction_id = $api->get_latest_invoice_transaction_id( $invoice );
// Set transaction_id for the subscription in case it not received earlier.
wpforms()->obj( 'payment' )->update(
[ 'transaction_id' => $transaction_id ],
wpforms()->obj( 'payment_meta' )->add_log(
'Square subscription was created. (Invoice ID: %s)',