Meta Pay의 결제를 처리할 때는 Meta Pay API에서 Webhooks를 호출하여 Meta에 결제 거래 활동(예: 승인, 환불)에 대해 알려야 합니다. 결제 거래 활동은 고객 Facebook 계정의 주문 및 결제 페이지에 표시됩니다.
Meta API를 사용하는 방법에 대한 자세한 내용은 그래프 API 개요를 참조하세요. 아래에서 설명하는 API는 표준 그래프 API 호스트 URL(https://graph.facebook.com
)에 상대적입니다. 자세한 일반 정보는 Meta Pay 통합 개요를 참조하세요.
일반 온보딩 단계의 일환으로 Meta for Developers 포털에서 새 앱을 만듭니다. 앱을 만들면 앱 ID와 앱 시크릿 코드를 얻습니다.
Meta Pay API로 호출을 보낼 때마다 앱 ID 및 앱 시크릿 코드에서 얻은 앱 액세스 토큰이 필요합니다. access_token
쿼리 매개변수가 아니라 Authorization
헤더를 사용하여 앱 액세스 토큰을 보냅니다. Meta Pay API는 사용자 토큰이 포함된 호출을 거부합니다.
예를 들어 다음과 같은 코드를 사용합니다.
Authorization: OAuth <APP_ACCESS_TOKEN>
Meta Pay API로 HTTP 요청을 보낼 때마다 FBPAY-SIGNATURE
요청 헤더를 포함해야 합니다. 이 헤더의 값은 ES256 알고리즘, 콤팩트 직렬화, 분리된 페이로드(https://tools.ietf.org/html/rfc7515#appendix-F 참조)를 포함한 JWS(JSON Web Signature) 개체입니다. 페이로드 값은 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 오류 처리를 사용합니다.
지원하는 판매자의 데이터를 초기화하거나 업데이트하려면 POST
요청을 판매자 그래프 API/metapay_partner/merchant
로 보내고 판매자 매개변수를 지정합니다.
https://graph.facebook.com/metapay_partner/merchant
매개변수 | 유형 | 설명 | 필수 |
---|---|---|---|
| 문자열 | 결제 파트너가 있는 판매자 계정의 고유한 식별자입니다. | 예 |
| 문자열 | Meta Pay 인터페이스에서 고객에게 표시되는 판매자 웹사이트의 URI입니다. URI는 | 예 |
| 문자열 | Meta Pay 인터페이스에서 고객에게 표시되는 판매자 이름입니다. | 예 |
| int64 | [사용 중단] 판매자 카테고리 코드입니다. Meta는 이를 사용하여 결제 활동을 분류하고 결제가 Meta 서비스 약관을 준수하는지 확인합니다. 참고:
| 아니요* |
| Array< int64> | 판매자 카테고리 코드의 리스트입니다. Meta는 이를 사용하여 결제 활동을 분류하고 결제가 Meta 서비스 약관을 준수하는지 확인합니다. 참고:
| 아니요* |
| 문자열 | 판매자가 결제 파트너로 활성화되었는지 비활성화되었는지 나타냅니다. PENDING, ENABLED, DISABLED 중 하나입니다. '대기 중'은 '비활성화됨'과 같은 의미지만 일시적으로 비활성화된 상태를 나타낼 수 있습니다. | 예 |
| URI | Meta Pay 인터페이스에서 고객에게 표시되는 판매자 아이콘의 URI입니다. 아이콘 파일 형식은 png와 jpeg 중 하나입니다. | 아니요 |
| 문자열 | 고객이 거래 영수증이나 요약을 요청하기 위한 이메일 주소입니다. | 아니요 |
| 문자열 | 고객이 결제 거래에 지원을 요청하기 위한 전화번호입니다. 16315551000, +1 631 555 1001, +1 (631) 555-1004, 1-631-555-1005 형식 중 하나를 사용하여 전화번호 형식을 지정합니다. | 아니요 |
| Array< String> | 판매자에게 유효한 보안 출처 URI의 전체 리스트입니다. 결제가 예상한 웹 보안 출처에서 시작되도록 하는 데 사용합니다. | 아니요 |
| 문자열 | 판매자의 Meta 픽셀에 대한 고유 식별자입니다. 광고 관리자에서 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
다음 선택적 요청 매개변수는 URL 매개변수로 지원됩니다.
매개변수 | 유형 | 설명 | 필수 |
---|---|---|---|
| 문자열 | 필터링 기준으로 적용할 쉼표로 구분된 파트너 판매자 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=..." } }
승인, 캡처, 분쟁, 결제 또는 환불이 발생할 때마다 Meta의 Webhooks를 호출하여 Meta에 결제 거래 활동에 대해 알려야 합니다.
200 OK
응답은 Webhooks가 성공적으로 처리되었다는 것을 나타냅니다. 요청에 성공한 응답 본문에서는 container_id
를 반환합니다.
{
"id":"cGF5bWVudF9jb250YWluZAXI6N2I3ODA1ZATYtZAmRiNS00Yzc4LWFjYjAtZATg3ZAjJhMzg2YTc5XzM2ODkyNjAzMTc4MDEzNzYZD"
}
Webhooks 호출이 실패하는 경우, 재시도 간격을 점차 늘려가며 최소 72시간 동안 3회 이상 호출을 다시 시도하세요. 그래도 호출이 실패할 경우 나중에 일괄 조정 시 알림을 캡처할 수 있습니다.
Meta API Webhooks에서 모델링된 리소스의 엔터티 관계 다이어그램은 다음과 같습니다. 검은색 점이 있는 속성은 필수 속성을 나타냅니다.
Webhooks를 호출할 때마다 요청 본문의 알림 매개변수와 리소스 필드의 알림 유형에 대한 상세 정보를 아래의 섹션에 나와 있는 대로 포함합니다. 알림의 일반 구조는 다음과 같습니다.
{ idempotence_token: '<your token>', notification: { ... }, resource: { ... } }
속성 | 유형 | 설명 | 필수 |
---|---|---|---|
| 문자열 | 판매자 계정의 고유한 식별자입니다. 사용할 수 있는 문자는 [a-zA-Z0-9_-]입니다. | 예 |
| 문자열 | 알림 유형입니다. 유효한 값은 | 예 |
| Int64 | UNIX 타임스탬프(ms)입니다. | 예 |
| 문자열 | 컨테이너 구조의 고유한 식별자입니다. | 예 |
POST
요청을 /<CONTAINER_ID>/notify_authorizations
로 보내서 Meta에 결제 거래의 승인 활동에 대해 알립니다.
https://graph.facebook.com/<CONTAINER_ID>/notify_authorizations
속성 | 유형 | 설명 | 필수 |
---|---|---|---|
| 문자열 | 승인 또는 청구의 고유한 식별자입니다. 사용할 수 있는 문자는 [a-zA-Z0-9_-]입니다. | 예 |
| 알림 금액 개체 | 승인된 금액입니다. 현재는 | 예 |
| 문자열 | 승인의 상태입니다. | 예 |
| Int64 | 승인을 시도한 시점의 UNIX 타임스탬프(ms)입니다. | 예 |
| 문자열 | 결제 거래에 대한 설명입니다. | 아니요 |
| 문자열 | 고객에게 표시되는 결제 거래에 대한 설명(예: 신용카드 내역서)입니다. | 아니요 |
| 알림 오류 개체입니다. | 오류 발생 시 오류의 상세 정보입니다. | 아니요 |
| Object {String : String} | 승인에 대해 추가 정보를 제공하는 키-값 쌍의 배열입니다. | 아니요 |
POST
요청을 /<CONTAINER_ID>/notify_captures
로 보내서 Meta에 결제 거래의 캡처 활동에 대해 알립니다.
https://graph.facebook.com/<CONTAINER_ID>/notify_captures
속성 | 유형 | 설명 | 필수 |
---|---|---|---|
| 문자열 | 캡처의 고유한 식별자입니다. 사용할 수 있는 문자는 [a-zA-Z0-9_-]입니다. | 예 |
| 문자열 | 이 캡처에 해당하는 승인이나 청구에 대해 이전에 생성한 식별자입니다. | 아니요 |
| 알림 금액 개체 | 캡처된 금액입니다. 현재는 | 예 |
| 문자열 | 캡처의 상태입니다. | 예 |
| Int64 | 캡처를 시도한 시점의 UNIX 타임스탬프(ms)입니다. | 예 |
| 문자열 | 캡처를 설명하는 판매자의 메모입니다. | 아니요 |
| 알림 오류 개체입니다. | 오류 발생 시 오류의 상세 정보입니다. | 아니요 |
POST
요청을 /<CONTAINER_ID>/notify_disputes
로 보내서 Meta에 결제 거래의 분쟁 활동에 대해 알립니다.
https://graph.facebook.com/<CONTAINER_ID>/notify_disputes
속성 | 유형 | 설명 | 필수 |
---|---|---|---|
| 문자열 | 분쟁의 고유한 식별자입니다. 사용할 수 있는 문자는 [a-zA-Z0-9_-]입니다. | 예 |
| Int64 | 분쟁이 생성된 시점의 UNIX 타임스탬프(ms)입니다. | 예 |
| 알림 금액 개체 | 분쟁이 일어난 금액입니다. 현재는 | 예 |
| 문자열 | 분쟁이 일어난 이유입니다. | 예 |
| 문자열 | 분쟁의 상태입니다. | 예 |
| 문자열 | 이 분쟁에 해당하는 결제에 대해 이전에 생성한 식별자입니다. | 아니요 |
| Array< String> | 이 분쟁에 해당하는 캡처의 식별자입니다. 이 속성은 선택 사항입니다. | 아니요 |
| 문자열 | 분쟁에 대한 설명입니다. | 아니요 |
| Object {String : String} | 분쟁에 대해 추가 정보를 제공하는 키-값 쌍의 배열입니다. | 아니요 |
POST
요청을 /<CONTAINER_ID>/notify_payments
로 보내서 Meta에 자금 이동 작업과 관련되지 않은 결제 활동에 대해 알립니다. 예를 들어 위험 검사를 통과하지 못하는 경우 사용자 결제를 처리하지 않기로 결정할 수 있습니다.
https://graph.facebook.com/<CONTAINER_ID>/notify_payments
속성 | 유형 | 설명 | 필수 |
---|---|---|---|
| 문자열 | 결제의 고유한 식별자입니다. 사용할 수 있는 문자는 [a-zA-Z0-9_-]입니다. | 예 |
| 문자열 | 결제의 상태입니다. | 예 |
| Int64 | 결제를 시도한 시점의 UNIX 타임스탬프(ms)입니다. | 예 |
| Object {String : String} | 결제에 대한 추가 정보를 제공하는 키-값 쌍의 배열입니다. | 아니요 |
POST
요청을 /<CONTAINER_ID>/notify_refunds
로 보내서 Meta에 결제 거래의 환불 활동에 대해 알립니다.
https://graph.facebook.com/<CONTAINER_ID>/notify_refunds
속성 | 유형 | 설명 | 필수 |
---|---|---|---|
| 문자열 | 환불의 고유한 식별자입니다. 사용할 수 있는 문자는 [a-zA-Z0-9_-]입니다. | 예 |
| Int64 | 환불이 생성된 시점의 UNIX 타임스탬프(ms)입니다. | 예 |
| 알림 금액 개체 | 환불 대상 금액입니다. 현재는 | 예 |
| 문자열 | 환불의 상태입니다. | 예 |
| 문자열 | 이 환불에 해당하는 캡처에 대해 이전에 생성한 식별자입니다. | 아니요 |
| 문자열 | 환불에 대한 설명입니다. | 아니요 |
| 문자열 | 고객에게 표시되는 환불에 대한 설명(예: 신용카드 내역서)입니다. | 아니요 |
| 알림 오류 개체입니다. | 오류 발생 시 오류의 상세 정보입니다. | 아니요 |
| Object {String : String} | 환불에 대해 추가 정보를 제공하는 키-값 쌍의 배열입니다. | 아니요 |
금액 개체를 사용하여 승인, 캡처, 분쟁 및 환불에 대한 알림의 각 통화 단위의 금액을 나타냅니다.
속성 | 유형 | 설명 |
---|---|---|
| 문자열 | 금액에 대한 ISO 4217 표준의 3자리 통화 코드입니다. 통화 코드 리스트는 ISO 4217을 참조하세요. 현재는 |
| 정수 |
|
승인, 캡처, 결제 또는 환불을 처리할 때 오류가 발생하는 경우 resource
에 error
개체를 포함해 오류에 대한 정보를 제공합니다.
속성 | 유형 | 설명 |
---|---|---|
| 문자열 | Meta 전용 오류 코드입니다. 유효한 값은 알림 유형에 따라 다르며, 이 내용은 이전 섹션에 설명되어 있습니다. |
| 문자열 | 오류 코드입니다. |
| 문자열 | 오류에 대한 설명입니다. |