Panduan ini membantu Anda menavigasi fitur canggih Meta Business SDK yang dirancang khusus untuk pengguna Conversions API. Permintaan Asinkron, Batching Serentak, dan Antarmuka Layanan HTTP tersedia di SDK PHP, NodeJS, Java, Python, dan Ruby. Untuk penggunaan Conversions API dasar, lihat dokumentasi Conversions API utama.
Meta Business SDK memberi Anda akses ke rangkaian API bisnis kami yang memungkinkan Anda untuk membangun solusi unik dan khusus untuk melayani bisnis dan klien Anda. Salah satu API yang tersedia untuk pengguna SDK adalah Conversions API.
Sebelum menggunakan salah satu fitur yang tercantum di bawah ini, Anda harus telah menginstal Meta Business SDK. Lihat Memulai Meta Business SDK atau ikuti instruksi README
yang tercantum di sini:
facebook-nodejs-business-sdk
facebook-python-business-sdk
Versi bahasa minimum yang diperlukan untuk menggunakan fitur-fitur ini:
Gunakan fitur ini jika Anda tidak ingin memblokir eksekusi program Anda untuk menunggu permintaan selesai. Dengan pendekatan ini, Anda membuat permintaan dan mendapatkan sinyal kembali dari server setelah permintaan selesai. Sementara Anda menunggu tanggapan, program dapat terus dieksekusi.
Permintaan asinkron memungkinkan Anda untuk menggunakan sumber daya secara lebih efisien, sehingga mengurangi waktu tanggapan server. Hal ini juga memungkinkan Anda untuk lebih mengontrol cara program Anda menangani kesalahan yang datang dari server dan dengan mudah mengintegrasikan SDK ke dalam kode yang sudah berjalan secara asinkron.
Untuk menerapkan Permintaan Asinkron, lihat contoh kode dalam bahasa berikut:
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");
Batching serentak memanfaatkan permintaan asinkron untuk meningkatkan throughput dengan memanfaatkan sumber daya secara lebih efisien. Anda dapat membuat permintaan dalam batch untuk mendukung kasus penggunaan seperti pekerja permintaan peristiwa, cron job, dan banyak lagi.
Anda memiliki metode BatchProcessor
berikut untuk dipilih:
Metode | Waktu Penggunaan |
---|---|
| Gunakan metode tersebut untuk memproses peristiwa yang memiliki kolom |
| Metode tersebut adalah generator dasar untuk Metode tersebut juga dapat digunakan untuk memproses peristiwa yang memiliki kolom |
| Gunakan metode tersebut untuk memproses |
| Metode tersebut adalah generator dasar untuk Metode tersebut juga dapat digunakan untuk memproses |
Saat menggunakan batching serentak, peristiwa harus dikirim sedekat mungkin dengan realtime. Untuk informasi selengkapnya, lihat Frekuensi Berbagi.
Jika Anda menggunakan SDK PHP, Python, atau Ruby, metode di atas memerlukan objek EventRequestAsync, bukan EventRequest.
Untuk menerapkan batching serentak, lihat contoh kode dalam bahasa berikut:
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);
Gunakan Antarmuka Layanan HTTP jika Anda memiliki serangkaian persyaratan khusus untuk lapisan layanan HTTP. Dengan fitur ini, Anda dapat mengganti layanan HTTP default dari Business SDK dan menerapkan layanan khusus Anda sendiri dengan metode atau pustaka pilihan Anda.
Untuk menerapkan Antarmuka Layanan HTTP Anda sendiri, lihat contoh kode dalam bahasa berikut:
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);
Anda dapat menguji permintaan peristiwa Anda menggunakan parameter test_event_code
. Temukan kode pengujian dengan membuka alat Uji Peristiwa yang ada di Pengelola Peristiwa pada tab Sumber Data > Pixel Anda > Uji Peristiwa.
Catatan: Anda harus mengganti nilai contoh pada kode di bawah ini (yaitu, TEST12345
) dengan kode tes yang Anda peroleh dari tab Uji Peristiwa.
...
$request = (new EventRequest($pixel_id))
->setTestEventCode('TEST12345')
->setEvents($events);
$response = $request->execute();
Saat ini, kami tidak mendukung pengaturan Antarmuka Layanan HTTP khusus saat pembuatan permintaan batch serentak atau permintaan asinkron.