مدیریت اطلاعات پرداخت اختیاری با کارگر خدمات

چگونه برنامه پرداخت مبتنی بر وب خود را با «پرداخت‌های وب» سازگار کنید و تجربه کاربری بهتری برای مشتریان فراهم کنید.

Once a web-based payment app receives a payment request and initiates a payment transaction, the service worker will act as the hub for communication between the merchant and the payment app. This post explains how a payment app can pass information about the payment method, shipping address, or contact information to the merchant using a service worker.

مدیریت اطلاعات پرداخت اختیاری با کارگر خدماتی
مدیریت اطلاعات پرداخت اختیاری با کارگر سرویس

به فروشنده اطلاع دهید

مهم است که تغییرات زیر را به اطلاع فروشنده برسانید.

تغییر روش پرداخت

برنامه‌های پرداخت می‌توانند از چندین ابزار پرداخت با روش‌های پرداخت مختلف پشتیبانی کنند.

مشتری روش پرداخت ابزار پرداخت
آمپر صادرکننده کارت اعتباری ۱ ****1234
صادرکننده کارت اعتباری ۱ ****4242
Bank X ******123
B صادرکننده کارت اعتباری ۲ ****5678
Bank X ******456

برای مثال، در جدول بالا، کیف پول مبتنی بر وب «مشتری الف» دو کارت اعتباری و یک حساب بانکی ثبت‌شده دارد. در این مورد، برنامه سه ابزار پرداخت (****1234، ****4242، ******123) و دو روش پرداخت (صادرکننده کارت اعتباری ۱ و بانک X) را مدیریت می‌کند. در تراکنش پرداخت، برنامه پرداخت می‌تواند به مشتری اجازه دهد یکی از ابزارهای پرداخت را انتخاب کند و از آن برای پرداخت به فروشنده استفاده کند.

رابط کاربری انتخاب‌گر روش پرداخت
میانای کاربر انتخابگر روش پرداخت

برنامه پرداخت می‌تواند قبل‌از ارسال پاسخ کامل پرداخت، به فروشنده اطلاع دهد که مشتری کدام روش پرداخت را انتخاب کرده است. این ویژگی زمانی مفید است که فروشنده بخواهد پویش تخفیفی برای نمانام روش پرداخت خاصی اجرا کند.

با میانای برنامه‌سازی کاربردی «مدیریت پرداخت مبتنی بر وب»، برنامه پرداخت می‌تواند رویداد «تغییر روش پرداخت» را ازطریق یک سرویس‌کار به فروشنده ارسال کند تا شناسه روش پرداخت جدید را اطلاع دهد. کارگر سرویس باید PaymentRequestEvent.changePaymentMethod() را با اطلاعات روش پرداخت جدید فراخوانی کند.

اطلاع دادن تغییر روش پرداخت به فروشنده
اطلاع دادن تغییر روش پرداخت به فروشنده

برنامه‌های پرداخت می‌توانند شیء methodDetails را به‌عنوان آرگومان دوم اختیاری برای PaymentRequestEvent.changePaymentMethod() ارسال کنند. این شیء می‌تواند حاوی جزئیات دلخواه روش پرداخت باشد که برای پردازش رویداد تغییر توسط فروشنده لازم است.

[payment handler] service-worker.js

…
// Received a message from the frontend
self.addEventListener('message', async e => {
  let details;
  try {
    switch (e.data.type) {
      …
      case 'PAYMENT_METHOD_CHANGED':
        const newMethod = e.data.paymentMethod;
        const newDetails = e.data.methodDetails;
        // Redact or check that no sensitive information is passed in
        // `newDetails`.
        // Notify the merchant of the payment method change
        details =
          await payment_request_event.changePaymentMethod(newMethod, newDetails);
      …

وقتی فروشنده رویداد paymentmethodchange را از Payment Request API دریافت می‌کند، می‌تواند جزئیات پرداخت را به‌روز کند و با شیء PaymentDetailsUpdate پاسخ دهد.

[merchant]

request.addEventListener('paymentmethodchange', e => {
  if (e.methodName === 'another-pay') {
    // Apply $10 discount for example.
    const discount = {
      label: 'special discount',
      amount: {
        currency: 'USD',
        // The value being string complies the spec
        value: '-10.00'
      }
    };
    let total = 0;
    details.displayItems.push(discount);
    for (let item of details.displayItems) {
     total += parseFloat(item.amount.value);
    }
    // Convert the number back to string
    details.total.amount.value = total.toString();
  }
  // Pass a promise to `updateWith()` and send updated payment details
  e.updateWith(details);
});

وقتی فروشنده پاسخ می‌دهد، وعده‌ای که PaymentRequestEvent.changePaymentMethod() برگردانده است با شیء PaymentRequestDetailsUpdate حل‌وفصل خواهد شد.

[payment handler] service-worker.js

…
        // Notify the merchant of the payment method change
        details = await payment_request_event.changePaymentMethod(newMethod, newDetails);
        // Provided the new payment details,
        // send a message back to the frontend to update the UI
        postMessage('UPDATE_REQUEST', details);
        break;
…

از این شیء برای به‌روزرسانی میانای کاربری در بخش کاربری استفاده کنید. نمایش جزئیات پرداخت به‌روزشده را ببینید.

تغییر نشانی ارسال کالا

برنامه‌های پرداخت می‌توانند نشانی ارسال کالا را به‌عنوان بخشی از تراکنش پرداخت به فروشنده ارائه دهند.

این کار برای فروشندگان مفید است زیرا می‌توانند جمع‌آوری نشانی را به برنامه‌های پرداخت واگذار کنند. و چون داده‌های نشانی در قالب استاندارد داده ارائه می‌شود، فروشنده می‌تواند انتظار داشته باشد که نشانی‌های ارسال کالا را در ساختاری یکسان دریافت کند.

علاوه‌براین، مشتریان می‌توانند اطلاعات نشانی‌شان را در برنامه پرداخت ترجیحی‌شان ثبت کنند و از آن برای فروشندگان مختلف استفاده کنند.

رابط کاربری انتخابگر نشانی ارسال کالا
میانای کاربر انتخابگر نشانی ارسال کالا

برنامه‌های پرداخت می‌توانند واسط کاربری‌ای برای ویرایش نشانی ارسال کالا یا انتخاب اطلاعات نشانی ازپیش ثبت‌شده برای مشتری در تراکنش پرداخت ارائه دهند. وقتی نشانی ارسال کالا به‌طور موقت تعیین می‌شود، برنامه پرداخت می‌تواند اطلاعات نشانی ویرایش‌شده را به فروشنده اطلاع دهد. این کار مزایای متعددی برای فروشندگان دارد:

  • فروشنده می‌تواند تعیین کند که آیا مشتری محدودیت منطقه‌ای را برای ارسال کالا رعایت می‌کند یا نه (برای مثال، فقط داخلی).
  • فروشنده می‌تواند فهرست گزینه‌های ارسال را براساس منطقه نشانی ارسال کالا تغییر دهد (برای مثال، ارسال بین‌المللی عادی یا سریع).
  • فروشنده می‌تواند هزینه ارسال جدید را براساس نشانی اعمال کند و قیمت کل را به‌روز کند.

با Web-based Payment Handler API، برنامه پرداخت می‌تواند رویداد «تغییر نشانی ارسال کالا» را ازطریق کارگر سرویس به فروشنده ارسال کند تا نشانی ارسال کالا جدید را اطلاع دهد. سرویس‌کار باید PaymentRequestEvent.changeShippingAddress() را با شیء نشانی جدید فراخوانی کند.

اطلاع دادن تغییر نشانی ارسال کالا به فروشنده
اطلاع دادن تغییر نشانی ارسال کالا به فروشنده

[payment handler] service-worker.js

...
// Received a message from the frontend
self.addEventListener('message', async e => {
  let details;
  try {
    switch (e.data.type) {
      …
      case 'SHIPPING_ADDRESS_CHANGED':
        const newAddress = e.data.shippingAddress;
        details =
          await payment_request_event.changeShippingAddress(newAddress);
      …

Key-term: Redacted address. در این مورد، اطلاع دادن نشانی کامل ارسال کالا به فروشنده ضروری نیست و حریم خصوصی مشتریان را به‌خطر می‌اندازد. فروشنده فقط بخش‌هایی از نشانی را دریافت می‌کند که برای تعیین هزینه ارسال لازم است. به‌طور مشخص، مرورگر فیلدهای organization، phone، recipient، addressLine را از نشانی ارائه‌شده توسط برنامه پرداخت پاک می‌کند و سپس رویداد shippingaddresschange را در DOM فروشنده ایجاد می‌کند.

فروشنده رویداد shippingaddresschange را از Payment Request API دریافت می‌کند تا بتواند با PaymentDetailsUpdate به‌روزشده پاسخ دهد.

[merchant]

request.addEventListener('shippingaddresschange', e => {
  // Read the updated shipping address and update the request.
  const addr = request.shippingAddress;
  const details = getPaymentDetailsFromShippingAddress(addr);
  // `updateWith()` sends back updated payment details
  e.updateWith(details);
});

وقتی فروشنده پاسخ می‌دهد، promise PaymentRequestEvent.changeShippingAddress() برگردانده‌شده با یک شیء PaymentRequestDetailsUpdate حل‌وفصل می‌شود.

[payment handler] service-worker.js

…
        // Notify the merchant of the shipping address change
        details = await payment_request_event.changeShippingAddress(newAddress);
        // Provided the new payment details,
        // send a message back to the frontend to update the UI
        postMessage('UPDATE_REQUEST', details);
        break;
…

از این شیء برای به‌روزرسانی میانای کاربری در بخش کاربری استفاده کنید. نمایش جزئیات پرداخت به‌روزشده را ببینید.

اطلاع دادن به فروشنده درباره تغییر گزینه ارسال کالا

گزینه‌های ارسال روش‌های تحویلی هستند که فروشندگان برای ارسال اقلام خریداری‌شده به مشتری استفاده می‌کنند. گزینه‌های ارسال کالا معمولاً شامل موارد زیر است:

  • ارسال رایگان
  • ارسال سریع
  • ارسال بین‌المللی
  • ارسال بین‌المللی Premium

هرکدام هزینه خودش را دارد. معمولاً روش‌ها و گزینه‌های سریع‌تر گران‌تر هستند.

فروشندگانی که از Payment Request API استفاده می‌کنند می‌توانند این انتخاب را به برنامه پرداخت واگذار کنند. برنامه پرداخت می‌تواند از این اطلاعات برای ساختن واسط کاربر استفاده کند و به مشتری اجازه دهد گزینه ارسال را انتخاب کند.

واسط کاربر انتخابگر گزینه ارسال کالا
رابط کاربری انتخابگر گزینه ارسال

فهرست گزینه‌های ارسال مشخص‌شده در Payment Request API فروشنده به‌عنوان ویژگی PaymentRequestEvent به سرویس‌کار برنامه پرداخت منتشر می‌شود.

[merchant]

const request = new PaymentRequest([{
  supportedMethods: 'https://bobbucks.dev/pay',
  data: { transactionId: '****' }
}], {
  displayItems: [{
    label: 'Anvil L/S Crew Neck - Grey M x1',
    amount: { currency: 'USD', value: '22.15' }
  }],
  shippingOptions: [{
    id: 'standard',
    label: 'Standard',
    amount: { value: '0.00', currency: 'USD' },
    selected: true
  }, {
    id: 'express',
    label: 'Express',
    amount: { value: '5.00', currency: 'USD' }
  }],
  total: {
    label: 'Total due',
    amount: { currency: 'USD', value : '22.15' }
  }
}, {  requestShipping: true });

برنامه پرداخت می‌تواند به فروشنده اطلاع دهد که مشتری کدام گزینه ارسال را انتخاب کرده است. این موضوع هم برای فروشنده و هم برای مشتری مهم است زیرا تغییر گزینه ارسال، قیمت کل را نیز تغییر می‌دهد. فروشنده باید از جدیدترین قیمت برای درستی‌سنجی پرداخت در آینده مطلع شود و مشتری نیز باید از این تغییر آگاه شود.

با Payment Handler API، برنامه پرداخت می‌تواند رویداد «تغییر گزینه ارسال» را ازطریق کارگر سرویس به فروشنده ارسال کند. سرویس‌کار باید PaymentRequestEvent.changeShippingOption() را با شناسه گزینه ارسال جدید فراخوانی کند.

اطلاع دادن به فروشنده درباره تغییر گزینه ارسال کالا
اطلاع دادن به فروشنده درباره تغییر گزینه ارسال کالا

[payment handler] service-worker.js

…
// Received a message from the frontend
self.addEventListener('message', async e => {
  let details;
  try {
    switch (e.data.type) {
      …
      case 'SHIPPING_OPTION_CHANGED':
        const newOption = e.data.shippingOptionId;
        details =
          await payment_request_event.changeShippingOption(newOption);
      …

فروشنده رویداد shippingoptionchange را از Payment Request API دریافت خواهد کرد. فروشنده باید از این اطلاعات برای به‌روزرسانی قیمت کل استفاده کند و سپس با PaymentDetailsUpdate به‌روزشده پاسخ دهد.

[merchant]

request.addEventListener('shippingoptionchange', e => {
  // selected shipping option
  const shippingOption = request.shippingOption;
  const newTotal = {
    currency: 'USD',
    label: 'Total due',
    value: calculateNewTotal(shippingOption),
  };
  // `updateWith()` sends back updated payment details
  e.updateWith({ total: newTotal });
});

وقتی فروشنده پاسخ می‌دهد، وعده‌ای که PaymentRequestEvent.changeShippingOption() برگردانده است با شیء PaymentRequestDetailsUpdate حل‌وفصل خواهد شد.

[payment handler] service-worker.js

…
        // Notify the merchant of the shipping option change
        details = await payment_request_event.changeShippingOption(newOption);
        // Provided the new payment details,
        // send a message back to the frontend to update the UI
        postMessage('UPDATE_REQUEST', details);
        break;
…

از این شیء برای به‌روزرسانی میانای کاربری در بخش کاربری استفاده کنید. نمایش جزئیات پرداخت به‌روزشده را ببینید.

جزئیات پرداخت به‌روزشده را نشان دهد

وقتی فروشنده به‌روزرسانی جزئیات پرداخت را تمام کرد، وعده‌های برگشتی از .changePaymentMethod()، .changeShippingAddress()، و .changeShippingOption() با شیء PaymentRequestDetailsUpdate مشترک حل‌وفصل می‌شود. گرداننده پرداخت می‌تواند از نتیجه برای منعکس کردن قیمت کل به‌روزشده و گزینه‌های ارسال در واسط کاربر استفاده کند.

فروشندگان ممکن است به چند دلیل خطا برگردانند:

  • روش پرداخت قابل‌قبول نیست.
  • نشانی ارسال کالا خارج از مناطق پشتیبانی‌شده آن‌ها است.
  • نشانی ارسال کالا حاوی اطلاعات نامعتبر است.
  • گزینه ارسال برای نشانی ارسال ارائه‌شده یا به دلیل دیگری قابل‌انتخاب نیست.

از ویژگی‌های زیر برای نشان دادن وضعیت خطا استفاده کنید:

  • error: رشته خطای قابل‌خواندن برای انسان. این بهترین رشته برای نمایش به مشتریان است.
  • ‫shippingAddressErrors: AddressErrors شیئی که حاوی رشته خطای دقیق برای هر ویژگی نشانی است. این کار زمانی مفید است که می‌خواهید فرمی را باز کنید که به مشتری اجازه می‌دهد نشانی‌اش را ویرایش کند و لازم است او را مستقیماً به فیلدهای نامعتبر هدایت کنید.
  • paymentMethodErrors: شیء خطای مختص روش پرداخت. می‌توانید از فروشندگان بخواهید خطای ساختاریافته ارائه دهند، اما نویسندگان مشخصات Web Payments توصیه می‌کنند که آن را به‌صورت رشته‌ای ساده نگه دارید.