सुरक्षित पेमेंट की पुष्टि करके पुष्टि करें

कारोबारी या कंपनियां, किसी क्रेडिट कार्ड या बैंक खाते के लिए, स्ट्रॉन्ग कस्टमर ऑथेंटिकेशन (SCA) प्रोसेस के हिस्से के तौर पर सिक्योर पेमेंट पुष्टि (SPC) का इस्तेमाल कर सकती हैं. WebAuthn पुष्टि करता है (अक्सर बायोमेट्रिक्स के ज़रिए). WebAuthn पहले से रजिस्टर होना चाहिए. इसके बारे में आपको सुरक्षित पेमेंट की पुष्टि रजिस्टर करें में जाना जा सकता है.

सामान्य तरीके से लागू करने की प्रक्रिया कैसे काम करती है

SPC का सबसे आम इस्तेमाल तब होता है, जब कोई ग्राहक किसी कारोबारी या कंपनी के है और क्रेडिट कार्ड जारी करने वाले बैंक या कंपनी को भुगतान करने वाले की पुष्टि की ज़रूरत है.

पुष्टि करने का वर्कफ़्लो.

आइए, पुष्टि करने के तरीके के बारे में जानते हैं:

  1. ग्राहक अपने पेमेंट क्रेडेंशियल (जैसे कि क्रेडिट कार्ड) देता है जानकारी).
  2. व्यापारी/कंपनी/कारोबारी, पेमेंट क्रेडेंशियल को जारी करने वाले या बैंक से पूछता है अगर पैसे चुकाने वाले को अलग से पुष्टि करने की ज़रूरत है, तो (आधिकारिक पार्टी या आरपी). यह एक्सचेंज हो सकता है, उदाहरण के लिए, EMV® 3-D सिक्योर.
    • अगर आरपी चाहता है कि कारोबारी या कंपनी, एसपीसी का इस्तेमाल करे और उपयोगकर्ता ने पहले रजिस्टर करने के बाद, आरपी जवाब में उन क्रेडेंशियल आईडी की सूची दिखाता है जिन्हें पेमेंट करने वाले और चैलेंज को पूरा करने के लिए.
    • अगर पुष्टि करने की ज़रूरत नहीं है, तो कारोबारी या कंपनी यह काम जारी रख सकती है लेन-देन पूरा करें.
  3. अगर पुष्टि करना ज़रूरी है, तो कारोबारी या कंपनी यह तय करती है कि ब्राउज़र पर SPC काम करता है या नहीं.
    • अगर ब्राउज़र SPC का समर्थन नहीं करता है, तो मौजूदा पुष्टि करने की प्रक्रिया.
  4. व्यापारी/कंपनी ने एसपीसी को शुरू किया हो. ब्राउज़र, पुष्टि करने के लिए एक डायलॉग दिखाता है.
    • अगर आरपी ने कोई भी क्रेडेंशियल आईडी पास नहीं किया है, तो पुष्टि करने का मौजूदा फ़्लो. पुष्टि हो जाने के बाद, SPC रजिस्ट्रेशन का इस्तेमाल करने के बारे में सोचें ताकि आने वाले समय में पुष्टि करने की प्रोसेस को आसान बनाया जा सके.
  5. उपयोगकर्ता, डिवाइस को अनलॉक करके पेमेंट करें.
  6. पुष्टि होने पर, व्यापारी/कंपनी को एक क्रेडेंशियल मिलता है.
  7. आरपी को कारोबारी या कंपनी से क्रेडेंशियल मिलता है और वह उसकी पुष्टि करता है प्रामाणिकता.
  8. आरपी, व्यापारी/कंपनी को पुष्टि के नतीजे भेजता है.
  9. व्यापारी/कंपनी/कारोबारी, उपयोगकर्ता को एक मैसेज दिखाता है. इससे पता चलता है कि पेमेंट किया गया है या नहीं सफल या असफल.

सुविधा की पहचान

यह पता लगाने के लिए कि SPC ब्राउज़र पर काम करता है या नहीं, आप canMakePayment().

व्यापारी/कंपनी की वेबसाइट पर SPC की पहचान करने की सुविधा के लिए, नीचे दिए गए कोड को कॉपी करके चिपकाएं.

const isSecurePaymentConfirmationSupported = async () => {
  if (!'PaymentRequest' in window) {
    return [false, 'Payment Request API is not supported'];
  }

  try {
    // The data below is the minimum required to create the request and
    // check if a payment can be made.
    const supportedInstruments = [
      {
        supportedMethods: "secure-payment-confirmation",
        data: {
          // RP's hostname as its ID
          rpId: 'rp.example',
          // A dummy credential ID
          credentialIds: [new Uint8Array(1)],
          // A dummy challenge
          challenge: new Uint8Array(1),
          instrument: {
            // Non-empty display name string
            displayName: ' ',
            // Transparent-black pixel.
            icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+P+/HgAFhAJ/wlseKgAAAABJRU5ErkJggg==',
          },
          // A dummy merchant origin
          payeeOrigin: 'https://non-existent.example',
        }
      }
    ];

    const details = {
      // Dummy shopping details
      total: {label: 'Total', amount: {currency: 'USD', value: '0'}},
    };

    const request = new PaymentRequest(supportedInstruments, details);
    const canMakePayment = await request.canMakePayment();
    return [canMakePayment, canMakePayment ? '' : 'SPC is not available'];
  } catch (error) {
    console.error(error);
    return [false, error.message];
  }
};

isSecurePaymentConfirmationSupported().then(result => {
  const [isSecurePaymentConfirmationSupported, reason] = result;
  if (isSecurePaymentConfirmationSupported) {
    // Display the payment button that invokes SPC.
  } else {
    // Fallback to the legacy authentication method.
  }
});

उपयोगकर्ता की पुष्टि करें

उपयोगकर्ता की पुष्टि करने के लिए, PaymentRequest.show() तरीके को इसके साथ शुरू करें secure-payment-confirmation और WebAuthn पैरामीटर:

पेमेंट के तरीके की data प्रॉपर्टी, SecurePaymentConfirmationRequest में ये पैरामीटर दिए गए हैं.

पैरामीटर ब्यौरा
rpId आरपी आईडी के तौर पर आरपी ऑरिजिन का होस्टनेम.
challenge यह एक रैंडम चैलेंज है, जो रीप्ले से होने वाले हमलों को रोकता है.
credentialIds क्रेडेंशियल आईडी का कलेक्शन. WebAuthn की पुष्टि करने की प्रक्रिया में allowCredentials प्रॉपर्टी, PublicKeyCredentialDescriptor ऑब्जेक्ट के कलेक्शन को स्वीकार करती है, लेकिन SPC में सिर्फ़ क्रेडेंशियल आईडी की सूची पास की जाती है.
payeeName (वैकल्पिक) पेमेंट पाने वाले का नाम.
payeeOrigin पैसे पाने वाले का मूल नाम. ऊपर बताई गई स्थिति में, यह कारोबारी या कंपनी का ऑरिजिन है.
instrument displayName के लिए स्ट्रिंग और icon के लिए एक यूआरएल, जो इमेज संसाधन पर ले जाता है. iconMustBeShown के लिए एक वैकल्पिक बूलियन (डिफ़ॉल्ट रूप से true पर सेट होता है) जो किसी आइकॉन के बारे में बताता है. अनुरोध को पूरा करने के लिए, उसे फ़ेच करना और दिखाना ज़रूरी है.
timeout मिलीसेकंड में लेन-देन पर हस्ताक्षर करने के लिए टाइम आउट
extensions WebAuthn कॉल में एक्सटेंशन जोड़े गए. आपको "पेमेंट" तय करने की ज़रूरत नहीं है एक्सटेंशन का उपयोग करने के लिए प्रोत्साहित करते हैं.

यह उदाहरण कोड देखें:

// After confirming SPC is available on this browser via a feature detection,
// fetch the request options cross-origin from the RP server.
const options = fetchFromServer('https://rp.example/spc-auth-request');
const { credentialIds, challenge } = options;

const request = new PaymentRequest([{
  // Specify `secure-payment-confirmation` as payment method.
  supportedMethods: "secure-payment-confirmation",
  data: {
    // The RP ID
    rpId: 'rp.example',

    // List of credential IDs obtained from the RP server.
    credentialIds,

    // The challenge is also obtained from the RP server.
    challenge,

    // A display name and an icon that represent the payment instrument.
    instrument: {
      displayName: "Fancy Card ****1234",
      icon: "https://rp.example/card-art.png",
      iconMustBeShown: false
    },

    // The origin of the payee (merchant)
    payeeOrigin: "https://merchant.example",

    // The number of milliseconds to timeout.
    timeout: 360000,  // 6 minutes
  }
}], {
  // Payment details.
  total: {
    label: "Total",
    amount: {
      currency: "USD",
      value: "5.00",
    },
  },
});

try {
  const response = await request.show();

  // response.details is a PublicKeyCredential, with a clientDataJSON that
  // contains the transaction data for verification by the issuing bank.
  // Make sure to serialize the binary part of the credential before
  // transferring to the server.
  const result = fetchFromServer('https://rp.example/spc-auth-response', response.details);
  if (result.success) {
    await response.complete('success');
  } else {
    await response.complete('fail');
  }
} catch (err) {
  // SPC cannot be used; merchant should fallback to traditional flows
  console.error(err);
}

.show() फ़ंक्शन से नतीजे के तौर पर PaymentResponse ऑब्जेक्ट को छोड़कर, details में सार्वजनिक कुंजी क्रेडेंशियल clientDataJSON जिसमें लेन-देन का डेटा शामिल है (payment) का इस्तेमाल करें.

नतीजे के तौर पर मिलने वाले क्रेडेंशियल को क्रॉस-ऑरिजिन से आरपी को ट्रांसफ़र करना चाहिए और पुष्टि की गई है.

आरपी, लेन-देन की पुष्टि कैसे करता है

आरपी सर्वर पर लेन-देन के डेटा की पुष्टि करना, सबसे अहम चरण होता है पर जाकर देखें.

लेन-देन के डेटा की पुष्टि करने के लिए प्रतिबंधित पार्टी, WebAuthn की पुष्टि करने के दावे की पुष्टि करने की प्रोसेस का पालन कर सकती है. इसके अलावा, उन्हें यह भी करना होगा कि payment की पुष्टि करें.

clientDataJSON के पेलोड का उदाहरण:

{
  "type":"payment.get",
  "challenge":"SAxYy64IvwWpoqpr8JV1CVLHDNLKXlxbtPv4Xg3cnoc",
  "origin":"https://spc-merchant.glitch.me",
  "crossOrigin":false,
  "payment":{
    "rp":"spc-rp.glitch.me",
    "topOrigin":"https://spc-merchant.glitch.me",
    "payeeOrigin":"https://spc-merchant.glitch.me",
    "total":{
      "value":"15.00",
      "currency":"USD"
    },
    "instrument":{
      "icon":"https://cdn.glitch.me/94838ffe-241b-4a67-a9e0-290bfe34c351%2Fbank.png?v=1639111444422",
      "displayName":"Fancy Card 825809751248"
    }
  }
}
  • rp, आरपी की मूल वैल्यू से मेल खाता है.
  • topOrigin, उस टॉप-लेवल ऑरिजिन से मेल खाता है जिसे आरपी ने उम्मीद की है ( ऊपर दिए गए उदाहरण में व्यापारी/कंपनी/कारोबारी का ऑरिजिन).
  • payeeOrigin, उस व्यक्ति के ऑरिजिन से मेल खाता है जिसे पैसे पाने वाले व्यक्ति के तौर पर होना चाहिए था उपयोगकर्ता को दिखाया जाता है.
  • total, उस लेन-देन की रकम से मेल खाता है जो आपको दिखनी चाहिए थी उपयोगकर्ता को कोई परेशानी नहीं है.
  • instrument उस भुगतान के तरीके की जानकारी से मेल खाता है जिसमें यह जानकारी होनी चाहिए उपयोगकर्ता को दिखाए जाते हैं.
const clientData = base64url.decode(response.clientDataJSON);
const clientDataJSON = JSON.parse(clientData);

if (!clientDataJSON.payment) {
  throw 'The credential does not contain payment payload.';
}

const payment = clientDataJSON.payment;
if (payment.rp !== expectedRPID ||
    payment.topOrigin !== expectedOrigin ||
    payment.payeeOrigin !== expectedOrigin ||
    payment.total.value !== '15.00' ||
    payment.total.currency !== 'USD') {
  throw 'Malformed payment information.';
}

पुष्टि के सभी नियम पास करने के बाद, आरपी यह बता सकता है कि कि लेन-देन पूरा हो गया है.

अगले चरण