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
相关产品推荐
相关产品推荐

