Android पेमेंट ऐप्लिकेशन से शिपिंग और संपर्क जानकारी देना

वेब पेमेंट्स एपीआई की मदद से, शिपिंग का पता और पैसे चुकाने वाले व्यक्ति की संपर्क जानकारी देने के लिए, Android के पेमेंट ऐप्लिकेशन को अपडेट करने का तरीका.

Sahel Sharify
Sahel Sharify

पब्लिश किया गया: 17 जुलाई, 2020, पिछली बार अपडेट किया गया: 27 मई, 2025

वेब फ़ॉर्म की मदद से शिपिंग का पता और संपर्क जानकारी डालना, ग्राहकों के लिए मुश्किल हो सकता है. इससे गड़बड़ियां हो सकती हैं और कन्वर्ज़न रेट कम हो सकता है.

इसलिए, पेमेंट रिक्वेस्ट एपीआई में शिपिंग पते और संपर्क जानकारी का अनुरोध करने की सुविधा है. इससे कई फ़ायदे मिलते हैं:

  • उपयोगकर्ता, सिर्फ़ कुछ टैप करके सही पता चुन सकते हैं.
  • पता हमेशा स्टैंडर्ड फ़ॉर्मैट में दिखता है.
  • गलत पता सबमिट करने की संभावना कम होती है.

ब्राउज़र, शिपिंग पते और संपर्क जानकारी को इकट्ठा करने की प्रोसेस को पेमेंट ऐप्लिकेशन पर भेज सकते हैं, ताकि एक ही जगह से पेमेंट किया जा सके. इस सुविधा को अधिकार सौंपना कहा जाता है.

जब भी संभव हो, Chrome, ग्राहक के शिपिंग पते और संपर्क जानकारी को इकट्ठा करने का काम, Android पर इस्तेमाल किए जा रहे पेमेंट ऐप्लिकेशन को सौंप देता है. ऐसा करने से, चेकआउट के दौरान होने वाली परेशानी कम हो जाती है.

शिपिंग के पते और शिपिंग के विकल्प के आधार पर, व्यापारी/कंपनी की वेबसाइट, शिपिंग के विकल्पों और कुल कीमत को डाइनैमिक तौर पर अपडेट कर सकती है.

शिपिंग का विकल्प और शिपिंग पता बदलने की कार्रवाई. देखें कि इससे शिपिंग के विकल्पों और कुल कीमत पर डाइनैमिक तौर पर क्या असर पड़ता है.

किसी मौजूदा Android पेमेंट ऐप्लिकेशन में, डेलिगेशन की सुविधा जोड़ने के लिए, यह तरीका अपनाएं:

  1. एलान करें कि ऐप्लिकेशन में, ऐक्सेस ट्रांसफ़र करने की कौनसी सुविधाएं काम करती हैं.
  2. ज़रूरी पेमेंट विकल्पों के लिए, PAY इंटेंट एक्सट्रा को पार्स करें.
  3. पेमेंट के रिस्पॉन्स में ज़रूरी जानकारी दें.
  4. [ज़रूरी नहीं] डाइनैमिक फ़्लो की सुविधा:
    1. उपयोगकर्ता के चुने गए पेमेंट के तरीके, शिपिंग पते या शिपिंग के विकल्प में हुए बदलावों के बारे में व्यापारी/कंपनी/कारोबारी को सूचना दें.
    2. व्यापारी/कंपनी से पेमेंट की अपडेट की गई जानकारी पाएं. उदाहरण के लिए, शिपिंग के लिए चुने गए विकल्प की कीमत के आधार पर, कुल रकम में बदलाव.

उन प्रतिनिधियों के बारे में बताना जिन्हें अनुमतियां दी गई हैं

ब्राउज़र को उस अतिरिक्त जानकारी की सूची की जानकारी होनी चाहिए जो आपका पेमेंट ऐप्लिकेशन उपलब्ध करा सकता है, ताकि वह उस जानकारी को इकट्ठा करने का काम आपके ऐप्लिकेशन को सौंप सके. अपने ऐप्लिकेशन के AndroidManifest.xml में, काम करने वाले डेलिगेशन को <meta-data> के तौर पर बताएं.

<activity
  android:name=".PaymentActivity"
    <meta-data
    android:name="org.chromium.payment_supported_delegations"
    android:resource="@array/chromium_payment_supported_delegations" />
</activity>

android:resource, किसी ऐसे <string-array> पर ले जाना चाहिए जिसमें इनमें से सभी वैल्यू या इनका कोई सबसेट शामिल हो:

  • payerName
  • payerEmail
  • payerPhone
  • shippingAddress

यहां दिए गए उदाहरण में, सिर्फ़ शिपिंग का पता और पैसे चुकाने वाले का ईमेल पता दिया जा सकता है.

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string-array name="chromium_payment_supported_delegations">
    <item>payerEmail</item>
    <item>shippingAddress</item>
  </string-array>
</resources>

पेमेंट के ज़रूरी विकल्पों के लिए, PAY इंटेंट एक्सट्रा को पार्स करना

कारोबारी या कंपनी, paymentOptions डिक्शनरी का इस्तेमाल करके, ज़रूरी जानकारी दे सकता है. Chrome, ज़रूरी विकल्पों की सूची उपलब्ध कराएगा. आपका ऐप्लिकेशन, PAY गतिविधि में paymentOptions इंटेंट एक्सट्रा को पास करके ये विकल्प उपलब्ध करा सकता है.

paymentOptions

paymentOptions, कारोबारी या कंपनी के बताए गए पेमेंट के उन विकल्पों का सबसेट है जिनके लिए आपके ऐप्लिकेशन ने, डेलिगेशन की सुविधा का एलान किया है.

Kotlin

val paymentOptions: Bundle? = extras.getBundle("paymentOptions")
val requestPayerName: Boolean? = paymentOptions?.getBoolean("requestPayerName")
val requestPayerPhone: Boolean? = paymentOptions?.getBoolean("requestPayerPhone")
val requestPayerEmail: Boolean? = paymentOptions?.getBoolean("requestPayerEmail")
val requestShipping: Boolean? = paymentOptions?.getBoolean("requestShipping")
val shippingType: String? = paymentOptions?.getString("shippingType")

Java

Bundle paymentOptions = extras.getBundle("paymentOptions");
if (paymentOptions != null) {
    Boolean requestPayerName = paymentOptions.getBoolean("requestPayerName");
    Boolean requestPayerPhone = paymentOptions.getBoolean("requestPayerPhone");
    Boolean requestPayerEmail = paymentOptions.getBoolean("requestPayerEmail");
    Boolean requestShipping = paymentOptions.getBoolean("requestShipping");
    String shippingType = paymentOptions.getString("shippingType");
}

इसमें ये पैरामीटर शामिल हो सकते हैं:

  • requestPayerName - यह बूलियन बताता है कि पेमेंट करने वाले का नाम देना ज़रूरी है या नहीं.
  • requestPayerPhone - यह बूलियन वैल्यू बताती है कि पैसे चुकाने वाले के पास फ़ोन होना ज़रूरी है या नहीं.
  • requestPayerEmail - यह बूलियन बताता है कि पैसे चुकाने वाले का ईमेल पता देना ज़रूरी है या नहीं.
  • requestShipping - यह बूलियन वैल्यू है, जिससे यह पता चलता है कि शिपिंग की जानकारी देना ज़रूरी है या नहीं.
  • shippingType - शिपिंग का टाइप दिखाने वाली स्ट्रिंग. शिपिंग का टाइप, "shipping", "delivery" या "pickup" हो सकता है. आपका ऐप्लिकेशन, उपयोगकर्ता का पता या शिपिंग के विकल्पों को चुनने के लिए पूछते समय, अपने यूज़र इंटरफ़ेस (यूआई) में इस हिंट का इस्तेमाल कर सकता है.

shippingOptions

shippingOptions, व्यापारी/कंपनी के तय किए गए शिपिंग के विकल्पों का पैकेज है. यह पैरामीटर सिर्फ़ तब मौजूद होगा, जब paymentOptions.requestShipping == true.

Kotlin

val shippingOptions: List<ShippingOption>? =
    extras.getParcelableArray("shippingOptions")?.mapNotNull {
        p -> from(p as Bundle)
    }

Java

Parcelable[] shippingOptions = extras.getParcelableArray("shippingOptions");
for (Parcelable it : shippingOptions) {
  if (it != null && it instanceof Bundle) {
    Bundle shippingOption = (Bundle) it;
  }
}

शिपिंग का हर विकल्प एक Bundle होता है, जिसमें ये कुंजियां होती हैं.

  • id - शिपिंग के विकल्प का आइडेंटिफ़ायर.
  • label - उपयोगकर्ता को दिखाया जाने वाला शिपिंग के विकल्प का लेबल.
  • amount - शिपिंग के लिए खरीदार से लिए जाने वाले शुल्क का बंडल, जिसमें currency और value बटन शामिल हैं. इन बटन की वैल्यू स्ट्रिंग होती है.
    • currency, शिपिंग के लिए खरीदार से लिए जाने वाले शुल्क की मुद्रा दिखाता है. यह मुद्रा, ISO4217 के मुताबिक, तीन अक्षरों वाले अक्षर कोड के तौर पर दिखती है
    • value, शिपिंग के लिए खरीदार से लिए जाने वाले शुल्क की वैल्यू को दशमलव वाली मान्य मुद्रा के तौर पर दिखाता है
  • selected - पेमेंट ऐप्लिकेशन में शिपिंग के विकल्प दिखने पर, शिपिंग का विकल्प चुना जाना चाहिए या नहीं.

selected के अलावा, सभी कुंजियों की वैल्यू स्ट्रिंग होती हैं. selected की वैल्यू बूलियन हो.

Kotlin

val id: String = bundle.getString("id")
val label: String = bundle.getString("label")
val amount: Bundle = bundle.getBundle("amount")
val selected: Boolean = bundle.getBoolean("selected", false)

Java

String id = bundle.getString("id");
String label = bundle.getString("label");
Bundle amount = bundle.getBundle("amount");
Boolean selected = bundle.getBoolean("selected", false);

पेमेंट के रिस्पॉन्स में ज़रूरी जानकारी देना

आपके ऐप्लिकेशन को PAY गतिविधि के जवाब में, ज़रूरी अतिरिक्त जानकारी शामिल करनी चाहिए.

ऐसा करने के लिए, इन पैरामीटर को इंटेंट एक्स्ट्रा के तौर पर तय करना होगा:

  • payerName - पेमेंट करने वाले का पूरा नाम. paymentOptions.requestPayerName के 'सही' होने पर, यह एक स्ट्रिंग होनी चाहिए.
  • payerPhone - पैसे चुकाने वाले का फ़ोन नंबर. paymentOptions.requestPayerPhone के 'सही' होने पर, यह एक स्ट्रिंग होनी चाहिए.
  • payerEmail - पेमेंट करने वाले का ईमेल पता. paymentOptions.requestPayerEmail के सही होने पर, यह एक खाली स्ट्रिंग नहीं होनी चाहिए.
  • shippingAddress - उपयोगकर्ता का दिया गया शिपिंग पता. paymentOptions.requestShipping के 'सही' होने पर, यह एक ऐसा बंडल होना चाहिए जिसमें कोई आइटम मौजूद हो. बंडल में ये कुंजियां होनी चाहिए, जो पते के अलग-अलग हिस्सों को दिखाती हैं.
    • countryCode
    • postalCode
    • sortingCode
    • region
    • city
    • dependentLocality
    • addressLine
    • organization
    • recipient
    • phone addressLine के अलावा, सभी कुंजियों की वैल्यू स्ट्रिंग होती हैं. addressLine एक स्ट्रिंग का कलेक्शन है.
  • shippingOptionId - उपयोगकर्ता के चुने गए शिपिंग विकल्प का आइडेंटिफ़ायर. paymentOptions.requestShipping के सही होने पर, यह स्ट्रिंग खाली नहीं होनी चाहिए.

पेमेंट के जवाब की पुष्टि करना

अगर इस्तेमाल किए गए पेमेंट ऐप्लिकेशन से मिले पेमेंट रिस्पॉन्स की गतिविधि का नतीजा RESULT_OK पर सेट है, तो Chrome अपने एक्सट्रा में ज़रूरी अतिरिक्त जानकारी देखेगा. अगर पुष्टि नहीं हो पाती है, तो Chrome, request.show() से अस्वीकार किए गए प्रॉमिस के साथ, डेवलपर को गड़बड़ी का यह मैसेज दिखाएगा:

'Payment app returned invalid response. Missing field "payerEmail".'
'Payment app returned invalid response. Missing field "payerName".'
'Payment app returned invalid response. Missing field "payerPhone".'
'Payment app returned invalid shipping address in response.'
'... is not a valid CLDR country code, should be 2 upper case letters [A-Z].'
'Payment app returned invalid response. Missing field "shipping option".'

यहां दिया गया कोड सैंपल, मान्य रिस्पॉन्स का उदाहरण है:

Kotlin

fun Intent.populateRequestedPaymentOptions() {
    if (requestPayerName) {
        putExtra("payerName", "John Smith")
    }
    if (requestPayerPhone) {
        putExtra("payerPhone", "5555555555")
    }
    if (requestPayerEmail) {
        putExtra("payerEmail", "john.smith@gmail.com")
    }
    if (requestShipping) {
        val address: Bundle = Bundle()
        address.putString("countryCode", "CA")
        val addressLines: Array<String> =
                arrayOf<String>("111 Richmond st. West")
        address.putStringArray("addressLines", addressLines)
        address.putString("region", "Ontario")
        address.putString("city", "Toronto")
        address.putString("postalCode", "M5H2G4")
        address.putString("recipient", "John Smith")
        address.putString("phone", "5555555555")
        putExtra("shippingAddress", address)
        putExtra("shippingOptionId", "standard")
    }
}

Java

private Intent populateRequestedPaymentOptions() {
    Intent result = new Intent();
    if (requestPayerName) {
        result.putExtra("payerName", "John Smith");
    }
    if (requestPayerPhone) {
        presult.utExtra("payerPhone", "5555555555");
    }
    if (requestPayerEmail) {
        result.putExtra("payerEmail", "john.smith@gmail.com");
    }
    if (requestShipping) {
        Bundle address = new Bundle();
        address.putExtra("countryCode", "CA");
        address.putExtra("postalCode", "M5H2G4");
        address.putExtra("region", "Ontario");
        address.putExtra("city", "Toronto");
        String[] addressLines = new String[] {"111 Richmond st. West"};
        address.putExtra("addressLines", addressLines);
        address.putExtra("recipient", "John Smith");
        address.putExtra("phone", "5555555555");
        result.putExtra("shippingAddress", address);
        result.putExtra("shippingOptionId", "standard");
    }
    return result;
}

ज़रूरी नहीं: डाइनैमिक फ़्लो की सुविधा

कभी-कभी लेन-देन की कुल कीमत बढ़ जाती है. जैसे, जब उपयोगकर्ता एक्सप्रेस शिपिंग का विकल्प चुनता है या जब उपयोगकर्ता अंतरराष्ट्रीय शिपिंग पता चुनता है, तो शिपिंग के उपलब्ध विकल्पों की सूची या उनकी कीमतें बदल जाती हैं. जब आपका ऐप्लिकेशन, उपयोगकर्ता के चुने गए शिपिंग पते या विकल्प की जानकारी देता है, तो उसे शिपिंग पते या विकल्प में हुए किसी भी बदलाव के बारे में व्यापारी/कंपनी को सूचना देनी चाहिए. साथ ही, उपयोगकर्ता को पेमेंट के तरीके की अपडेट की गई जानकारी (व्यापारी/कंपनी की ओर से दी गई) दिखानी चाहिए.

व्यापारी/कंपनी को नए बदलावों के बारे में सूचना देने के लिए, IPaymentDetailsUpdateServiceCallback इंटरफ़ेस लागू करें और UPDATE_PAYMENT_DETAILS इंटेंट फ़िल्टर की मदद से, अपने AndroidManifest.xml में इसकी जानकारी दें.

PAY इंटेंट को ट्रिगर करने के तुरंत बाद, Chrome उसी पैकेज में UPDATE_PAYMENT_DETAILS सेवा (अगर मौजूद हो) से कनेक्ट हो जाएगा जिसमें PAY इंटेंट मौजूद है. साथ ही, उपयोगकर्ता के पेमेंट के तरीके, शिपिंग के विकल्प या शिपिंग पते में हुए बदलावों के बारे में सूचना देने के लिए, आपके पेमेंट ऐप्लिकेशन को IPaymentDetailsUpdateService एंड-पॉइंट उपलब्ध कराने के लिए setPaymentDetailsUpdateService(service) को कॉल करेगा.

इंटर-प्रोसेस कम्यूनिकेशन (आईपीसी) पाने पर packageManager.getPackagesForUid(Binder.getCallingUid()) का इस्तेमाल करें. इससे यह पुष्टि की जा सकती है कि PAY इंटेंट को ट्रिगर करने वाले ऐप्लिकेशन का पैकेज नाम, IPaymentDetailsUpdateServiceCallback तरीकों को ट्रिगर करने वाले ऐप्लिकेशन के पैकेज नाम से मेल खाता है या नहीं.

एआईडीएल

यहां दिए गए कॉन्टेंट के साथ दो AIDL फ़ाइलें बनाएं:

org/chromium/components/payments/IPaymentDetailsUpdateServiceCallback.aidl

package org.chromium.components.payments;

import android.os.Bundle;
import org.chromium.components.payments.IPaymentDetailsUpdateService;

interface IPaymentDetailsUpdateServiceCallback {
    oneway void updateWith(in Bundle updatedPaymentDetails);

    oneway void paymentDetailsNotUpdated();

    oneway void setPaymentDetailsUpdateService(IPaymentDetailsUpdateService service);
}

org/chromium/components/payments/IPaymentDetailsUpdateService.aidl

package org.chromium.components.payments;

import android.os.Bundle;
import org.chromium.components.payments.IPaymentDetailsUpdateServiceCallback;

interface IPaymentDetailsUpdateService {
    oneway void changePaymentMethod(in Bundle paymentHandlerMethodData,
            IPaymentDetailsUpdateServiceCallback callback);

    oneway void changeShippingOption(in String shippingOptionId,
            IPaymentDetailsUpdateServiceCallback callback);

    oneway void changeShippingAddress(in Bundle shippingAddress,
            IPaymentDetailsUpdateServiceCallback callback);
}

सेवा

IPaymentDetailsUpdateServiceCallback सेवा लागू करें.

Kotlin

class SampleUpdatePaymentDetailsCallbackService : Service() {
    private val binder = object : IPaymentDetailsUpdateServiceCallback.Stub() {
        override fun updateWith(updatedPaymentDetails: Bundle) {}

        override fun paymentDetailsNotUpdated() {}

        override fun setPaymentDetailsUpdateService(service: IPaymentDetailsUpdateService) {}
    }

    override fun onBind(intent: Intent?): IBinder? {
        return binder
    }
}

Java

import org.chromium.components.paymsnts.IPaymentDetailsUpdateServiceCallback;

public class SampleUpdatePaymentDetailsCallbackService extends Service {
    private final IPaymentDetailsUpdateServiceCallback.Stub mBinder =
        new IPaymentDetailsUpdateServiceCallback.Stub() {
            @Override
            public void updateWith(Bundle updatedPaymentDetails) {}

            @Override
            public void paymentDetailsNotUpdated() {}

            @Override
            public void setPaymentDetailsUpdateService(IPaymentDetailsUpdateService service) {}
        };

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }
}

AndroidManifest.xml

अपनी AndroidManifest.xml में IPaymentDetailsUpdateServiceCallback के लिए सेवा को एक्सपोज़ करें.

<service
    android:name=".SampleUpdatePaymentDetailsCallbackService"
    android:exported="true">
    <intent-filter>
        <action android:name="org.chromium.intent.action.UPDATE_PAYMENT_DETAILS" />
    </intent-filter>
</service>

उपयोगकर्ता के चुने गए पेमेंट के तरीके, शिपिंग पते या शिपिंग के विकल्प में हुए बदलावों के बारे में व्यापारी/कंपनी/कारोबारी को सूचना देना

Kotlin

try {
    if (isOptionChange) {
        service?.changeShippingOption(selectedOptionId, callback)
    } else (isAddressChange) {
        service?.changeShippingAddress(selectedAddress, callback)
    } else {
        service?.changePaymentMethod(methodData, callback)
    }
} catch (e: RemoteException) {
    // Handle the remote exception
}

Java

if (service == null) {
  return;
}

try {
    if (isOptionChange) {
        service.changeShippingOption(selectedOptionId, callback);
    } else (isAddressChange) {
        service.changeShippingAddress(selectedAddress, callback);
    } else {
        service.changePaymentMethod(methodData, callback);
    }
} catch (RemoteException e) {
    // Handle the remote exception
}

changePaymentMethod

उपयोगकर्ता के चुने गए पेमेंट के तरीके में हुए बदलावों के बारे में व्यापारी/कंपनी/कारोबारी को सूचना देता है. paymentHandlerMethodData बंडल में methodName और वैकल्पिक details बटन शामिल हैं. दोनों की वैल्यू स्ट्रिंग होती है. Chrome, ऐसे बंडल की जांच करेगा जिसमें methodName न हो. अगर पुष्टि नहीं हो पाती है, तो callback.updateWith के ज़रिए गड़बड़ी का कोई एक मैसेज भेजा जाएगा.updatePaymentDetails

'Method data required.'
'Method name required.'

changeShippingOption

उपयोगकर्ता के चुने गए शिपिंग के विकल्प में हुए बदलावों के बारे में व्यापारी/कंपनी/कारोबारी को सूचना देता है. shippingOptionId, शिपिंग के लिए कारोबारी या कंपनी के बताए गए विकल्पों में से किसी एक का आइडेंटिफ़ायर होना चाहिए. Chrome, shippingOptionId के खाली न होने की जांच करेगा. अगर पुष्टि नहीं हो पाती है, तो callback.updateWith के ज़रिए गड़बड़ी का यह मैसेज भेजकर, updatePaymentDetails भेजा जाएगा.

'Shipping option identifier required.'

changeShippingAddress

उपयोगकर्ता के दिए गए शिपिंग पते में हुए बदलावों के बारे में व्यापारी/कंपनी/कारोबारी को सूचना देता है. Chrome, मान्य countryCode वाले किसी खाली shippingAddress बंडल की जांच करेगा. अगर पुष्टि नहीं हो पाती है, तो callback.updateWith के ज़रिए गड़बड़ी का यह मैसेज भेजकर updatePaymentDetails भेजा जाएगा.

'Payment app returned invalid shipping address in response.'

अमान्य स्थिति की गड़बड़ी का मैसेज

अगर Chrome को बदलाव का कोई अनुरोध मिलने पर, अमान्य स्थिति का पता चलता है, तो वह updatePaymentDetails बंडल के साथ callback.updateWith को कॉल करेगा. बंडल में सिर्फ़ "Invalid state" वाली error कुंजी होगी. अमान्य स्थिति के उदाहरण:

  • जब Chrome, व्यापारी/कंपनी/कारोबारी के किसी पिछले बदलाव (जैसे, बदलाव का कोई इवेंट जारी है) के जवाब का इंतज़ार कर रहा हो.
  • पेमेंट ऐप्लिकेशन से मिले शिपिंग के विकल्प का आइडेंटिफ़ायर, व्यापारी/कंपनी/कारोबारी के बताए गए शिपिंग के किसी भी विकल्प से मेल नहीं खाता.

व्यापारी/कंपनी से पेमेंट की अपडेट की गई जानकारी पाना

Kotlin

override fun updateWith(updatedPaymentDetails: Bundle) {}

override fun paymentDetailsNotUpdated() {}

Java

@Override
public void updateWith(Bundle updatedPaymentDetails) {}

@Override
public void paymentDetailsNotUpdated() {}

updatedPaymentDetails, PaymentRequestDetailsUpdate WebIDL डिक्शनरी के बराबर का बंडल है. इसमें ये वैकल्पिक कुंजियां शामिल हैं:

  • total - currency और value बटन वाला बंडल, दोनों बटन की वैल्यू स्ट्रिंग है
  • shippingOptions - शिपिंग के विकल्पों का पैकेज किया जा सकने वाला ऐरे
  • error - गड़बड़ी का सामान्य मैसेज देने वाली स्ट्रिंग. उदाहरण के लिए, जब changeShippingOption शिपिंग के मान्य विकल्प का आइडेंटिफ़ायर नहीं देता है
  • stringifiedPaymentMethodErrors - पेमेंट के तरीके की पुष्टि करने से जुड़ी गड़बड़ियों की जानकारी देने वाली JSON स्ट्रिंग
  • addressErrors - शिपिंग पते और स्ट्रिंग वैल्यू जैसी वैकल्पिक कुंजियों वाला बंडल. हर कुंजी, शिपिंग पते के उस हिस्से से जुड़ी पुष्टि से जुड़ी गड़बड़ी दिखाती है जिससे वह जुड़ी है.
  • modifiers - बंडल का ऐसा कलेक्शन जिसे पार्सल किया जा सकता है. इसमें हर बंडल में एक total और एक methodData फ़ील्ड होता है. ये दोनों फ़ील्ड भी बंडल होते हैं.

अगर कोई कुंजी मौजूद नहीं है, तो इसका मतलब है कि उसकी वैल्यू नहीं बदली है.