결제 요청 API

W3C 후보 권고안 초안

이 문서에 대한 자세한 정보
이번 버전:
https://www.w3.org/TR/2025/CRD-payment-request-20250808/
최신 공개 버전:
https://www.w3.org/TR/payment-request/
최신 편집자 초안:
https://w3c.github.io/payment-request/
이력:
https://www.w3.org/standards/history/payment-request/
커밋 이력
테스트 스위트:
https://wpt.live/payment-request/
구현 보고서:
https://w3c.github.io/test-results/payment-request/all.html
최신 권고안:
https://www.w3.org/TR/2022/REC-payment-request-20220908/
편집자:
Marcos Cáceres (Apple Inc.)
Rouslan Solomakhin (Google)
Ian Jacobs (W3C)
이전 편집자:
Domenic Denicola (Google)
Adrian Bateman (Microsoft Corporation)
Zach Koch (Google)
Roy McElmurry (Facebook)
Danyao Wang (Google)
피드백:
GitHub w3c/payment-request (풀 리퀘스트, 새 이슈, 열린 이슈)
브라우저 지원:
caniuse.com

개요

이 명세는 판매자(즉, 물리적 또는 디지털 상품을 판매하는 웹사이트)가 최소한의 통합으로 하나 이상의 결제 수단을 활용할 수 있도록 API를 표준화합니다. 사용자 에이전트(예: 브라우저)는 판매자와 사용자 간의 결제 흐름을 지원합니다.

이 문서의 상태

이 섹션은 이 문서가 발행된 시점의 상태를 설명합니다. 현재 W3C 발행 문서 목록과 이 기술 보고서의 최신 개정판은 W3C 표준 및 초안 색인에서 확인할 수 있습니다.

2022년 9월, 웹 결제 작업 그룹은 결제 요청 권고안을 발표했습니다. 개인정보 보호 및 국제화 검토 이후, 권고안은 청구 및 배송 주소와 관련된 기능을 제외했습니다. 그러나 구현은 해당 기능을 상호 운용 가능하게 계속 지원해 왔으며, 작업 그룹은 명세를 구현과 다시 조정하고 관련 문제에 대해 커뮤니티와 다시 협력하기로 결정했습니다.

이 문서는 원래 권고안 텍스트를 기반으로 하는 후보 권고안 스냅샷입니다. 이후의 후보 권고안 초안은 주소 기능과 권고안 발표 이후에 이루어진 소수의 다른 변경 사항을 추가할 예정입니다.

주소 지원을 다시 추가하는 과정의 일환으로, 이 명세는 이제 연락처 선택기 API에서 정의된 주소 구성 요소를 참조하며, 더 이상 자체적으로 해당 구성 요소를 정의하지 않습니다. 사실, 연락처 선택기 API는 결제 요청 API에서 발견된 원래 정의에서 파생되었으며, 주소가 결제를 넘어 웹에서 유용하기 때문에 명세에서 분리되었습니다.

작업 그룹은 명세를 제안된 권고안 상태로 발전시키기 전에 논의를 진행하고 일반적인 검토 과정을 따를 계획입니다.

작업 그룹은 구현 보고서를 제작하여 구현 경험을 입증할 것입니다. 이 보고서는 테스트 스위트의 각 필수 테스트를 두 개 이상의 독립적인 구현이 통과했음을 보여줄 것입니다(즉, 각 테스트는 명세의 MUST 요구 사항에 해당합니다).

이 문서는 웹 결제 작업 그룹에서 권고안 트랙을 사용하여 후보 권고안 초안으로 발행한 문서입니다.

후보 권고안으로 발행되었다고 해서 W3C 및 회원사들의 승인을 의미하지는 않습니다. 후보 권고안 초안은 작업 그룹이 이후의 후보 권고안 스냅샷에 포함할 예정인 이전 후보 권고안에서의 변경 사항을 통합합니다.

이 문서는 초안 문서로, 언제든지 업데이트되거나, 대체되거나, 폐기될 수 있습니다. 작업 중인 문서로서 이 문서를 인용하는 것은 적절하지 않습니다. 이 명세의 향후 업데이트는 새로운 기능을 통합할 수 있습니다.

이 문서는 W3C 특허 정책 하에 운영되는 그룹에서 작성되었습니다. W3C해당 그룹의 산출물과 관련된 모든 특허 공개 목록을 유지하고 있으며, 그 페이지에는 특허를 공개하는 방법에 대한 지침도 포함되어 있습니다. 특정 특허가 핵심 청구 항목을 포함한다고 믿는 개인은 W3C 특허 정책 6항에 따라 정보를 공개해야 합니다.

이 문서는 2023년 11월 3일 W3C 프로세스 문서의 적용을 받습니다.

1. 소개

이 섹션은 비규범적입니다.

이 명세는 사용자 에이전트 (예: 브라우저)가 거래에서 세 당사자 간의 중개 역할을 할 수 있도록 하는 API를 설명합니다:

결제 방식은 다음을 정의합니다:

선택적 추가 데이터 유형
선택적으로, 결제 방식PaymentMethodDatadata 멤버로 받을 것으로 예상되는 IDL 유형. 특정 결제 방식에 대해 지정되지 않은 경우, IDL로 변환되지 않으며 결제 방식은 data를 JSON으로 받게 됩니다.
결제 방식 데이터를 검증하는 단계
결제 방식data 멤버를 해당 결제 방식의 추가 데이터 유형으로 변환한 후 검증하는 알고리즘 단계. 특정 결제 방식에 대해 지정되지 않은 경우, 검증은 수행되지 않습니다.

주어진 결제 방식의 결제 요청을 충족하는 방법의 세부 사항은 결제 핸들러의 구현 세부 사항으로, 결제를 처리하는 애플리케이션 또는 서비스입니다. 구체적으로, 결제 핸들러는 다음을 정의합니다:

결제를 할 수 있는지 확인하는 단계:
결제 핸들러가 본인 또는 사용자가 "결제를 할 수 있는지" 여부를 확인하는 방법도 결제 핸들러의 구현 세부 사항입니다.
결제 요청에 응답하는 단계:
상인이 거래를 처리하거나 검증하는 데 사용하는 객체 또는 사전(dictionary)을 반환하는 단계. 이 객체의 구조는 각 결제 방식에 고유합니다.
사용자가 결제 방식을 변경할 때의 단계 (선택적)

사용자가 결제 방식이나 금융 수단(예: 직불카드에서 신용카드로)을 변경하여 사전(dictionary) 또는 object 또는 null을 반환하는 경우를 처리하는 방법을 설명하는 단계.

이 API는 또한 웹사이트가 보다 안전한 결제 체계(예: 토큰화 및 시스템 수준 인증)를 활용할 수 있도록 하여 표준 자바스크립트 라이브러리로는 불가능한 기능을 제공합니다. 이는 상인의 책임을 줄이고 민감한 사용자 정보를 보호하는 데 도움이 됩니다.

1.1 목표와 범위

다음은 이 명세의 범위에 포함되지 않습니다:

2. 사용 예시

이 섹션은 비규범적입니다.

API를 사용하려면 개발자는 여러 핵심 정보를 제공하고 관리해야 합니다. 이러한 정보들은 PaymentRequest 생성자에 인수로 전달되며, 이후 사용자에게 표시되는 결제 요청을 업데이트하는 데 사용됩니다. 즉, 다음과 같은 정보들입니다:

PaymentRequest가 생성되면 show() 메서드를 통해 최종 사용자에게 표시됩니다. show()는 사용자가 결제 요청을 확인하면 PaymentResponse로 이어지는 프라미스를 반환합니다.

2.1 여러 결제 방식 선언

새로운 PaymentRequest를 생성할 때, 상인은 첫 번째 인수(methodData)를 사용하여 사용자가 결제할 수 있는 다양한 방식을 나열합니다 (예: 신용카드, Apple Pay, Google Pay 등). 보다 구체적으로, methodData 시퀀스에는 PaymentMethodData 사전가 포함되며, 상인이 수락하는 결제 방식 식별자와 해당 결제 방식에 특화된 데이터(예: 지원되는 신용카드 네트워크)가 들어 있습니다.

예시 1: `methodData` 인수
const methodData = [
  {
    supportedMethods: "https://example.com/payitforward",
    data: {
      payItForwardField: "ABC",
    },
  },
  {
    supportedMethods: "https://example.com/bobpay",
    data: {
      merchantIdentifier: "XXXX",
      bobPaySpecificField: true,
    },
  },
];

2.2 결제 대상 설명

새로운 PaymentRequest를 생성할 때, 상인은 두 번째 인수(details)로 사용자가 완료해야 하는 거래의 세부 정보를 제공합니다. 여기에는 주문의 총액과 선택적으로 결제 대상에 대한 상세 내역을 제공하는 몇 가지 라인 아이템이 포함됩니다.

예시 2: `details` 인수
const details = {
  id: "super-store-order-123-12312",
  displayItems: [
    {
      label: "Sub-total",
      amount: { currency: "GBP", value: "55.00" },
    },
    {
      label: "Value-Added Tax (VAT)",
      amount: { currency: "GBP", value: "5.00" },
    },
  ],
  total: {
    label: "Total due",
    // The total is GBP£65.00 here because we need to
    // add shipping (below). The selected shipping
    // costs GBP£5.00.
    amount: { currency: "GBP", value: "65.00" },
  },
};

2.3 배송 옵션 추가

여기에서는 details에 두 가지 배송 옵션을 추가하는 방법의 예를 보여줍니다.

예시 3: 배송 옵션 추가
const shippingOptions = [
  {
    id: "standard",
    // Shipping by truck, 2 days
    label: "🚛  Envío por camión (2 dias)",
    amount: { currency: "EUR", value: "5.00" },
    selected: true,
  },
  {
    id: "drone",
    // Drone shipping, 2 hours
    label: "🚀 Drone Express (2 horas)",
    amount: { currency: "EUR", value: "25.00" }
  },
];
Object.assign(details, { shippingOptions });

2.4 결제 요청의 조건부 수정

특정 네트워크의 카드를 사용할 때 처리 수수료를 추가하는 방법을 보여줍니다. 이때 총액을 재계산해야 함에 유의하세요.

예시 4: 카드 유형에 따른 결제 요청 수정
// Certain cards incur a $3.00 processing fee.
const cardFee = {
  label: "Card processing fee",
  amount: { currency: "AUD", value: "3.00" },
};

// Modifiers apply when the user chooses to pay with
// a card.
const modifiers = [
  {
    additionalDisplayItems: [cardFee],
    supportedMethods: "https://example.com/cardpay",
    total: {
      label: "Total due",
      amount: { currency: "AUD", value: "68.00" },
    },
    data: {
      supportedNetworks: networks,
    },
  },
];
Object.assign(details, { modifiers });

2.5 최종 사용자에게 특정 정보 요청

일부 금융 거래에서는 상인이 구매를 이행하기 위해 사용자가 특정 정보를 제공해야 합니다(예: 물리적 상품 배송이 필요한 경우 사용자의 배송 주소). 이 정보를 요청하기 위해, 상인은 세 번째 선택적 인수(options)를 PaymentRequest 생성자에 전달하여 필요한 정보를 지정할 수 있습니다. 결제 요청이 표시되면 사용자 에이전트는 최종 사용자에게 이 정보를 요청하고, 사용자가 결제 요청을 수락할 때 상인에게 이를 반환합니다.

예시 5: `options` 인수
const options = {
  requestPayerEmail: false,
  requestPayerName: true,
  requestPayerPhone: false,
  requestShipping: true,
}

2.6 PaymentRequest 구성

모든 사전 정보가 준비되면, PaymentRequest를 구성하고 브라우저가 이를 사용자에게 표시하도록 요청할 수 있습니다:

예시 6: `PaymentRequest` 구성
async function doPaymentRequest() {
  try {
    const request = new PaymentRequest(methodData, details, options);
    // See below for a detailed example of handling these events
    request.onshippingaddresschange = ev => ev.updateWith(details);
    request.onshippingoptionchange = ev => ev.updateWith(details);
    const response = await request.show();
    await validateResponse(response);
  } catch (err) {
    // AbortError, SecurityError
    console.error(err);
  }
}
async function validateResponse(response) {
  try {
    const errors = await checkAllValuesAreGood(response);
    if (errors.length) {
      await response.retry(errors);
      return validateResponse(response);
    }
    await response.complete("success");
  } catch (err) {
    // Something went wrong...
    await response.complete("fail");
  }
}
// Must be called as a result of a click
// or some explicit user action.
doPaymentRequest();

2.7 이벤트 처리 및 결제 요청 업데이트

사용자가 결제를 수락하기 전에, 사이트는 사용자 입력에 응답하여 결제 요청을 업데이트할 기회를 가집니다. 예를 들어, 추가 배송 옵션 제공(또는 비용 수정), 특정 주소로 배송할 수 없는 항목 제거 등입니다.

예시 7: 이벤트 핸들러 등록
const request = new PaymentRequest(methodData, details, options);
// Async update to details
request.onshippingaddresschange = ev => {
  ev.updateWith(checkShipping(request));
};
// Sync update to the total
request.onshippingoptionchange = ev => {
  // selected shipping option
  const { shippingOption } = request;
  const newTotal = {
    currency: "USD",
    label: "Total due",
    value: calculateNewTotal(shippingOption),
  };
  ev.updateWith({ total: newTotal });
};
async function checkShipping(request) {
  try {
    const { shippingAddress } = request;

    await ensureCanShipTo(shippingAddress);
    const { shippingOptions, total } = await calculateShipping(shippingAddress);

    return { shippingOptions, total };
  } catch (err) {
    // Shows error to user in the payment sheet.
    return { error: `Sorry! we can't ship to your address.` };
  }
}

2.8 세분화된 오류 보고

개발자는 shippingAddressErrors 멤버를 PaymentDetailsUpdate 사전에서 사용하여 특정 ContactAddress의 속성에 검증 오류가 있음을 나타낼 수 있습니다. shippingAddressErrors 멤버는 AddressErrors 사전로, 물리적 주소의 오류가 있는 필드를 구체적으로 표시하고 최종 사용자에게 보여줄 유용한 오류 메시지를 제공합니다.

request.onshippingaddresschange = ev => {
  ev.updateWith(validateAddress(request.shippingAddress));
};
function validateAddress(shippingAddress) {
  const error = "Can't ship to this address.";
  const shippingAddressErrors = {
    city: "FarmVille is not a real place.",
    postalCode: "Unknown postal code for your country.",
  };
  // Empty shippingOptions implies that we can't ship
  // to this address.
  const shippingOptions = [];
  return { error, shippingAddressErrors, shippingOptions };
}

2.9 결제 응답을 서버로 POST 전송

PaymentResponse의 데이터는 처리를 위해 서버로 POST 전송되는 것이 일반적입니다. 이를 최대한 쉽게 하기 위해, PaymentResponse기본 toJSON 단계(즉, .toJSON())를 사용하여 객체를 직접 JSON으로 직렬화할 수 있습니다. 이렇게 하면 Fetch Standard를 사용해 결과 JSON을 서버로 POST 전송하는 작업이 매우 간단해집니다:

예시 9: `fetch()`로 POST 전송
async function doPaymentRequest() {
  const payRequest = new PaymentRequest(methodData, details);
  const payResponse = await payRequest.show();
  let result = "";
  try {
    const httpResponse = await fetch("/process-payment", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: payResponse.toJSON(),
    });
    result = httpResponse.ok ? "success" : "fail";
  } catch (err) {
    console.error(err);
    result = "fail";
  }
  await payResponse.complete(result);
}
doPaymentRequest();

2.10 교차 출처 iframe과 함께 사용

교차 출처 iframe이 결제 요청 API를 호출할 수 있음을 나타내려면, allow 속성에 "payment" 키워드를 함께 지정하여 iframe 요소에 설정하면 됩니다.

예시 10: 교차 출처 iframe에서 Payment Request API 사용
<iframe
  src="https://cross-origin.example"
  allow="payment">
</iframe>

만약 iframe이 결제 요청 API를 지원하는 여러 출처 간을 탐색하게 될 경우, allow"payment *"로 설정할 수 있습니다. Permissions Policy 명세에서 추가 세부 사항과 예시를 확인할 수 있습니다.

3. PaymentRequest 인터페이스

WebIDL[SecureContext, Exposed=Window]
interface PaymentRequest : EventTarget {
  constructor(
    sequence<PaymentMethodData> methodData,
    PaymentDetailsInit details,
    optional PaymentOptions options = {}
  );
  [NewObject]
  Promise<PaymentResponse> show(optional Promise<PaymentDetailsUpdate> detailsPromise);
  [NewObject]
  Promise<undefined> abort();
  [NewObject]
  Promise<boolean> canMakePayment();

  readonly attribute DOMString id;
  readonly attribute ContactAddress? shippingAddress;
  readonly attribute DOMString? shippingOption;
  readonly attribute PaymentShippingType? shippingType;

  attribute EventHandler onshippingaddresschange;
  attribute EventHandler onshippingoptionchange;
  attribute EventHandler onpaymentmethodchange;
};
참고

개발자는 결제 요청을 만들기 위해 PaymentRequest를 생성합니다. 이는 일반적으로 사용자가 결제 프로세스를 시작하는 행위(예: 웹사이트에서 "Buy", "Purchase", "Checkout" 버튼을 누르기, 인터랙티브 게임에서 "Power Up"을 선택하기, 주차 구조물의 키오스크에서 결제하기 등)와 연관됩니다. PaymentRequest는 사용자가 입력을 제공하는 동안 (사용자가 결제 요청을 승인하거나 거부하는 시점까지) 개발자가 사용자 에이전트와 정보를 교환할 수 있도록 합니다.

shippingAddress, shippingOption, 그리고 shippingType 속성은 처리 중에 requestShipping 멤버가 설정되어 있는 경우 채워집니다.

request결제 관련 브라우징 컨텍스트는 해당 PaymentRequest관련 전역 객체의 브라우징 컨텍스트의 최상위 브라우징 컨텍스트입니다. 모든 결제 관련 브라우징 컨텍스트는 한 번에 하나 이상의 결제 UI가 표시되는 것을 방지하는 결제 요청 표시 중 불리언을 갖습니다.

결제 요청 표시 중 불리언은 단일 브라우저 탭에서 둘 이상의 결제 UI가 표시되는 것을 막을 뿐입니다. 그러나 결제 핸들러사용자 에이전트가 모든 브라우저 창과 탭에 걸쳐 단 하나의 결제 UI만 표시하도록 제한할 수 있습니다. 다른 결제 핸들러는 서로 다른 브라우저 탭에 걸쳐 결제 UI 표시를 허용할 수도 있습니다.

3.1 생성자

PaymentRequest는 제공된 PaymentMethodData methodData 시퀀스(해당 결제 방식data 포함), PaymentDetailsInit details, 그리고 PaymentOptions options를 사용하여 구성됩니다.

PaymentRequest(methodData, details, options) 생성자는 다음과 같이 동작해야 합니다(MUST):

  1. this관련 전역 객체연결된 Document사용이 허용되지 않은 경우 "payment" 권한에 대해, "SecurityError" DOMExceptionthrow합니다.
  2. 요청의 id를 설정합니다:
    1. details.id가 없으면 detailsid 멤버를 추가하고 그 값을 UUID [RFC4122]로 설정합니다.
  3. serializedMethodData를 빈 목록으로 둡니다.
  4. 결제 방식을 처리합니다:
    1. methodData 시퀀스의 길이가 0이면 throw를 통해 TypeError를 발생시키며, 선택적으로 개발자에게 최소 하나의 결제 방식이 필요함을 알립니다.
    2. seenPMIs를 빈 집합으로 둡니다.
    3. methodData의 각 paymentMethod에 대해:
      1. paymentMethod.supportedMethods결제 방식 식별자를 검증하는 단계를 실행합니다. 결과가 false이면 RangeError 예외를 던집니다. 선택적으로, 결제 방식 식별자가 유효하지 않음을 개발자에게 알립니다.
      2. pmipaymentMethod.supportedMethods기본 URL 파서로 파싱한 결과로 둡니다:
        1. 실패라면, pmipaymentMethod.supportedMethods로 설정합니다.
      3. seenPMIscontainspmi를 이미 포함한다면 RangeError DOMException을 던지며, 선택적으로 해당 결제 방식 식별자가 중복임을 개발자에게 알립니다.
      4. Append를 통해 pmiseenPMIs에 추가합니다.
      5. paymentMethoddata 멤버가 없으면 serializedData를 null로 둡니다. 그렇지 않으면 serialize를 사용해 paymentMethod.data를 JSON 문자열로 변환한 결과를 serializedData로 둡니다. 예외가 발생하면 재던집니다.
      6. serializedData가 null이 아니고, paymentMethod.supportedMethods를 정의하는 명세가 추가 데이터 유형을 지정하는 경우:
        1. serializedDataJSON-파싱한 결과를 object로 둡니다.
        2. converting을 통해 object추가 데이터 유형의 IDL 값으로 변환한 결과를 idl로 둡니다. 예외가 발생하면 재던집니다.

        3. 해당 명세에서 정의한 paymentMethod.supportedMethods에 대해 결제 방식 데이터를 검증하는 단계object에 대해 실행합니다. 예외가 발생하면 재던집니다.

          참고

          이 단계들은 IDL 타입 변환 및 검증 오류가 가능한 한 이른 시점에 포착되도록 보장합니다.

      7. 튜플 (paymentMethod.supportedMethods, serializedData)를 serializedMethodData에 추가합니다.
  5. 총액을 처리합니다:
    1. 총액을 확인하고 정규화합니다: details.total.amount. 예외가 발생하면 재던집니다.
  6. detailsdisplayItems 멤버가 존재하면, details.displayItems의 각 item에 대해:
    1. 금액을 확인하고 정규화합니다: item.amount. 예외가 발생하면 재던집니다.
  7. selectedShippingOption을 null로 둡니다.
  8. optionsrequestShipping 멤버가 존재하고 true로 설정된 경우, 배송 옵션을 처리합니다:
    1. options를 빈 sequence<PaymentShippingOption>로 둡니다.
    2. detailsshippingOptions 멤버가 존재하면:
      1. seenIDs를 빈 집합으로 둡니다.
      2. details.shippingOptions의 각 option에 대해:
        1. 금액을 확인하고 정규화합니다: item.amount. 예외가 발생하면 재던집니다.
        2. seenIDsoption.id가 포함되어 있으면 TypeError를 던집니다. 선택적으로, 배송 옵션 ID는 고유해야 함을 개발자에게 알립니다.
        3. 그 외의 경우, option.idseenIDs에 추가합니다.
        4. option.selected가 true이면, selectedShippingOptionoption.id로 설정합니다.
    3. details.shippingOptionsoptions로 설정합니다.
  9. serializedModifierData를 빈 목록으로 둡니다.
  10. 결제 세부사항 수정자를 처리합니다:
    1. modifiers를 빈 sequence<PaymentDetailsModifier>로 둡니다.
    2. detailsmodifiers 멤버가 존재하면:
      1. modifiersdetails.modifiers로 설정합니다.
      2. modifiers의 각 modifier에 대해:
        1. modifiertotal 멤버가 존재하면:
          1. 총액을 확인하고 정규화합니다: modifier.total.amount. 예외가 발생하면 재던집니다.
        2. additionalDisplayItems 멤버가 modifier에 존재하면, modifier.additionalDisplayItems의 각 item에 대해:
          1. 금액을 확인하고 정규화합니다: item.amount. 예외가 발생하면 재던집니다.
        3. modifierdata 멤버가 없으면 serializedData를 null로 둡니다. 그렇지 않으면 serialize를 통해 modifier.data를 JSON 문자열로 변환한 결과를 serializedData로 둡니다. 예외가 발생하면 재던집니다.
        4. 튜플 (modifier.supportedMethods, serializedData)를 serializedModifierData에 추가합니다.
        5. 존재하는 경우 modifierdata 멤버를 제거합니다.
    3. details.modifiersmodifiers로 설정합니다.
  11. request를 새로운 PaymentRequest로 둡니다.
  12. request[[handler]]null로 설정합니다.
  13. request[[options]]options로 설정합니다.
  14. request[[state]]를 "created"로 설정합니다.
  15. request[[updating]]을 false로 설정합니다.
  16. request[[details]]details로 설정합니다.
  17. request[[serializedModifierData]]serializedModifierData로 설정합니다.
  18. request[[serializedMethodData]]serializedMethodData로 설정합니다.
  19. request[[response]]를 null로 설정합니다.
  20. requestshippingOption 속성 값을 selectedShippingOption으로 설정합니다.
  21. requestshippingAddress 속성 값을 null로 설정합니다.
  22. options.requestShipping이 true로 설정되어 있으면, requestshippingType 속성 값을 options.shippingType으로 설정합니다. 그렇지 않으면 null로 설정합니다.
  23. request를 반환합니다.

3.2 id 속성

가져올 때, id 속성은 이 PaymentRequest[[details]].id를 반환합니다.

참고

감사 및 정산 목적을 위해, 상인은 각 거래에 대해 고유 식별자를 id 속성과 연계할 수 있습니다.

3.3 show() 메서드

참고

개발자가 결제 요청에 대한 사용자 상호작용을 시작하고자 할 때 show() 메서드를 호출합니다. show() 메서드는 Promise를 반환하며, 사용자가 결제 요청을 수락하면 해결됩니다. show() 메서드가 반환된 후 결제 요청을 지원하기 위한 어떤 형태의 사용자 인터페이스가 사용자에게 표시됩니다.

여러 브라우징 컨텍스트가 동시에 show() 메서드를 호출하는 경우에 무엇이 일어나는지는 각 결제 핸들러가 제어합니다. 예를 들어, 일부 결제 핸들러는 서로 다른 브라우저 탭/창에서 여러 결제 UI를 표시하도록 허용할 수 있습니다. 다른 결제 핸들러는 전체 사용자 에이전트에 대해 단 하나의 결제 UI만 허용할 수 있습니다.

show(optional detailsPromise) 메서드는 다음과 같이 동작해야 합니다(MUST):

  1. requestthis로 둡니다.
  2. request관련 전역 객체일시적 활성화가 없는 경우, 사용자 에이전트는 다음을 수행해도 됩니다(MAY):
    1. 거부된 프라미스를 "SecurityError" DOMException과 함께 반환합니다.
    참고

    이는 예를 들어 리디렉트 후 사용자 활성화가 없을 수 있는 리디렉트 플로우를 지원하기 위해 사용자 에이전트가 사용자 활성화를 요구하지 않도록 허용합니다. 보안 고려사항은 19.9 사용자 활성화 요구사항을 참고하십시오.

    또한 issue #1022에서 사용자 에이전트가 show()에 대해 사용자 활성화를 요구해야 하는지에 대한 보다 구체적인 지침을 명세에 제공하는 방안에 관해 논의하고 있습니다.

  3. 그렇지 않으면, 사용자 활성화를 소모합니다(해당 관련 전역 객체의).
  4. documentrequest관련 전역 객체연결된 Document로 둡니다.
  5. document완전히 활성화됨이 아니면, "AbortError" DOMException으로 거부된 프라미스를 반환합니다.
  6. document가시성 상태"visible"이 아니면, "AbortError" DOMException으로 거부된 프라미스를 반환합니다.
  7. 선택적으로, 사용자 에이전트가 사용자를 보호하기 위해 show() 호출을 허용하지 않으려는 경우, "SecurityError" DOMException으로 거부된 프라미스를 반환합니다. 예를 들어, 사용자 에이전트show()를 페이지가 호출할 수 있는 빈도를 제한할 수 있습니다. 자세한 내용은 19. 개인정보 보호 및 보안 고려사항을 참고하십시오.

  8. request[[state]]가 "created"가 아니면, "InvalidStateError" DOMException으로 거부된 프라미스를 반환합니다.
  9. 사용자 에이전트payment request is showing 불리언이 true이면:
    1. request[[state]]를 "closed"로 설정합니다.
    2. "AbortError" DOMException으로 거부된 프라미스를 반환합니다.
  10. request[[state]]를 "interactive"로 설정합니다.
  11. acceptPromise새 프라미스로 둡니다.
  12. request[[acceptPromise]]acceptPromise로 설정합니다.
  13. 선택적으로:

    1. acceptPromise를 "AbortError" DOMException으로 거부합니다.
    2. request[[state]]를 "closed"로 설정합니다.
    3. acceptPromise를 반환합니다.
    참고

    이는 사용자 에이전트가 재량에 따라 사용자가 즉시 결제 요청을 중단한 것처럼 동작하도록 허용합니다. 예를 들어, "프라이빗 브라우징" 모드 등에서 사용자 에이전트는 이 단계를 활용할 수 있습니다.

  14. request결제 관련 브라우징 컨텍스트payment request is showing 불리언을 true로 설정합니다.
  15. acceptPromise를 반환하고, 나머지 단계를 병렬로 수행합니다.
  16. handlers를 빈 리스트로 둡니다.
  17. request[[serializedMethodData]]의 각 paymentMethod 튜플에 대해:
    1. identifier를 해당 paymentMethod 튜플의 첫 번째 요소로 둡니다.
    2. datapaymentMethod 튜플의 두 번째 요소를 JSON-파싱한 결과로 둡니다.
    3. identifier를 정의하는 명세가 추가 데이터 유형을 지정한다면, 변환하여 data를 그 타입의 IDL 값으로 둡니다. 그렇지 않으면, 변환하여 dataobject로 둡니다.
    4. 변환이 예외 error를 발생시키면:
      1. request[[state]]를 "closed"로 설정합니다.
      2. acceptPromiseerror로 거부합니다.
      3. request결제 관련 브라우징 컨텍스트payment request is showing 불리언을 false로 설정합니다.
      4. 이 알고리즘을 종료합니다.
    5. registeredHandlers리스트로 두고, 결제 방식 identifier에 대해 등록된 결제 핸들러들을 포함시킵니다.
      참고: 결제 핸들러 등록
    6. registeredHandlers의 각 handler에 대해:
      1. handler결제를 할 수 있는지 확인하는 단계data와 함께 실행한 결과를 canMakePayment로 둡니다.
      2. canMakePayment가 true이면, handlerhandlers에 추가합니다.
  18. handlers가 비어 있으면:
    1. request[[state]]를 "closed"로 설정합니다.
    2. acceptPromise를 "NotSupportedError" DOMException으로 거부합니다.
    3. request결제 관련 브라우징 컨텍스트payment request is showing 불리언을 false로 설정합니다.
    4. 이 알고리즘을 종료합니다.
  19. 사용자에게 handlers와 상호작용할 수 있는 사용자 인터페이스를 표시합니다. 사용자 에이전트는 결제 방식을 표시할 때 사용자의 선호도를 SHOULD 우선시해야 합니다. 사용자 인터페이스는 가능하다면 document문서 요소언어와 일치하는 언어 및 로케일 기반 형식으로 표시되어야 하며(SHOULD), 그렇지 않다면 적절한 대체값을 사용해야 합니다.

    참고: 결제 사용자 인터페이스의 현지화
  20. detailsPromise가 전달되었다면:
    1. detailsPromise, request, 그리고 null을 사용하여 PaymentRequest의 세부 정보 업데이트 알고리즘을 실행합니다.
    2. detailsPromise가 완료(settle)될 때까지 기다립니다.
      참고

      detailsPromise가 어떻게 완료되는지에 따라 PaymentRequest의 세부 정보 업데이트 알고리즘이 결제 UI 동작 방식을 결정합니다. 즉, detailsPromise거부되면 결제 요청은 중단되고, detailsPromise이행되면 사용자 에이전트는 결제 요청 UI를 다시 활성화하고 결제 흐름이 계속될 수 있습니다.

  21. request[[handler]]를 최종 사용자가 선택한 결제 핸들러로 설정합니다.
  22. modifiers를 빈 리스트로 둡니다.
  23. [[serializedModifierData]]의 각 tuple에 대해:
    1. tuple의 첫 번째 요소(PMI)가 request[[handler]]결제 방식 식별자와 일치하면, tuple의 두 번째 요소(직렬화된 메서드 데이터)를 modifiers에 추가합니다.
  24. paymentMethod 튜플의 두 번째 요소(변환된 값)를 변환하여 전달하고, modifiers도 함께 전달합니다. 선택적으로, 사용자 에이전트는 사용자 선택 결제 핸들러가 사용자를 결제 과정으로 안내할 수 있도록 request에서 적절한 데이터를 보내야 합니다(SHOULD). 여기에는 request의 다양한 속성과 기타 내부 슬롯이 포함됩니다(적절한 경우 개인정보 보호 사유로 일부는 제외될 수 있음).

    [[serializedModifierData]] 내부 슬롯에서 적용 가능한 여러 수정자를 처리하는 방식은 결제 핸들러마다 다르며 본 명세의 범위를 벗어납니다. 그럼에도 불구하고 결제 핸들러는 리스트의 항목에 대해 "마지막 항목 우선(last one wins)" 접근 방식을 사용할 것을 RECOMMENDED합니다: 즉, 리스트 끝의 항목이 리스트 시작의 어떤 항목보다 항상 우선합니다(아래 예시 참조).

    acceptPromise는 이후 사용자 인터페이스와의 상호작용을 통해 트리거되는 사용자가 결제 요청을 수락하는 알고리즘이나 사용자가 결제 요청을 중단하는 알고리즘에 의해 해결되거나 거부됩니다.

    사용자 인터페이스가 표시되는 동안 document완전히 활성화됨이 아니게 되거나, 이 단계에 도달할 때까지 그렇게 되었다면:

    1. 사용자 인터페이스를 닫습니다.
    2. request결제 관련 브라우징 컨텍스트payment request is showing 불리언을 false로 설정합니다.

3.4 abort() 메서드

참고

개발자가 abort() 메서드를 호출하여 사용자 에이전트에게 결제 request를 중단하고 표시된 사용자 인터페이스를 제거하도록 지시할 수 있습니다. abort()show() 메서드가 호출된 후 (참조: 상태) 이 인스턴스의 [[acceptPromise]]가 해결되기 전에만 호출할 수 있습니다. 예를 들어, 판매 중인 상품이 제한된 시간 동안만 이용 가능한 경우 개발자는 이를 수행할 수 있습니다. 허용된 시간 내에 사용자가 결제 요청을 수락하지 않으면 요청이 중단됩니다.

사용자 에이전트가 항상 요청을 중단할 수 있는 것은 아닙니다. 예를 들어, 사용자 에이전트가 요청 책임을 다른 앱에 위임한 경우가 있습니다. 이 상황에서는 abort()가 반환된 Promise를 거부합니다.

또한, 사용자가 결제 요청을 중단하는 경우의 알고리즘을 참조하십시오.

abort() 메서드는 다음과 같이 동작해야 합니다(MUST):

  1. requestthis로 둡니다.
  2. request.[[response]]가 null이 아니고, request.[[response]].[[retryPromise]] 가 null이 아니면, "InvalidStateError" DOMException으로 거부된 프라미스를 반환합니다.
  3. request.[[state]]의 값이 "interactive"가 아니면, "InvalidStateError" DOMException으로 거부된 프라미스를 반환합니다.
  4. promise새 프라미스로 둡니다.
  5. promise를 반환하고 나머지 단계를 병렬로 수행합니다.
  6. 결제 핸들러와의 현재 사용자 상호작용을 중단하고 남아 있는 사용자 인터페이스를 닫으려고 시도합니다.
  7. 작업을 큐에 추가하고 사용자 상호작용 작업 소스에서 다음 단계를 수행합니다:
    1. 현재 사용자 상호작용을 중단할 수 없으면, "InvalidStateError" DOMException으로 promise를 거부하고 이 단계를 중단합니다.
    2. request.[[state]]를 "closed"로 설정합니다.
    3. request.[[acceptPromise]]를 "AbortError" DOMException으로 거부합니다.
    4. promise를 undefined로 해결합니다.

3.5 canMakePayment() 메서드

참고: canMakePayment()

canMakePayment() 메서드는 개발자가 사용자 에이전트가 원하는 결제 방식 중 하나를 지원하는지 확인하기 위해 사용할 수 있습니다. 자세한 내용은 19.8 canMakePayment() 보호를 참조하십시오.

canMakePayment()의 결과가 true라고 해서 사용자가 결제를 위한 프로비저닝된 수단을 이미 준비해 놓았음을 의미하지는 않습니다.

canMakePayment() 메서드는 can make payment 알고리즘을 실행해야 합니다(MUST).

3.6 shippingAddress 속성

PaymentRequestshippingAddress 속성은 사용자가 배송 주소를 제공할 때 채워지며, 기본값은 null입니다. 사용자가 배송 주소를 제공할 때 shipping address changed 알고리즘이 실행됩니다.

3.7 shippingType 속성

PaymentRequestshippingType 속성은 거래를 이행하기 위해 사용되는 배송 유형입니다. 이 값은 PaymentShippingType 열거형 값이거나, 개발자가 구성 시점에 제공하지 않은 경우 null입니다. (참조: PaymentOptionsshippingType 멤버).

3.8 onshippingaddresschange 속성

PaymentRequestonshippingaddresschange 속성은 EventHandler로, PaymentRequestUpdateEventshippingaddresschange와 명명된 이벤트를 처리합니다.

3.9 shippingOption 속성

PaymentRequestshippingOption 속성은 사용자가 배송 옵션을 선택할 때 채워지며, 기본값은 null입니다. 사용자가 배송 옵션을 선택할 때 shipping option changed 알고리즘이 실행됩니다.

3.10 onshippingoptionchange 속성

PaymentRequestonshippingoptionchange 속성은 EventHandler로, PaymentRequestUpdateEventshippingoptionchange와 명명된 이벤트를 처리합니다.

3.11 onpaymentmethodchange 속성

PaymentRequestonpaymentmethodchange 속성은 EventHandler로, PaymentMethodChangeEvent 중 "paymentmethodchange"와 명명된 이벤트를 처리합니다.

3.12 내부 슬롯

PaymentRequest의 인스턴스는 아래 표에 나열된 내부 슬롯과 함께 생성됩니다:

내부 슬롯 설명 (비규범적)
[[serializedMethodData]] 생성자에 제공된 methodData로, 지원되는 메서드와 문자열 또는 null로 표현된 데이터(원래 객체 형식 대신)로 구성된 튜플로 나타냅니다.
[[serializedModifierData]] data 멤버의 직렬화된 문자열 형식을 포함하는 리스트로, 이는 해당 시퀀스 [[details]].modifier의 각 항목과 일치하거나, 그러한 멤버가 없는 경우 null입니다.
[[details]] 결제 요청의 현재 PaymentDetailsBase로, 생성자에 처음 제공된 후 updateWith() 호출로 업데이트됩니다. 참고로 data 멤버는 PaymentDetailsModifier 인스턴스의 modifiers 멤버에서 제거되며, 대신 직렬화된 형식으로 [[serializedModifierData]] 내부 슬롯에 저장됩니다.
[[options]] 생성자에 제공된 PaymentOptions.
[[state]]

결제 요청의 현재 상태로, 아래 상태로 전환됩니다:

"created"
결제 요청이 생성되었으며 아직 사용자에게 표시되지 않은 상태.
"interactive"
결제 요청이 사용자에게 표시되고 있는 상태.
"closed"
결제 요청이 완료된 상태.

상태 전환은 아래 그림에 설명되어 있습니다:

그림 1 생성자는 초기 상태를 "created"로 설정합니다. show() 메서드는 상태를 "interactive"로 변경합니다. 그 후, abort() 메서드 또는 기타 오류가 상태를 "closed"로 전환할 수 있습니다; 마찬가지로 사용자가 결제 요청을 수락하는 알고리즘사용자가 결제 요청을 중단하는 알고리즘상태를 "closed"로 변경합니다.
[[updating]] updateWith() 호출로 결제 요청을 업데이트하기 위한 대기 중인 작업이 있으면 true, 그렇지 않으면 false입니다.
[[acceptPromise]] show() 호출 시 생성된 대기 중인 Promise로, 사용자가 결제 요청을 수락하면 해결됩니다.
[[response]] null이거나, 이 PaymentRequest에 의해 인스턴스화된 PaymentResponse입니다.
[[handler]] PaymentRequest와 연관된 결제 핸들러. 초기값은 null입니다.

4. PaymentMethodData 사전

WebIDLdictionary PaymentMethodData {
  required DOMString supportedMethods;
  object data;
};

PaymentMethodData 사전은 지원되는 결제 방식 집합 및 해당 방식들에 대한 관련 결제 방식별 데이터를 나타내는 데 사용됩니다.

supportedMethods 멤버
상인 웹 사이트에서 허용하는 결제 방식 식별자.
data 멤버
지원되는 결제 방식들에서 필요할 수 있는 선택적 정보를 제공하는 객체입니다. 제공된 경우, 직렬화됩니다.
참고

supportedMethods의 값이 배열에서 문자열로 변경되었으나, 웹의 기존 콘텐츠와 호환성을 유지하기 위해 이름은 복수형으로 남겨졌습니다.

5. PaymentCurrencyAmount 사전

WebIDLdictionary PaymentCurrencyAmount {
  required DOMString currency;
  required DOMString value;
};

PaymentCurrencyAmount 사전은 금액을 제공하는 데 사용됩니다.

currency 멤버

[ISO4217] 올바르게 형성된 3-문자 알파벳 코드(즉, 숫자 코드는 지원되지 않음)입니다. 정규 형식은 대문자입니다. 그러나 로컬화된 통화 기호가 제공되는 통화 코드 조합은 구현에 따라 다를 수 있습니다.

금액을 표시할 때, 사용자 에이전트가 통화 코드를 표시하는 것이 권장되지만 통화 기호를 표시하는 것은 선택사항입니다. 이는 통화 기호가 여러 통화에서 사용되므로 모호할 수 있기 때문입니다(예: "$"는 USD, AUD, NZD, CAD 등을 의미할 수 있음).

사용자 에이전트는 OS 규칙(예: 로컬화 목적)을 준수하기 위해 currency 멤버를 표시 형식에 맞게 조정할 수 있습니다(MAY).

참고: 디지털 통화와 ISO 4217 통화 코드

이 명세를 구현하는 사용자 에이전트는 ECMAScript의 isWellFormedCurrencyCode 추상 작업을 통해 [ISO4217]의 3-문자 코드 형식을 강제합니다. 이는 check and canonicalize amount 알고리즘의 일부로 호출됩니다. 코드가 [ISO4217] 정의 형식에 맞지 않으면 RangeError가 발생합니다.

현재 구현은 공식 [ISO4217] 목록에 포함되지 않은 올바르게 형성된 통화 코드(예: XBT, XRP 등)의 사용을 허용합니다. 제공된 코드가 브라우저가 표시 방법을 알고 있는 통화인 경우, 구현은 일반적으로 사용자 인터페이스에 적절한 통화 기호를 표시합니다 (예: "USD"는 U+0024 달러 기호($)로 표시되고, "GBP"는 U+00A3 파운드 기호(£)로 표시되며, "PLN"은 U+007A U+0142 즈워티(zł)로 표시되고, 비표준 "XBT"는 U+0243 라틴 대문자 B와 스트로크(Ƀ)로 표시될 수 있음).

ISO는 디지털 통화를 포함하기 위해 작업을 진행 중이며, 이는 [ISO4217] 레지스트리 업데이트 또는 완전히 새로운 레지스트리를 초래할 수 있습니다. 커뮤니티는 이것이 비표준 3-문자 코드 사용으로 인해 발생한 모호성을 해결할 것으로 예상합니다. 예를 들어, "BTC"가 비트코인을 나타내는지 아니면 미래의 부탄 통화를 나타내는지에 대한 질문이 있습니다. 발행 시점에서는 이러한 진화가 어떤 형태를 취할 것인지, 또는 작업이 완료될 시간 프레임조차 불분명합니다. W3C 웹 결제 작업 그룹은, 앞으로 이 명세의 개정이 관련 ISO 레지스트리와 호환되도록 ISO와 협력하고 있습니다.

value 멤버
금액을 포함하는 유효한 소수 통화 값.
예시 12: 1.234 오만 리얄을 나타내는 방법
{
   "currency": "OMR",
   "value": "1.234"
}

5.1 유효성 검사기

JavaScript 문자열유효한 소수 통화 값인지 여부는 다음 순서로 구성된 코드 포인트로 판단됩니다:

  1. 선택적으로, 단일 U+002D (-)로 금액이 음수임을 나타냅니다.
  2. U+0030 (0)에서 U+0039 (9) 범위의 코드 포인트 하나 이상.
  3. 선택적으로, 단일 U+002E (.) 뒤에 U+0030 (0)에서 U+0039 (9) 범위의 코드 포인트 하나 이상.
참고
다음 정규 표현식은 위 정의의 구현입니다.
^-?[0-9]+(\.[0-9]+)?$

금액 확인 및 정규화PaymentCurrencyAmount amount에 대해 실행하려면, 다음 단계를 따르십시오:

  1. IsWellFormedCurrencyCode(amount.currency) 결과가 false인 경우 RangeError 예외를 발생시키고, 선택적으로 개발자에게 통화가 유효하지 않음을 알립니다.
  2. amount.value유효한 소수 통화 값이 아닌 경우, TypeError를 발생시키고, 선택적으로 개발자에게 통화가 유효하지 않음을 알립니다.
  3. amount.currencyASCII 대문자로 변환한 결과로 설정합니다: amount.currency.

총 금액 확인 및 정규화PaymentCurrencyAmount amount에 대해 실행하려면, 다음 단계를 따르십시오:

  1. 금액 확인 및 정규화 amount. 모든 예외를 다시 발생시킵니다.
  2. amount.value의 첫 번째 코드 포인트가 U+002D (-)인 경우, TypeError를 발생시키고, 선택적으로 개발자에게 총 금액의 값은 음수일 수 없음을 알립니다.
참고: 값 변경 없음

6. 결제 세부사항 사전

6.1 PaymentDetailsBase 사전

WebIDLdictionary PaymentDetailsBase {
  sequence<PaymentItem> displayItems;
  sequence<PaymentShippingOption> shippingOptions;
  sequence<PaymentDetailsModifier> modifiers;
};
displayItems 멤버
PaymentItem 사전의 시퀀스는 사용자 에이전트표시할 수 있는 결제 요청의 항목을 포함합니다.
참고
shippingOptions 멤버

사용자가 선택할 수 있는 다양한 배송 옵션을 포함하는 시퀀스입니다.

시퀀스 내 항목에 selected 멤버가 true로 설정된 경우, 이 배송 옵션이 기본적으로 사용되며 shippingOption은 이 옵션의 id로 설정됩니다. 시퀀스 내에서 여러 항목이 selected로 true로 설정된 경우, 사용자 에이전트가 시퀀스의 마지막 항목을 선택합니다.

shippingOptions 멤버는 PaymentRequestPaymentOptionsrequestShipping이 true로 설정된 상태로 생성된 경우에만 사용됩니다.

참고
modifiers 멤버
특정 결제 방법 식별자에 대한 수정자를 포함하는 PaymentDetailsModifier 사전의 시퀀스입니다. 예를 들어, 결제 방법을 기준으로 총 금액을 조정할 수 있습니다.

6.2 PaymentDetailsInit 사전

WebIDLdictionary PaymentDetailsInit : PaymentDetailsBase {
  DOMString id;
  required PaymentItem total;
};
참고

PaymentDetailsBase 사전에서 상속된 멤버 외에도, 다음 멤버가 PaymentDetailsInit 사전의 일부입니다:

id 멤버
이 결제 요청에 대한 자유 형식 식별자입니다.
참고
total 멤버
결제 요청에 대한 0 이상의 총 금액을 포함하는 PaymentItem입니다.
참고

6.3 PaymentDetailsUpdate 사전

WebIDLdictionary PaymentDetailsUpdate : PaymentDetailsBase {
  DOMString error;
  PaymentItem total;
  AddressErrors shippingAddressErrors;
  PayerErrors payerErrors;
  object paymentMethodErrors;
};

PaymentDetailsUpdate 사전은 updateWith()를 사용하여 결제 요청을 업데이트하는 데 사용됩니다.

PaymentDetailsBase 사전에서 상속된 멤버 외에도, 다음 멤버가 PaymentDetailsUpdate 사전의 일부입니다:

error 멤버
선택한 배송 주소로 상품을 배송할 수 없는 이유 또는 배송 옵션이 제공되지 않는 기타 이유를 설명하는 사람이 읽을 수 있는 문자열입니다. 결제 요청이 updateWith()를 사용하여 업데이트될 때, PaymentDetailsUpdateerror 멤버에 메시지를 포함할 수 있으며, 이는 PaymentDetailsUpdate에 유효한 shippingOptions가 포함되지 않는 경우 사용자에게 표시됩니다. (결제 요청이 PaymentRequestrequestShipping 옵션을 true로 설정하여 생성된 경우)
total 멤버
0 이상의 PaymentItem을 포함합니다.
참고

이 명세의 알고리즘은 PaymentDetailsUpdate 사전을 허용하며 total.amount.value가 음수인 경우 예외를 발생시킵니다.

shippingAddressErrors 멤버
잠재적인 이벤트 타겟과 연관된 배송 주소의 유효성 검사 오류를 나타냅니다.
payerErrors 멤버
지불자 세부정보와 관련된 유효성 검사 오류입니다.
paymentMethodErrors 멤버

결제 방법과 관련된 구체적인 오류입니다.

7. PaymentDetailsModifier 사전

WebIDLdictionary PaymentDetailsModifier {
  required DOMString supportedMethods;
  PaymentItem total;
  sequence<PaymentItem> additionalDisplayItems;
  object data;
};

PaymentDetailsModifier 사전은 PaymentDetailsBase결제 방법 식별자를 기반으로 수정하는 세부사항을 제공합니다. 다음 멤버를 포함합니다:

supportedMethods 멤버
결제 방법 식별자. PaymentDetailsModifier의 멤버는 사용자가 이 결제 방법을 선택했을 때만 적용됩니다.
total 멤버
PaymentItem 값으로, total 멤버를 덮어씁니다. 이 멤버는 PaymentDetailsInit 사전 내의 결제 방법 식별자supportedMethods 멤버와 관련됩니다.
additionalDisplayItems 멤버
추가 표시 항목을 제공하는 PaymentItem 사전의 시퀀스입니다. 이는 displayItems 멤버에 추가되며, PaymentDetailsBase 사전 내 결제 방법 식별자supportedMethods 멤버에 관련됩니다. 이 멤버는 일반적으로 선택한 결제 방법에 대해 다른 total 금액의 이유를 나타내는 할인 또는 추가 요금 항목을 추가하는 데 사용됩니다. 표시할 수 있습니다.
참고

개발자는 total 금액이 displayItemsadditionalDisplayItems의 합계인지 확인해야 합니다.

data 멤버
지원되는 결제 방법에 필요할 수 있는 선택적 정보를 제공하는 객체입니다. 제공된 경우, 이는 직렬화됩니다.

8. PaymentShippingType 열거형

WebIDLenum PaymentShippingType {
  "shipping",
  "delivery",
  "pickup"
};
"shipping"
기본값으로, 주소배송의 목적지로 수집하는 것을 나타냅니다.
"delivery"
주소를 배송의 목적지로 수집하는 것을 나타냅니다. 이는 일반적으로 배송보다 빠릅니다. 예를 들어, 음식 배달에 사용될 수 있습니다.
"pickup"
주소를 서비스 픽업의 일부로 수집하는 것을 나타냅니다. 예를 들어, 세탁물 픽업을 위한 주소일 수 있습니다.

9. PaymentOptions 사전

WebIDLdictionary PaymentOptions {
  boolean requestPayerName = false;
  boolean requestBillingAddress = false;
  boolean requestPayerEmail = false;
  boolean requestPayerPhone = false;
  boolean requestShipping = false;
  PaymentShippingType shippingType = "shipping";
};
참고

PaymentOptions 사전은 PaymentRequest 생성자에 전달되며, 결제 요청에 대한 옵션을 제공합니다.

requestBillingAddress 멤버
사용자 에이전트수집하고 반환해야 하는지 나타내는 boolean 값입니다. 이는 청구 주소와 관련되어 있으며, 예를 들어 특정 관할권에서 세금을 계산하고 표시된 합계를 업데이트하는 데 사용할 수 있습니다. 사용자 정보 노출와 관련된 개인정보 보호 고려 사항을 확인하세요.
requestPayerName 멤버
사용자 에이전트수집하고 반환해야 하는지 나타내는 boolean 값입니다. 예를 들어, 지불자의 이름으로 예약을 허용하기 위해 true로 설정될 수 있습니다.
requestPayerEmail 멤버
사용자 에이전트수집하고 반환해야 하는지 나타내는 boolean 값입니다. 예를 들어, 영수증을 이메일로 보내기 위해 true로 설정될 수 있습니다.
requestPayerPhone 멤버
사용자 에이전트수집하고 반환해야 하는지 나타내는 boolean 값입니다. 예를 들어, 청구 문의를 위해 고객에게 전화를 걸기 위해 true로 설정될 수 있습니다.
requestShipping 멤버
사용자 에이전트수집하고 반환해야 하는지 나타내는 boolean 값입니다. 예를 들어, 물리적인 상품을 사용자가 배송받아야 하는 경우 true로 설정됩니다.
shippingType 멤버
PaymentShippingType 열거형 값입니다. 일부 거래는 배송을 위해 주소가 필요하지만, "배송"이라는 용어가 적합하지 않을 수 있습니다. 예를 들어, "피자 배달"은 "피자 배송"이 아니며, "세탁물 픽업"은 "세탁물 배송"이 아닙니다.

shippingType 멤버는 결제 요청에 대한 사용자 인터페이스에만 영향을 미칩니다.

10. PaymentItem 사전

WebIDLdictionary PaymentItem {
  required DOMString label;
  required PaymentCurrencyAmount amount;
  boolean pending = false;
};

하나 이상의 PaymentItem 사전의 시퀀스가 PaymentDetailsBase 사전에 포함되어, 결제 요청의 목적과 요청된 값을 나타냅니다.

label 멤버
항목에 대한 사람이 읽을 수 있는 설명입니다. 사용자 에이전트가 이를 사용자에게 표시할 수 있습니다.
참고: 레이블의 국제화
amount 멤버
항목의 금액을 포함하는 PaymentCurrencyAmount입니다.
pending 멤버
boolean 값입니다. true로 설정된 경우, amount 멤버가 최종 금액이 아님을 의미합니다. 이는 일반적으로 배송 주소 또는 배송 옵션 선택에 따라 달라지는 배송비나 세금 금액과 같은 항목을 표시하는 데 사용됩니다. 사용자 에이전트는 결제 요청에 대한 사용자 인터페이스에서 대기 중인 필드를 표시할 수 있습니다.

11. PaymentCompleteDetails 사전

WebIDLdictionary PaymentCompleteDetails {
  object? data = null;
};

PaymentCompleteDetails 사전은 결제 요청이 완료되었을 때 가맹점 웹사이트에서 결제 처리기로 추가 정보를 제공합니다.

PaymentCompleteDetails 사전은 다음 멤버를 포함합니다:

data 멤버
관련된 PaymentResponse 결제 방법에 필요할 수 있는 선택적 정보를 제공하는 객체입니다. 제공된 경우, 이는 직렬화됩니다.

12. PaymentComplete 열거형

WebIDLenum PaymentComplete {
  "fail",
  "success",
  "unknown"
};
"fail"
결제 처리에 실패했음을 나타냅니다. 사용자 에이전트가 실패를 나타내는 UI를 표시할 수 있습니다.
"success"
결제가 성공적으로 처리되었음을 나타냅니다. 사용자 에이전트가 성공을 나타내는 UI를 표시할 수 있습니다.
"unknown"
개발자가 성공 또는 실패를 명시하지 않았으며, 사용자 에이전트가 성공 또는 실패를 나타내는 UI를 표시하지 않아야 합니다.

13. PaymentShippingOption 사전

WebIDLdictionary PaymentShippingOption {
  required DOMString id;
  required DOMString label;
  required PaymentCurrencyAmount amount;
  boolean selected = false;
};

PaymentShippingOption 사전은 배송 옵션을 설명하는 멤버를 포함합니다. 개발자는 updateWith() 메서드를 호출하여 변경 이벤트에 응답하여 사용자에게 하나 이상의 배송 옵션을 제공할 수 있습니다.

id 멤버
PaymentShippingOption을 참조하는 데 사용되는 문자열 식별자입니다. 이는 주어진 PaymentRequest에 대해 고유해야 합니다.
label 멤버
항목에 대한 사람이 읽을 수 있는 문자열 설명입니다. 사용자 에이전트가 이 문자열을 사용하여 사용자에게 배송 옵션을 표시해야 합니다.
amount 멤버
항목의 금액을 포함하는 PaymentCurrencyAmount입니다.
selected 멤버
boolean 값입니다. true로 설정된 경우, 이는 시퀀스에서 기본적으로 선택된 PaymentShippingOption임을 나타냅니다. 사용자 에이전트는 사용자 인터페이스에서 기본적으로 이 옵션을 표시해야 합니다.

14. PaymentResponse 인터페이스

WebIDL[SecureContext, Exposed=Window]
interface PaymentResponse : EventTarget  {
  [Default] object toJSON();

  readonly attribute DOMString requestId;
  readonly attribute DOMString methodName;
  readonly attribute object details;
  readonly attribute ContactAddress? shippingAddress;
  readonly attribute DOMString? shippingOption;
  readonly attribute DOMString? payerName;
  readonly attribute DOMString? payerEmail;
  readonly attribute DOMString? payerPhone;

  [NewObject]
  Promise<undefined> complete(
    optional PaymentComplete result = "unknown",
    optional PaymentCompleteDetails details = {}
  );
  [NewObject]
  Promise<undefined> retry(optional PaymentValidationErrors errorFields = {});

  attribute EventHandler onpayerdetailchange;
};
참고

PaymentResponse는 사용자가 결제 방법을 선택하고 결제 요청을 승인했을 때 반환됩니다.

14.1 retry() 메서드

참고

retry(errorFields) 메서드는 다음과 같이 반드시 동작해야 합니다:

  1. responsethis로 둔다.
  2. requestresponse.[[request]]로 둔다.
  3. documentrequest관련 전역 객체연결된 Document로 둔다.
  4. document완전히 활성 상태가 아니면, "AbortError" DOMException으로 거부된 프로미스를 반환한다.
  5. response.[[complete]]가 true이면, "InvalidStateError" DOMException으로 거부된 프로미스를 반환한다.
  6. response.[[retryPromise]]가 null이 아니면, "InvalidStateError" DOMException으로 거부된 프로미스를 반환한다.
  7. request.[[state]]를 "interactive"로 설정한다.
  8. retryPromise새로운 프로미스로 둔다.
  9. response.[[retryPromise]]retryPromise로 설정한다.
  10. errorFields가 전달되었다면:
    1. 다음 중 하나라도 참이면, 선택적으로 개발자 콘솔에 경고를 표시한다:
      1. request.[[options]].requestPayerName 가 false이고, errorFields.payer.name 이 존재하는 경우.
      2. request.[[options]].requestPayerEmail 이 false이고, errorFields.payer.email 이 존재하는 경우.
      3. request.[[options]].requestPayerPhone 이 false이고, errorFields.payer.phone 이 존재하는 경우.
      4. request.[[options]].requestShipping 이 false이고, errorFields.shippingAddress 가 존재하는 경우.
    2. errorFields.paymentMethod 멤버가 전달되었고, response.methodName를 정의하는 명세에서 이를 요구하는 경우에는, 변환하여 errorFieldspaymentMethod 멤버를 거기서 지정된 타입의 IDL 값으로 만든다. 그렇지 않으면 변환하여 object로 만든다.
    3. request결제 관련 브라우징 컨텍스트결제 요청 표시 중 불리언을 false로 설정한다.
    4. 변환 결과가 예외 error를 발생시키면:
      1. retryPromiseerror로 거부한다.
      2. 사용자 에이전트결제 요청 표시 중 불리언을 false로 설정한다.
      3. 반환한다.
    5. errorFields의 멤버를 사용자 에이전트의 UI에 있는 입력 필드와 매칭시켜, 최종 사용자에게 결제 응답 데이터에 문제가 있음을 알린다. 예를 들어, 사용자 에이전트는 브라우저 UI에서 잘못된 errorFields에 사용자의 주의를 끌고, 각 필드의 값을 사용자가 각 오류를 수정하는 데 도움이 되는 방식으로 표시할 수 있다. 마찬가지로 error 멤버가 전달된 경우, 그 오류를 사용자 에이전트의 UI에 표시한다. 멤버의 값이 빈 문자열인 경우, 사용자 에이전트는 대체할 수 있다 적절한 오류 메시지로 값을 대체해도 된다.
  11. 그 밖에, errorFields가 전달되지 않았다면, 최종 사용자에게 결제를 다시 시도하라고 신호를 보낸다. 결제 요청 수락을 다시 시도할 수 있게 하는 모든 UI 요소를 다시 활성화한다.
  12. 사용자 인터페이스가 표시되는 동안 또는 이 단계에 도달할 때까지의 사이에 document완전히 활성 상태가 아니게 되면, 다음을 수행한다:
    1. 사용자 인터페이스를 닫는다.
    2. request결제 관련 브라우징 컨텍스트결제 요청 표시 중 불리언을 false로 설정한다.
  13. 마지막으로, retryPromise가 결정(settle)되면, response.[[retryPromise]]를 null로 설정한다.
  14. retryPromise를 반환한다.
    참고

    retryPromise는 이후 사용자가 결제 요청을 수락하는 알고리즘에 의해 이행되거나, 사용자가 결제 요청을 중단하는 알고리즘 또는 업데이트 중단에 의해 거부된다.

14.1.1 PaymentValidationErrors 사전

WebIDLdictionary PaymentValidationErrors {
  PayerErrors payer;
  AddressErrors shippingAddress;
  DOMString error;
  object paymentMethod;
};
payer 멤버
지불자 세부정보와 관련된 유효성 검사 오류입니다.
shippingAddress 멤버
PaymentResponseshippingAddress와 관련된 유효성 검사 오류를 나타냅니다.
error 멤버
사용자가 복구를 시도할 수 있는 결제 관련 오류에 대한 일반 설명입니다. 예를 들어, 사용자는 결제를 다시 시도함으로써 복구할 수 있습니다. 개발자는 선택적으로 error 멤버만 전달하여 유효성 문제에 대한 일반적인 개요를 제공할 수 있으며, 또는 PaymentValidationErrors 사전의 다른 멤버와 함께 전달할 수도 있습니다.
참고: 오류의 국제화
paymentMethod 멤버
결제 방법과 관련된 구체적인 오류입니다.

14.1.2 PayerErrors 사전

WebIDLdictionary PayerErrors {
  DOMString email;
  DOMString name;
  DOMString phone;
};

PayerErrors는 하나 이상의 지불자 세부정보에 대한 유효성 검사 오류를 표현하는 데 사용됩니다.

지불자 세부정보는 지불자의 이름, 지불자의 전화번호, 지불자의 이메일 중 어느 것이든 해당됩니다.

email 멤버
지불자의 이메일에 유효성 검사 오류가 있음을 나타냅니다. 사용자 에이전트의 UI에서 이 멤버는 PaymentResponsepayerEmail 속성 값에 해당하는 입력 필드와 대응됩니다.
name 멤버
지불자의 이름에 유효성 검사 오류가 있음을 나타냅니다. 사용자 에이전트의 UI에서 이 멤버는 PaymentResponsepayerName 속성 값에 해당하는 입력 필드와 대응됩니다.
phone 멤버
지불자의 전화번호에 유효성 검사 오류가 있음을 나타냅니다. 사용자 에이전트의 UI에서 이 멤버는 PaymentResponsepayerPhone 속성 값에 해당하는 입력 필드와 대응됩니다.

14.2 methodName 속성

사용자가 거래를 이행하기 위해 선택한 결제 방법 식별자로서, 해당 결제 방법을 나타냅니다.

14.3 details 속성

가맹점이 거래를 처리하거나 검증하는 데 사용할 수 있도록 사전 또는 object 형태로 결제 방법에 의해 생성됩니다(선택된 결제 방법에 따라 다름).

참고

14.4 shippingAddress 속성

requestShipping 멤버가 PaymentOptions에서 true로 설정된 상태로 PaymentRequest 생성자에 전달된 경우, shippingAddress는 사용자가 선택한 전체이자 최종 배송 주소가 됩니다.

14.5 shippingOption 속성

requestShipping 멤버가 PaymentOptions에서 true로 설정된 상태로 PaymentRequest 생성자에 전달된 경우, shippingOption은 선택된 배송 옵션의 id 속성이 됩니다.

14.6 payerName 속성

requestPayerName 멤버가 PaymentOptions에서 true로 설정된 상태로 PaymentRequest 생성자에 전달된 경우, payerName은 사용자가 제공한 이름이 됩니다.

14.7 payerEmail 속성

requestPayerEmail 멤버가 PaymentOptions에서 true로 설정된 상태로 PaymentRequest 생성자에 전달된 경우, payerEmail은 사용자가 선택한 이메일 주소가 됩니다.

14.8 payerPhone 속성

requestPayerPhone 멤버가 PaymentOptions에서 true로 설정된 상태로 PaymentRequest 생성자에 전달된 경우, payerPhone은 사용자가 선택한 전화번호가 됩니다.

14.9 requestId 속성

이 결제 응답을 생성한 해당 결제 요청의 id입니다.

14.10 complete() 메서드

참고

사용자가 결제 요청을 수락하고 [[acceptPromise]]가 이행된 뒤에 complete() 메서드가 호출됩니다. complete() 메서드를 호출하면 사용자 에이전트에 결제 상호작용이 종료되었음을 알리며 남아 있는 사용자 인터페이스를 닫아야 합니다(SHOULD).

결제 요청이 수락되어 호출자에게 PaymentResponse가 반환되었지만, 호출자가 complete()를 호출하기 전까지는 결제 요청 사용자 인터페이스는 보류 상태로 남습니다. 이때에는 결제 요청이 수락되어 반환되었으므로 사용자 인터페이스가 취소 명령을 제공해서는 안 됩니다. 그러나 문제가 발생하여 개발자가 complete()를 호출하지 않으면 사용자 인터페이스가 차단됩니다.

이러한 이유로, 구현은 개발자가 complete()를 호출해야 하는 제한 시간을 둘 수 있습니다. 제한 시간이 만료되면 구현은 인자가 없는 상태로 complete()가 호출된 것처럼 동작합니다.

complete() 메서드는 다음과 같이 반드시 동작해야 합니다:

  1. responsethis로 둔다.
  2. response.[[complete]]가 true이면, "InvalidStateError" DOMException으로 거부된 프로미스를 반환한다.
  3. response.[[retryPromise]]가 null이 아니면, "InvalidStateError" DOMException으로 거부된 프로미스를 반환한다.
  4. promise새로운 프로미스로 둔다.
  5. serializedData직렬화의 결과로서 details.data를 JSON 문자열로 변환한 값으로 둔다.
  6. 예외를 던지는 일이 직렬화 중 발생하면, 그 예외로 거부된 프로미스를 반환한다.
  7. response.methodName을 정의하는 명세에서 요구하는 경우:
    1. jsonJSONparse()serializedData로 호출한 결과로 둔다.
    2. idl변환을 통해 json을 해당 명세에서 지정한 타입의 IDL 값으로 얻은 결과로 둔다.
    3. IDL 값으로의 변환이 예외를 던지면, 그 예외로 거부된 프로미스를 반환한다.
    4. 또한 그 명세에서 요구하는 경우, idl의 멤버들을 검증한다. 어떤 멤버의 값이 유효하지 않으면 거부된 프로미스TypeError로 반환한다.
      참고: 복구 기회
  8. response.[[complete]]를 true로 설정한다.
  9. promise를 반환하고, 나머지 단계를 병렬로 수행한다.
  10. document가 사용자 인터페이스가 표시되는 동안 또는 이 단계에 도달할 때까지의 사이에 완전히 활성 상태가 아니게 되면:
    1. 사용자 인터페이스를 닫는다.
    2. request결제 관련 브라우징 컨텍스트결제 요청 표시 중 불리언을 false로 설정한다.
  11. 그 밖의 경우:
    1. 남아 있는 모든 사용자 인터페이스를 닫는다. 사용자 에이전트resultserializedData 값을 사용하여 사용자 경험에 영향을 줄 수 있다.
    2. request결제 관련 브라우징 컨텍스트결제 요청 표시 중 불리언을 false로 설정한다.
    3. promise를 undefined로 이행(resolve)한다.

14.11 onpayerdetailchange 속성

개발자가 "payerdetailchange" 이벤트를 처리할 수 있도록 합니다.

14.12 내부 슬롯

PaymentResponse의 인스턴스는 다음 표의 내부 슬롯과 함께 생성됩니다:

내부 슬롯 설명 (비규범적)
[[complete]] 결제 요청이 완료된 경우(즉, complete()가 호출되었거나, 응답을 더 이상 사용할 수 없게 만드는 치명적 오류가 있었던 경우) true이며, 그렇지 않으면 false입니다.
[[request]] PaymentRequest 인스턴스로부터 생성된 PaymentResponse입니다.
[[retryPromise]] null이거나, Promise로서 사용자가 결제 요청을 수락하면 이행되고, 사용자가 결제 요청을 중단하면 거부됩니다.

15. 배송 및 청구 주소

PaymentRequest 인터페이스는 가맹점이 사용자로부터 배송 및/또는 청구 목적을 위한 물리적 주소를 요청할 수 있게 합니다. 배송 주소청구 주소물리적 주소입니다.

15.1 AddressErrors 사전

WebIDLdictionary AddressErrors {
  DOMString addressLine;
  DOMString city;
  DOMString country;
  DOMString dependentLocality;
  DOMString organization;
  DOMString phone;
  DOMString postalCode;
  DOMString recipient;
  DOMString region;
  DOMString sortingCode;
};

AddressErrors 사전의 멤버들은 물리적 주소의 특정 부분에 대한 유효성 검사 오류를 나타냅니다. 각 사전 멤버는 이중 기능을 갖습니다: 첫째, 멤버가 존재한다는 것은 주소의 특정 부분에 유효성 검사 오류가 있음을 의미합니다. 둘째, 문자열 값은 개발자가 유효성 검사 오류(그리고 최종 사용자가 오류를 어떻게 수정할 수 있는지)를 설명할 수 있게 해줍니다.

참고

사용자가 주소의 일부를 수정할 수 없는 경우가 있을 수 있음을 개발자는 인지해야 합니다. 따라서 사용자가 통제할 수 없는 항목을 수정하도록 요구하지 않도록 유의해야 합니다.

addressLine 멤버
주소 행에 유효성 검사 오류가 있음을 나타냅니다. 사용자 에이전트의 UI에서, 이 멤버는 ContactAddressaddressLine 속성 값을 제공한 입력 필드에 대응됩니다.
city 멤버
도시에 유효성 검사 오류가 있음을 나타냅니다. 사용자 에이전트의 UI에서, 이 멤버는 ContactAddresscity 속성 값을 제공한 입력 필드에 대응됩니다.
country 멤버
국가에 유효성 검사 오류가 있음을 나타냅니다. 사용자 에이전트의 UI에서, 이 멤버는 ContactAddresscountry 속성 값을 제공한 입력 필드에 대응됩니다.
dependentLocality 멤버
하위 지역에 유효성 검사 오류가 있음을 나타냅니다. 사용자 에이전트의 UI에서, 이 멤버는 ContactAddressdependentLocality 속성 값을 제공한 입력 필드에 대응됩니다.
organization 멤버
조직에 유효성 검사 오류가 있음을 나타냅니다. 사용자 에이전트의 UI에서, 이 멤버는 ContactAddressorganization 속성 값을 제공한 입력 필드에 대응됩니다.
phone 멤버
전화번호에 유효성 검사 오류가 있음을 나타냅니다. 사용자 에이전트의 UI에서, 이 멤버는 ContactAddressphone 속성 값을 제공한 입력 필드에 대응됩니다.
postalCode 멤버
우편번호에 유효성 검사 오류가 있음을 나타냅니다. 사용자 에이전트의 UI에서, 이 멤버는 ContactAddresspostalCode 속성 값을 제공한 입력 필드에 대응됩니다.
recipient 멤버
수취인에 유효성 검사 오류가 있음을 나타냅니다. 사용자 에이전트의 UI에서, 이 멤버는 ContactAddressaddressLine 속성 값을 제공한 입력 필드에 대응됩니다.
region 멤버
지역에 유효성 검사 오류가 있음을 나타냅니다. 사용자 에이전트의 UI에서, 이 멤버는 ContactAddressregion 속성 값을 제공한 입력 필드에 대응됩니다.
sortingCode 멤버
정렬 코드에 유효성 검사 오류가 있습니다. 사용자 에이전트의 UI에서, 이 멤버는 ContactAddresssortingCode 속성 값을 제공한 입력 필드에 대응됩니다.

16. Permissions Policy 통합

본 명세는 문자열 "payment"로 식별되는 정책으로 제어되는 기능을 정의합니다 [permissions-policy]. 해당 기능의 기본 허용 목록'self'입니다.

참고

17. 이벤트

17.1 요약

이 절은 비규범적입니다.

이벤트 이름 인터페이스 다음 상황에서 디스패치됨… 대상
shippingaddresschange PaymentRequestUpdateEvent 사용자가 새 배송 주소를 제공합니다. PaymentRequest
shippingoptionchange PaymentRequestUpdateEvent 사용자가 새 배송 옵션을 선택합니다. PaymentRequest
payerdetailchange PaymentRequestUpdateEvent 사용자가 지불자 이름, 지불자 이메일 또는 지불자 전화번호를 변경합니다( 지불자 세부정보 변경 알고리즘 참조). PaymentResponse
paymentmethodchange PaymentMethodChangeEvent 사용자가 결제 방법결제 처리기 내에서 다른 것으로 선택합니다. PaymentRequest

17.2 PaymentMethodChangeEvent 인터페이스

WebIDL[SecureContext, Exposed=Window]
interface PaymentMethodChangeEvent : PaymentRequestUpdateEvent {
  constructor(DOMString type, optional PaymentMethodChangeEventInit eventInitDict = {});
  readonly attribute DOMString methodName;
  readonly attribute object? methodDetails;
};

17.2.1 methodDetails 속성

가져올 때, 초기화된 값을 반환합니다. 자세한 내용은 methodDetails 멤버와 PaymentMethodChangeEventInit을 참조하십시오.

17.2.2 methodName 속성

가져올 때, 초기화된 값을 반환합니다. 자세한 내용은 methodName 멤버와 PaymentMethodChangeEventInit을 참조하십시오.

17.2.3 PaymentMethodChangeEventInit 사전

WebIDLdictionary PaymentMethodChangeEventInit : PaymentRequestUpdateEventInit {
  DOMString methodName = "";
  object? methodDetails = null;
};
methodName 멤버
결제 방법 식별자를 나타내는 문자열입니다.
methodDetails 멤버
결제 방법에서 제공되는 일부 데이터를 나타내는 객체이거나, null입니다.

17.3 PaymentRequestUpdateEvent 인터페이스

WebIDL[SecureContext, Exposed=Window]
interface PaymentRequestUpdateEvent : Event {
  constructor(DOMString type, optional PaymentRequestUpdateEventInit eventInitDict = {});
  undefined updateWith(Promise<PaymentDetailsUpdate> detailsPromise);
};

PaymentRequestUpdateEvent는 사용자 상호작용에 응답하여 결제 요청의 세부 정보를 업데이트할 수 있도록 합니다.

17.3.1 Constructor

PaymentRequestUpdateEventconstructor(type, eventInitDict)는 다음과 같이 동작해야 합니다:

  1. event를, PaymentRequestUpdateEventconstructortypeeventInitDict로 호출한 결과로 둔다.
  2. event.[[waitForUpdate]]를 false로 설정한다.
  3. event를 반환한다.

17.3.2 updateWith() 메서드

참고

updateWith()detailsPromise와 함께 호출하는 메서드는 다음과 같이 동작해야 합니다:

  1. eventthis로 둔다.
  2. eventisTrusted 속성이 false이면, "InvalidStateError" DOMExceptionthrow한다.
  3. event.[[waitForUpdate]]가 true이면, "InvalidStateError" DOMExceptionthrow한다.
  4. eventtargetPaymentResponse의 인스턴스이면, requesteventtarget[[request]] 값으로 둔다.
  5. 그 밖의 경우, requesteventtarget 값으로 둔다.
  6. Assert: requestPaymentRequest의 인스턴스이다.
  7. request.[[state]]가 "interactive"가 아니면, "InvalidStateError" DOMExceptionthrow한다.
  8. request.[[updating]]이 true이면, "InvalidStateError" DOMExceptionthrow한다.
  9. event전파 중단 플래그즉시 전파 중단 플래그를 설정한다.
  10. event.[[waitForUpdate]]를 true로 설정한다.
  11. pmi를 null로 둔다.
  12. eventmethodName 속성을 가진 경우, pmimethodName 속성의 값으로 설정한다.
  13. detailsPromise, request, 그리고 pmi를 사용하여 PaymentRequest의 세부 정보를 업데이트하는 알고리즘을 실행한다.

17.3.3 내부 슬롯

PaymentRequestUpdateEvent의 인스턴스는 다음 표의 내부 슬롯과 함께 생성됩니다:

내부 슬롯 설명 (비규범적)
[[waitForUpdate]] updateWith()로 시작된 업데이트가 현재 진행 중인지 나타내는 불리언입니다.

17.3.4 PaymentRequestUpdateEventInit 사전

WebIDLdictionary PaymentRequestUpdateEventInit : EventInit {};

18. 알고리즘

PaymentRequest 객체의 내부 슬롯 [[state]]가 "interactive"로 설정되면, 사용자 에이전트는 사용자 상호작용에 따라 다음 알고리즘들을 트리거합니다.

18.1 결제 가능 여부 알고리즘

결제 가능 여부 알고리즘사용자 에이전트결제 방법을 사용해 결제를 지원하는지 확인합니다. 이 결제 방법들은 PaymentRequest가 구성될 때 지정된 것들입니다.

  1. request를, 메서드가 호출된 PaymentRequest 객체로 둔다.
  2. request.[[state]]가 "created"가 아니면, "InvalidStateError" DOMException으로 거부된 프로미스를 반환한다.
  3. 선택적으로, 최상위 브라우징 컨텍스트의 재량으로 "NotAllowedError" DOMException으로 거부된 프로미스를 반환할 수 있다.
    참고

    이는 사용자 에이전트가 지문 채취 목적의 남용을 감지하고 방지하기 위한 휴리스틱을 적용할 수 있도록 합니다. 예를 들어 다양한 지원되는 PaymentRequest 객체를 생성하고 여러 결제 방법에 대해 결제 가능 여부 알고리즘을 연달아 트리거하는 것과 같은 경우입니다. 예를 들어, 사용자 에이전트는 해당 호출이 이루어진 최상위 브라우징 컨텍스트나 호출이 이루어진 시간대에 따라 허용되는 성공적인 호출의 수를 제한할 수 있습니다.

  4. hasHandlerPromise새로운 프로미스로 둔다.
  5. hasHandlerPromise를 반환하고, 나머지 단계를 병렬로 수행한다.
  6. paymentMethod 튜플 각각에 대해 request[[serializedMethodData]] 안에서:
    1. paymentMethod 튜플의 첫 번째 요소를 identifier로 둔다.
    2. 사용자 에이전트에 identifier에 대한 결제 요청을 처리할 수 있는 결제 처리기가 있다면, hasHandlerPromise를 true로 이행(resolve)하고 이 알고리즘을 종료한다.
  7. hasHandlerPromise를 false로 이행(resolve)한다.

18.2 배송 주소 변경 알고리즘

배송 주소 변경 알고리즘은 사용자가 새로운 배송 주소를 제공할 때 실행됩니다. 이 알고리즘은 다음 단계를 반드시 수행합니다:

  1. request를, 사용자가 상호작용 중인 PaymentRequest 객체로 둔다.
  2. 다음 단계를 실행하기 위해 작업을 큐에 넣고, 사용자 상호작용 작업 소스에서 실행한다:
    1. 참고: 수취인 정보의 프라이버시

      redactList는 API가 가맹점과 공유하는 수취인 개인 정보의 양을 제한합니다.

      가맹점의 경우, 결과로 얻는 ContactAddress 객체는 예를 들어 배송비를 계산하기에 충분한 정보를 제공하지만, 대부분의 경우 수취인을 물리적으로 특정하고 고유하게 식별하기에는 충분하지 않습니다.

      불행히도 redactList가 있더라도 수취인의 익명성이 보장되는 것은 아닙니다. 일부 국가에서는 우편번호가 매우 세분화되어 특정 수취인을 고유하게 식별할 수 있기 때문입니다.

    2. redactList를 빈 리스트로 둔다. redactList를 « "organization", "phone", "recipient", "addressLine" »로 설정한다.
    3. address를, redactList와 함께 사용자가 제공한 입력으로부터 contactaddress를 생성하는 단계를 실행한 결과로 둔다.
    4. requestshippingAddressaddress로 설정한다.
    5. request와 "shippingaddresschange"를 사용하여 PaymentRequest 업데이트 알고리즘을 실행한다.

18.3 배송 옵션 변경 알고리즘

배송 옵션 변경 알고리즘은 사용자가 새로운 배송 옵션을 선택할 때 실행됩니다. 이 알고리즘은 다음 단계를 반드시 수행합니다:

  1. request를, 사용자가 상호작용 중인 PaymentRequest 객체로 둔다.
  2. 다음 단계를 실행하기 위해 작업을 큐에 넣고, 사용자 상호작용 작업 소스에서 실행한다:
    1. requestshippingOption 속성을, 사용자가 제공한 PaymentShippingOptionid 문자열로 설정한다.
    2. request와 "shippingoptionchange"를 사용하여 PaymentRequest 업데이트 알고리즘을 실행한다.

18.4 결제 방법 변경 알고리즘

사용자가 methodDetails(이는 사전 또는 object 또는 null)과 methodName(사용자가 상호작용 중인 payment method identifier를 나타내는 DOMString)과 함께 결제 방법을 변경할 때, 결제 처리기MAY 결제 방법 변경 알고리즘을 실행할 수 있다.

참고: paymentmethodchange 이벤트로 공유되는 정보의 프라이버시

사용자가 결제 방법(예: 신용카드)을 선택하거나 변경하면, PaymentMethodChangeEvent에는 세금 계산을 수행하기 위한 목적으로 마스킹된 청구지 주소 정보가 포함된다. 마스킹되는 속성에는 다음이 포함되나 이에 국한되지는 않는다: address line, dependent locality, organization, phone number, 그리고 recipient.

  1. request를, 사용자가 상호작용 중인 PaymentRequest 객체로 둔다.
  2. 다음 단계를 실행하기 위해 작업을 큐에 넣고, 사용자 상호작용 작업 소스에서 실행한다:
    1. Assert: request.[[updating]]은 false이다. 한 번에 하나의 업데이트만 수행될 수 있다.
    2. Assert: request.[[state]]는 "interactive"이다.
    3. 이벤트를 발생시킨다. 이름은 "paymentmethodchange"이며, PaymentMethodChangeEvent를 사용하여 request에서 발생시킨다. 이때 그 methodName 속성은 methodName으로 초기화하고, methodDetails 속성은 methodDetails로 초기화한다.

18.5 PaymentRequest 업데이트 알고리즘

PaymentRequest 업데이트 알고리즘은 위의 다른 알고리즘들에 의해 실행되어, 사용자가 PaymentRequest request에 변경을 가했음을 나타내는 이벤트를 발생시키며, 이벤트 이름은 name이다:

  1. Assert: request.[[updating]]은 false이다. 한 번에 하나의 업데이트만 수행될 수 있다.
  2. Assert: request.[[state]]는 "interactive"이다.
  3. event를, 이벤트 생성을 통해 PaymentRequestUpdateEvent 인터페이스를 사용하여 만든 결과로 둔다.
  4. eventtype 속성을 name으로 초기화한다.
  5. 디스패치 eventrequest에서 수행한다.
  6. event.[[waitForUpdate]]가 true이면, 또 다른 업데이트 이벤트가 발생할 수 있는 사용자 인터페이스의 모든 부분을 비활성화한다.
  7. 그 밖의 경우, event.[[waitForUpdate]]를 true로 설정한다.

18.6 지불자 세부정보 변경 알고리즘

사용자 에이전트는 사용자가 사용자 인터페이스에서 payer name 또는 payer email 또는 payer phone을 변경할 때 MUST 지불자 세부정보 변경 알고리즘을 실행해야 한다:

  1. request를, 사용자가 상호작용 중인 PaymentRequest 객체로 둔다.
  2. request.[[response]]가 null이면, 반환한다.
  3. responserequest.[[response]]로 둔다.
  4. 다음 단계를 실행하기 위해 작업을 큐에 넣고, 사용자 상호작용 작업 소스에서 실행한다:
    1. Assert: request.[[updating]]은 false이다.
    2. Assert: request.[[state]]는 "interactive"이다.
    3. optionsrequest.[[options]]로 둔다.
    4. payer name이 변경되었고 options.requestPayerName이 true이면:
      1. responsepayerName 속성을 payer name으로 설정한다.
    5. payer email이 변경되었고 options.requestPayerEmail 이 true이면:
      1. responsepayerEmailpayer email로 설정한다.
    6. payer phone이 변경되었고 options.requestPayerPhone 이 true이면:
      1. responsepayerPhonepayer phone으로 설정한다.
    7. event를, 이벤트 생성을 통해 PaymentRequestUpdateEvent를 사용하여 만든 결과로 둔다.
    8. eventtype 속성을 "payerdetailchange"로 초기화한다.
    9. 디스패치 eventresponse에서 수행한다.
    10. event.[[waitForUpdate]]가 true이면, 지불자 세부정보에 또 다른 변경을 발생시킬 수 있는 사용자 인터페이스의 모든 부분을 비활성화한다.
    11. 그 밖의 경우, event.[[waitForUpdate]]를 true로 설정한다.

18.7 사용자가 결제 요청을 수락하는 알고리즘

사용자가 결제 요청을 수락하는 알고리즘은 사용자가 결제 요청을 수락하고 결제 의사를 확인할 때 실행된다. 다음 단계를 수행하기 위해 작업을 큐에 넣어야 한다 (작업 소스: 사용자 상호작용 작업 소스):

  1. request를 사용자가 상호작용 중인 PaymentRequest 객체로 둔다.
  2. request.[[updating]]이 true이면, 이 알고리즘을 종료하고 추가 동작을 하지 않는다. 사용자 에이전트의 사용자 인터페이스는 이러한 상황이 발생하지 않도록 권장된다.
  3. request.[[state]]가 "interactive"가 아니면, 이 알고리즘을 종료하고 추가 동작을 하지 않는다. 사용자 에이전트의 사용자 인터페이스는 이러한 상황이 발생하지 않도록 권장된다.
  4. request.[[options]]requestShipping 값이 true이면, requestshippingAddress 속성이 null이거나 shippingOption 속성이 null이면, 이 알고리즘을 종료하고 추가 동작을 하지 않는다. 사용자 에이전트는 이러한 상황이 발생하지 않도록 권장된다.
  5. isRetry를, request.[[response]]가 null이 아니면 true, 그렇지 않으면 false로 둔다.
  6. response를, isRetry가 true이면 request.[[response]]로, 그렇지 않으면 새로운 PaymentResponse로 둔다.
  7. isRetry가 false이면, 새로 생성한 response를 초기화한다:
    1. response.[[request]]request로 설정한다.
    2. response.[[retryPromise]]를 null로 설정한다.
    3. response.[[complete]]를 false로 설정한다.
    4. responserequestId 속성 값을, request[[details]].id의 값으로 설정한다.
    5. request.[[response]]response로 설정한다.
  8. handlerrequest.[[handler]]로 둔다.
  9. responsemethodName 속성 값을, handler결제 방법 식별자로 설정한다.
  10. responsedetails 속성 값을, handler결제 요청에 응답하는 단계를 실행한 결과로 얻은 객체로 설정한다.
  11. request.[[options]]requestShipping 값이 false이면, responseshippingAddress 속성 값을 null로 설정한다. 그렇지 않으면:
    1. shippingAddress를, 사용자가 제공한 입력으로부터 contactaddress를 생성한 결과로 둔다.
    2. responseshippingAddress 속성 값을 shippingAddress로 설정한다.
    3. requestshippingAddress 속성 값을 shippingAddress로 설정한다.
  12. request.[[options]]requestShipping 값이 true이면, responseshippingOption 속성을 requestshippingOption 속성 값으로 설정한다. 그렇지 않으면 null로 설정한다.
  13. request.[[options]]requestPayerName 값이 true이면, responsepayerName 속성을 사용자가 제공한 지불자 이름으로 설정하고, 제공되지 않았으면 null로 설정한다. 그렇지 않으면 null로 설정한다.
  14. request.[[options]]requestPayerEmail 값이 true이면, responsepayerEmail 속성을 사용자가 제공한 지불자 이메일 주소로 설정하고, 제공되지 않았으면 null로 설정한다. 그렇지 않으면 null로 설정한다.
  15. request.[[options]]requestPayerPhone 값이 true이면, responsepayerPhone 속성을 사용자가 제공한 지불자 전화번호로 설정하고, 제공되지 않았으면 null로 설정한다. payerPhone 값을 설정할 때, 사용자 에이전트는 [E.164]를 준수하도록 번호를 권장되는 방식으로 서식화해야 한다.
  16. request.[[state]]를 "closed"로 설정한다.
  17. isRetry가 true이면, response.[[retryPromise]]를 undefined로 이행(resolve)한다. 그렇지 않으면, request.[[acceptPromise]]response로 이행(resolve)한다.

18.8 사용자가 결제 요청을 중단하는 알고리즘

사용자가 결제 요청을 중단하는 알고리즘은 사용자가 현재 상호작용 중인 사용자 인터페이스를 통해 결제 요청을 중단할 때 실행된다. 다음 단계를 수행하기 위해 작업을 큐에 넣어야 한다 (작업 소스: 사용자 상호작용 작업 소스):

  1. request를 사용자가 상호작용 중인 PaymentRequest 객체로 둔다.
  2. request.[[state]]가 "interactive"가 아니면, 이 알고리즘을 종료하고 추가 동작을 하지 않는다. 사용자 에이전트의 사용자 인터페이스는 이러한 상황이 발생하지 않도록 권장된다.
  3. request.[[state]]를 "closed"로 설정한다.
  4. request결제 관련 브라우징 컨텍스트결제 요청 표시 중 불리언을 false로 설정한다.
  5. error를 "AbortError" DOMException으로 둔다.
  6. responserequest.[[response]]로 둔다.
  7. response가 null이 아니면:
    1. response.[[complete]]를 true로 설정한다.
    2. Assert: response.[[retryPromise]]는 null이 아니다.
    3. response.[[retryPromise]]error로 거부(reject)한다.
  8. 그 밖의 경우, request.[[acceptPromise]]error로 거부(reject)한다.
  9. 현재 사용자 상호작용을 중단하고, 남아 있는 모든 사용자 인터페이스를 닫는다.

18.9 PaymentRequest의 details 업데이트 알고리즘

PaymentRequest의 details 업데이트 알고리즘PaymentDetailsUpdate detailsPromisePaymentRequest request, 그리고 DOMString 또는 null(즉, payment method identifier)인 pmi를 인자로 받는다. 단계들은 detailsPromise의 이행/거부에 따라 조건부로 수행된다. detailsPromise가 끝내 완료되지 않으면 결제 요청은 차단된다. 사용자 에이전트는 사용자가 결제 요청을 중단할 수 있는 수단을 제공하는 것이 SHOULD이며, 구현체는 detailsPromise가 합리적인 시간 내에 완료되지 않을 경우 대기 중 업데이트에 대해 타임아웃을 구현할 수 MAY 있다.

타임아웃이 발생하거나, 사용자가 수동으로 중단하거나, payment handler가 해당 결제를 중단하기로 결정한 경우, 사용자 에이전트는 user aborts the payment request algorithmMUST 실행해야 한다.

  1. request.[[updating]]을 true로 설정한다.
  2. 병렬로, 사용자가 결제 요청을 수락할 수 있는 사용자 인터페이스를 비활성화한다. 이는 사용자 인터페이스가 새로운 세부정보로 업데이트되기 전에는 결제가 수락되지 않도록 보장하기 위함이다.
  3. 거부될 때 detailsPromise에 대해:
    1. 업데이트를 중단하고, request와 "AbortError" DOMException을 전달한다.
  4. 이행될 때 detailsPromise가 값 value로:
    1. details변환을 통해 valuePaymentDetailsUpdate 사전으로 얻은 결과로 둔다. 이 과정에서 예외가 발생하면, 업데이트를 중단하고 request와 발생한 예외를 전달한다.
    2. serializedModifierData를 빈 리스트로 둔다.
    3. selectedShippingOption을 null로 둔다.
    4. shippingOptions를 빈 sequence<PaymentShippingOption>로 둔다.
    5. details를 검증하고 정규화한다:
      1. detailstotal 멤버가 존재하면:
        1. 총액 확인 및 정규화를 수행한다: details.total.amount. 예외가 발생하면 업데이트를 중단하고 request와 해당 예외를 전달한다.
      2. detailsdisplayItems 멤버가 존재하면, 각 itemdetails.displayItems에 대하여:
        1. 금액 확인 및 정규화를 수행한다: item.amount. 예외가 발생하면 업데이트를 중단하고 request와 해당 예외를 전달한다.
      3. detailsshippingOptions 멤버가 존재하고, request.[[options]].requestShipping 이 true이면:
        1. seenIDs를 빈 집합으로 둔다.
        2. optiondetails.shippingOptions에 대하여:
          1. 금액 확인 및 정규화를 수행한다: option.amount. 예외가 발생하면 업데이트를 중단하고 request와 해당 예외를 전달한다.
          2. seenIDs[option.{{PaymentShippingOption/id}]가 존재하면, 업데이트를 중단하고 requestTypeError를 전달한다.
          3. option.idseenIDs에 추가한다.
          4. optionshippingOptions에 추가한다.
          5. option.selected 가 true이면, selectedShippingOptionoption.id로 설정한다.
      4. detailsmodifiers 멤버가 존재하면:
        1. modifiers를 시퀀스 details.modifiers로 둔다.
        2. serializedModifierData를 빈 리스트로 둔다.
        3. PaymentDetailsModifier modifiermodifiers에 대하여:
          1. payment method identifier 검증 단계를 modifier.supportedMethods에 대해 실행한다. false를 반환하면 업데이트를 중단하고 requestRangeError 예외를 전달한다. 선택적으로, 결제 방법 식별자가 유효하지 않음을 개발자에게 알린다.
          2. modifiertotal 멤버가 존재하면:
            1. 총액 확인 및 정규화를 수행한다: modifier.total.amount. 예외가 발생하면 업데이트를 중단하고 request와 해당 예외를 전달한다.
          3. additionalDisplayItems 멤버가 modifier에 존재하면, 각 PaymentItem itemmodifier.additionalDisplayItems에 대하여:
            1. 금액 확인 및 정규화를 수행한다: item.amount. 예외가 발생하면 업데이트를 중단하고 request와 해당 예외를 전달한다.
          4. modifierdata 멤버가 없으면 serializedData를 null로 둔다. 그렇지 않으면 직렬화를 통해 modifier.data를 JSON 문자열로 변환한 결과를 serializedData로 둔다. 예외가 발생하면 업데이트를 중단하고 request와 해당 예외를 전달한다.
          5. serializedDataserializedModifierData에 추가한다.
          6. 존재한다면 modifierdata 멤버를 제거한다.
    6. paymentMethodErrors 멤버가 존재하고 identifier가 null이 아니면:
      1. pmi를 정의하는 명세에서 요구하는 경우, 변환을 통해 paymentMethodErrors를 IDL 값으로 변환한다.
      2. 변환이 exception error를 초래하면, 업데이트를 중단하고 error를 전달한다.
      3. payment handler는 관련 오류 필드 각각에 대해 paymentMethodErrors를 사용하여 오류를 표시하는 것이 SHOULD이다.
    7. 새로운 details를 사용하여 PaymentRequest를 업데이트한다:
      1. detailstotal 멤버가 존재하면:
        1. request.[[details]].totaldetails.total로 설정한다.
      2. detailsdisplayItems 멤버가 존재하면:
        1. request.[[details]].displayItemsdetails.displayItems로 설정한다.
      3. detailsshippingOptions 멤버가 존재하고, request.[[options]].requestShipping 이 true이면:
        1. request.[[details]].shippingOptionsshippingOptions로 설정한다.
        2. requestshippingOption 속성 값을 selectedShippingOption으로 설정한다.
      4. detailsmodifiers 멤버가 존재하면:
        1. request.[[details]].modifiersdetails.modifiers로 설정한다.
        2. request.[[serializedModifierData]]serializedModifierData로 설정한다.
      5. 만약 request.[[options]].requestShipping 이 true이고, request.[[details]].shippingOptions가 비어 있다면, 이는 개발자가 현재 선택된 배송 주소(즉, requestshippingAddress로 주어진)에 대해 유효한 배송 옵션이 없음을 나타낸다.

        이 경우, 사용자 에이전트는 이를 나타내는 오류를 표시하는 것이 SHOULD이며, 현재 선택된 배송 주소가 어떤 방식으로든 유효하지 않음을 표시할 수 MAY 있다. 사용자 에이전트는 error 멤버가 details에 존재한다면 이를 사용하여 해당 주소에 유효한 배송 옵션이 없는 이유에 대한 추가 정보를 제공하는 것이 SHOULD이다.

        또한, details["shippingAddressErrors"] 멤버가 존재한다면, 사용자 에이전트는 배송 주소의 오류가 있는 각 필드에 대해 구체적인 오류를 표시하는 것이 SHOULD이다. 이는 AddressErrors의 각 존재하는 멤버를 표시된 사용자 인터페이스 내의 해당 입력 필드에 매칭하여 수행한다.

        마찬가지로, details["payerErrors"] 멤버가 존재하고 request.[[options]]requestPayerName, requestPayerEmail, 또는 requestPayerPhone 가 true이면, 오류가 있는 각 필드에 대해 구체적인 오류를 표시한다.

        이와 같이, details.paymentMethodErrors가 존재한다면, 해당 결제 방법의 오류가 있는 각 입력 필드에 대해 구체적인 오류를 표시한다.

  5. request.[[updating]]을 false로 설정한다.
  6. 변경된 request의 값에 따라 사용자 인터페이스를 업데이트한다. 이 알고리즘을 실행하기 전에 비활성화했던 사용자 인터페이스 요소들을 다시 활성화한다.

18.9.1 업데이트 중단

PaymentRequest requestexception exception으로 업데이트를 중단하려면:

  1. 선택적으로, 오류가 발생했음을 사용자에게 알리는 오류 메시지를 표시한다.
  2. 현재 사용자 상호작용을 중단하고 남아 있는 사용자 인터페이스를 모두 닫는다.
  3. 작업을 큐에 넣고 사용자 상호작용 작업 소스에서 다음 단계를 수행한다:
    1. request결제 관련 브라우징 컨텍스트결제 요청 표시 중 불리언을 false로 설정한다.
    2. request.[[state]]를 "closed"로 설정한다.
    3. responserequest.[[response]]로 둔다.
    4. response가 null이 아니면:
      1. response.[[complete]]를 true로 설정한다.
      2. Assert: response.[[retryPromise]]는 null이 아니다.
      3. response.[[retryPromise]]exception으로 거부(reject)한다.
    5. 그 밖의 경우, request.[[acceptPromise]]exception으로 거부(reject)한다.
    6. request.[[updating]]을 false로 설정한다.
  4. 알고리즘을 중단한다.
Note

업데이트를 중단은 제공된 detailsPromise가 거부되거나, 이행 값이 유효하지 않은 데이터를 포함하는 등 결제 요청을 업데이트하는 동안 치명적인 오류가 발생했을 때 실행된다. 이는 개발자가 변경 이벤트를 성공적으로 처리하지 못했기 때문에 결제 요청이 불일치 상태로 남을 가능성이 있다.

따라서, PaymentRequest는 "closed" 상태로 전환된다. 오류는 [[acceptPromise]]의 거부를 통해 개발자에게 전달되며, 즉, show()가 반환한 프로미스가 거부된다.

마찬가지로, 업데이트 중단retry() 중에 발생하면 [[retryPromise]]는 거부되고, 해당 PaymentResponse[[complete]] internal slot이 true로 설정되어(즉, 더 이상 사용할 수 없다).

19. 프라이버시 및 보안 고려사항

19.1 show() 메서드의 사용자 보호

이 절은 비규범적입니다.

사용자가 의도치 않게 민감한 자격 증명을 특정 출처에 공유하지 않도록 돕기 위해, 이 API는 PaymentRequest의 show() 메서드가 관련 Window일시적 활성화 (예: 클릭 또는 누르기)을 보유한 동안 호출되도록 요구합니다.

혼란스러운 사용자 경험을 피하기 위해, 본 명세는 show() 메서드를 통해 한 번에 하나만 표시하도록 사용자 에이전트를 제한합니다. 추가로, 사용자 에이전트는 페이지가 show()를 호출하는 빈도를 제한할 수 있습니다.

19.2 보안 컨텍스트

이 절은 비규범적입니다.

본 명세에서 정의한 API는 보안 컨텍스트에서만 노출됩니다. 자세한 내용은 Secure Contexts 명세를 참조하십시오. 실제로 이는 이 API가 HTTPS를 통해서만 사용 가능함을 의미합니다. 이는 결제 방식 데이터(예: 신용카드 번호)가 평문으로 전송되는 가능성을 제한하기 위함입니다.

19.3 교차 출처 결제 요청

이 절은 비규범적입니다.

가맹점과 기타 수취인이 체크아웃 및 기타 전자상거래 활동을 결제 서비스 제공자에게 위임하기 위해 iframe을 사용하는 것은 일반적입니다. 이 API는 [HTML]의 allow 속성을 통해 수취인 승인 교차 출처 iframe을 지원합니다.

결제 처리기iframe을 호스팅하는 출처와 해당 iframe 콘텐츠의 출처(여기에서 PaymentRequest가 시작됨)에 모두 접근할 수 있습니다.

19.4 데이터 필드의 암호화

이 절은 비규범적입니다.

PaymentRequest API는 데이터 필드의 암호화를 직접 지원하지 않습니다. 개별 결제 방법은 암호화된 데이터 지원을 포함하도록 선택할 수 있지만, 모든 결제 방법에 이를 의무화하지는 않습니다.

19.5 사용자 에이전트가 결제 처리기를 일치시키는 방법

이 절은 비규범적입니다.

보안상의 이유로, 사용자 에이전트는 show()canMakePayment()에서의 매칭을 URL 결제 방법 식별자와 동일한 origin결제 처리기로 제한할 수 있습니다.

19.6 데이터 사용

결제 방법 소유자는 결제 방법을 위해 수집된 사용자 데이터가 어떻게 사용될지에 대한 개인정보 보호정책을 수립합니다. Payment Request API는 데이터가 거래 완료 및 이 API와 관련된 사용자 경험의 목적에 사용될 것이라는 분명한 기대치를 설정합니다. 결제 수취인은 모든 데이터 사용이 결제 방법 정책을 준수하도록 보장할 책임이 있습니다. 거래 완료를 넘어서는 허용된 사용이 있는 경우, 수취인은 그 사용을 사용자에게 명확히 전달해야 합니다.

19.7 사용자 정보 공개

사용자 에이전트는 사용자 동의 없이 (예: 배송 주소)와 같은 사용자 정보를 개발자와 공유해서는 안 됩니다.

특히, PaymentMethodDatadataPaymentResponsedetails 멤버는 임의의 데이터 교환을 허용합니다. 기존 결제 방법에서 사용되는 다양한 데이터 모델을 고려할 때, 이 API에서 데이터의 특정 형식을 규정하면 유용성이 제한됩니다. details 멤버는 웹 기반(Payment Handler API에 의해 정의됨) 또는 독점적인 결제 처리기에서 온 데이터를 담습니다. 사용자 에이전트는 적절한 사용자 동의 메커니즘(예: 거래 당사자에 대한 인지와 데이터 공유 의사 표시 메커니즘)을 포함하지 않는 결제 처리기를 지원해서는 안 됩니다.

사용자 에이전트displayItems 멤버 또는 additionalDisplayItems 멤버의 값을 거래 완료를 용이하게 하는 목적 외의 어떤 목적으로도 공유해서는 안 됩니다.

PaymentMethodChangeEvent는 수취인이 선택된 결제 방법에 특정한 정보에 기반하여 표시된 총액을 업데이트할 수 있게 합니다. 예를 들어, 선택된 결제 방법과 연관된 청구지 주소는 세금 계산(예: VAT)에 영향을 줄 수 있으며, 지불자가 거래를 완료하기 전에 사용자 인터페이스가 총액을 정확히 표시하는 것이 바람직합니다. 동시에, 결제 완료 이전에는 가능한 한 적은 정보를 공유하는 것이 바람직합니다. 따라서, 결제 방법사용자가 결제 방법을 변경할 때의 단계를 정의하는 경우, PaymentMethodChangeEventmethodDetails 속성을 통해 공유되는 데이터를 최소화하는 것이 중요합니다. 공유 데이터 최소화에 대한 요구사항과 접근 방식은 결제 방법에 따라 달라질 수 있으며 다음을 포함할 수 있습니다:

사용자에게 프라이버시 민감 정보의 공유가 명백하지 않을 수 있는 경우(예: 결제 방법 변경 시), 사용자 에이전트가 어떤 정보가 상인과 공유되는지 정확히 사용자에게 알리도록 하는 것이 권고됩니다.

19.8 canMakePayment() 보호

canMakePayment() 메서드는 다양한 결제 방법에 대한 기능 감지를 제공합니다. 향후 다수의 결제 방법이 사용 가능해지는 경우, 이는 지문 채취 벡터가 될 수 있습니다. 사용자 에이전트는 이 메서드의 남용으로부터 사용자를 보호할 것으로 기대됩니다. 예를 들어, 사용자 에이전트는 다음과 같이 사용자 지문 채취를 줄일 수 있습니다:

속도 제한을 위해 사용자 에이전트는 반복 호출을 다음 기준으로 살펴볼 수 있습니다:

이러한 속도 제한 기법은 반복 호출과 연관된 비용을 증가시키는 것을 목표로 합니다. 이는 여러 등록 가능 도메인을 관리하는 비용이거나, 여러 창(탭 또는 팝업)을 여는 사용자 경험상의 마찰일 수 있습니다.

19.9 사용자 활성화 요구사항

사용자 에이전트가 show() 메서드의 일부로 사용자 활성화를 요구하지 않는 경우, 추가적인 보안 완화를 고려해야 합니다. 사용자 활성화를 요구하지 않으면, 사용자가 페이지와 즉시 상호작용하지 않고도 Payment Request UI를 시작할 수 있게 되어 스팸 및 클릭재킹 공격의 위험이 증가합니다.

스팸을 완화하기 위해, 사용자 에이전트는 특정 임계값 이후 사용자 활성화 요구를 강제할 수 있습니다. 예를 들어, 현재 페이지에서 사용자 활성화 없이 이미 Payment Request UI가 표시된 이후와 같은 경우입니다. 클릭재킹 공격을 완화하기 위해, 사용자 에이전트는 대화 상자가 표시된 직후의 클릭을 무시하는 시간 임계값을 구현할 수 있습니다.

또 다른 관련 완화책은 show()의 6단계에 존재하며, 사용자 상호작용을 시작하려면 문서가 가시 상태여야 합니다.

20. 접근성 고려사항

이 절은 비규범적입니다.

Payment Request API의 사용자 대상 측면에 대해, 구현체는 폼 컨트롤과 기타 입력 방식들을 통해 플랫폼 접근성 API와 통합합니다. 또한 합계(total), 배송 주소, 연락처 정보의 이해 가능성을 높이기 위해, 구현체는 시스템 규약에 따라 데이터를 서식화합니다.

21. 종속성

이 명세는 여러 다른 기반 명세에 의존합니다.

ECMAScript
internal slot 용어는 [ECMASCRIPT]에 정의되어 있습니다.

22. 적합성

비규범적으로 표시된 절들뿐 아니라, 이 명세의 모든 작성 가이드라인, 도표, 예제, 그리고 노트는 비규범적입니다. 그 외의 모든 내용은 규범적입니다.

이 문서에서 MAY, MUST, MUST NOT, OPTIONAL, RECOMMENDED, SHOULD, SHOULD NOT 키워드는 BCP 14 [RFC2119] [RFC8174]에 설명된 대로, 그리고 여기에서와 같이 전부 대문자로 나타날 때에만 해석되어야 합니다.

이 명세에 대한 적합성을 주장할 수 있는 제품 클래스는 오직 user agent뿐입니다.

Note

이 명세는 주로 웹 브라우저를 대상으로 하지만, 다른 소프트웨어도 이 명세를 적합하게 구현하는 것이 가능할 수 있습니다.

사용자 에이전트는 최종 결과가 명세의 알고리즘으로 얻어지는 결과와 구별할 수 없는 한, 이 명세에 제시된 알고리즘을 원하는 방식으로 MAY 구현할 수 있습니다.

사용자 에이전트는 서비스 거부 공격 방지, 메모리 고갈 방지, 또는 플랫폼별 제약 회피 등을 위해, 원래 제한되지 않은 입력에 대해 구현체별 한계를 MAY 부과할 수 있습니다. 입력이 구현체별 한계를 초과하는 경우, 사용자 에이전트는 MUST 예외를 던지거나(또는 프로미스 문맥에서는 거부하여) TypeError로 처리해야 하며, 특정 입력이 어떻게 구현체별 한계를 초과했는지 개발자에게 선택적으로 알릴 수 있습니다.

A. IDL 색인

WebIDL[SecureContext, Exposed=Window]
interface PaymentRequest : EventTarget {
  constructor(
    sequence<PaymentMethodData> methodData,
    PaymentDetailsInit details,
    optional PaymentOptions options = {}
  );
  [NewObject]
  Promise<PaymentResponse> show(optional Promise<PaymentDetailsUpdate> detailsPromise);
  [NewObject]
  Promise<undefined> abort();
  [NewObject]
  Promise<boolean> canMakePayment();

  readonly attribute DOMString id;
  readonly attribute ContactAddress? shippingAddress;
  readonly attribute DOMString? shippingOption;
  readonly attribute PaymentShippingType? shippingType;

  attribute EventHandler onshippingaddresschange;
  attribute EventHandler onshippingoptionchange;
  attribute EventHandler onpaymentmethodchange;
};

dictionary PaymentMethodData {
  required DOMString supportedMethods;
  object data;
};

dictionary PaymentCurrencyAmount {
  required DOMString currency;
  required DOMString value;
};

dictionary PaymentDetailsBase {
  sequence<PaymentItem> displayItems;
  sequence<PaymentShippingOption> shippingOptions;
  sequence<PaymentDetailsModifier> modifiers;
};

dictionary PaymentDetailsInit : PaymentDetailsBase {
  DOMString id;
  required PaymentItem total;
};

dictionary PaymentDetailsUpdate : PaymentDetailsBase {
  DOMString error;
  PaymentItem total;
  AddressErrors shippingAddressErrors;
  PayerErrors payerErrors;
  object paymentMethodErrors;
};

dictionary PaymentDetailsModifier {
  required DOMString supportedMethods;
  PaymentItem total;
  sequence<PaymentItem> additionalDisplayItems;
  object data;
};

enum PaymentShippingType {
  "shipping",
  "delivery",
  "pickup"
};

dictionary PaymentOptions {
  boolean requestPayerName = false;
  boolean requestBillingAddress = false;
  boolean requestPayerEmail = false;
  boolean requestPayerPhone = false;
  boolean requestShipping = false;
  PaymentShippingType shippingType = "shipping";
};

dictionary PaymentItem {
  required DOMString label;
  required PaymentCurrencyAmount amount;
  boolean pending = false;
};

dictionary PaymentCompleteDetails {
  object? data = null;
};

enum PaymentComplete {
  "fail",
  "success",
  "unknown"
};

dictionary PaymentShippingOption {
  required DOMString id;
  required DOMString label;
  required PaymentCurrencyAmount amount;
  boolean selected = false;
};

[SecureContext, Exposed=Window]
interface PaymentResponse : EventTarget  {
  [Default] object toJSON();

  readonly attribute DOMString requestId;
  readonly attribute DOMString methodName;
  readonly attribute object details;
  readonly attribute ContactAddress? shippingAddress;
  readonly attribute DOMString? shippingOption;
  readonly attribute DOMString? payerName;
  readonly attribute DOMString? payerEmail;
  readonly attribute DOMString? payerPhone;

  [NewObject]
  Promise<undefined> complete(
    optional PaymentComplete result = "unknown",
    optional PaymentCompleteDetails details = {}
  );
  [NewObject]
  Promise<undefined> retry(optional PaymentValidationErrors errorFields = {});

  attribute EventHandler onpayerdetailchange;
};

dictionary PaymentValidationErrors {
  PayerErrors payer;
  AddressErrors shippingAddress;
  DOMString error;
  object paymentMethod;
};

dictionary PayerErrors {
  DOMString email;
  DOMString name;
  DOMString phone;
};

dictionary AddressErrors {
  DOMString addressLine;
  DOMString city;
  DOMString country;
  DOMString dependentLocality;
  DOMString organization;
  DOMString phone;
  DOMString postalCode;
  DOMString recipient;
  DOMString region;
  DOMString sortingCode;
};

[SecureContext, Exposed=Window]
interface PaymentMethodChangeEvent : PaymentRequestUpdateEvent {
  constructor(DOMString type, optional PaymentMethodChangeEventInit eventInitDict = {});
  readonly attribute DOMString methodName;
  readonly attribute object? methodDetails;
};

dictionary PaymentMethodChangeEventInit : PaymentRequestUpdateEventInit {
  DOMString methodName = "";
  object? methodDetails = null;
};

[SecureContext, Exposed=Window]
interface PaymentRequestUpdateEvent : Event {
  constructor(DOMString type, optional PaymentRequestUpdateEventInit eventInitDict = {});
  undefined updateWith(Promise<PaymentDetailsUpdate> detailsPromise);
};

dictionary PaymentRequestUpdateEventInit : EventInit {};

B. 감사의 말

이 명세는 이전에 웹 플랫폼 인큐베이터 커뮤니티 그룹에서 발행한 보고서로부터 파생되었습니다.

C. 변경 로그

CR2 이후 현재까지의 변경 사항:

CR1과 CR2 사이의 변경 사항:

D. 참고 문헌

D.1 규범 참고 문헌

[contact-picker]
Contact Picker API. Peter Beverloo. W3C. 2024년 7월 8일. W3C 워킹 드래프트. URL: https://www.w3.org/TR/contact-picker/
[dom]
DOM Standard. Anne van Kesteren. WHATWG. 현행 표준. URL: https://dom.spec.whatwg.org/
[E.164]
The international public telecommunication numbering plan. ITU-T. 2010년 11월. 권고. URL: https://www.itu.int/rec/dologin_pub.asp?lang=e&id=T-REC-E.164-201011-I!!PDF-E&type=items
[ecma-402]
ECMAScript Internationalization API Specification. Ecma International. URL: https://tc39.es/ecma402/
[ECMASCRIPT]
ECMAScript Language Specification. Ecma International. URL: https://tc39.es/ecma262/multipage/
[fetch]
Fetch Standard. Anne van Kesteren. WHATWG. 현행 표준. URL: https://fetch.spec.whatwg.org/
[HTML]
HTML Standard. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. 현행 표준. URL: https://html.spec.whatwg.org/multipage/
[infra]
Infra Standard. Anne van Kesteren; Domenic Denicola. WHATWG. 현행 표준. URL: https://infra.spec.whatwg.org/
[ISO4217]
Currency codes - ISO 4217. ISO. 2015년. 국제 표준. URL: http://www.iso.org/iso/home/standards/currency_codes.htm
[payment-handler]
Payment Handler API. Adrian Hope-Bailie; Ian Jacobs; Rouslan Solomakhin; Jinho Bang. W3C. 2023년 1월 25일. W3C 워킹 드래프트. URL: https://www.w3.org/TR/payment-handler/
[payment-method-id]
Payment Method Identifiers. Marcos Caceres. W3C. 2022년 9월 8일. W3C 권고. URL: https://www.w3.org/TR/payment-method-id/
[permissions-policy]
Permissions Policy. Ian Clelland. W3C. 2025년 8월 6일. W3C 워킹 드래프트. URL: https://www.w3.org/TR/permissions-policy-1/
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. 1997년 3월. 최선의 현재 관행. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC4122]
A Universally Unique IDentifier (UUID) URN Namespace. P. Leach; M. Mealling; R. Salz. IETF. 2005년 7월. 제안 표준. URL: https://www.rfc-editor.org/rfc/rfc4122
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. 2017년 5월. 최선의 현재 관행. URL: https://www.rfc-editor.org/rfc/rfc8174
[url]
URL Standard. Anne van Kesteren. WHATWG. 현행 표준. URL: https://url.spec.whatwg.org/
[WEBIDL]
Web IDL Standard. Edgar Chen; Timothy Gu. WHATWG. 현행 표준. URL: https://webidl.spec.whatwg.org/

D.2 비규범 참고 문헌

[rfc6454]
The Web Origin Concept. A. Barth. IETF. 2011년 12월. 제안 표준. URL: https://www.rfc-editor.org/rfc/rfc6454
[secure-contexts]
Secure Contexts. Mike West. W3C. 2023년 11월 10일. CRD. URL: https://www.w3.org/TR/secure-contexts/
2.