Google Wallet পাস উন্নয়ন প্রবাহ

Google Wallet API একটি পূর্ব-নির্ধারিত পাস প্রকারের সেট সরবরাহ করে যা নির্দিষ্ট ব্যবহারের ক্ষেত্রে অপ্টিমাইজ করা হয়, যেমন উপহার কার্ড, বোর্ডিং পাস, ইভেন্ট টিকিট এবং আরও অনেক কিছু। একটি জেনেরিক পাস টাইপও রয়েছে যা ব্যবহারের ক্ষেত্রে উদ্দেশ্যে যেখানে একটি নির্দিষ্ট পাস টাইপ উপলব্ধ নেই।

এই নিবন্ধটি Google Wallet API ব্যবহার করে একটি পাস তৈরি এবং ইস্যু করার জন্য প্রয়োজনীয় প্রাথমিক পদক্ষেপগুলির সাথে আপনাকে পরিচিত করার উদ্দেশ্যে। নীচে বিস্তারিত কিছু ধাপ সম্পন্ন করার একাধিক উপায় আছে, কিন্তু উচ্চ স্তরে সমস্ত পাসের ধরন একই মৌলিক উন্নয়ন প্রবাহ অনুসরণ করে তৈরি করা হয়।

একটি পাস তৈরির বিস্তারিত ওয়াকথ্রু-এর জন্য, ওয়েব, ইমেল এবং এসএমএস বা অ্যান্ড্রয়েড অ্যাপের জন্য গাইড দেখুন।

এটা কি জন্য

একটি পাস ক্লাস বৈশিষ্ট্যগুলির একটি সেট সংজ্ঞায়িত করে যা একটি টেমপ্লেটের মতো একাধিক পাস জুড়ে সাধারণ। উদাহরণ স্বরূপ, আপনি যদি কোনো ইভেন্টের টিকিট ইস্যু করে থাকেন, তাহলে পাস ক্লাস এমন ক্ষেত্রগুলিকে সংজ্ঞায়িত করবে যা সমস্ত টিকিট জুড়ে একই, যেমন ইভেন্টের নাম, তারিখ এবং সময়।

আপনার ইস্যু করা প্রতিটি পাস অবশ্যই একটি পাস ক্লাস উল্লেখ করতে হবে। আপনার তৈরি করা প্রতিটি পাস ক্লাসে আপনাকে অবশ্যই একটি অনন্য আইডি বরাদ্দ করতে হবে, যা পাস তৈরি করার সময় এটিকে উল্লেখ করতে ব্যবহৃত হয়।

কিভাবে এটা করা হয়েছে

একটি পাস ক্লাস 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"
      }
    }
  }
}
    

এটা কি জন্য

একটি পাস অবজেক্ট একটি অনন্য পাসের বৈশিষ্ট্যগুলিকে সংজ্ঞায়িত করে যা একটি নির্দিষ্ট ব্যবহারকারীকে জারি করা হবে। উদাহরণস্বরূপ, একটি ইভেন্ট টিকিটের জন্য পাস অবজেক্ট এমন ক্ষেত্রগুলিকে সংজ্ঞায়িত করবে যা একটি নির্দিষ্ট টিকিটের জন্য অনন্য, যেমন আসন নম্বর বা সেই টিকিটের জন্য একটি QR কোড।

যখন একটি পাস অবজেক্ট তৈরি করা হয়, তখন 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 ওয়েব টোকেনে (JWT) এনকোড করা আবশ্যক৷ JWT ফরম্যাট হল দুটি পক্ষের মধ্যে দাবির প্রতিনিধিত্ব করার জন্য একটি সাধারণ এবং উন্মুক্ত মান। Google Wallet API দিয়ে পাস ইস্যু করার ক্ষেত্রে, JWTs ব্যবহার করা হয় একটি দাবি পাঠানোর জন্য যে ব্যবহারকারীর একটি নির্দিষ্ট পাস অ্যাক্সেস করার অধিকার রয়েছে যা আপনার ইস্যুকারী অ্যাকাউন্টের সাথে যুক্ত।

যখন একটি JWT Google Wallet API এ পাঠানো হয়, তখন এনকোড করা ডেটা একটি নির্দিষ্ট পাস সনাক্ত করতে এবং ব্যবহারকারীকে এটি ইস্যু করতে ব্যবহৃত হয়। যদি পাসটি ইতিমধ্যে ইস্যু করা হয়ে থাকে, তবে এই ডেটা Google Wallet API-কে পাসটি একটি সদৃশ তা সনাক্ত করার অনুমতি দেয় যাতে এটি ব্যবহারকারীর Google Wallet-এ একাধিকবার যুক্ত না হয়৷

কিভাবে এটা করা হয়েছে

JWT স্পেসিফিকেশনের উপর ভিত্তি করে JSON ফরম্যাটে JWT সংজ্ঞায়িত করা হয়। 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 ক্লাউড পরিষেবা অ্যাকাউন্ট কী দিয়ে স্বাক্ষরিত। যারা Google Wallet Android SDK ব্যবহার করেন তাদের জন্য, SDK স্বয়ংক্রিয়ভাবে আপনার অ্যাপ সাইনিং সার্টিফিকেটের SHA-1 ফিঙ্গারপ্রিন্টের সাথে JWT-এ স্বাক্ষর করার ব্যবস্থা করে।

আপনার শংসাপত্রগুলি সুরক্ষিত করতে, JWTs শুধুমাত্র আপনার সার্ভারে সাইন ইন করা উচিত বা আপনার অ্যাপে Google Wallet Android SDK ব্যবহার করা উচিত।

উদাহরণ কোড সাইনিং দেখান

জাভা

  // 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);
        

নোড.জেএস

  // 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' });
        

পাইথন

  # 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-এ সংরক্ষণ করার জন্য জারি করা হবে।

কিভাবে এটা করা হয়েছে

একটি অ্যান্ড্রয়েড অ্যাপের জন্য একটি 'Google ওয়ালেটে যোগ করুন' বোতাম তৈরি করতে, Google Wallet Android SDK ব্যবহার করুন, যা বোতাম তৈরি করার পদ্ধতি প্রদান করে। ওয়েব, ইমেল এবং পাঠ্য বার্তা সহ অন্যান্য সমস্ত প্ল্যাটফর্মের জন্য, https://pay.google.com/gp/v/save/<signed_jwt> ফর্ম্যাটে একটি হাইপারলিঙ্ক তৈরি করুন। যেখানে সম্ভব, 'Google Wallet এ যোগ করুন' বোতাম হিসাবে ব্যবহারকারীর কাছে এই লিঙ্কটি সরবরাহ করা ভাল৷

'Google Wallet এ যোগ করুন' বোতাম ব্যবহার করার বিষয়ে আরও তথ্যের জন্য, Google Wallet API ব্র্যান্ড নির্দেশিকা দেখুন

উদাহরণ কোড দেখান

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

অ্যান্ড্রয়েড এসডিকে

  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 দ্বারা পাস ক্লাস এবং পাস অবজেক্ট তৈরি করা হয় যখন স্বাক্ষরিত JWT একটি 'Google Wallet এ যোগ করুন' বোতাম বা লিঙ্ক ব্যবহার করে পাঠানো হয়।

উদাহরণ স্বরূপ, 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": ""
        }
      }]
    }
  }