服务器到服务器:竞价集成疑难解决

内部中介不公开提供

内部 Audience Network 竞价现在处于封测阶段,不公开提供。如有变化,我们将提供最新信息。

作为替代方案,您可以通过与我们合作的其中一个中介平台访问 Audience Network 竞价。

完成服务器到服务器竞价集成后,您应在实体设备上使用实际投放的广告完成应用竞价集成测试。若您遇到一些 http 错误或“无竞价”,此版块将帮助您解决实施方面的疑难。

前提条件

版块

使用 cURL 调试竞价请求

竞价请求中的 HTTP 错误代码和解决方案

无竞价疑难解决

使用 cURL 调试竞价请求

为调试竞价请求,您可以利用 cURL 命令。该命令让您能够在自己的终端发送竞价请求并接收竞价响应。

第 1 步:竞价请求中的插屏广告 JSON 负载

  • 用您的版位编号替代 YOUR_PLACEMENT_ID
  • 用您的公司编号替代 YOUR_BUSINESS_ID
  • 用您的设备编号替代 YOUR_DEVICE_ID
  • 用 Audience Network SDK 中生成的竞价者口令替代 YOUR_BIDDER_TOKEN
  • 用中介合作伙伴平台编号(FB 应用编号)替代 YOUR_PLATFORM_ID
  • 若您想要用不同的广告格式进行测试,请参阅支持的广告格式
  • 将下方的 JSON 负载保存为 bid_request.json
{
"id": "vwxfKskkMobzQQ1e7M70",
"imp": [
{
"id": "FB Ad Impression",
"tagid": "YOUR_PLACEMENT_ID",
"instl": 1,
"banner": {
"h": 0,
"w": 0,
"linearity": 0
}
}
],
"app": {
"publisher": {
"id": "YOUR_BUSINESS_ID"
}
},
"device": {
"ua": "Dalvik\/2.1.0 (Linux; U; Android 8.1.0; Android SDK built for x86 Build\/OSM1.180201.000)",
"ifa": "YOUR_DEVICE_ID",
"dnt": 0,
"ip": "125.123.255.123"
},
"user": {
"buyeruid": "YOUR_BIDDER_TOKEN"
},
"regs": {
"coppa": 0
},
"at": 1,
"tmax": 500,
"test": 1,
"ext": {
"platformid": "YOUR_PLATFORM_ID"
}
}

第 2 步:使用 cURL 命令发送竞价请求

  • 打开您的 Terminal
  • 导航至您用 cd ~/{FILE_PATH} 保存 bid_request.json 的目录位置
curl -X POST -H "Content-Type: application/json" -d @bid_request.json https://an.facebook.com/placementbid.ortb

第 3 步:若竞价请求有效,则检查竞价响应

{
"id": "Auction ID",
"seatbid": [
{
"bid": [
{
"id": "Bid Response ID",
"impid": "FB Ad Impression",
"price": 99.99,
"adm": "{\"type\":\"ID\",\"bid_id\":\"BID ID\",\"placement_id\":\"Placement ID\",\"resolved_placement_id\":\"Resolved Placement ID\",\"sdk_version\":\"SDK Version\",\"device_id\":\"Device ID\",\"template\":102,\"payload\":null}",
"nurl": "https://www.facebook.com/audiencenetwork/nurl/?partner=partner_id&app=app_id&placement=placement_id&auction=auction_id&impression=impression_id&request=request_id&bid=bid_id&ortb_loss_code=0&clearing_price=${AUCTION_PRICE}",
"lurl": "https://www.facebook.com/audiencenetwork/nurl/?partner=partner_id&app=app_id&placement=placement_id&auction=auction_id&impression=impression_id&request=request_id&bid=bid_id&ortb_loss_code=${AUCTION_LOSS}&clearing_price=${AUCTION_PRICE}"
}
]
}
],
"bidid": "Bid ID",
"cur": "USD"
}

第 4 步:若您没有收到上述竞价响应,请在 HTTP 响应标头中查找 x-fb-an-errors

用于显示 HTTP 响应标头的 cURL 命令。

url -X POST -H "Content-Type: application/json" -v @bid_request.json https://an.facebook.com/placementbid.ortb
...
> Content-Type: application/json
>
* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
< HTTP/2 400
< x-fb-an-request-id: fb_an_request_id
...
< x-fb-an-errors: Value cannot be null: value given: null
...

请参阅竞价请求中的 HTTP 错误说明和解决方案,以修复您的竞价请求。

竞价请求中的 HTTP 错误说明和解决方案

测试竞价实施时,您可能会在发出竞价请求时遇到其中一个可能出现的错误代码。下方说明了这些错误代码和解决方案。

400 响应:无效参数错误

错误消息 描述 解决方案

user.buyeruid 中的无效竞价口令

user.buyeruid 中的竞价口令无效。

如何生成有效的竞价口令:

  • Android - BidderTokenProvider.getBidderToken(context);

  • iOS — [FBAdSettings bidderToken];

ipaddress 必须为有效的 IP 地址

在竞价请求负载的 device 对象中,您应为 ip(v4) 或 ipv6 字段提供有效的 IP 地址。

正确示例:

  • ip(v4): 255.255.255.0

  • ipv6: 2001:0db8:85a3:0000:0000:8a2e:0370:7334

错误示例:(不要截断您的 IP)

  • ip(v4): 255.255.255

  • ipv6: 2001:0db8:85a3:0000:0000:8a2e

需要有效的版位编号

imp.tagid 字段中,您应提供有效的 Audience Network 版位编号。

请从商务管理平台找到您的版位编号。选择“管理资产”并在 Android 或 iOS 平台的广告专区下找到版位编号。

应用请求中未设置发行商编号。

请求中未设置 app.publisher.id 字段。

请从公司设置找到您的发行商编号。在左侧菜单中选择“应用”,并找到您的应用编号,将其作为发行商编号

所有版位编号必须属于相同应用编号

如消息所示,竞价请求中的所有 Audience Network 版位编号应属于相同的应用编号。

请在商务管理平台中检查竞价请求中的所有版位编号是否属于相同应用编号。选择“管理资产”并在 Android 或 iOS 平台的广告专区下找到版位编号。

值未包含必填且不可留空的 shape 字段

您的竞价请求中缺失必填值。

必填值:

  1. id

  2. impimp.tagidimp.id

  3. app.publisherapp.publisher.id

  4. device

  5. extext.platformid

  6. at -- 枚举 (1, 2) 值为必填

广告格式为必填,广告格式和版位编号的数量应相同

请提供非空且有效的广告格式。

支持的广告格式:

  • 原生广告格式:{'id': ${AUCTION_ID}, "native": { "h": -1, "w": -1 }, 'tagid': ${PLACEMENT_ID}}

  • 原生横幅广告格式:{'id': ${AUCTION_ID}, "native": { "h": -1, "w": -1 }, 'tagid': ${PLACEMENT_ID}}

  • 插屏广告格式:{'id': ${AUCTION_ID}, "banner": { "h": 0, "w": 0 }, 'tagid': ${PLACEMENT_ID}, 'instl': 1}

  • 激励视频广告格式:{'id': ${AUCTION_ID}, "video": { "h": 0, "w": 0, 'ext': { 'videotype': 'rewarded' } }, 'tagid': ${PLACEMENT_ID}}

  • 横幅广告格式 - 高度 50:{'id': ${AUCTION_ID}, "banner": { "h": 50, "w": -1 }, 'tagid': ${PLACEMENT_ID}}

  • 横幅广告格式 - 高度 250:{'id': ${AUCTION_ID}, "banner": { "h": 250, "w": -1 }, 'tagid': ${PLACEMENT_ID}}

  • 插播视频广告格式:{'id': ${AUCTION_ID}, "video": { "h": 0, "w": 0, 'linearity': 1 }, 'tagid': ${PLACEMENT_ID}}

如需更多信息,请查看支持的广告格式

横幅广告、原生广告和视频广告的对象相互排斥,但您必须选择其中一个

对于上述广告格式,存在不同的对象:nativebannervideo。我们的端点需要这 3 个对象之一,但请注意它们是互斥的。

请参阅上文支持的广告格式解决方案。

400 响应:未授权错误

错误消息 描述 解决方案

无应用匹配网域和公司编号

若您在 app.publisher.id 字段中使用公司编号,则我们的后端无法通过网域和公司找到应用。

如果您一直遇到此错误,请在 app.publisher.id 字段中使用应用编号。

应用程序未被授权进行应用竞价

app.publisher.id 中的应用程序编号不在竞价的白名单中,或者应用程序待审核。

请联系我们,以将您的应用添加至白名单,或等待应用获得批准。

平台未被授权进行应用竞价

ext.platformid 中的平台编号不在竞价的白名单中。请确保您的应用编号在白名单中且不处于待审核状态。

解决方案:

  1. 如果您是发行商,则应用编号与平台编号相同。

  2. 如果您是合作伙伴,您的发行商将在 ext.platformid(合作伙伴应用编号)和 app.publisher.id(发行商应用编号)中填入不同的值

请联系我们,以将您的应用添加至白名单,或等待应用获得批准。

意外错误

原因:

  1. 应用/用户节流。

  2. 应用程序未通过。

  3. 不受信任的安装程序。

  4. 欺骗性质的请求。

解决方案:

  1. 请减少重新加载广告的频率。

  2. 请联系我们,以检查您的应用程序状态。

  3. 请确保您是从受信任的应用商店安装此应用。

  4. 如果您一直遇到此错误,请联系我们。

204 响应:空错误信息

错误消息 描述 解决方案

竞价响应 x-fb-an-errors 的错误标头为空

原因:

  1. dnt: 1 -- do-not-track 的情况下,Facebook 不会竞价。

  2. 插屏广告格式缺少 imp.instl

  3. Facebook 选择不参与此次竞拍。

解决方案:

  1. 用户必须在设备中打开“广告追踪”,然后客户端应在竞价请求中传递 dnt: 0 (do-not-track),随后 Facebook 会进行竞价。

  2. 请确保您的 imp.instl 字段为 1,以进行插屏广告竞价。

若持续显示 204 响应,请联系我们。

无竞价疑难解决

  • 确保您在捕获并记录 x-fb-an-errors HTTP 标头,以帮助您了解错误原因。
  • 确保在运行应用的设备上安装了 Facebook 应用,并且您使用自己的真实用户帐户登录 Facebook。使用虚假或测试 Facebook 用户帐户均违反 Facebook 的政策,并会导致帐户禁用。
  • 确保通过调用 Android 上的 com.facebook.ads.BidderTokenProvider.getBidderToken() 和 iOS 上的 [FBAdSettings bidderToken],从 Audience Network SDK 获得竞价口令,并将返回的字符串发送到竞价请求的 buyeruid 字段中。
  • 确保您向竞价请求的 ifa 字段发送了正确的设备编号(Android -- AdvertisingIdClient.getAdvertisingIdInfo(context).getId()、iOS -- [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString])。
  • 确保您的设备未启用 do-not-track(dnt),然后在竞价请求中传递 dnt: 0 (do-not-track)。