325 lines
14 KiB
PHP
325 lines
14 KiB
PHP
<?php
|
|
|
|
namespace app\event;
|
|
|
|
use DateTime;
|
|
use GuzzleHttp\Client;
|
|
use GuzzleHttp\Exception\GuzzleException;
|
|
use support\Redis;
|
|
use think\facade\Db as ThinkDb;
|
|
use Webman\Event\Event;
|
|
use Workerman\Crontab\Crontab;
|
|
|
|
class ShopifyOrders
|
|
{
|
|
const event = 'shopify:orders:event';
|
|
const event_customer = 'shopify:customers:event';
|
|
const SHOPIFY_API_URL = 'https://{storeName}.myshopify.com/admin/api/2024-07/orders.json';
|
|
const SHOPIFY_API_URL_CUSTOMER = 'https://{storeName}.myshopify.com/admin/api/2024-07/customers.json';
|
|
|
|
|
|
public function fetchCustomerIds($options = [])
|
|
{
|
|
$client = new Client();
|
|
$headers = [
|
|
'X-Shopify-Access-Token' => $options['token']
|
|
];
|
|
|
|
$customerIds = [];
|
|
$orderIdsNotOrderCount = $orderIdsOrderCountOne = $orderIdsOrderCountOther = [];
|
|
$pageInfo = "";
|
|
|
|
while (true) {
|
|
$params = [];
|
|
if ($pageInfo !== "") {
|
|
$params = [
|
|
'limit' => 200,
|
|
'page_info' => $pageInfo
|
|
];
|
|
} else {
|
|
$params = [
|
|
'limit' => 200,
|
|
'fields' => 'id,orders_count,total_spent,last_order_id,created_at',
|
|
// 'created_at_min' => '2025-02-1T00:00:00-08:00',
|
|
// 'created_at_max' => '2025-02-13T23:59:59-08:00',
|
|
'ids' => $options['aaa']
|
|
// 'created_at_min' => '2025-02-14T00:00:00+00:00',
|
|
// 'created_at_max' => '2025-02-14T23:59:59+00:00'
|
|
];
|
|
//
|
|
// $createdAtMin = new DateTime($params['created_at_min']);
|
|
// $createdAtMax = new DateTime($params['created_at_max']);
|
|
}
|
|
|
|
// dump($params,$headers);
|
|
dump(str_replace("{storeName}", $options['storeName'], self::SHOPIFY_API_URL_CUSTOMER));
|
|
|
|
try {
|
|
$response = $client->get(str_replace("{storeName}", $options['storeName'], self::SHOPIFY_API_URL_CUSTOMER), [
|
|
'headers' => $headers,
|
|
'query' => $params
|
|
]);
|
|
|
|
$data = json_decode($response->getBody(), true);
|
|
|
|
// dump($data);
|
|
|
|
// Loop through the orders and collect the order IDs
|
|
foreach ($data['customers'] as $customer) {
|
|
$customerIds[] = (string)$customer['id'];
|
|
|
|
// echo $order['id'] . PHP_EOL; // Log order ID
|
|
// 将日期时间字符串转换为 DateTime 对象
|
|
$customerCreatedAt = new DateTime($customer['created_at']);
|
|
$customerOrderCount = max($customer['orders_count'], 0);
|
|
|
|
// 判断 $orderCreatedAt 是否在 $createdAtMin 和 $createdAtMax 之间
|
|
// if ($customerOrderCount >= $createdAtMin && $orderCustomerCreatedAt <= $createdAtMax) {
|
|
// $orderIdsCreatedAt[] = (string)$order['id'];
|
|
// } else {
|
|
// $orderIdsNotCreatedAt[] = (string)$order['id'];
|
|
// }
|
|
// dump($customer['id'],$customerOrderCount);
|
|
if ($customerOrderCount == 0) {
|
|
$orderIdsNotOrderCount[] = (string)$customer['id'];
|
|
} else if ($customerOrderCount == 1) {
|
|
$orderIdsOrderCountOne[] = (string)$customer['id'];
|
|
} else {
|
|
$orderIdsOrderCountOther[] = (string)$customer['id'];
|
|
}
|
|
|
|
// if($order['customer'][''])
|
|
// $orderDatass[$customer['id']] = [
|
|
// 'id' => $order['id'],
|
|
// 'cus' => $order['customer']
|
|
// ];
|
|
|
|
}
|
|
$customerIds = array_unique($customerIds);
|
|
dump('Total number of customer IDs: ' . count($customerIds));
|
|
dump('customer IDs: ' . implode(',', $customerIds));
|
|
|
|
// dump('Total number of orderIdsCreatedAt IDs: ' . count($orderIdsCreatedAt));
|
|
// dump('orderIdsCreatedAt IDs: ' . implode(',', $orderIdsCreatedAt));
|
|
// dump('Total number of orderIdsNotCreatedAt IDs: ' . count($orderIdsNotCreatedAt));
|
|
// dump('orderIdsNotCreatedAt IDs: ' . implode(',', $orderIdsNotCreatedAt));
|
|
dump('Total number of customerIdsNotOrderCount IDs: ' . count($orderIdsNotOrderCount));
|
|
dump('customerIdsNotOrderCount IDs: ' . implode(',', $orderIdsNotOrderCount));
|
|
dump('Total number of customerIdsOrderCountOne IDs: ' . count($orderIdsOrderCountOne));
|
|
dump('customerIdsOrderCountOne IDs: ' . implode(',', $orderIdsOrderCountOne));
|
|
dump('Total number of customerOrderCountOther IDs: ' . count($orderIdsOrderCountOther));
|
|
dump('customerOrderCountOther IDs: ' . implode(',', $orderIdsOrderCountOther));
|
|
// dump($orderDatass);
|
|
// Check if there's a next page
|
|
if (isset($response->getHeader('link')[0]) && strpos($response->getHeader('link')[0], 'rel="next"')) {
|
|
preg_match('/page_info=([^&]*)/', $response->getHeader('link')[0], $matches);
|
|
$pageInfo = $matches[1];
|
|
} else {
|
|
break; // Exit loop if no more pages
|
|
}
|
|
} catch (GuzzleException $e) {
|
|
echo 'Error fetching Shopify orders: ' . $e->getMessage() . PHP_EOL;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// echo 'Total number of order IDs: ' . count($orderIds) . PHP_EOL;
|
|
// dump('Total number of order IDs: ' . count($orderIds));
|
|
// dump('Order IDs: ' . implode(',', $orderIds));
|
|
return ;
|
|
}
|
|
|
|
// const SHOPIFY_API_URL = 'https://fefc94-67.myshopify.com/admin/api/2024-07/orders.json';
|
|
|
|
public function fetchOrderIds($options = [])
|
|
{
|
|
$client = new Client();
|
|
$headers = [
|
|
'X-Shopify-Access-Token' => $options['token']
|
|
];
|
|
|
|
$orderIds = [];
|
|
$pageInfo = "";
|
|
|
|
while (true) {
|
|
$params = [];
|
|
if ($pageInfo !== "") {
|
|
$params = [
|
|
'limit' => 200,
|
|
'page_info' => $pageInfo
|
|
];
|
|
} else {
|
|
$params = [
|
|
'limit' => 200,
|
|
'status' => 'any',
|
|
'fields' => 'id,customer',
|
|
'created_at_min' => '2025-02-13T00:00:00-08:00',
|
|
'created_at_max' => '2025-02-13T23:59:59-08:00'
|
|
// 'created_at_min' => '2025-02-14T00:00:00+00:00',
|
|
// 'created_at_max' => '2025-02-14T23:59:59+00:00'
|
|
];
|
|
|
|
$createdAtMin = new DateTime($params['created_at_min']);
|
|
$createdAtMax = new DateTime($params['created_at_max']);
|
|
}
|
|
|
|
// dump($params,$headers);
|
|
dump(str_replace("{storeName}", $options['storeName'], self::SHOPIFY_API_URL));
|
|
|
|
try {
|
|
$response = $client->get(str_replace("{storeName}", $options['storeName'], self::SHOPIFY_API_URL), [
|
|
'headers' => $headers,
|
|
'query' => $params
|
|
]);
|
|
|
|
$data = json_decode($response->getBody(), true);
|
|
|
|
// dump($data);
|
|
|
|
// Loop through the orders and collect the order IDs
|
|
foreach ($data['orders'] as $order) {
|
|
$orderIds[] = (string)$order['id'];
|
|
$customerIds[] = (string)$order['customer']['id'];
|
|
|
|
// echo $order['id'] . PHP_EOL; // Log order ID
|
|
// 将日期时间字符串转换为 DateTime 对象
|
|
// $orderCustomerCreatedAt = new DateTime($order['customer']['created_at']);
|
|
// $orderCustomerOrderCount = $order['customer']['orders_count']?? 0;
|
|
|
|
// 判断 $orderCreatedAt 是否在 $createdAtMin 和 $createdAtMax 之间
|
|
// if ($orderCustomerCreatedAt >= $createdAtMin && $orderCustomerCreatedAt <= $createdAtMax) {
|
|
// $orderIdsCreatedAt[] = (string)$order['id'];
|
|
// } else {
|
|
// $orderIdsNotCreatedAt[] = (string)$order['id'];
|
|
// }
|
|
// if($orderCustomerOrderCount == 0){
|
|
// $orderIdsNotOrderCount[] = (string)$order['id'];
|
|
// }else if($orderCustomerOrderCount == 1){
|
|
// $orderIdsOrderCountOne[] = (string)$order['id'];
|
|
// }else{
|
|
// $orderIdsOrderCountOther[] = (string)$order['id'];
|
|
// }
|
|
|
|
// if($order['customer'][''])
|
|
// $orderDatass[$order['id']] = [
|
|
// 'id' => $order['id'],
|
|
// 'cus' => $order['customer']
|
|
// ];
|
|
|
|
}
|
|
$customerIds = array_unique($customerIds);
|
|
$customerIdsStr = implode(',', $customerIds);
|
|
|
|
dump('Total number of customer IDs: ' . count($customerIds));
|
|
dump('customer IDs: ' . $customerIdsStr);
|
|
dump('Total number of order IDs: ' . count($orderIds));
|
|
dump('Order IDs: ' . implode(',', $orderIds));
|
|
Event::emit(ShopifyOrders::event_customer, ['storeName' => 'fefc94-67', 'token' => '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','aaa' => $customerIdsStr]);
|
|
// dump('Total number of orderIdsCreatedAt IDs: ' . count($orderIdsCreatedAt));
|
|
// dump('orderIdsCreatedAt IDs: ' . implode(',', $orderIdsCreatedAt));
|
|
// dump('Total number of orderIdsNotCreatedAt IDs: ' . count($orderIdsNotCreatedAt));
|
|
// dump('orderIdsNotCreatedAt IDs: ' . implode(',', $orderIdsNotCreatedAt));
|
|
// dump('orderIdsNotOrderCount IDs: ' . implode(',', $orderIdsNotOrderCount));
|
|
// dump('orderIdsOrderCountOne IDs: ' . implode(',', $orderIdsOrderCountOne));
|
|
// dump('orderIdsOrderCountOther IDs: ' . implode(',', $orderIdsOrderCountOther));
|
|
// dump($orderDatass);
|
|
// Check if there's a next page
|
|
if (isset($response->getHeader('link')[0]) && strpos($response->getHeader('link')[0], 'rel="next"')) {
|
|
preg_match('/page_info=([^&]*)/', $response->getHeader('link')[0], $matches);
|
|
$pageInfo = $matches[1];
|
|
} else {
|
|
break; // Exit loop if no more pages
|
|
}
|
|
} catch (GuzzleException $e) {
|
|
echo 'Error fetching Shopify orders: ' . $e->getMessage() . PHP_EOL;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// echo 'Total number of order IDs: ' . count($orderIds) . PHP_EOL;
|
|
// dump('Total number of order IDs: ' . count($orderIds));
|
|
// dump('Order IDs: ' . implode(',', $orderIds));
|
|
return $orderIds;
|
|
}
|
|
|
|
// Method to save order data into bps.shopify_orders
|
|
private function saveShopifyOrder($orderData)
|
|
{
|
|
// Define the table name dynamically
|
|
$tableName = 'bps.shopify_orders';
|
|
$tableName = getenv('DB_PG_SCHEMA') ? getenv('DB_PG_SCHEMA') . '.' . $tableName : 'bps' . $tableName;
|
|
|
|
// Prepare data for insertion
|
|
$data = [
|
|
'id' => $orderData['id'],
|
|
'admin_graphql_api_id' => $orderData['admin_graphql_api_id'],
|
|
'browser_ip' => $orderData['browser_ip'],
|
|
'buyer_accepts_marketing' => $orderData['buyer_accepts_marketing'],
|
|
'cancel_reason' => $orderData['cancel_reason'],
|
|
'cancelled_at' => $orderData['cancelled_at'],
|
|
'created_at' => $orderData['created_at'],
|
|
'currency' => $orderData['currency'],
|
|
'current_subtotal_price' => $orderData['current_subtotal_price'],
|
|
'current_total_discounts' => $orderData['current_total_discounts'],
|
|
'current_total_price' => $orderData['current_total_price'],
|
|
'customer_email' => $orderData['customer_email'],
|
|
'customer_name' => $orderData['customer_name'],
|
|
'customer_phone' => $orderData['customer_phone']
|
|
];
|
|
|
|
// SQL statement for inserting or updating order data
|
|
$sql = "
|
|
INSERT INTO {$tableName} (
|
|
id,
|
|
admin_graphql_api_id,
|
|
browser_ip,
|
|
buyer_accepts_marketing,
|
|
cancel_reason,
|
|
cancelled_at,
|
|
created_at,
|
|
currency,
|
|
current_subtotal_price,
|
|
current_total_discounts,
|
|
current_total_price,
|
|
customer_email,
|
|
customer_name,
|
|
customer_phone
|
|
)
|
|
VALUES (
|
|
:id,
|
|
:admin_graphql_api_id,
|
|
:browser_ip,
|
|
:buyer_accepts_marketing,
|
|
:cancel_reason,
|
|
:cancelled_at,
|
|
:created_at,
|
|
:currency,
|
|
:current_subtotal_price,
|
|
:current_total_discounts,
|
|
:current_total_price,
|
|
:customer_email,
|
|
:customer_name,
|
|
:customer_phone
|
|
)
|
|
ON CONFLICT (id)
|
|
DO UPDATE SET
|
|
admin_graphql_api_id = EXCLUDED.admin_graphql_api_id,
|
|
browser_ip = EXCLUDED.browser_ip,
|
|
buyer_accepts_marketing = EXCLUDED.buyer_accepts_marketing,
|
|
cancel_reason = EXCLUDED.cancel_reason,
|
|
cancelled_at = EXCLUDED.cancelled_at,
|
|
created_at = EXCLUDED.created_at,
|
|
currency = EXCLUDED.currency,
|
|
current_subtotal_price = EXCLUDED.current_subtotal_price,
|
|
current_total_discounts = EXCLUDED.current_total_discounts,
|
|
current_total_price = EXCLUDED.current_total_price,
|
|
customer_email = EXCLUDED.customer_email,
|
|
customer_name = EXCLUDED.customer_name,
|
|
customer_phone = EXCLUDED.customer_phone
|
|
";
|
|
|
|
// Execute the SQL query
|
|
ThinkDb::execute($sql, $data);
|
|
}
|
|
}
|