You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP Facebook Business SDK创建Ad Creative时图片缺失问题求助

PHP Facebook Business SDK 创建Ad Creative时的「Missing Image」报错解决

我在用PHP Facebook Business SDK创建Ad Creative时碰到了「Missing Image」报错,虽然已经成功生成图片哈希,但无论保留或移除IMAGE_URL和IMAGE_FILE字段都无法解决问题。

原代码实现

public function createAdCreative($ad_set_id, $adName, $primaryText, $description, $websiteURL, $file)
{
    try {
        $ad_image = new AdImage(null, 'act_' . $this->ad_account_id);
        $ad_image->{AdImageFields::FILENAME} = $file;
        $ad_image->create();

        $ad_creative = new AdCreative(null, 'act_' . $this->ad_account_id);
        $ad_creative->setData([
            AdCreativeFields::TITLE => $adName,
            AdCreativeFields::BODY => $description,
            AdCreativeFields::OBJECT_URL => $websiteURL,
            AdCreativeFields::IMAGE_HASH => $ad_image->{AdImageFields::HASH},
            AdCreativeFields::IMAGE_URL => env('APP_URL').'/uploads/'. basename($file),
            AdCreativeFields::IMAGE_FILE => basename($file)
        ]);

        $ad = new Ad(null, 'act_' . $this->ad_account_id);
        $ad->setData([
            AdFields::NAME => $adName,
            AdFields::ADSET_ID => $ad_set_id,
            AdFields::CREATIVE => $ad_creative
        ]);
        $ad_res = $ad->create(array(
            Ad::STATUS_PARAM_NAME => Ad::STATUS_PAUSED,
        ));

        return $ad_creative->id;

    } catch (RequestException $e) {
        echo 'Exception ->: ' . $e->getMessage().PHP_EOL;
        echo 'Error details: ' . json_encode($e->getErrorUserTitle()).PHP_EOL.PHP_EOL;
    }
}

关键问题点

  • 图片哈希$ad_image->{AdImageFields::HASH}已成功生成,确认有效
  • 尝试过保留/移除AdCreativeFields::IMAGE_URL和AdCreativeFields::IMAGE_FILE字段,均无效
  • 参考官方文档后仍无法解决

解决方案

1. 移除冗余字段,仅保留IMAGE_HASH

Facebook Ad Creative只需要IMAGE_HASH就能关联已上传到Facebook服务器的图片,IMAGE_URL和IMAGE_FILE属于冗余字段,甚至会和IMAGE_HASH产生冲突,导致识别失败。创建AdCreative时只传递IMAGE_HASH即可。

2. 先单独创建AdCreative,再关联到Ad

原代码中直接把未创建的AdCreative对象传给Ad,可能导致关联失败。正确的做法是先创建AdCreative得到ID,再用ID关联到Ad中。

3. 修正后的代码示例

public function createAdCreative($ad_set_id, $adName, $primaryText, $description, $websiteURL, $file)
{
    try {
        // 上传图片并获取哈希
        $ad_image = new AdImage(null, 'act_' . $this->ad_account_id);
        $ad_image->{AdImageFields::FILENAME} = $file;
        $ad_image->create();
        
        // 校验哈希是否有效
        if (empty($ad_image->{AdImageFields::HASH})) {
            throw new Exception("图片上传失败,未获取到有效哈希");
        }

        // 创建AdCreative,仅保留必要字段
        $ad_creative = new AdCreative(null, 'act_' . $this->ad_account_id);
        $ad_creative->setData([
            AdCreativeFields::TITLE => $adName,
            AdCreativeFields::BODY => $description,
            AdCreativeFields::OBJECT_URL => $websiteURL,
            AdCreativeFields::IMAGE_HASH => $ad_image->{AdImageFields::HASH},
        ]);
        $ad_creative->create(); // 先完成AdCreative的创建

        // 创建Ad并关联已生成的AdCreative
        $ad = new Ad(null, 'act_' . $this->ad_account_id);
        $ad->setData([
            AdFields::NAME => $adName,
            AdFields::ADSET_ID => $ad_set_id,
            AdFields::CREATIVE => ['creative_id' => $ad_creative->id] // 通过ID关联
        ]);
        $ad_res = $ad->create([
            Ad::STATUS_PARAM_NAME => Ad::STATUS_PAUSED,
        ]);

        return $ad_creative->id;

    } catch (RequestException $e) {
        echo 'Exception ->: ' . $e->getMessage().PHP_EOL;
        echo 'Error details: ' . json_encode($e->getErrorUserTitle()).PHP_EOL.PHP_EOL;
    } catch (Exception $e) {
        echo 'Error: ' . $e->getMessage().PHP_EOL;
    }
}

4. 额外检查项

  • 确认$file指向的本地图片路径正确,PHP进程拥有读取该文件的权限
  • 图片格式符合Facebook要求(支持JPG/PNG,尺寸、分辨率符合对应广告位规格)
  • 检查Ad Account的权限是否足够上传图片和创建Ad Creative

内容的提问来源于stack exchange,提问作者Pascal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 04:45:25