token = SQUARE_ACCESS_TOKEN; $this->baseUrl = SQUARE_ENV === 'production' ? 'https://connect.squareup.com/v2' : 'https://connect.squareupsandbox.com/v2'; } public function charge( string $sourceId, int $amountCents, string $note = '', string $cardholderName= '', array $billingAddress= [], string $buyerEmail = '' ): array { $body = [ 'idempotency_key' => uniqid('tg_', true), 'source_id' => $sourceId, 'amount_money' => ['amount' => $amountCents, 'currency' => 'USD'], 'location_id' => SQUARE_LOCATION_ID, 'note' => $note ?: 'TomGames Token Purchase', 'autocomplete' => true, ]; if ($cardholderName) { $body['buyer_email_address'] = $buyerEmail ?: null; } if (!empty($billingAddress)) { $body['billing_address'] = array_filter($billingAddress); } if ($buyerEmail && filter_var($buyerEmail, FILTER_VALIDATE_EMAIL)) { $body['buyer_email_address'] = $buyerEmail; $body['receipt_email'] = $buyerEmail; } $ch = curl_init($this->baseUrl . '/payments'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 30, CURLOPT_HTTPHEADER => [ 'Content-Type: application/json', 'Authorization: Bearer ' . $this->token, 'Square-Version: 2024-01-18', ], CURLOPT_POSTFIELDS => json_encode(array_filter($body, fn($v) => $v !== null)), ]); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); $curlErr = curl_error($ch); curl_close($ch); if ($curlErr) return ['success'=>false,'error'=>'Connection error. Please try again.']; $data = json_decode($response, true); if ($httpCode === 200 && isset($data['payment']['id'])) { return [ 'success' => true, 'payment_id' => $data['payment']['id'], 'status' => $data['payment']['status'], 'receipt_url'=> $data['payment']['receipt_url'] ?? null, 'card_brand' => $data['payment']['card_details']['card']['card_brand'] ?? null, 'last_4' => $data['payment']['card_details']['card']['last_4'] ?? null, ]; } $errorMsg = $data['errors'][0]['detail'] ?? ($data['errors'][0]['code'] ?? 'Payment failed. Please try again.'); return ['success'=>false,'error'=>$errorMsg]; } public static function sdkUrl(): string { return SQUARE_ENV === 'production' ? 'https://web.squarecdn.com/v1/square.js' : 'https://sandbox.web.squarecdn.com/v1/square.js'; } // Generic POST for Square APIs (gift cards, etc.) public static function post(string $path, array $body): array { $baseUrl = SQUARE_ENV === 'production' ? 'https://connect.squareup.com' : 'https://connect.squareupsandbox.com'; $url = $baseUrl . $path; $ch = curl_init($url); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => json_encode($body), CURLOPT_HTTPHEADER => [ 'Content-Type: application/json', 'Square-Version: 2024-01-18', 'Authorization: Bearer ' . SQUARE_ACCESS_TOKEN, ], CURLOPT_TIMEOUT => 30, ]); $resp = curl_exec($ch); $httpCode= curl_getinfo($ch, CURLINFO_HTTP_CODE); $err = curl_error($ch); curl_close($ch); if ($err) throw new Exception('Square connection error: ' . $err); $data = json_decode($resp, true); if (isset($data['errors'])) { throw new Exception($data['errors'][0]['detail'] ?? 'Square API error'); } return $data; } }