处理 Meta Pay 的支付事务时,您必须在 Meta Pay API 中调用 Webhooks,以向 Meta 通知相关支付交易活动,例如授权和退款。支付交易活动显示在客户 Facebook 账户的订单与支付页面。
如要了解如何使用 Meta 的 API,请参阅图谱 API 概览,并请注意,下方所述 API 均与标准图谱 API 托管网址 (https://graph.facebook.com
) 相关。如需更多一般信息,请参阅 Meta Pay 集成概览。
根据常规入门引导步骤,您需在 Meta 开发者网站创建一个新应用程序。应用程序创建完毕后,您会获得该应用程序的应用编号和应用密钥。
每次向 Meta Pay API 发出调用时,您均需提供由应用编号和应用密钥派生的应用访问口令。请使用 Authorization
标头(而非 access_token
查询参数)发送应用访问口令。Meta Pay API 会拒绝带有用户口令的调用。
例如,您可以使用以下代码:
Authorization: OAuth <APP_ACCESS_TOKEN>
每个向 Meta Pay API 发送的 HTTP 请求都必须包含 FBPAY_SIGNATURE
请求标头。此标头的值即为 JSON Web Signature (JWS) 对象,采用 ES256 算法、紧凑型序列化格式和分离的有效负载(参照 https://tools.ietf.org/html/rfc7515#appendix-F)。有效负载值为 HTTP POST
请求正文。JWS 签名秘钥须使用 x5c 标头进行标识,且须包含链接到合作伙伴可信根的证书。在入门引导流程中,合作伙伴的根证书将分享给 Meta (称为 Meta Pay API 签名证书)。
curl -i -X POST \ -H "Content-Type: application/json" \ -H "FBPAY_SIGNATURE: eyJhbGciOiJFUzI1NiIsIng1YyI6WyJNSUlCaERDQ0FTcWdBd0lCQWdJQkFUQUtCZ2dxaGtqT1BRUURBakFoTVI4d0hRWURWUVFEREJad1lYSjBibVZ5SUhOcFoyNWhkSFZ5WlNCalpYSjBNQjRYRFRJd01EY3hNekl5TWpVek1Gb1hEVEkwTURNeE1USXlNalV6TUZvd0lURWZNQjBHQTFVRUF3d1djR0Z5ZEc1bGNpQnphV2R1WVhSMWNtVWdZMlZ5ZERCWk1CTUdCeXFHU000OUFnRUdDQ3FHU000OUF3RUhBMElBQkFuRngwR1NKMklPZGZpcFdiMGMwZytBVThlbDh6QnRVS0kxdWRzT2kzN2thd1JRSFkzV29YaWRvRThIOHM1cVIySmo2ZkFKWVhOTURXY0NiditWMEJ1alV6QlJNQjBHQTFVZERnUVdCQlR4NlBGRkhjd2FUZnY5cVdzZUJcL1NjMWFPbVZ6QWZCZ05WSFNNRUdEQVdnQlR4NlBGRkhjd2FUZnY5cVdzZUJcL1NjMWFPbVZ6QVBCZ05WSFJNQkFmOEVCVEFEQVFIXC9NQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUUNBRE9zZ0pZanRXVm9xNUZOSjc3U2JDeWtON1ZldUlKR2pXb3NBVUFNd1ZRSWdUTlVcL2ttc1wvN0cxVUx5Z01DRWVXemNiYTNrMVo4NEE4RmNlMXQzYUNGbGc9Il19..ZnT7ZR3EqsPYMQt3WdgUZYScBiyK9RI77zMaUKr-tkFRBHgBJQVTOORwM2fFh0QQCTLwOp1TiAzt_q9ofvw6JQ" "https://graph.facebook.com/1001200005002/notify_authorizations" \ -d '{"notification":{"partner_merchant_id":"123e4567-e89b-12d3-a456-426614174000","container_id":"cGF5bWVudF9jb250YWluZAXI6MTIzNDU2NzhfX01FUkNIQU5UX1RFU1RfRTJFX19QU1BfVEVTVF8x","event_time":1582230020020,"type":"notify_authorizations"},"resource":{"partner_auth_id":"1234567890","auth_amount":{"currency":"USD","value":29508},"status":"SUCCEEDED","created_time":1582230019010,"metadata":[]},"idempotence_token":"ddbdf2cf-d339-4b0b-a27e-4731d8d37c9d"}'
上述请求对以下数据进行了编码:
{ "notification": { "partner_merchant_id": "123e4567-e89b-12d3-a456-426614174000", "container_id": "cGF5bWVudF9jb250YWluZAXI6MTIzNDU2NzhfX01FUkNIQU5UX1RFU1RfRTJFX19QU1BfVEVTVF8x", "event_time": 1582230020020, "type": "notify_authorizations" }, "resource": { "partner_auth_id": "1234567890", "auth_amount": { "currency": "USD", "value": 29508 }, "status": "SUCCEEDED", "created_time": 1582230019010, "metadata": [] }, "idempotence_token": "ddbdf2cf-d339-4b0b-a27e-4731d8d37c9d" }
以下是来自上述请求的签名,为清晰起见,我们已利用 Base64 解码其中的 JSON 字符串:
base64url( json({ "x5c": [ "MIIBhDCCASqgAwIBAgIBATAKBggqhkjOPQQDAjAhMR8wHQYDVQQDDBZwYXJ0bmVyIHNpZ25hdHVyZSBjZXJ0MB4XDTIwMDcxMzIyMjUzMFoXDTI0MDMxMTIyMjUzMFowITEfMB0GA1UEAwwWcGFydG5lciBzaWduYXR1cmUgY2VydDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABAnFx0GSJ2IOdfipWb0c0g+AU8el8zBtUKI1udsOi37kawRQHY3WoXidoE8H8s5qR2Jj6fAJYXNMDWcCbv+V0BujUzBRMB0GA1UdDgQWBBTx6PFFHcwaTfv9qWseB/Sc1aOmVzAfBgNVHSMEGDAWgBTx6PFFHcwaTfv9qWseB/Sc1aOmVzAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0gAMEUCIQCADOsgJYjtWVoq5FNJ77SbCykN7VeuIJGjWosAUAMwVQIgTNU/kms/7G1ULygMCEeWzcba3k1Z84A8Fce1t3aCFlg=" ], "alg": "ES256" }) ) + // Protected Header "." + "" + // Payload is detached "." + "ZnT7ZR3EqsPYMQt3WdgUZYScBiyK9RI77zMaUKr-tkFRBHgBJQVTOORwM2fFh0QQCTLwOp1TiAzt_q9ofvw6JQ" // Signature
idempotence_token
字段用于防止系统在网络出现故障或超时后重试请求时,重复执行该请求。幂等口令是客户端生成的唯一值,该口令的生成方式由客户端决定。例如,您可以使用 V4 UUID 生成幂等口令。
在成功完成请求或对 API 的调用返回有效结果后,系统将使用幂等口令保存响应数据。当使用先前用过的幂等口令重试成功请求时,系统无需重新运行任何代码,即会返回先前保存的响应。
如果请求导致错误,则不会保存任何结果。您可以重试请求,并使用相同的幂等口令。
如果您使用相同的幂等口令同时发出 2 次请求,则只有其中一个会返回响应数据。
幂等口令只是一个临时口令,仅用于在出现故障时重试 API 调用。如果在一段时间后重试请求,您可能会收到与前一个调用不同的响应。
请求参数会被忽略。如果您对请求内容作出任何更改,请为该请求创建新的幂等口令。
在处理支付事务时,您需使用 Meta Pay Webhooks,以向 Meta 通知相关支付交易活动。调用 Webhooks 后,支付交易活动会尽快显示在客户 Facebook 账户的 Facebook Pay 活动页面。
在批量对账期间,Meta 会捕获失败的通知,稍后再将这些通知显示在客户的 Facebook 账户中。
为支持批量对账,您需每天上传一个文件,其中应包含您当天向 Meta 发送的通知。请一并包含成功和失败的通知。如需了解向 Meta API 上传文件的详细信息,请参阅将文件上传至 Facebook。
Meta Pay API 使用标准的图谱 API 错误处理程序。
如要初始化或更新您所支持的商家的数据,请向商家图谱 API /metapay_partner/merchant
发出 POST
请求,并在请求中指定商家参数。
https://graph.facebook.com/metapay_partner/merchant
参数 | 类型 | 描述 | 是否必要 |
---|---|---|---|
| 字符串 | 商家账户在支付合作伙伴平台的唯一标识符。 | 是 |
| 字符串 | 指向商家网站的 URI,该网站会在 Meta Pay 界面向客户显示。URI 必须以 | 是 |
| 字符串 | 会在 Meta Pay 界面向客户显示的商家名称。 | 是 |
| int64 | [已停用] 商家类别代码。Meta 使用此代码来为支付活动分类,确保相关支付符合我们的服务条款。 注意: 必须提供 | 否* |
| Array< int64> | 由商家类别代码组成的清单。Meta 使用这些代码来为支付活动分类,确保相关支付符合我们的服务条款。 注意: 必须提供 | 否* |
| 字符串 | 是否允许商家使用支付合作伙伴平台。状态可为以下其中一种:PENDING、ENABLED 或 DISABLED。PENDING 与 DISABLED 的影响一致,但也可能表示一种临时禁用状态。 | 是 |
| URI | 指向商家图标的 URI,该图标会在 Meta Pay 界面向客户显示。图标文件格式可为 png 或 jpeg。 | 否 |
| 字符串 | 客户用于请求收据或交易摘要的邮箱。 | 否 |
| 字符串 | 客户用于请求支付交易支持的手机号。使用以下其中一种格式设置手机号格式:16315551000、+1 631 555 1001、+1 (631) 555-1004 或 1-631-555-1005。 | 否 |
| Array< String> | 商家有效安全源 URI 的完整清单。此清单用于确保支付是从预期的网站安全源发起。 | 否 |
| 字符串 | 商家 Meta Pixel 像素代码的唯一标识符。用于支持广告管理工具中的特定 Meta 结账功能 | 否 |
当您向商家 API 发出 POST
请求后,若系统返回 200 OK
响应,即表示 POST
已被成功处理。响应正文指明了商家的状态,即 ENABLED
或 DISABLED
。非空状态修饰符提供了更多信息。
常见的成功响应如下所示:
{
"status":"ENABLED",
"status_modifiers":[]
}
若商家正在接受临时审查,响应则如下所示:
{
"status":"DISABLED",
"status_modifiers":["PENDING_SCREENING"]
}
以下为可能出现的状态修饰符。
状态修饰符 | 描述 |
---|---|
| 商家正在等待合规审查结果,暂时无法使用 Meta Pay。审查一般在 24 小时内结束。查询商家 API 即可验证商家状态。 |
|
|
| 一或多个商家属性触发了诚信标记。商家将被禁用。 |
| 商家被永久禁止使用 Meta Pay。 |
如要获取已注册商家的清单,请向商家图谱 API /metapay_partner/merchants
发出 GET
请求。
https://graph.facebook.com/metapay_partner/merchants
支持将以下可选请求参数用作网址参数:
参数 | 类型 | 描述 | 是否必要 |
---|---|---|---|
| 字符串 | 要用作筛选条件的以逗号分隔的合作伙伴商家编号 | 否 |
GET
商家 API 提供的结果将分页显示。请查看所链接的页面,了解一般响应格式。data
数组中返回的每个元素都将采用商家请求参数格式。示例:
curl -H "Authorization: OAuth $OAUTH" -X GET "https://graph.facebook.com/metapay_partner/merchants?partner_merchant_id=MERCHANT_TEST_1" { "data": [ { "partner_merchant_id": "MERCHANT_TEST_1", "merchant_status": "DISABLED", "display_name": "Test merchant 1", "business_uri": "https://facebook.com/", "icon_uri": "https://facebook.com/favicon.ico", "mcc_list": [7311], "support_email": "example@facebook.com", "support_phone": "+11234567890", "valid_origins": [ "https://facebook.com/" ], "legal_structure": "COMPANY_TYPE_NOT_SPECIFIED", "status_modifiers":["BLOCKED"], "effective_merchant_status":"DISABLED" } ], "paging": { "cursors": { "before": "aaa...", "after": "bbb..." }, "next": "https://graph.facebook.com/metapay_partner/merchants?limit=25&after=..." } }
无论何时发生何种授权、捕获、异议、支付或退款事件,您都必须调用 Meta 的 Webhooks,以向 Meta 通知相关支付交易活动。
若返回 200 OK
响应,即表示 Webhooks 已被成功处理。若调用成功,响应正文将返回 container_id
:
{
"id":"cGF5bWVudF9jb250YWluZAXI6N2I3ODA1ZATYtZAmRiNS00Yzc4LWFjYjAtZATg3ZAjJhMzg2YTc5XzM2ODkyNjAzMTc4MDEzNzYZD"
}
若 Webhooks 调用失败,请在至少 72 小时内,以递增退避的方式重新尝试调用至少 3 次。若调用仍旧失败,Meta 稍后可在批量对账期间捕获该通知。
实体关系图如下所示,其中各项是 Meta API Webhooks 中已用于模型的各类资源。黑点表示相关属性为必要项。
每次调用 Webhooks 时,您都要在请求正文中添加通知参数,并在资源字段添加通知类型详情,正如后续小节所述。通知的一般结构如下所示:
{ idempotence_token: '<your token>', notification: { ... }, resource: { ... } }
属性 | 类型 | 描述 | 是否必要 |
---|---|---|---|
| 字符串 | 您为商家账户创建的唯一标识符。您可以使用以下字符:[a-zA-Z0-9_-]。 | 是 |
| 字符串 | 通知类型。有效值包括 | 是 |
| Int64 | UNIX 时间戳(以毫秒为单位)。 | 是 |
| 字符串 | 容器结构的唯一标识符。 | 是 |
向 /<CONTAINER_ID>/notify_authorizations
发出 POST
请求,以向 Meta 通知与特定支付交易相关的授权活动。
https://graph.facebook.com/<CONTAINER_ID>/notify_authorizations
属性 | 类型 | 描述 | 是否必要 |
---|---|---|---|
| 字符串 | 您为授权或收费创建的唯一标识符。您可以使用以下字符:[a-zA-Z0-9_-]。 | 是 |
| 通知金额对象 | 授权的金额。目前, | 是 |
| 字符串 | 授权状态。以下其中一种: | 是 |
| Int64 | 尝试授权时的 UNIX 时间戳(以毫秒为单位)。 | 是 |
| 字符串 | 对支付交易的描述。 | 否 |
| 字符串 | 向客户显示的支付交易描述,例如对客户信用卡对账单的描述。 | 否 |
| 通知错误对象。 | 错误(如有)的详细信息。 | 否 |
| Object {String : String} | 键-值对数组,可提供更多授权信息。 | 否 |
向 /<CONTAINER_ID>/notify_captures
发出 POST
请求,以向 Meta 通知与特定支付交易相关的捕获活动。
https://graph.facebook.com/<CONTAINER_ID>/notify_captures
属性 | 类型 | 描述 | 是否必要 |
---|---|---|---|
| 字符串 | 您为捕获创建的唯一标识符。您可以使用以下字符:[a-zA-Z0-9_-]。 | 是 |
| 字符串 | 您先前为与此捕获对应的授权或收费创建的标识符。 | 否 |
| 通知金额对象 | 捕获的金额。目前, | 是 |
| 字符串 | 捕获状态。以下其中一种: | 是 |
| Int64 | 尝试捕获时的 UNIX 时间戳(以毫秒为单位)。 | 是 |
| 字符串 | 商家为描述捕获所作的备注。 | 否 |
| 通知错误对象。 | 错误(如有)的详细信息。 | 否 |
向 /<CONTAINER_ID>/notify_disputes
发出 POST
请求,以向 Meta 通知与特定支付交易相关的异议活动。
https://graph.facebook.com/<CONTAINER_ID>/notify_disputes
属性 | 类型 | 描述 | 是否必要 |
---|---|---|---|
| 字符串 | 您为异议创建的唯一标识符。您可以使用以下字符:[a-zA-Z0-9_-]。 | 是 |
| Int64 | 创建异议时的 UNIX 时间戳(以毫秒为单位)。 | 是 |
| 通知金额对象 | 有异议的金额。目前, | 是 |
| 字符串 | 异议原因。以下其中一种: | 是 |
| 字符串 | 异议状态。以下其中一种: | 是 |
| 字符串 | 您先前为与此异议对应的支付创建的标识符。 | 否 |
| Array< String> | 与此异议对应的捕获的标识符。此为可选属性。 | 否 |
| 字符串 | 对异议的描述。 | 否 |
| Object {String : String} | 键-值对数组,可提供更多异议相关信息。 | 否 |
向 /<CONTAINER_ID>/notify_payments
发出 POST
请求,以向 Meta 通知与资金流动操作无关的支付活动。例如,当用户的支付未通过风险检查时,您可能会决定对该支付行为不予处理。
https://graph.facebook.com/<CONTAINER_ID>/notify_payments
属性 | 类型 | 描述 | 是否必要 |
---|---|---|---|
| 字符串 | 您为支付创建的唯一标识符。您可以使用以下字符:[a-zA-Z0-9_-]。 | 是 |
| 字符串 | 支付状态。以下其中一种: | 是 |
| Int64 | 尝试支付时的 UNIX 时间戳(以毫秒为单位)。 | 是 |
| Object {String : String} | 可提供更多支付信息的键-值对数组。 | 否 |
向 /<CONTAINER_ID>/notify_refunds
发出 POST
请求,以向 Meta 通知与特定支付交易相关的退款活动。
https://graph.facebook.com/<CONTAINER_ID>/notify_refunds
属性 | 类型 | 描述 | 是否必要 |
---|---|---|---|
| 字符串 | 您为退款创建的唯一标识符。您可以使用以下字符:[a-zA-Z0-9_-]。 | 是 |
| Int64 | 创建退款时的 UNIX 时间戳(以毫秒为单位)。 | 是 |
| 通知金额对象 | 退款金额。目前, | 是 |
| 字符串 | 退款状态。以下其中一种: | 是 |
| 字符串 | 您先前为与此退款对应的捕获创建的标识符。 | 否 |
| 字符串 | 对退款的描述。 | 否 |
| 字符串 | 向客户显示的退款描述,例如对客户信用卡对账单的描述。 | 否 |
| 通知错误对象。 | 错误(如有)的详细信息。 | 否 |
| Object {String : String} | 可提供更多退款信息的键-值对数组。 | 否 |
使用金额对象代表授权、捕获、异议和退款通知中以特定货币表示的货币价值。
属性 | 类型 | 描述 |
---|---|---|
| 字符串 | 3 个字母的货币代码(ISO 4217 标准),表示金额所使用的货币。如需查看货币代码清单,请参阅 ISO 4217。目前, |
| 整数 | 以 |
如果处理授权、捕获、支付或退款时发生错误,请在 resource
中添加 error
对象,以提供该错误的相关信息。
属性 | 类型 | 描述 |
---|---|---|
| 字符串 | Meta 专用错误代码。有效值取决于通知类型,具体已在前述各节作出说明。 |
| 字符串 | 错误代码。 |
| 字符串 | 错误说明。 |