Google Wallet का पास डेवलपमेंट फ़्लो

Google Wallet API, पहले से तय किए गए पास के सेट उपलब्ध कराता है. इन्हें खास तरह के इस्तेमाल के लिए ऑप्टिमाइज़ किया जाता है. जैसे, उपहार कार्ड, बोर्डिंग पास, इवेंट के टिकट वगैरह. एक जेनरिक पास भी होता है. इसे इस्तेमाल के उन मामलों में इस्तेमाल किया जाता है, जहां कोई खास तरह का पास उपलब्ध न हो.

इस लेख का मकसद, आपको Google Wallet API का इस्तेमाल करके पास बनाने और उसे जारी करने के बुनियादी तरीकों के बारे में जानकारी देना है. यहां दिए गए कुछ चरणों को पूरा करने के कई तरीके हैं. हालांकि, उच्च लेवल पर सभी पास टाइप, एक ही बेसिक डेवलपमेंट फ़्लो का इस्तेमाल करके बनाए जाते हैं.

पास बनाने के बारे में सिलसिलेवार तरीके से जानकारी पाने के लिए, वेब, ईमेल, और एसएमएस या Android ऐप्लिकेशन से जुड़ी गाइड देखें.

यह किसलिए है

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

जारी किया जाने वाला हर पास, पास की कैटगरी का होना चाहिए. आपको अपनी बनाई गई हर पास क्लास के लिए एक यूनीक आईडी भी असाइन करना होगा. इसका इस्तेमाल, पास बनाते समय उसका रेफ़रंस देने के लिए किया जाएगा.

यह कैसे किया जाता है

पास क्लास की जानकारी JSON फ़ॉर्मैट में दी जाती है. इसे Google Wallet REST API, Android SDK या Google Wallet Business Console की मदद से बनाया जा सकता है.

पास की कैटगरी दिखाएं

{
  "id": "ISSUER_ID.EVENT_CLASS_ID",
  "issuerName": "[TEST ONLY] Heraldic Event",
  "localizedIssuerName": {
    "defaultValue": {
      "language": "en-US",
      "value": "[TEST ONLY] Heraldic Event"
    }
  },
  "logo": {
    "sourceUri": {
      "uri": "https://images.unsplash.com/photo-1475721027785-f74eccf877e2?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=660&h=660"
    },
    "contentDescription": {
      "defaultValue": {
        "language": "en-US",
        "value": "LOGO_IMAGE_DESCRIPTION"
      }
    }
  },
  "eventName": {
    "defaultValue": {
      "language": "en-US",
      "value": "Google Live"
    }
  },
  "venue": {
    "name": {
      "defaultValue": {
        "language": "en-US",
        "value": "Shoreline Amphitheater"
      }
    },
    "address": {
      "defaultValue": {
        "language": "en-US",
        "value": "ADDRESS_OF_THE_VENUE"
      }
    }
  },
  "dateTime": {
    "start": "2023-04-12T11:30"
  },
  "reviewStatus": "UNDER_REVIEW",
  "hexBackgroundColor": "#264750",
  "heroImage": {
    "sourceUri": {
      "uri": "https://images.unsplash.com/photo-1501281668745-f7f57925c3b4?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1032&h=336"
    },
    "contentDescription": {
      "defaultValue": {
        "language": "en-US",
        "value": "HERO_IMAGE_DESCRIPTION"
      }
    }
  }
}
    

यह किसलिए है

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

पास ऑब्जेक्ट बनाए जाने पर, Google Wallet API एक नया पास सेव करता है और उसे आपके कार्ड जारी करने वाले खाते से जोड़ता है. सेव किया गया यह पास, पास ऑब्जेक्ट की यूनीक प्रॉपर्टी और उससे जुड़ी पास क्लास की टेंप्लेट प्रॉपर्टी को मिलाकर बनाया जाता है.

आपको हर पास ऑब्जेक्ट के लिए एक यूनीक आईडी भी असाइन करना होगा. इसका इस्तेमाल पास जारी करते समय उसका रेफ़रंस देने के लिए किया जाता है.

यह कैसे किया जाता है

पास ऑब्जेक्ट को JSON फ़ॉर्मैट में तय किया जाता है. इसे Google Wallet REST API या Android SDK की मदद से बनाया जा सकता है.

पास ऑब्जेक्ट का उदाहरण दिखाएं

{
  "id": "ISSUER_ID.OBJECT_ID",
  "classId": "ISSUER_ID.EVENT_CLASS_ID",
  "state": "ACTIVE",
  "seatInfo": {
    "seat": {
      "defaultValue": {
        "language": "en-us",
        "value": "5"
      }
    },
    "row": {
      "defaultValue": {
        "language": "en-us",
        "value": "G"
      }
    },
    "section": {
      "defaultValue": {
        "language": "en-us",
        "value": "40"
      }
    },
    "gate": {
      "defaultValue": {
        "language": "en-us",
        "value": "3A"
      }
    }
  },
  "barcode": {
    "type": "QR_CODE",
    "value": "BARCODE_VALUE",
    "alternateText": ""
  }
}
    

यह किसलिए है

किसी उपयोगकर्ता को पास जारी करने के लिए, पास क्लास और पास ऑब्जेक्ट को JSON Web Token (JWT) में एन्कोड किया जाना चाहिए. JWT फ़ॉर्मैट, दो पक्षों के बीच दावों को दिखाने के लिए एक सामान्य और ओपन स्टैंडर्ड है. Google Wallet API की मदद से पास जारी करने के मामले में, JWT का इस्तेमाल यह दावा करने के लिए किया जाता है कि उपयोगकर्ता के पास, आपके जारी करने वाले खाते से जुड़े खास पास को ऐक्सेस करने का अधिकार है.

जब कोई JWT Google Wallet API को भेजा जाता है, तो कोड में बदले गए डेटा का इस्तेमाल किसी खास पास की पहचान करने और उसे उपयोगकर्ता को जारी करने के लिए किया जाता है. अगर पास पहले ही जारी किया जा चुका है, तो यह डेटा Google Wallet API को यह भी पहचानने की अनुमति देता है कि पास का डुप्लीकेट है. ऐसा इसलिए किया जाता है, ताकि उसे उपयोगकर्ता के Google Wallet में एक से ज़्यादा बार न जोड़ा जा सके.

यह कैसे किया जाता है

JWT, JWT की स्पेसिफ़िकेशन के हिसाब से, JSON फ़ॉर्मैट में तय किया जाता है. Google Wallet API की मदद से पास जारी करने के लिए JWT तय करने के लिए, आपको उस पास की जानकारी देनी होती है जिसे आपको JWT की payload प्रॉपर्टी में जारी करना है.

JWT का उदाहरण दिखाएं

{
  "iss": "issuer@example.com",
  "aud": "google",
  "typ": "savetowallet",
  "iat": 1696877738,
  "origins": [
    "www.example.com"
  ],
  "payload": {
    "eventTicketObjects": [
      {
        "id": "ISSUER_ID.LOYALTY_OBJECT_SUFFIX"
      }
    ]
  }
}
    

यह किसलिए है

पास जारी करने के लिए, Google Wallet API को भेजे गए सभी JWT, Google Wallet Business Console में पहले सबमिट किए गए क्रेडेंशियल से साइन किए जाने चाहिए. साइनिंग की मदद से, JWT को एन्क्रिप्ट करने के लिए आपके क्रेडेंशियल का इस्तेमाल किया जाता है, ताकि आपके पास सुरक्षित रहें. साथ ही, Google Wallet API को यह पुष्टि करने की अनुमति देने के लिए कि इसमें कोड में बदली गई पास की जानकारी मान्य है और आपके खाते से जुड़ी है.

यह कैसे किया जाता है

Google Wallet क्लाइंट लाइब्रेरी और Android SDK टूल, आपके JWT साइन करने के लिए आसान तरीके उपलब्ध कराते हैं. यहां कई ओपन-सोर्स लाइब्रेरी भी उपलब्ध हैं, जो कोड साइनिंग की जटिलता को संभाल लेती हैं.

पास जारी करने के लिए, Google Wallet REST API का इस्तेमाल करने वाले लोगों के लिए, JWT को Google Cloud सेवा खाता कुंजी से साइन किया जाता है. Google Wallet के Android SDK टूल का इस्तेमाल करने वाले लोगों के लिए, यह SDK टूल आपके ऐप्लिकेशन साइनिंग सर्टिफ़िकेट के SHA-1 फ़िंगरप्रिंट से, JWT पर साइन इन करने का काम अपने-आप मैनेज करता है.

आपके क्रेडेंशियल की सुरक्षा के लिए, JWT को सिर्फ़ आपके सर्वर पर या आपके ऐप्लिकेशन में Google Wallet के Android SDK टूल का इस्तेमाल करके साइन किया जाना चाहिए.

उदाहरण के तौर पर दिए गए कोड पर हस्ताक्षर करना दिखाएं

Java

  // Create the JWT as a HashMap object
  HashMap claims = new HashMap();
  claims.put("iss", ((ServiceAccountCredentials) credentials).getClientEmail());
  claims.put("aud", "google");
  claims.put("origins", Arrays.asList("www.example.com"));
  claims.put("typ", "savetowallet");

  // Create the Google Wallet payload and add to the JWT
  HashMap payload = new HashMap();
  payload.put("eventTicketObjects", Arrays.asList(newObject));
  claims.put("payload", payload);

  // Google Cloud service account credentials are used to sign the JWT
  Algorithm algorithm =
      Algorithm.RSA256(
          null, (RSAPrivateKey) ((ServiceAccountCredentials) credentials).getPrivateKey());
  String token = JWT.create().withPayload(claims).sign(algorithm);
        

Node.JS

  // Create the JWT claims
  let claims = {
    iss: this.credentials.client_email,
    aud: 'google',
    origins: ['www.example.com'],
    typ: 'savetowallet',
    payload: {
      eventTicketObjects: [newObject]
    },
  };

  // The service account credentials are used to sign the JWT
  let token = jwt.sign(claims, this.credentials.private_key, { algorithm: 'RS256' });
        

Python

  # Create the JWT claims
  claims = {
      'iss': self.credentials.service_account_email,
      'aud': 'google',
      'origins': ['www.example.com'],
      'typ': 'savetowallet',
      'payload': {
          # The listed classes and objects will be created
          'eventTicketObjects': [new_object]
      }
  }

  # The service account credentials are used to sign the JWT
  signer = crypt.RSASigner.from_service_account_file(self.key_file_path)
  token = jwt.encode(signer, claims).decode('utf-8')
        

यह किसलिए है

साइन किया हुआ JWT बनाने के बाद, Google Wallet उपयोगकर्ता को पास जारी किया जा सकता है! इसके लिए, उपयोगकर्ता को 'Google Wallet में जोड़ें' बटन या लिंक उपलब्ध कराएं. जब कोई उपयोगकर्ता बटन या हाइपरलिंक पर क्लिक करता है, तो साइन किया गया JWT Google Wallet API को भेजा जाता है. इसके बाद, यह आपके सेव किए गए क्रेडेंशियल की मदद से, इसे डिक्रिप्ट करता है. JWT के हस्ताक्षर की पुष्टि होने के बाद, उपयोगकर्ता को पास जारी किया जाएगा, ताकि वह उसे Google Wallet में सेव कर सके.

यह कैसे किया जाता है

किसी Android ऐप्लिकेशन के लिए 'Google Wallet में जोड़ें' बटन बनाने के लिए, Google Wallet का Android SDK इस्तेमाल करें. इसमें, बटन जनरेट करने के तरीके बताए गए हैं. वेब, ईमेल, और मैसेज के साथ-साथ दूसरे सभी प्लैटफ़ॉर्म के लिए, https://pay.google.com/gp/v/save/<signed_jwt> फ़ॉर्मैट में हाइपरलिंक बनाएं. जहां भी संभव हो, इस लिंक को 'Google वॉलेट में जोड़ें' बटन के रूप में उपयोगकर्ता को डिलीवर करना सर्वश्रेष्ठ होता है.

'Google Wallet में जोड़ें' बटन का इस्तेमाल करने के बारे में ज़्यादा जानकारी के लिए, Google Wallet API ब्रैंड के दिशा-निर्देश देखें

उदाहरण कोड दिखाएं

  https://pay.google.com/gp/v/save/<signed_jwt>
        

Android SDK

  private lateinit var walletClient: PayClient
  private val addToGoogleWalletRequestCode = 1000
  private lateinit var addToGoogleWalletButton: View

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    walletClient = Pay.getClient(this)
    addToGoogleWalletButton.setOnClickListener {
      walletClient.savePasses(newObjectJson, this, addToGoogleWalletRequestCode)
    }
  }
        

पास की जानकारी सेव करने के बाद, उपयोगकर्ता के Google Wallet ऐप्लिकेशन में उसकी जानकारी दिखेगी. साथ ही, सेव किए गए पास की जानकारी भी दिखेगी.

JWT में पास ऑब्जेक्ट और पास क्लास बनाना

पास की क्लास और पास से जुड़े ऑब्जेक्ट, पहले से ही Google Wallet REST API या Android SDK का इस्तेमाल करके बनाए जा सकते हैं. पास बनाने के बाद, उनका इस्तेमाल उनके आईडी का रेफ़रंस देकर, पास जारी करने के लिए किया जाता है.

इसके अलावा, पास की क्लास और पास ऑब्जेक्ट 'ठीक समय पर' बनाए जा सकते हैं. इसके लिए, JSON को सीधे JWT में एम्बेड किया जा सकता है. इसका इस्तेमाल, उपयोगकर्ता को पास जारी करने के लिए किया जाता है. इस तरीके में, Google Wallet API की मदद से पास की क्लास और पास ऑब्जेक्ट बनाए जाते हैं. ऐसा तब किया जाता है, जब 'Google Wallet में जोड़ें' बटन या लिंक का इस्तेमाल करके साइन किया गया JWT भेजा जाता है.

उदाहरण के लिए, यहां दी गई टेबल में, payload.eventTicketClasses और payload.eventTicketObjects प्रॉपर्टी का इस्तेमाल करके, नए पास क्लास और पास ऑब्जेक्ट वाला JWT दिखाया गया है. ध्यान दें कि ये प्रॉपर्टी कलेक्शन हैं. इसलिए, वे एक या एक से ज़्यादा पास क्लास या पास ऑब्जेक्ट स्वीकार कर सकती हैं. JWT में सिर्फ़ एक नया पास ऑब्जेक्ट भी शामिल किया जा सकता है, जो किसी मौजूदा पास क्लास का रेफ़रंस उसके आईडी से देता है.

JWT का उदाहरण दिखाएं

  {
    "iss": "issuer@example.com",
    "aud": "google",
    "typ": "savetowallet",
    "iat": 1696877738,
    "origins": [
      "www.example.com"
    ],
    "payload": {
      "eventTicketClasses": [{
        "id": "ISSUER_ID.EVENT_CLASS_ID",
        "issuerName": "[TEST ONLY] Heraldic Event",
        "localizedIssuerName": {
          "defaultValue": {
            "language": "en-US",
            "value": "[TEST ONLY] Heraldic Event"
          }
        },
        "logo": {
          "sourceUri": {
            "uri": "https://images.unsplash.com/photo-1475721027785-f74eccf877e2?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=660&h=660"
          },
          "contentDescription": {
            "defaultValue": {
              "language": "en-US",
              "value": "LOGO_IMAGE_DESCRIPTION"
            }
          }
        },
        "eventName": {
          "defaultValue": {
            "language": "en-US",
            "value": "Google Live"
          }
        },
        "venue": {
          "name": {
            "defaultValue": {
              "language": "en-US",
              "value": "Shoreline Amphitheater"
            }
          },
          "address": {
            "defaultValue": {
              "language": "en-US",
              "value": "ADDRESS_OF_THE_VENUE"
            }
          }
        },
        "dateTime": {
          "start": "2023-04-12T11:30"
        },
        "reviewStatus": "UNDER_REVIEW",
        "hexBackgroundColor": "#264750",
        "heroImage": {
          "sourceUri": {
            "uri": "https://images.unsplash.com/photo-1501281668745-f7f57925c3b4?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1032&h=336"
          },
          "contentDescription": {
            "defaultValue": {
              "language": "en-US",
              "value": "HERO_IMAGE_DESCRIPTION"
            }
          }
        }
      }],
      "eventTicketObjects": [{
        "id": "ISSUER_ID.OBJECT_ID",
        "classId": "ISSUER_ID.EVENT_CLASS_ID",
        "state": "ACTIVE",
        "seatInfo": {
          "seat": {
            "defaultValue": {
              "language": "en-us",
              "value": "5"
            }
          },
          "row": {
            "defaultValue": {
              "language": "en-us",
              "value": "G"
            }
          },
          "section": {
            "defaultValue": {
              "language": "en-us",
              "value": "40"
            }
          },
          "gate": {
            "defaultValue": {
              "language": "en-us",
              "value": "3A"
            }
          }
        },
        "barcode": {
          "type": "QR_CODE",
          "value": "BARCODE_VALUE",
          "alternateText": ""
        }
      }]
    }
  }