Hướng dẫn này giúp bạn khám phá các tính năng nâng cao của Meta Business SDK dành riêng cho người dùng API Chuyển đổi. Các tính năng Yêu cầu không đồng bộ, Xử lý hàng loạt đồng thời và Giao diện dịch vụ HTTP đã có sẵn trong các SDK PHP, NodeJS, Java, Python và Ruby. Nếu bạn muốn biết trường hợp sử dụng API Chuyển đổi cơ bản, hãy tham khảo tài liệu về API Chuyển đổi chính.
Với Meta Business SDK, bạn có thể truy cập vào bộ API kinh doanh của chúng tôi, từ đó xây dựng các giải pháp độc đáo và tùy chỉnh để phục vụ doanh nghiệp và khách hàng của bạn. Một trong số các API mà người dùng SDK có thể sử dụng là API Chuyển đổi.
Trước khi sử dụng bất kỳ tính năng nào nêu dưới đây, bạn cần cài đặt Meta Business SDK. Hãy xem bài viết Bắt đầu sử dụng Meta Business SDK hoặc làm theo hướng dẫn trong file README
theo liên kết dưới đây:
facebook-nodejs-business-sdk
facebook-python-business-sdk
Sau đây là phiên bản ngôn ngữ tối thiểu cần có để sử dụng các tính năng này:
Sử dụng tính năng này nếu bạn không muốn chặn thực thi chương trình để chờ hoàn tất một yêu cầu. Với phương pháp này, bạn gửi yêu cầu và nhận lại tín hiệu từ máy chủ sau khi yêu cầu hoàn tất. Trong khi bạn chờ phản hồi, chương trình có thể tiếp tục thực thi.
Với tính năng Yêu cầu không đồng bộ, bạn có thể sử dụng tài nguyên của mình hiệu quả hơn, qua đó giảm thời gian phản hồi của máy chủ. Tính năng này cũng cho phép bạn kiểm soát hơn nữa cách chương trình xử lý các lỗi đến từ máy chủ, đồng thời dễ dàng tích hợp SDK vào mã đã chạy không đồng bộ.
Để triển khai Yêu cầu không đồng bộ, hãy xem mã mẫu bằng các ngôn ngữ sau:
use FacebookAds\Api;
use FacebookAds\Object\ServerSide\CustomData;
use FacebookAds\Object\ServerSide\Event;
use FacebookAds\Object\ServerSide\EventRequest;
use FacebookAds\Object\ServerSide\EventRequestAsync;
use FacebookAds\Object\ServerSide\UserData;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Promise;
$pixel_id = getenv('PIXEL_ID');
$access_token = getenv('ACCESS_TOKEN');
if (empty($pixel_id) || empty($access_token)) {
throw new Exception('Missing required test config. Got pixel_id: "' . $pixel_id . '", access_token: "' . $access_token . '"');
}
Api::init(null, null, $access_token, false);
function create_events($num) {
$user_data = (new UserData())
->setEmail('joe' . $num . '@eg.com')
->setClientIpAddress($_SERVER['REMOTE_ADDR'])
->setClientUserAgent($_SERVER['HTTP_USER_AGENT']);
$custom_data = (new CustomData())
->setCurrency('usd')
->setValue(123.45);
$event = (new Event())
->setEventName('Purchase')
->setEventTime(time())
->setEventSourceUrl('http://jaspers-market.com/product/123')
->setUserData($user_data)
->setCustomData($custom_data)
->setActionSource(ActionSource::WEBSITE);
return array($event);
}
function create_async_request($pixel_id, $num) {
$async_request = (new EventRequestAsync($pixel_id))
->setEvents(create_events($num));
return $async_request->execute()
->then(
null,
function (RequestException $e) {
print(
"Error!!!\n" .
$e->getMessage() . "\n" .
$e->getRequest()->getMethod() . "\n"
);
}
);
}
// Async request:
$promise = create_async_request($pixel_id, 2);
print("Request 1 state: " . $promise->getState() . "\n");
print("Async request - OK.\n");
// Async request with wait:
$promise = create_async_request($pixel_id, 3);
$response2 = $promise->wait();
print("Request 2: " . $response2->getBody() . "\n");
print("Async request with wait - OK.\n");
// Multiple async requests:
$promises = [
"Request 3" => create_async_request($pixel_id, 4),
"Request 4" => create_async_request($pixel_id, 5),
];
$response3 = Promise\unwrap($promises);
foreach ($response3 as $request_name => $response) {
print($request_name . ": " . $response->getBody()."\n");
}
print("Async - Multiple async requests OK.\n");
Tính năng Xử lý hàng loạt đồng thời tận dụng các yêu cầu không đồng bộ để tăng thông lượng bằng cách sử dụng tài nguyên hiệu quả hơn. Bạn có thể tạo yêu cầu hàng loạt để hỗ trợ các trường hợp sử dụng như trình xử lý yêu cầu sự kiện, lệnh chạy ngầm theo thời gian định trước và hơn thế nữa.
Bạn có thể chọn một trong các phương thức BatchProcessor
sau:
Phương thức | Thời điểm sử dụng |
---|---|
| Dùng để xử lý các sự kiện có trường |
| Đây là trình tạo cơ bản của Phương thức này còn được dùng để xử lý các sự kiện có trường |
| Dùng để xử lý đồng thời |
| Đây là trình tạo cơ bản của Phương thức này còn được dùng để xử lý đồng thời |
Khi sử dụng tính năng xử lý hàng loạt đồng thời, bạn nên gửi các sự kiện gần với thời gian thực nhất có thể. Để biết thêm thông tin, hãy xem phần Tần suất chia sẻ.
Nếu bạn đang sử dụng SDK PHP, Python hoặc Ruby, các phương thức ở trên sẽ yêu cầu (các) đối tượng EventRequestAsync, thay vì đối tượng EventRequest.
Để triển khai tính năng xử lý hàng loạt đồng thời, hãy xem mã mẫu bằng các ngôn ngữ sau:
use FacebookAds\Api;
use FacebookAds\Object\ServerSide\BatchProcessor;
use FacebookAds\Object\ServerSide\CustomData;
use FacebookAds\Object\ServerSide\Event;
use FacebookAds\Object\ServerSide\EventRequestAsync;
use FacebookAds\Object\ServerSide\UserData;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Promise;
$pixel_id = getenv('PIXEL_ID');
$access_token = getenv('ACCESS_TOKEN');
if (empty($pixel_id) || empty($access_token)) {
throw new Exception('Missing required test config. Got pixel_id: "' . $pixel_id . '", access_token: "' . $access_token . '"');
}
$api = Api::init(null, null, $access_token, false);
function create_event($i) {
$user_data = (new UserData())
->setEmail('joe' . $i . '@eg.com')
->setClientIpAddress($_SERVER['REMOTE_ADDR'])
->setClientUserAgent($_SERVER['HTTP_USER_AGENT']);
$custom_data = (new CustomData())
->setCurrency('usd')
->setValue(123.45);
return (new Event())
->setEventName('Purchase')
->setEventTime(time())
->setEventSourceUrl('http://jaspers-market.com/product/' . $i)
->setUserData($user_data)
->setCustomData($custom_data)
->setActionSource(ActionSource::WEBSITE);
}
function create_events($num) {
$events = [];
for ($i = 0; $i < $num; $i++) {
$events[] = create_event($i);
}
return $events;
}
function create_async_requests($pixel_id, $num) {
$requests = [];
for ($i = 0; $i < $num; $i++) {
$requests[] = (new EventRequestAsync($pixel_id))
->setUploadTag('test-tag-2')
->setEvents([create_event($i)]);
}
return $requests;
}
function run($pixel_id) {
print("Started CONVERSIONS_API_EVENT_CREATE_BATCH...\n");
$batch_processor = new BatchProcessor($pixel_id, 2, 2);
// processEvents
$events = create_events(11);
$batch_processor->processEvents(array('upload_tag' => 'test-tag-1'), $events);
// processEventRequests
$requests = create_async_requests($pixel_id, 5);
$batch_processor->processEventRequests($requests);
// processEventsGenerator
$process_events_generator = $batch_processor->processEventsGenerator(array('upload_tag' => 'test-tag-1'), $events);
foreach ($process_events_generator as $promises) {
try {
Promise\unwrap($promises);
} catch (RequestException $e) {
print('RequestException: ' . $e->getResponse()->getBody()->getContents() . "\n");
throw $e;
} catch (\Exception $e) {
print("Exception:\n");
print_r($e);
throw $e;
}
}
// processEventRequestsGenerator
$requests = create_async_requests($pixel_id, 5);
$process_event_requests_generator = $batch_processor->processEventRequestsGenerator($requests);
foreach ($process_event_requests_generator as $promises) {
try {
Promise\unwrap($promises);
} catch (RequestException $e) {
print('RequestException: ' . $e->getResponse()->getBody()->getContents() . "\n");
throw $e;
} catch (\Exception $e) {
print("Exception:\n");
print_r($e);
throw $e;
}
}
print("Finished CONVERSIONS_API_EVENT_CREATE_BATCH with no errors.\n");
}
run($pixel_id);
Sử dụng Giao diện dịch vụ HTTP nếu bạn có loạt yêu cầu cụ thể dành cho lớp dịch vụ HTTP. Với tính năng này, bạn có thể ghi đè dịch vụ HTTP mặc định của Business SDK và triển khai dịch vụ tùy chỉnh của mình bằng phương thức hoặc thư viện ưu tiên.
Để triển khai Giao diện dịch vụ HTTP của riêng bạn, hãy xem mã mẫu bằng các ngôn ngữ sau:
require __DIR__ . '/../vendor/autoload.php';
use FacebookAds\Api;
use FacebookAds\Object\ServerSide\CustomData;
use FacebookAds\Object\ServerSide\Event;
use FacebookAds\Object\ServerSide\EventRequest;
use FacebookAds\Object\ServerSide\EventRequestAsync;
use FacebookAds\Object\ServerSide\HttpServiceClientConfig;
use FacebookAds\Object\ServerSide\UserData;
// Imports used by the TestHttpClient class
use FacebookAds\Object\ServerSide\HttpServiceInterface;
use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Handler\CurlHandler;
use GuzzleHttp\Psr7\MultipartStream;
use GuzzleHttp\Psr7\Request;
$pixel_id = getenv('PIXEL_ID');
$access_token = getenv('ACCESS_TOKEN');
if (empty($pixel_id) || empty($access_token)) {
throw new Exception('Missing required test config. Got pixel_id: "' . $pixel_id . '", access_token: "' . $access_token . '"');
}
function run($access_token, $pixel_id) {
Api::init(null, null, $access_token, false);
$request1 = getEventRequest($pixel_id, 1);
$request1->setHttpClient(new TestHttpClient());
$response1 = $request1->execute();
print("Response: " . $response1->getBody() . "\n");
print("Custom HTTP Service Request 1 - OK.\n");
// Alternatively, you can set the access_token and the HTTP Client on the HttpServiceClientConfig
Api::init(null, null, null, false);
HttpServiceClientConfig::getInstance()->setClient(new TestHttpClient());
HttpServiceClientConfig::getInstance()->setAccessToken($access_token);
$request2 = getEventRequest($pixel_id, 2);
$response2 = $request2->execute();
print("Response: " . $response2->getBody() . "\n");
print("Custom HTTP Service Request 2 - OK.\n");
}
function getEventRequest($pixel_id, $num) {
$user_data = (new UserData())
->setEmail('joe' . $num . '@eg.com')
->setClientIpAddress($_SERVER['REMOTE_ADDR'])
->setClientUserAgent($_SERVER['HTTP_USER_AGENT']);
$custom_data = (new CustomData())
->setCurrency('usd')
->setValue(123.45);
$event = (new Event())
->setEventName('Purchase')
->setEventTime(time())
->setEventSourceUrl('http://jaspers-market.com/product/123')
->setUserData($user_data)
->setCustomData($custom_data)
->setActionSource(ActionSource::WEBSITE);
return (new EventRequest($pixel_id))
->setEvents(array($event));
}
class TestHttpClient implements HttpServiceInterface {
public function executeRequest($url, $method, array $curl_options, array $headers, array $params) {
$multipart_contents = [];
foreach ($params as $key => $value) {
if ($key === 'data') {
$multipart_contents[] = [
'name' => $key,
'contents' => \GuzzleHttp\json_encode($value),
'headers' => array('Content-Type' => 'multipart/form-data'),
];
} else {
$multipart_contents[] = [
'name' => $key,
'contents' => $value,
'headers' => array('Content-Type' => 'multipart/form-data'),
];
}
}
$body = new MultipartStream($multipart_contents);
$request = new Request($method, $url, $headers, $body);
$handler_stack = HandlerStack::create(
new CurlHandler(['options' => $curl_options])
);
$client = new Client(['handler' => $handler_stack]);
return $client->send($request);
}
}
run($access_token, $pixel_id);
Bạn có thể dùng thông số test_event_code
để thử nghiệm các yêu cầu sự kiện. Để tìm mã thử nghiệm, hãy chuyển đến công cụ Thử nghiệm sự kiện trong Trình quản lý sự kiện trong Nguồn dữ liệu > Pixel của bạn > tab Thử nghiệm sự kiện.
Lưu ý: Bạn phải thay giá trị mẫu trong mã dưới đây (tức là TEST12345
) bằng mã thử nghiệm được lấy từ tab Thử nghiệm sự kiện.
...
$request = (new EventRequest($pixel_id))
->setTestEventCode('TEST12345')
->setEvents($events);
$response = $request->execute();
Hiện tại, chúng tôi không hỗ trợ đặt Giao diện dịch vụ HTTP tùy chỉnh khi thực hiện các yêu cầu hàng loạt đồng thời hoặc yêu cầu không đồng bộ.