使用 Meta Pay API

处理 Meta Pay 的支付事务时,您必须在 Meta Pay API 中调用 Webhooks,以向 Meta 通知相关支付交易活动,例如授权和退款。支付交易活动显示在客户 Facebook 账户的订单与支付页面。

如要了解如何使用 Meta 的 API,请参阅图谱 API 概览,并请注意,下方所述 API 均与标准图谱 API 托管网址 (https://graph.facebook.com) 相关。如需更多一般信息,请参阅 Meta Pay 集成概览

入门指南

开始使用 Meta Pay API 前,请先完成以下任务:

调用 Meta Pay API

根据常规入门引导步骤,您需在 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

请求参数

参数类型描述是否必要

partner_merchant_id

字符串

商家账户在支付合作伙伴平台的唯一标识符。

business_uri

字符串

指向商家网站的 URI,该网站会在 Meta Pay 界面向客户显示。URI 必须以 http://https:// 开头。

display_name

字符串

会在 Meta Pay 界面向客户显示的商家名称。

mcc

int64

[已停用]

商家类别代码。Meta 使用此代码来为支付活动分类,确保相关支付符合我们的服务条款。


注意:

必须提供 mccmcc_list

否*

mcc_list

Array< int64>

商家类别代码组成的清单。Meta 使用这些代码来为支付活动分类,确保相关支付符合我们的服务条款。


注意:

必须提供 mccmcc_list。此参数优先于 mcc

否*

merchant_status

字符串

是否允许商家使用支付合作伙伴平台。状态可为以下其中一种:PENDING、ENABLED 或 DISABLED。PENDING 与 DISABLED 的影响一致,但也可能表示一种临时禁用状态。

icon_uri

URI

指向商家图标的 URI,该图标会在 Meta Pay 界面向客户显示。图标文件格式可为 png 或 jpeg。

support_email

字符串

客户用于请求收据或交易摘要的邮箱。

support_phone

字符串

客户用于请求支付交易支持的手机号。使用以下其中一种格式设置手机号格式:16315551000、+1 631 555 1001、+1 (631) 555-1004 或 1-631-555-1005。

valid_origins

Array< String>

商家有效安全源 URI 的完整清单。此清单用于确保支付是从预期的网站安全源发起。

pixel_id

字符串

商家 Meta Pixel 像素代码的唯一标识符。用于支持广告管理工具中的特定 Meta 结账功能

响应

当您向商家 API 发出 POST 请求后,若系统返回 200 OK 响应,即表示 POST 已被成功处理。响应正文指明了商家的状态,即 ENABLEDDISABLED。非空状态修饰符提供了更多信息。

常见的成功响应如下所示:

{
    "status":"ENABLED",
    "status_modifiers":[]
}

若商家正在接受临时审查,响应则如下所示:

{
    "status":"DISABLED",
    "status_modifiers":["PENDING_SCREENING"]
}

以下为可能出现的状态修饰符。

状态修饰符描述

PENDING_SCREENING

商家正在等待合规审查结果,暂时无法使用 Meta Pay。审查一般在 24 小时内结束。查询商家 API 即可验证商家状态。

INVALID_ICON

icon_uri 不可接受。文件格式不正确、文件大小超出限制或无法检索 URI。此状态修饰符不会阻止商家使用 Meta Pay。

INTEGRITY_FLAG

一或多个商家属性触发了诚信标记。商家将被禁用。

BLOCKED

商家被永久禁止使用 Meta Pay。

获取商家

如要获取已注册商家的清单,请向商家图谱 API /metapay_partner/merchants 发出 GET 请求。

https://graph.facebook.com/metapay_partner/merchants

请求参数

支持将以下可选请求参数用作网址参数:

参数类型描述是否必要

partner_merchant_id

字符串

要用作筛选条件的以逗号分隔的合作伙伴商家编号

响应

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=..."
    }
}

Webhooks

无论何时发生何种授权、捕获、异议、支付或退款事件,您都必须调用 Meta 的 Webhooks,以向 Meta 通知相关支付交易活动。

若返回 200 OK 响应,即表示 Webhooks 已被成功处理。若调用成功,响应正文将返回 container_id

{
    "id":"cGF5bWVudF9jb250YWluZAXI6N2I3ODA1ZATYtZAmRiNS00Yzc4LWFjYjAtZATg3ZAjJhMzg2YTc5XzM2ODkyNjAzMTc4MDEzNzYZD"
}

若 Webhooks 调用失败,请在至少 72 小时内,以递增退避的方式重新尝试调用至少 3 次。若调用仍旧失败,Meta 稍后可在批量对账期间捕获该通知。

实体关系图如下所示,其中各项是 Meta API Webhooks 中已用于模型的各类资源。黑点表示相关属性为必要项。

通知

每次调用 Webhooks 时,您都要在请求正文中添加通知参数,并在资源字段添加通知类型详情,正如后续小节所述。通知的一般结构如下所示:

{
  idempotence_token: '<your token>',
  notification:
  {
    ...
  },
  resource:
  {
    ...
  }
}

通知参数

属性类型描述是否必要

merchant_id

字符串

您为商家账户创建的唯一标识符。您可以使用以下字符:[a-zA-Z0-9_-]。

type

字符串

通知类型。有效值包括 notify_authorizationsnotify_capturesnotify_disputesnotify_paymentsnotify_refunds,应与所调用的 Webhooks 相符。批量对账会使用此参数。

event_time

Int64

UNIX 时间戳(以毫秒为单位)。

container_id

字符串

容器结构的唯一标识符。

通知授权

/<CONTAINER_ID>/notify_authorizations 发出 POST 请求,以向 Meta 通知与特定支付交易相关的授权活动。

https://graph.facebook.com/<CONTAINER_ID>/notify_authorizations

授权资源

属性类型描述是否必要

partner_auth_id

字符串

您为授权或收费创建的唯一标识符。您可以使用以下字符:[a-zA-Z0-9_-]。

auth_amount

通知金额对象

授权的金额。目前,currency 仅支持 USD

status

字符串

授权状态。以下其中一种:PENDINGSUCCEEDEDFAILEDCANCELED

created_time

Int64

尝试授权时的 UNIX 时间戳(以毫秒为单位)。

description

字符串

对支付交易的描述。

statement_descriptor

字符串

向客户显示的支付交易描述,例如对客户信用卡对账单的描述。

error

通知错误对象。

错误(如有)的详细信息。code 的有效值包括 INVALID_PAYMENT_METHODPROCESSING_FAILUREEXPIREDOTHER

metadata

Object {String : String}

键-值对数组,可提供更多授权信息。

捕获通知

/<CONTAINER_ID>/notify_captures 发出 POST 请求,以向 Meta 通知与特定支付交易相关的捕获活动。

https://graph.facebook.com/<CONTAINER_ID>/notify_captures

捕获资源

属性类型描述是否必要

partner_capture_id

字符串

您为捕获创建的唯一标识符。您可以使用以下字符:[a-zA-Z0-9_-]。

partner_auth_id

字符串

您先前为与此捕获对应的授权或收费创建的标识符。

capture_amount

通知金额对象

捕获的金额。目前,currency 仅支持 USD

status

字符串

捕获状态。以下其中一种:PENDINGSUCCEEDEDFAILED

created_time

Int64

尝试捕获时的 UNIX 时间戳(以毫秒为单位)。

note

字符串

商家为描述捕获所作的备注。

error

通知错误对象。

错误(如有)的详细信息。code 的有效值包括 PROCESSING_FAILUREDECLINEDOTHER

异议通知

/<CONTAINER_ID>/notify_disputes 发出 POST 请求,以向 Meta 通知与特定支付交易相关的异议活动。

https://graph.facebook.com/<CONTAINER_ID>/notify_disputes

异议资源

属性类型描述是否必要

partner_dispute_id

字符串

您为异议创建的唯一标识符。您可以使用以下字符:[a-zA-Z0-9_-]。

created_time

Int64

创建异议时的 UNIX 时间戳(以毫秒为单位)。

dispute_amount

通知金额对象

有异议的金额。目前,currency 仅支持 USD

reason

字符串

异议原因。以下其中一种:BANK_CANNOT_PROCESSCREDIT_NOT_PROCESSEDCUSTOMER_INITIATEDDEBIT_NOT_AUTHORIZEDDUPLICATEFRAUDULENTGENERALINCORRECT_ACCOUNT_DETAILSINSUFFICIENT_FUNDSPRODUCT_UNACCEPTABLESUBSCRIPTION_CANCELEDOTHER_UNRECOGNIZEDPRODUCT_NOT_RECEIVEDINCORRECT_AMOUNTPAYMENT_BY_OTHER_MEANSPROBLEM_WITH_REMITTANCE

status

字符串

异议状态。以下其中一种:RESOLVED_BUYER_FAVORREVERSED_SELLER_FAVORRETRIEVAL_EVIDENCE_REQUESTEDRETRIEVAL_UNDER_REVIEWRETRIEVAL_CLOSEDBUYER_REFUNDEDCHARGEBACK_EVIDENCE_REQUESTEDCHARGEBACK_UNDER_REVIEW

partner_payment_id

字符串

您先前为与此异议对应的支付创建的标识符。

partner_capture_ids

Array< String>

与此异议对应的捕获的标识符。此为可选属性。

description

字符串

对异议的描述。

metadata

Object {String : String}

键-值对数组,可提供更多异议相关信息。

支付通知

/<CONTAINER_ID>/notify_payments 发出 POST 请求,以向 Meta 通知与资金流动操作无关的支付活动。例如,当用户的支付未通过风险检查时,您可能会决定对该支付行为不予处理。

https://graph.facebook.com/<CONTAINER_ID>/notify_payments

支付资源

属性类型描述是否必要

partner_payment_id

字符串

您为支付创建的唯一标识符。您可以使用以下字符:[a-zA-Z0-9_-]。

status

字符串

支付状态。以下其中一种:PENDINGSUCCEEDEDFAILEDCANCELED

created_time

Int64

尝试支付时的 UNIX 时间戳(以毫秒为单位)。

metadata

Object {String : String}

可提供更多支付信息的键-值对数组。

退款通知

/<CONTAINER_ID>/notify_refunds 发出 POST 请求,以向 Meta 通知与特定支付交易相关的退款活动。

https://graph.facebook.com/<CONTAINER_ID>/notify_refunds

退款资源

属性类型描述是否必要

partner_refund_id

字符串

您为退款创建的唯一标识符。您可以使用以下字符:[a-zA-Z0-9_-]。

created_time

Int64

创建退款时的 UNIX 时间戳(以毫秒为单位)。

refund_amount

通知金额对象

退款金额。目前,currency 仅支持 USD

status

字符串

退款状态。以下其中一种:PENDINGSUCCEEDEDFAILEDCANCELED

partner_capture_id

字符串

您先前为与此退款对应的捕获创建的标识符。

description

字符串

对退款的描述。

statement_descriptor

字符串

向客户显示的退款描述,例如对客户信用卡对账单的描述。

error

通知错误对象。

错误(如有)的详细信息。code 的有效值包括 PROCESSING_FAILUREDECLINEDOTHER

metadata

Object {String : String}

可提供更多退款信息的键-值对数组。

通知金额对象

使用金额对象代表授权、捕获、异议和退款通知中以特定货币表示的货币价值。

金额对象

属性类型描述

currency

字符串

3 个字母的货币代码(ISO 4217 标准),表示金额所使用的货币。如需查看货币代码清单,请参阅 ISO 4217。目前,currency 仅支持 USD

value

整数

currency 的最小单位表示的货币金额价值。例如,如果 currencyUSD,$19.99 美元的 value 将按美分表示为 1999

通知错误对象

如果处理授权、捕获、支付或退款时发生错误,请在 resource 中添加 error 对象,以提供该错误的相关信息。

错误对象

属性类型描述

code

字符串

Meta 专用错误代码。有效值取决于通知类型,具体已在前述各节作出说明。

partner_code

字符串

错误代码。

partner_error

字符串

错误说明。