Unity3d Web App 调用 Facebook Sdk payments 出现 API Error Code:
支付阿杰
结论
API Error Code: 1383008 通常不表示 og:product 标签解析失败,而是 Facebook 创建支付订单时,没有从应用获得有效响应。先检查应用后台配置的 Payments 回调地址及服务器响应,再确认传给 FB.Canvas.Pay 的商品 URL 是完整且可公开访问的 HTTPS 地址。
C# 中的 callback 只负责支付弹窗返回 Unity 后的客户端回调,不能代替 Facebook Payments 要求的服务端回调。
重点检查项
1. 检查 Payments 服务端回调
在 Facebook 应用的支付配置中逐项确认:
- Payments callback URL 已正确填写。
- URL 可以从公网访问,不是
localhost、内网地址或只有开发者才能打开的页面。 - HTTPS 证书有效,证书链完整。
- 请求不会被登录验证、Cookie 检查、IP 白名单或 CSRF 防护拦截。
- 服务端可以正确处理 Facebook 发来的支付请求。
- 回调能及时返回符合对应 Payments API 规范的内容和 HTTP
200。 - 服务端没有出现
404、500、超时或重定向循环。
排查时应直接查看服务器访问日志。如果点击购买按钮后,Facebook 请求了回调地址,却收到异常响应,问题基本就在服务端配置。
不同时期的 Facebook Payments API 对回调请求和返回内容有不同要求。请以项目实际使用的 Facebook Unity SDK 及对应的 Graph API 文档为准,不要套用旧版教程中的回调格式。
2. 使用完整的商品 URL
示例中的:
product: "my_url/products/coin.html"
需要替换为完整的绝对地址,例如:
https://game.example.com/products/coin.html
商品页面应满足以下条件:
- 无需登录即可访问。
- 返回 HTTP
200。 - 不依赖浏览器本地 Cookie。
- 没有设备或地区限制。
- Facebook 服务器可以抓取。
og:type、价格、币种、标题和图片等商品信息有效。- 最终 URL 使用的域名与应用配置中允许的域名一致。
即使 Open Graph 调试工具可以识别该页面,也要检查实际支付请求期间是否出现重定向、偶发超时或访问控制。
Unity 调用示例
public void OnCoinsClicked()
{
const string productUrl =
"https://game.example.com/products/coin.html";
FB.Canvas.Pay(
product: productUrl,
action: "purchaseitem",
quantity: 1,
testCurrency: "EUR",
callback: response =>
{
if (response == null)
{
FbDebug.Log("Payment returned no response.");
return;
}
FbDebug.Log("Payment response: " + response.Text);
}
);
FbDebug.Log("OnCoinsClicked invoked.");
}
action 必须准确写成:
purchaseitem
不要修改大小写,也不要加入空格。testCurrency 只用于测试流程,无法解决服务端回调或商品页面的配置问题。
建议的排查顺序
- 在浏览器无痕窗口中打开商品 URL,确认页面无需登录,并返回
200。 - 使用
curl -I或服务器监控检查是否存在301/302循环、403、404或500。 - 点击购买按钮,同时查看 Payments 回调服务器的访问日志和错误日志。
- 核对 Facebook 应用后台的支付回调地址、应用域名和 Canvas URL。
- 确认测试账号已设置为该应用的 payments tester,并且可以访问 sandbox 应用。
- 清除 Open Graph 缓存,然后重新抓取商品页面。
- 记录 Unity 回调中完整的
response.Text,不要只看弹窗里的通用错误信息。 - 如果使用的是较旧版本的 Facebook Unity SDK,检查它支持的 Graph API 和 Payments 接口。旧 SDK 可能无法正确调用当前接口。
注意事项
- 不要只在客户端发放 coins。订单完成后,服务端应先验证支付状态和订单标识,再将虚拟货币写入玩家账户。
- 客户端弹窗关闭或返回成功,不代表支付已经完成最终结算。
- 同一订单或回调可能会被重复投递,因此发货逻辑需要具备幂等性。
- 如果回调日志中完全没有 Facebook 请求,应重点检查回调 URL 是否保存到了正确的应用、当前使用的 App ID 是否一致,以及 sandbox 环境配置是否正确。
- 如果商品页面和回调服务都正常,但错误仍然存在,需要结合 Unity SDK 版本、Graph API 版本和 Facebook 后台支付配置继续判断。仅凭
1383008,无法认定 Unity 客户端代码中的某个参数有误。
备注:内容仅供参考。
