वेब पेमेंट्स एपीआई की मदद से, शिपिंग का पता और पैसे चुकाने वाले व्यक्ति की संपर्क जानकारी देने के लिए, Android के पेमेंट ऐप्लिकेशन को अपडेट करने का तरीका.
पब्लिश किया गया: 17 जुलाई, 2020, पिछली बार अपडेट किया गया: 27 मई, 2025
वेब फ़ॉर्म की मदद से शिपिंग का पता और संपर्क जानकारी डालना, ग्राहकों के लिए मुश्किल हो सकता है. इससे गड़बड़ियां हो सकती हैं और कन्वर्ज़न रेट कम हो सकता है.
इसलिए, पेमेंट रिक्वेस्ट एपीआई में शिपिंग पते और संपर्क जानकारी का अनुरोध करने की सुविधा है. इससे कई फ़ायदे मिलते हैं:
- उपयोगकर्ता, सिर्फ़ कुछ टैप करके सही पता चुन सकते हैं.
- पता हमेशा स्टैंडर्ड फ़ॉर्मैट में दिखता है.
- गलत पता सबमिट करने की संभावना कम होती है.
ब्राउज़र, शिपिंग पते और संपर्क जानकारी को इकट्ठा करने की प्रोसेस को पेमेंट ऐप्लिकेशन पर भेज सकते हैं, ताकि एक ही जगह से पेमेंट किया जा सके. इस सुविधा को अधिकार सौंपना कहा जाता है.
जब भी संभव हो, Chrome, ग्राहक के शिपिंग पते और संपर्क जानकारी को इकट्ठा करने का काम, Android पर इस्तेमाल किए जा रहे पेमेंट ऐप्लिकेशन को सौंप देता है. ऐसा करने से, चेकआउट के दौरान होने वाली परेशानी कम हो जाती है.
शिपिंग के पते और शिपिंग के विकल्प के आधार पर, व्यापारी/कंपनी की वेबसाइट, शिपिंग के विकल्पों और कुल कीमत को डाइनैमिक तौर पर अपडेट कर सकती है.
किसी मौजूदा Android पेमेंट ऐप्लिकेशन में, डेलिगेशन की सुविधा जोड़ने के लिए, यह तरीका अपनाएं:
- एलान करें कि ऐप्लिकेशन में, ऐक्सेस ट्रांसफ़र करने की कौनसी सुविधाएं काम करती हैं.
- ज़रूरी पेमेंट विकल्पों के लिए,
PAY
इंटेंट एक्सट्रा को पार्स करें. - पेमेंट के रिस्पॉन्स में ज़रूरी जानकारी दें.
- [ज़रूरी नहीं] डाइनैमिक फ़्लो की सुविधा:
उन प्रतिनिधियों के बारे में बताना जिन्हें अनुमतियां दी गई हैं
ब्राउज़र को उस अतिरिक्त जानकारी की सूची की जानकारी होनी चाहिए जो आपका पेमेंट ऐप्लिकेशन उपलब्ध करा सकता है, ताकि वह उस जानकारी को इकट्ठा करने का काम आपके ऐप्लिकेशन को सौंप सके. अपने ऐप्लिकेशन के 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
फ़ील्ड होता है. ये दोनों फ़ील्ड भी बंडल होते हैं.
अगर कोई कुंजी मौजूद नहीं है, तो इसका मतलब है कि उसकी वैल्यू नहीं बदली है.