Facebook营销API(php SDK)'无效参数'对于AdCreative

时间:2016-09-12 08:24:25

标签: php facebook-marketing-api

我试图让Marketing API示例与PHP SDK一起使用。我设法创建了广告系列,设置了定位,上传图片和创建了AdSet。但是,我在使用AdCreative和Ad本身时遇到了问题。

代码一直打破“无效参数”,但我不知道哪一个是无效的。我现在已经调试了3天而且我被困了。这是我的代码:

制作广告系列:

$campaign = new Campaign(null, 'act_xxxxxxx');
$campaign->setData(array(
  CampaignFields::NAME => '#My Campaign#',
  CampaignFields::OBJECTIVE => CampaignObjectiveValues::LINK_CLICKS,
));

$campaign->create(array(
  Campaign::STATUS_PARAM_NAME => Campaign::STATUS_PAUSED,
));

创建目标受众群体:

$targeting = new Targeting();
$targeting->{TargetingFields::GEO_LOCATIONS} =
  array(
    'location_types' => array('recent'),
    'custom_locations' => array(
                            array(
                                'latitude'=> 'xx.xxxxxxx',
                                 'longitude'=> 'xx.xxxxxxx',
                                  'radius'=> 2,
                                   'distance_unit'=> 'kilometer')),
  );

创建Adset:

$start_time = (new \DateTime("+1 day"))->format(DateTime::ISO8601);
$end_time = (new \DateTime("+2 day"))->format(DateTime::ISO8601);

$adset = new AdSet(null, 'act_xxxxxxxx');
$adset->setData(array(
  AdSetFields::NAME => '#My Adset#',
  AdSetFields::OPTIMIZATION_GOAL => AdSetOptimizationGoalValues::LINK_CLICKS,
  AdSetFields::BILLING_EVENT => AdSetBillingEventValues::LINK_CLICKS,
  AdSetFields::BID_AMOUNT => 2,
  AdSetFields::DAILY_BUDGET => 500,
  AdSetFields::CAMPAIGN_ID => $campaign->id,
  AdSetFields::TARGETING => $targeting,
  AdSetFields::START_TIME => $start_time,
  AdSetFields::END_TIME => $end_time,
));
$adset->create(array(
  AdSet::STATUS_PARAM_NAME => AdSet::STATUS_PAUSED,
));

上传图片:

$image = new AdImage(null, 'act_xxxxxxxx');
$image->{AdImageFields::FILENAME} = 'fb-ad-images/xxxxx.jpeg';

$image->create();
$img_hash=$image->{AdImageFields::HASH}.PHP_EOL;

创建AdCreative:

$link_data = new AdCreativeLinkData();
$link_data->setData(array(
  AdCreativeLinkDataFields::MESSAGE => 'try it out',
  AdCreativeLinkDataFields::LINK => 'http://example.com',
  AdCreativeLinkDataFields::CAPTION => 'My caption',
  AdCreativeLinkDataFields::IMAGE_HASH => $img_hash,
));

$object_story_spec = new AdCreativeObjectStorySpec();
$object_story_spec->setData(array(
  AdCreativeObjectStorySpecFields::PAGE_ID => xxxxxxxxxxxxxxx,
  AdCreativeObjectStorySpecFields::LINK_DATA => $link_data,
));

$creative = new AdCreative(null, 'act_xxxxxxx');

$creative->setData(array(
  AdCreativeFields::NAME => 'Sample Creative',
  AdCreativeFields::OBJECT_STORY_SPEC => $object_story_spec,
));

$creative->create();

制作广告:

$data = array(
  AdFields::NAME => 'My Ad',
  AdFields::ADSET_ID => $adset->id,
  AdFields::CREATIVE => array(
    'creative_id' => $creative->id,
  ),
);

$ad = new Ad(null, 'act_xxxxxx');
$ad->setData($data);
$ad->create(array(
  Ad::STATUS_PARAM_NAME => Ad::STATUS_PAUSED,
));

我已经检查了参数的验证兼容性,一切似乎都没问题。错误是

Fatal error: Uncaught exception 'FacebookAds\Http\Exception\AuthorizationException' with message 'Invalid parameter'

任何人都可以帮忙,我真的卡住了。感谢。

2 个答案:

答案 0 :(得分:0)

查看您的代码,看起来您没有在定位中指定经度和纬度。 xx.xxx需要替换为文本。我想出来的方法是启用代码登录并获取指示错误的实际API调用。请查看更新的代码段。

<?php
$access_token = '<ACCESS_TOKEN>';
$app_id = <APP_ID>;
$app_secret = '<APP_SECRET>';
// should begin with "act_" (eg: $account_id = 'act_1234567890';)
$account_id = 'act_<Ad_ACCOUNT_ID>';
// Configurations - End

if (is_null($access_token) || is_null($app_id) || is_null($app_secret)) {
  throw new \Exception(
    'You must set your access token, app id and app secret before executing'
  );
}

if (is_null($account_id)) {
  throw new \Exception(
    'You must set your account id before executing');
}

define('SDK_DIR', __DIR__ . '/..'); // Path to the SDK directory
$loader = include SDK_DIR.'/vendor/autoload.php';

use FacebookAds\Api;
use FacebookAds\Logger\CurlLogger;
Api::init($app_id, $app_secret, $access_token);

// Create the CurlLogger
$logger = new CurlLogger();
// To write to a file pass in a file handler
// $logger = new CurlLogger(fopen('test','w'));
// Attach the logger to the Api instance
Api::instance()->setLogger($logger);

use FacebookAds\Object\Campaign;
use FacebookAds\Object\Fields\CampaignFields;
use FacebookAds\Object\Values\CampaignObjectiveValues;
use FacebookAds\Object\Targeting;
use FacebookAds\Object\Fields\TargetingFields;
use FacebookAds\Object\Fields\AdSetFields;
use FacebookAds\Object\AdSet;
use FacebookAds\Object\Values\AdSetOptimizationGoalValues;
use FacebookAds\Object\Values\AdSetBillingEventValues;

$campaign = new Campaign(null, $account_id);
$campaign->setData(array(
  CampaignFields::NAME => '#My Campaign#',
  CampaignFields::OBJECTIVE => CampaignObjectiveValues::LINK_CLICKS,
));

$campaign->create(array(
  Campaign::STATUS_PARAM_NAME => Campaign::STATUS_PAUSED,
));

$targeting = new Targeting();
$targeting->{TargetingFields::GEO_LOCATIONS} =
  array(
    'location_types' => array('recent'),
    'custom_locations' => array(
                            array(
                                'latitude'=> '47.6062',
                                 'longitude'=> '122.3321',
                                  'radius'=> 2,
                                   'distance_unit'=> 'kilometer')),
  );

$start_time = (new \DateTime("+1 day"))->format(DateTime::ISO8601);
$end_time = (new \DateTime("+2 day"))->format(DateTime::ISO8601);
echo $campaign->id."\n";
$adset = new AdSet(null, $account_id);
$adset->setData(array(
  AdSetFields::NAME => '#My Adset#',
  AdSetFields::OPTIMIZATION_GOAL => AdSetOptimizationGoalValues::IMPRESSIONS,
  AdSetFields::BILLING_EVENT => AdSetBillingEventValues::IMPRESSIONS,
  AdSetFields::BID_AMOUNT => 2,
  AdSetFields::DAILY_BUDGET => 500,
  AdSetFields::CAMPAIGN_ID => $campaign->id,
  AdSetFields::TARGETING => $targeting,
  AdSetFields::START_TIME => $start_time,
  AdSetFields::END_TIME => $end_time,
));
$adset->create(array(
  AdSet::STATUS_PARAM_NAME => AdSet::STATUS_PAUSED,
));

答案 1 :(得分:0)

我认为指定经度和纬度不是问题。 我建议直接从开发人员工具浏览器检查错误消息: https://developers.facebook.com/tools/explorer

我准备了具有相同参数的请求,响应为:

$ awk -F, 'NR==FNR {a[$1]; next}                  # fill array with names from first file
           $1 in a {print rt, $0 > ($1".txt")}    # print the record from second file
                   {rt = RT}' results.csv RS="define_it_here" sample.txt  

因此原因很明确。