requestAutocomplete

Weź moje pieniądze, a nie mój czas

Jake Archibald
Jake Archibald

Wprowadzenie

Lubię internet. Podsumowując, uważam, że to całkiem dobry pomysł. Dlatego często biorę udział w dyskusjach na temat reklam internetowych i reklam natywnych. Wkrótce rozmówca zaczyna mówić o łatwości dokonywania płatności za pomocą systemów natywnych. Moja zwykła reakcja to wyrzucenie bomby dymnej i ucieczka z pokoju, śmiejąc się jak szaleniec, ponieważ nie jest to argument, w którym mogę wygrać. W internecie mobilnym współczynnik porzuceń koszyka może sięgać nawet 97%. Wyobraź sobie to w rzeczywistym świecie. Wyobraź sobie, że 97% osób w supermarkecie ma pełny koszyk z produktami, które chcą kupić, odwracają go i wychodzą. Niektórzy z nich po prostu podają ceny produktów, których nigdy nie zamierzali kupić, ale ważnym czynnikiem jest też okropne wrażenia użytkowników związane z zakupami w internecie. Nakładamy na użytkowników podatek od ich zrównoważenia psychicznego. Pomyśl o przyjemnym procesie płatności w internecie, zwłaszcza na urządzeniach mobilnych. To sklep z aplikacjami, prawda? Lub przynajmniej w podobnym zamkniętym systemie, który już ma Twoje dane do płatności. To jest problem. Wymaga to od witryn zobowiązania się do określonego dostawcy płatności, z którym użytkownik musi mieć konto i być zalogowany, lub zobowiązania się do platformy, która wymaga od użytkowników zalogowania się w danym dostawcy płatności, np. sklepów z aplikacjami, które wymagają od Ciebie pisania kodu tylko na danej platformie. Jeśli nie zrobisz tego, użytkownik będzie musiał dotykać ekranu lub klawiatury, aż zniknie mu skóra z palców lub się podda. Musimy to naprawić.

requestAutocomplete

W świecie WebGL, WebRTC i innych fajnych interfejsów API, których nazwy zaczynają się od „Web”, requestAutocomplete jest raczej nieatrakcyjne. Jest to jednak superbohater w beżowym stroju. Małe, nudne API, które może przebić w serce wampira czasu płatności internetowych.

Zamiast polegać na konkretnym dostawcy płatności, witryna prosi o dane do płatności z przeglądarki, która przechowuje je w imieniu użytkownika. Wersja funkcji requestAutocomplete() w Chrome jest też zintegrowana z Portfelem Google (obecnie tylko dla użytkowników w Stanach Zjednoczonych). Wypróbuj to na naszej witrynie testowej

form.requestAutocomplete

Elementy formularza zawierają jedną nową metodę, requestAutocomplete, która prosi przeglądarkę o wypełnienie formularza. Przeglądarka wyświetli użytkownikowi okno z prośbą o uprawnienia i możliwością wybrania, które dane chce udostępnić. Nie możesz wywoływać tej metody w dowolnym momencie. Musisz ją wywołać podczas wykonywania określonych zdarzeń interakcji, takich jak zdarzenia przesunięcia kursora w górę/w dół, kliknięcia, naciśnięcia klawiszy i dotknięcia. Jest to celowe ograniczenie zabezpieczeń.

button.addEventListener('click', function(event) {
  form.requestAutocomplete();
  event.preventDefault();
});

// TODO: listen for autocomplete events on the form

Zanim przyjrzymy się zdarzeniom, musimy się upewnić, że przeglądarka rozumie pola formularza.

Wymagania dotyczące formularza

W czasach, gdy internet był czarno-biały, przeglądarka Internet Explorer 5 wprowadziła nowy atrybut autocomplete w elementach formularza. Można było ustawić go na „wyłączone”, aby zatrzymać wyświetlanie sugestii przez przeglądarkę. Ten interfejs API został rozszerzony, aby umożliwić określanie oczekiwanej zawartości pola bez modyfikowania atrybutu „name”. requestAutocomplete używa go do łączenia pól formularza z danymi użytkownika.

<input name="fullname" autocomplete="name">

Specyfikacja requestAutocomplete nie dotyczy tylko płatności, ale obecna implementacja w Chrome w dużej mierze tak. W przyszłości przeglądarki będą mogły obsługiwać inne rodzaje danych, takie jak informacje logowania i generator haseł, dane paszportowe, a nawet przesyłanie awatara.

Obecnie w Chrome requestAutocomplete rozpoznaje te elementy:

Płatność

  • e-mail
  • cc-name – imię i nazwisko na karcie
  • cc-number – numer karty,
  • cc-exp-month - miesiąc ważności karty jako dwucyfrowa liczba
  • cc-exp-year – rok ważności karty podany w cztery cyfry
  • cc-csc – 3-4-cyfrowy kod zabezpieczający karty
<input type="email" autocomplete="email" name="email">
<input type="text" autocomplete="cc-name" name="card-name">
<input type="text" autocomplete="cc-number" name="card-num">
<input type="text" autocomplete="cc-exp-month" name="card-exp-month">
<input type="text" autocomplete="cc-exp-year" name="card-exp-year">
<input type="text" autocomplete="cc-csc" name="card-csc">

Użyte powyżej atrybuty „name” są tylko przykładami. Nie musisz używać konkretnych wartości. Jeśli chcesz używać tego formularza w przypadku użytkowników bez requestAutocomplete (co jest idealnym rozwiązaniem), dodaj etykiety, uporządkuj układ i wprowadź podstawową walidację HTML5.

Nie musisz ograniczać się do elementów wejściowych. Możesz użyć dowolnego typu danych formularza. W przypadku pól daty ważności karty możesz na przykład użyć wartości <select>.

Szczegółowy komunikat w konsoli.
Szczegółowy komunikat w konsoli

Adres

  • name – pełne imię i nazwisko. Podanie pełnego imienia i nazwiska w pojedynczym polu jest znacznie lepsze niż podanie kilku pól. Wiele pól, takich jak imię i nazwisko, jest oparte na zachodnich standardach i może nie mieć sensu w innych kulturach. Poza tym łatwiej jest wpisać dane w pojedynczym polu.

  • tel – pełny numer telefonu, w tym kod kraju, może być podzielony na

    • tel-country-code – np. +44
    • tel-national - reszta
  • street-address – pełny adres z elementami rozdzielonymi przecinkami, który można podzielić na

    • address-line1
    • address-line2 – może być pusty.
  • miejscowość – miasto/miejscowość;

  • region – kod stanu, hrabstwa lub kantonu;

  • kod pocztowy – kod pocztowy, kod pocztowy, kod pocztowy przesyłki

  • country

Powyższe informacje należy podawać w połączeniu z: - płatnościami - dostawą

<input type="text" autocomplete="billing name" required name="billing-name">
<input type="tel" autocomplete="billing tel" required name="billling-tel">
<input type="text" autocomplete="billing address-line1" required name="billing-address1">
<input type="text" autocomplete="billing address-line2" required name="billing-address2">
<input type="text" autocomplete="billing locality" required name="billing-locality">
<input type="text" autocomplete="billing region" required name="billing-region">
<input type="text" autocomplete="billing postal-code" required name="billing-postal-code">
<select autocomplete="billing country" required name="billing-country">
  <option value="US">United States</option>
  …
</select>

<input type="text" autocomplete="shipping name" name="shipping-name">
…

Ponownie, atrybuty nazwy są przykładami, możesz użyć dowolnej nazwy. Oczywiście nie wszystkie formularze powinny wymagać adresu dostawy.Nie pytaj mnie na przykład, gdzie chcę, aby dostarczono mój pokój hotelowy. Obecna lokalizacja jest często punktem sprzedaży. Mamy już formularz i wiemy, jak poprosić o autocompletion. Ale…

Kiedy należy wywołać requestAutocomplete?

Najlepiej jest wyświetlić okno requestAutocomplete zamiast wczytywać stronę z formularzem płatności. Jeśli wszystko pójdzie dobrze, użytkownik nie powinien w ogóle widzieć formularza.

Proces płatności

Typowym wzorcem jest strona koszyka z przyciskiem „Zakończ zakupy”, który prowadzi do formularza danych do płatności. W tej sytuacji chcesz załadować formularz płatności na stronie koszyka, ale ukryć go przed użytkownikiem i wywołać funkcję requestAutocomplete, gdy użytkownik kliknie przycisk „Zakończ zakupy”. Pamiętaj, że aby uniknąć ostrzeżenia Skeletor, musisz wyświetlać stronę koszyka za pomocą SSL. Na początek ukryj przycisk płatności, aby użytkownik nie mógł go kliknąć, dopóki nie będzie gotowy. Chcesz to zrobić tylko w przypadku użytkowników z JavaScriptem. W nagłówku strony:

<script>document.documentElement.className += ' js';</script>

W pliku CSS:

.js #checkout-button,
#checkout-form.for-autocomplete {
  display: none;
}

Musimy umieścić formularz płatności na stronie koszyka. Może ona znajdować się w dowolnym miejscu. Dzięki temu, że jest ona osadzona w CSS, nie jest widoczna dla użytkownika.

<form id="checkout-form" class="for-autocomplete" action="/checkout" method="post">
  …fields for payment, billing address &amp; shipping if relevant…
</form>

Teraz nasz kod JavaScript może zacząć wszystko konfigurować:

function enhanceForm() {
  var button = document.getElementById('checkout-button');
  var form = document.getElementById('checkout-form');

  // show the checkout button
  button.style.display = 'block';

  // exit early if there's no requestAutocomplete support
  if (!form.requestAutocomplete) {
    // be sure to show the checkout button so users can
    // access the basic payment form!
    return;
  }

  button.addEventListener('click', function(event) {
    form.requestAutocomplete();
    event.preventDefault();
  });

  // TODO: listen for autocomplete events on the form
}

Funkcję enhanceForm wywołujesz na stronie koszyka, po wypełnieniu formularza i kliknięciu przycisku. Przeglądarki obsługujące requestAutocomplete będą korzystać z nowego szybkiego interfejsu, a inne przeglądarki będą używać zwykłej formy płatności. Aby uzyskać punkty bonusowe, możesz wczytać kod HTML formularza za pomocą XHR w ramach enhanceForm. Oznacza to, że formularz możesz wczytać tylko w przeglądarkach obsługujących requestAutocomplete. Nie musisz pamiętać o dodaniu formularza do każdej strony, z której możesz wywołać enhanceForm. W ten sposób działa witryna demonstracyjna.

Wywołano funkcję requestAutocomplete. Co dalej?

Proces autouzupełniania jest asynchroniczny, requestAutocomplete zwracany jest od razu. Aby sprawdzić, jak to działa, posłuchaj kilku nowych wydarzeń:

form.addEventListener('autocomplete', function() {
  // hurrah! You got all the data you needed
});

form.addEventListener('autocompleteerror', function(event) {
  if (event.reason == 'invalid') {
    // the form was populated, but it failed html5 validation
    // eg, the data didn't match one of your pattern attributes
  }
  else if (event.reason == 'cancel') {
    // the user aborted the process
  }
  else if (event.reason == 'disabled') {
    // the browser supports requestAutocomplete, but it's not
    // available at this time. Eg, it wasn't called from an
    // interaction event or the page is insecure
  }
});

Jeśli wszystko działa prawidłowo, możesz robić z tymi danymi, co tylko chcesz. Najprostszym rozwiązaniem jest przesłanie formularza. Serwer może następnie zweryfikować dane i przekazać użytkownikowi stronę z potwierdzeniem, na której uwzględniony jest koszt dostawy. Jeśli dane są nieprawidłowe, możesz wyświetlić formularz i wyróżnić pola, które użytkownik musi poprawić. Możesz też przesłać formularz i pozwolić, aby standardowa weryfikacja po stronie serwera przejęła kontrolę. Jeśli użytkownik anulował proces, nie musisz nic robić. Jeśli funkcja jest wyłączona, przekieruj użytkownika do zwykłego formularza. W większości przypadków Twoi słuchacze będą wyglądać tak:

form.addEventListener('autocomplete', function() {
  form.submit();
});

form.addEventListener('autocompleteerror', function(event) {
  if (event.reason == 'invalid') {
    form.submit();
  }
  else if (event.reason != 'cancel') {
    window.location = '/checkout-page/';
  }
});

Gdzie przeglądarka przechowuje moje dane?

Specyfikacja nie określa, gdzie są przechowywane dane, co pozwala przeglądarkom na wprowadzanie innowacji. Jeśli zalogujesz się w Chrome, możesz zapisać szczegóły w Portfelu Google, dzięki czemu będą dostępne na innych urządzeniach, na których jesteś zalogowany(-a). Jeśli przechowujesz swoje dane w Portfelu, requestAutocomplete nie będzie udostępniać Twojego rzeczywistego numeru karty, co zwiększa bezpieczeństwo. Jeśli nie zalogujesz się w Chrome lub zdecydujesz się nie używać Portfela Google, Twoje dane zostaną opcjonalnie zapisane lokalnie w przeglądarce, aby można było ich użyć ponownie. Obecnie jest to stan rzeczy, ale w przyszłości Chrome i inne przeglądarki mogą obsługiwać dodatkowych dostawców płatności.

Upraszczanie płatności

To trochę śmieszne, że użytkownicy muszą za każdym razem, gdy chcą dokonać zakupu, wpisywać swoje dane do płatności. Gdy witryna przechowuje dane do płatności, jest to wygodniejsze, ale niepokoi mnie, że tak wiele witryn przechowuje dane mojej karty. To idealny problem do rozwiązania przez standardy internetowe. requestAutocomplete może wprowadzić płatności jednym kliknięciem w całej sieci bez konieczności wiązania się z usługą lub platformą. Czas najwyższy!

Bonus: obsługa formularzy wielostronicowych

Lepiej jest wywołać funkcję requestAutocomplete raz i zebrać wszystkie potrzebne dane. Jeśli nie możesz zmodyfikować serwera, aby otrzymywał wszystkie te dane jednocześnie, nie ma problemu. Pobierz dane z wypełnionego formularza i prześlij je w wygodny dla siebie sposób. Za pomocą tej poręcznej funkcji możesz rejestrować wszystkie obecnie obsługiwane dane jako prosty obiekt, bez konieczności tworzenia formularza. Gdy już je masz, możesz je przekształcić w dowolny format, którego potrzebuje Twój serwer, i opublikować w kilku krokach.

checkoutButton.addEventListener('click', function() {
  requestUserData({
    billing: true,
    shipping: true
  }, function(response) {
    if (response.err == 'cancel') {
      // exit silently
      return;
    }
    if (response.err) {
      // fall back to normal form
      window.location.href = '/normal-checkout-form/';
      return;
    }

    // the rest is just made-up pseudo code as an example
    postToServer(data.shipping).then(function() {
      return postToServer(data.billing);
    }).then(function() {
      return postToServer(data.cc);
    }).catch(function() {
      // handle error
    });
  });
});