ব্যবসায়ীদের জন্য পেমেন্ট ডেটা ক্রিপ্টোগ্রাফি

Google Pay API একটি স্বাক্ষরিত এবং এনক্রিপ্ট করা PaymentMethodToken পেলোডে পেমেন্ট পদ্ধতি ফেরত দেয়। ফেরত দেওয়া পেমেন্ট পদ্ধতিগুলি হয় PAN ধারণকারী কার্ড, অথবা টোকেনাইজড কার্ড যা ডিভাইস PAN এবং ক্রিপ্টোগ্রাম ধারণ করে।

পেলোডে protocolVersion নামে একটি ক্ষেত্র থাকে যা পেলোডের প্রাপককে কোন ক্রিপ্টোগ্রাফিক প্রিমিটিভগুলি ব্যবহৃত হচ্ছে এবং প্রত্যাশিত ফর্ম্যাটটি বলে।

এই নির্দেশিকাটিতে Google-স্বাক্ষরিত এবং এনক্রিপ্ট করা পেমেন্ট পদ্ধতির টোকেনের অনুরোধ করার জন্য কীভাবে একটি পাবলিক কী তৈরি করতে হয় সে সম্পর্কে তথ্য প্রদান করা হয়েছে এবং টোকেনটি যাচাই এবং ডিক্রিপ্ট করার জন্য কী কী পদক্ষেপ নিতে হবে তার বিশদ বিবরণ দেওয়া হয়েছে।

এই নির্দেশিকাটি শুধুমাত্র protocolVersion = ECv2 এর ক্ষেত্রে প্রযোজ্য।

যেহেতু আপনি সরাসরি পেমেন্ট কার্ডের তথ্য পান, তাই নিশ্চিত করুন যে আপনার অ্যাপটি PCI DSS অনুগত এবং আপনার সার্ভারগুলিতে ব্যবহারকারীর পেমেন্ট শংসাপত্রগুলি নিরাপদে পরিচালনা করার জন্য প্রয়োজনীয় অবকাঠামো রয়েছে।

Google Pay API ECv2 PaymentMethodToken পেলোড ব্যবহার করার জন্য একজন ইন্টিগ্রেটরকে কী করতে হবে তা নিম্নলিখিত ধাপগুলি রূপরেখা দেয়:

  1. গুগল রুট সাইনিং কীগুলি আনুন।
  2. যাচাই করুন যে ইন্টারমিডিয়েট সাইনিং কী-এর স্বাক্ষরটি মেয়াদোত্তীর্ণ না হওয়া যেকোনো রুট সাইনিং কী-এর দ্বারা বৈধ।
  3. পেলোডের মধ্যবর্তী স্বাক্ষরকারী কীটির মেয়াদ শেষ হয়ে গেছে কিনা তা যাচাই করুন।
  4. ইন্টারমিডিয়েট সাইনিং কী ব্যবহার করে পেলোডের স্বাক্ষর বৈধ কিনা তা যাচাই করুন।
  5. স্বাক্ষর যাচাই করার পর পেলোডের বিষয়বস্তু ডিক্রিপ্ট করুন।
  6. যাচাই করুন যে বার্তাটির মেয়াদ শেষ হয়ে গেছে কিনা। এর জন্য আপনাকে পরীক্ষা করতে হবে যে বর্তমান সময় ডিক্রিপ্ট করা বিষয়বস্তুর মধ্যে থাকা messageExpiration ক্ষেত্রের চেয়ে কম।
  7. ডিক্রিপ্ট করা কন্টেন্টে পেমেন্ট পদ্ধতি ব্যবহার করুন এবং চার্জ করুন।

আমাদের টিঙ্ক লাইব্রেরির নমুনা কোডটি ১-৬ ধাপ সম্পাদন করে।

পেমেন্ট পদ্ধতির টোকেন কাঠামো

PaymentData প্রতিক্রিয়ায় Google যে বার্তাটি ফেরত দিয়েছে তা হল একটি UTF-8 এনকোডেড, সিরিয়ালাইজড JSON অবজেক্ট যার মধ্যে নিম্নলিখিত টেবিলে উল্লেখিত কীগুলি রয়েছে:

নাম আদর্শ বিবরণ
protocolVersion স্ট্রিং বার্তাটি তৈরি করার জন্য এনক্রিপশন বা স্বাক্ষরকরণ স্কিম চিহ্নিত করে। প্রয়োজনে এটি সময়ের সাথে সাথে প্রোটোকলকে বিকশিত হতে দেয়।
signature স্ট্রিং বার্তাটি গুগল থেকে এসেছে কিনা তা যাচাই করে। এটি base64-এনকোডেড, এবং ইন্টারমিডিয়েট সাইনিং কী ব্যবহার করে ECDSA দিয়ে তৈরি।
intermediateSigningKey বস্তু একটি JSON অবজেক্ট যাতে Google এর ইন্টারমিডিয়েট সাইনিং কী থাকে। এতে keyValue , keyExpiration এবং signatures সহ signedKey থাকে। ইন্টারমিডিয়েট সাইনিং কী সিগনেচার যাচাইকরণ প্রক্রিয়া সহজ করার জন্য এটি সিরিয়ালাইজ করা হয়েছে।
signedMessage স্ট্রিং একটি JSON অবজেক্টকে HTML-নিরাপদ স্ট্রিং হিসেবে সিরিয়ালাইজ করা হয়েছে যাতে encryptedMessage , ephemeralPublicKey এবং tag থাকে। স্বাক্ষর যাচাইকরণ প্রক্রিয়া সহজ করার জন্য এটি সিরিয়ালাইজ করা হয়েছে।

উদাহরণ

JSON-এ একটি পেমেন্ট পদ্ধতির টোকেন প্রতিক্রিয়া নিম্নরূপ:

{
  "protocolVersion":"ECv2",
  "signature":"MEQCIH6Q4OwQ0jAceFEkGF0JID6sJNXxOEi4r+mA7biRxqBQAiAondqoUpU/bdsrAOpZIsrHQS9nwiiNwOrr24RyPeHA0Q\u003d\u003d",
  "intermediateSigningKey":{
    "signedKey": "{\"keyExpiration\":\"1542323393147\",\"keyValue\":\"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/1+3HBVSbdv+j7NaArdgMyoSAM43yRydzqdg1TxodSzA96Dj4Mc1EiKroxxunavVIvdxGnJeFViTzFvzFRxyCw\\u003d\\u003d\"}",
    "signatures": ["MEYCIQCO2EIi48s8VTH+ilMEpoXLFfkxAwHjfPSCVED/QDSHmQIhALLJmrUlNAY8hDQRV/y1iKZGsWpeNmIP+z+tCQHQxP0v"]
  },
  "signedMessage":"{\"tag\":\"jpGz1F1Bcoi/fCNxI9n7Qrsw7i7KHrGtTf3NrRclt+U\\u003d\",\"ephemeralPublicKey\":\"BJatyFvFPPD21l8/uLP46Ta1hsKHndf8Z+tAgk+DEPQgYTkhHy19cF3h/bXs0tWTmZtnNm+vlVrKbRU9K8+7cZs\\u003d\",\"encryptedMessage\":\"mKOoXwi8OavZ\"}"
}

মধ্যবর্তী স্বাক্ষরকারী কী

intermediateSigningKey হল একটি UTF-8 এনকোডেড, সিরিয়ালাইজড JSON অবজেক্ট যাতে নিম্নলিখিত মানগুলি রয়েছে:

নাম আদর্শ বিবরণ
signedKey স্ট্রিং একটি base64-এনকোডেড বার্তা যাতে কীটির পেমেন্টের বিবরণ রয়েছে।
signatures স্ট্রিং যাচাই করে যে মধ্যবর্তী সাইনিং কীটি Google থেকে এসেছে। এটি base64-এনকোডেড, এবং ECDSA দিয়ে তৈরি।

স্বাক্ষরিত চাবি

signedKey হল একটি UTF-8 এনকোডেড, সিরিয়ালাইজড JSON অবজেক্ট যাতে নিম্নলিখিত মানগুলি রয়েছে:

নাম আদর্শ বিবরণ
keyValue স্ট্রিং ASN.1 টাইপে এনকোড করা একটি বেস৬৪ সংস্করণ কী। SubjectPublicKeyInfo X.509 স্ট্যান্ডার্ডে সংজ্ঞায়িত করা হয়েছে।
keyExpiration স্ট্রিং মধ্যবর্তী কীটির মেয়াদ শেষ হওয়ার তারিখ এবং সময়, যুগের পর থেকে UTC মিলিসেকেন্ড হিসাবে। ইন্টিগ্রেটররা মেয়াদ শেষ হয়ে যাওয়া যেকোনো কী প্রত্যাখ্যান করে।

স্বাক্ষরিত বার্তা

signedMessage হল একটি UTF-8 এনকোডেড, সিরিয়ালাইজড JSON অবজেক্ট যার মধ্যে নিম্নলিখিত মানগুলি রয়েছে:

নাম আদর্শ বিবরণ
encryptedMessage স্ট্রিং একটি base64-এনকোডেড এনক্রিপ্টেড বার্তা যাতে পেমেন্ট তথ্য এবং কিছু অতিরিক্ত নিরাপত্তা ক্ষেত্র থাকে।
ephemeralPublicKey স্ট্রিং একটি বেস৬৪-এনকোডেড এফেমেরাল পাবলিক কী যা প্রাইভেট কী-এর সাথে যুক্ত, যা বার্তাটিকে আনকম্প্রেসড পয়েন্ট ফর্ম্যাটে এনক্রিপ্ট করে। আরও তথ্যের জন্য, এনক্রিপশন পাবলিক কী ফর্ম্যাট দেখুন।
tag স্ট্রিং encryptedMessage এর একটি base64-এনকোডেড MAC।

এনক্রিপ্ট করা বার্তা

ডিক্রিপ্টেড encryptedMessage একটি UTF-8 এনকোডেড, সিরিয়ালাইজড JSON অবজেক্ট। JSON-এ দুটি লেভেল রয়েছে। বাইরের লেভেলে মেটাডেটা এবং নিরাপত্তার জন্য অন্তর্ভুক্ত ক্ষেত্র রয়েছে, যখন ভিতরের লেভেলটি আরেকটি JSON অবজেক্ট যা প্রকৃত পেমেন্ট ক্রেডেনশিয়ালকে প্রতিনিধিত্ব করে।

encryptedMessage সম্পর্কে আরও বিস্তারিত জানার জন্য, নিম্নলিখিত টেবিল এবং JSON অবজেক্টের উদাহরণগুলি দেখুন:

নাম আদর্শ বিবরণ
messageExpiration স্ট্রিং বার্তাটির মেয়াদ শেষ হওয়ার তারিখ এবং সময়, যুগের পর থেকে UTC মিলিসেকেন্ড হিসাবে। ইন্টিগ্রেটরদের মেয়াদ শেষ হয়ে যাওয়া যেকোনো বার্তা প্রত্যাখ্যান করা উচিত।
messageId স্ট্রিং একটি অনন্য আইডি যা বার্তাটি প্রত্যাহার করার প্রয়োজন হলে বা পরবর্তী সময়ে অবস্থান সনাক্ত করার ক্ষেত্রে সনাক্ত করে।
paymentMethod স্ট্রিং পেমেন্ট শংসাপত্রের ধরণ। বর্তমানে, শুধুমাত্র CARD সমর্থিত।
paymentMethodDetails বস্তু পেমেন্ট ক্রেডেনশিয়াল নিজেই। এই অবজেক্টের ফর্ম্যাট paymentMethod দ্বারা নির্ধারিত হয় এবং নিম্নলিখিত টেবিলে বর্ণনা করা হয়েছে।

কার্ড

নিম্নলিখিত বৈশিষ্ট্যগুলি CARD পেমেন্ট পদ্ধতির জন্য একটি পেমেন্ট শংসাপত্র তৈরি করে:

নাম আদর্শ বিবরণ
pan স্ট্রিং ব্যক্তিগত অ্যাকাউন্ট নম্বর চার্জ করা হয়েছে। এই স্ট্রিংটিতে শুধুমাত্র সংখ্যা রয়েছে।
expirationMonth সংখ্যা কার্ডের মেয়াদ শেষ হওয়ার মাস, যেখানে ১ জানুয়ারীকে প্রতিনিধিত্ব করে, ২ ফেব্রুয়ারিকে প্রতিনিধিত্ব করে, ইত্যাদি।
expirationYear সংখ্যা কার্ডের চার অঙ্কের মেয়াদ শেষ হওয়ার বছর, যেমন ২০২০।
authMethod স্ট্রিং কার্ড লেনদেনের প্রমাণীকরণ পদ্ধতি।

PAN_ONLY

নিম্নলিখিত JSON স্নিপেটটি একটি CARD paymentMethod জন্য সম্পূর্ণ encryptedMessage একটি উদাহরণ। একটি PAN_ONLY authMethod সহ।

{
  "paymentMethod": "CARD",
  "paymentMethodDetails": {
    "authMethod": "PAN_ONLY",
    "pan": "1111222233334444",
    "expirationMonth": 10,
    "expirationYear": 2025
  },
  "gatewayMerchantId": "some-merchant-id",
  "messageId": "some-message-id",
  "messageExpiration": "1759309000000"
}

CRYPTOGRAM_3DS

একটি 3-D সিকিউর ক্রিপ্টোগ্রাম, CRYPTOGRAM_3DS authMethod ব্যবহার করে প্রমাণীকরণ করা একটি CARD । এতে নিম্নলিখিত অতিরিক্ত ক্ষেত্রগুলি অন্তর্ভুক্ত রয়েছে:

নাম আদর্শ বিবরণ
cryptogram স্ট্রিং একটি 3-ডি সিকিউর ক্রিপ্টোগ্রাম।
eciIndicator স্ট্রিং এই স্ট্রিংটি সবসময় উপস্থিত থাকে না। এটি শুধুমাত্র Android (CRYPTOGRAM_3DS) এ প্রমাণীকৃত ডিভাইস টোকেন লেনদেনের জন্য ফেরত আসে। এই মানটি অবশ্যই পেমেন্ট প্রক্রিয়াকরণ প্রবাহে প্রেরণ করতে হবে।

নিম্নলিখিত JSON স্নিপেটটি CRYPTOGRAM_3DS authMethod সহ একটি CARD paymentMethod জন্য সম্পূর্ণ encryptedMessage এর একটি উদাহরণ:

{
  "paymentMethod": "CARD",
  "paymentMethodDetails": {
    "authMethod": "CRYPTOGRAM_3DS",
    "pan": "1111222233334444",
    "expirationMonth": 10,
    "expirationYear": 2025,
    "cryptogram": "AAAAAA...",
    "eciIndicator": "eci indicator"
    
  },
  
  "messageId": "some-message-id",
  "messageExpiration": "1759309000000"
}

eciIndicator সম্পর্কে

কার্ড নেটওয়ার্ক প্রমাণিত ডিভাইস টোকেন লেনদেনের জন্য eciIndicator প্রদান করতে পারে (CRYPTOGRAM_3DS)।

অনুমোদন লেনদেনে eciIndicator মানটি পরিবর্তন বা হার্ডকোড না করেই পাস করতে হবে; অন্যথায়, লেনদেন ব্যর্থ হবে। নিম্নলিখিত টেবিলে eciIndicator এর মানগুলি বিস্তারিতভাবে বর্ণনা করা হয়েছে।

eciIndicator মান কার্ড নেটওয়ার্ক দায়বদ্ধ পক্ষ প্রমাণীকরণ পদ্ধতি
""(empty) মাস্টারকার্ড বণিক/অধিগ্রহণকারী CRYPTOGRAM_3DS সম্পর্কে
02 মাস্টারকার্ড কার্ড ইস্যুকারী CRYPTOGRAM_3DS সম্পর্কে
06 মাস্টারকার্ড বণিক/অধিগ্রহণকারী CRYPTOGRAM_3DS সম্পর্কে
05 ভিসা কার্ড ইস্যুকারী CRYPTOGRAM_3DS সম্পর্কে
07 ভিসা বণিক/অধিগ্রহণকারী CRYPTOGRAM_3DS সম্পর্কে
""(empty) অন্যান্য নেটওয়ার্ক বণিক/অধিগ্রহণকারী CRYPTOGRAM_3DS সম্পর্কে

এই টেবিলে উপস্থিত না থাকা VISA এবং Mastercard-এর জন্য অন্য কোনও ECI মান ফেরত দেওয়া হবে না।

স্বাক্ষর যাচাইকরণ

স্বাক্ষর যাচাই করার জন্য, যার মধ্যে মধ্যবর্তী কী এবং বার্তা স্বাক্ষর অন্তর্ভুক্ত, নিম্নলিখিত আইটেমগুলি প্রয়োজন:

  • স্বাক্ষর তৈরি করতে ব্যবহৃত অ্যালগরিদম
  • স্বাক্ষর তৈরি করতে ব্যবহৃত বাইট-স্ট্রিং
  • স্বাক্ষর তৈরি করতে ব্যবহৃত ব্যক্তিগত কী-এর সাথে সঙ্গতিপূর্ণ পাবলিক কী
  • স্বাক্ষর নিজেই

স্বাক্ষর অ্যালগরিদম

গুগল নিম্নলিখিত প্যারামিটারগুলির সাথে বার্তাগুলিতে স্বাক্ষর করার জন্য এলিপটিক কার্ভ ডিজিটাল সিগনেচার অ্যালগরিদম ( ECDSA ) ব্যবহার করে: FIPS 186-4 এ সংজ্ঞায়িত হ্যাশ ফাংশন হিসাবে SHA-256 সহ NIST P-256 এর উপর ECDSA।

স্বাক্ষর

স্বাক্ষরটি বার্তার বাইরেরতম স্তরে অন্তর্ভুক্ত করা হয়েছে। এটি ASN.1 বাইট ফর্ম্যাটে base64 দিয়ে এনকোড করা হয়েছে। ASN.1 সম্পর্কে আরও তথ্যের জন্য, IETF টুলস পরিশিষ্ট A দেখুন। স্বাক্ষরটিতে ECDSA পূর্ণসংখ্যা r এবং s রয়েছে। আরও তথ্যের জন্য, স্বাক্ষর জেনারেশন অ্যালগরিদম দেখুন।

নিচে নির্দিষ্ট ASN.1 বাইট ফর্ম্যাটের একটি উদাহরণ দেওয়া হল, যা জাভা ক্রিপ্টোগ্রাফি এক্সটেনশন (JCE) ECDSA বাস্তবায়ন দ্বারা উত্পাদিত স্ট্যান্ডার্ড ফর্ম্যাট।

ECDSA-Sig-Value :: = SEQUENCE {
 r INTEGER,
 s INTEGER
}

ইন্টারমিডিয়েট সাইনিং কী সিগনেচারের জন্য বাইট-স্ট্রিং কীভাবে তৈরি করবেন

নমুনা পেমেন্ট পদ্ধতি টোকেনে মধ্যবর্তী স্বাক্ষরকারী কী স্বাক্ষর যাচাই করতে, নিম্নলিখিত সূত্র ব্যবহার করে signedStringForIntermediateSigningKeySignature তৈরি করুন:

signedStringForIntermediateSigningKeySignature =
length_of_sender_id || sender_id || length_of_protocol_version || protocol_version || length_of_signed_key || signed_key

"||" স্বরলিপির অর্থ হল concatenate। প্রতিটি উপাদান— sender_id , protocolVersion , signedKey — অবশ্যই UTF-8 এনকোডেড হতে হবে। signedKey অবশ্যই intermediateSigningKey.signedKey এর স্ট্রিং হতে হবে। লিটল-এন্ডিয়ান ফর্ম্যাটে প্রতিটি উপাদানের বাইট দৈর্ঘ্য ৪ বাইট।

উদাহরণ

এই উদাহরণে নিম্নলিখিত নমুনা পেমেন্ট পদ্ধতি টোকেন ব্যবহার করা হয়েছে:

{
  "protocolVersion":"ECv2",
  "signature":"MEQCIH6Q4OwQ0jAceFEkGF0JID6sJNXxOEi4r+mA7biRxqBQAiAondqoUpU/bdsrAOpZIsrHQS9nwiiNwOrr24RyPeHA0Q\u003d\u003d",
  "intermediateSigningKey":{
    "signedKey": "{\"keyExpiration\":\"1542323393147\",\"keyValue\":\"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/1+3HBVSbdv+j7NaArdgMyoSAM43yRydzqdg1TxodSzA96Dj4Mc1EiKroxxunavVIvdxGnJeFViTzFvzFRxyCw\\u003d\\u003d\"}",
    "signatures": ["MEYCIQCO2EIi48s8VTH+ilMEpoXLFfkxAwHjfPSCVED/QDSHmQIhALLJmrUlNAY8hDQRV/y1iKZGsWpeNmIP+z+tCQHQxP0v"]
  },
  "signedMessage":"{\"tag\":\"jpGz1F1Bcoi/fCNxI9n7Qrsw7i7KHrGtTf3NrRclt+U\\u003d\",\"ephemeralPublicKey\":\"BJatyFvFPPD21l8/uLP46Ta1hsKHndf8Z+tAgk+DEPQgYTkhHy19cF3h/bXs0tWTmZtnNm+vlVrKbRU9K8+7cZs\\u003d\",\"encryptedMessage\":\"mKOoXwi8OavZ\"}"
}

sender_id সর্বদা Google হয় এবং protocol_version হল ECv2

যদি sender_id Google হয়, তাহলে signedString নিম্নলিখিত উদাহরণে দেখানো হিসাবে প্রদর্শিত হবে:

signedStringForIntermediateSigningKeySignature =
\x06\x00\x00\x00 || Google || | \x04\x00\x00\x00 || ECv2 || \xb5\x00\x00\x00 || {"keyExpiration":"1542323393147","keyValue":"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/1+3HBVSbdv+j7NaArdgMyoSAM43yRydzqdg1TxodSzA96Dj4Mc1EiKroxxunavVIvdxGnJeFViTzFvzFRxyCw\u003d\u003d"}

signedStringForIntermediateSigningKeySignature-এ স্বাক্ষর কীভাবে যাচাই করবেন

ইন্টারমিডিয়েট সাইনিং কী সিগনেচারের জন্য সাইন করা স্ট্রিংটি একত্রিত করার সময় স্ট্যান্ডার্ড ECDSA যাচাইকরণ অ্যালগরিদম ব্যবহার করা হয়। ECv2 প্রোটোকলের জন্য, আপনাকে intermediateSigningKey.signatures এ সমস্ত স্বাক্ষর পুনরাবৃত্তি করতে হবে এবং keys.json এ মেয়াদোত্তীর্ণ না হওয়া Google সাইনিং কী দিয়ে প্রতিটি স্বাক্ষর যাচাই করার চেষ্টা করতে হবে। যদি কমপক্ষে একটি স্বাক্ষর যাচাইকরণ কাজ করে, তাহলে যাচাইকরণ সম্পূর্ণ হয়েছে বলে মনে করুন। signedStringForMessageSignature যাচাই করতে পরে intermediateSigningKey.signedKey.keyValue ব্যবহার করুন। Google দৃঢ়ভাবে সুপারিশ করে যে আপনি আপনার নিজস্ব যাচাইকরণ কোডের পরিবর্তে বিদ্যমান একটি ক্রিপ্টোগ্রাফিক লাইব্রেরি ব্যবহার করুন।

বার্তা স্বাক্ষরের জন্য বাইট-স্ট্রিং কীভাবে তৈরি করবেন

নমুনা পেমেন্ট পদ্ধতি টোকেনে স্বাক্ষর যাচাই করতে, নিম্নলিখিত সূত্র ব্যবহার করে signedStringForMessageSignature তৈরি করুন:

signedStringForMessageSignature =
length_of_sender_id || sender_id || length_of_recipient_id || recipient_id || length_of_protocolVersion || protocolVersion || length_of_signedMessage || signedMessage

"||" স্বরলিপির অর্থ হল concatenate। প্রতিটি উপাদান— sender_id , recipient_id , protocolVersion , signedMessage — অবশ্যই UTF-8 এনকোডেড হতে = । প্রতিটি উপাদানের বাইট দৈর্ঘ্য লিটল-এন্ডিয়ান ফর্ম্যাটে 4 বাইট। বাইট স্ট্রিং তৈরি করার সময়, signedMessage পার্স বা পরিবর্তন করবেন না। উদাহরণস্বরূপ, \u003d অক্ষর দিয়ে প্রতিস্থাপন করবেন না।

উদাহরণ

নিম্নলিখিত উদাহরণটি একটি নমুনা পেমেন্ট পদ্ধতি টোকেন:

{
  "protocolVersion":"ECv2",
  "signature":"MEQCIH6Q4OwQ0jAceFEkGF0JID6sJNXxOEi4r+mA7biRxqBQAiAondqoUpU/bdsrAOpZIsrHQS9nwiiNwOrr24RyPeHA0Q\u003d\u003d",
  "intermediateSigningKey":{
    "signedKey": "{\"keyExpiration\":\"1542323393147\",\"keyValue\":\"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/1+3HBVSbdv+j7NaArdgMyoSAM43yRydzqdg1TxodSzA96Dj4Mc1EiKroxxunavVIvdxGnJeFViTzFvzFRxyCw\\u003d\\u003d\"}",
    "signatures": ["MEYCIQCO2EIi48s8VTH+ilMEpoXLFfkxAwHjfPSCVED/QDSHmQIhALLJmrUlNAY8hDQRV/y1iKZGsWpeNmIP+z+tCQHQxP0v"]
  },
  "signedMessage":"{\"tag\":\"jpGz1F1Bcoi/fCNxI9n7Qrsw7i7KHrGtTf3NrRclt+U\\u003d\",\"ephemeralPublicKey\":\"BJatyFvFPPD21l8/uLP46Ta1hsKHndf8Z+tAgk+DEPQgYTkhHy19cF3h/bXs0tWTmZtnNm+vlVrKbRU9K8+7cZs\\u003d\",\"encryptedMessage\":\"mKOoXwi8OavZ\"}"
}

sender_id সর্বদা Google এবং recipient_id merchant: merchantId হয়। প্রোডাকশন অ্যাক্সেস সহ ব্যবসায়ীদের জন্য Google Pay এবং Wallet কনসোলে পাওয়া মানের সাথে merchantId মিলবে।

যদি sender_id Google হয় এবং recipient_id merchant:12345 হয়, তাহলে signedString নিম্নলিখিত উদাহরণে যেমন আছে তেমনই প্রদর্শিত হবে:

signedStringForMessageSignature =
\x06\x00\x00\x00 || Google || \x0e\x00\x00\x00 || merchant:12345 || | \x04\x00\x00\x00 || ECv2 || \xd2\x00\x00\x00 || {"tag":"jpGz1F1Bcoi/fCNxI9n7Qrsw7i7KHrGtTf3NrRclt+U\u003d","ephemeralPublicKey":"BJatyFvFPPD21l8/uLP46Ta1hsKHndf8Z+tAgk+DEPQgYTkhHy19cF3h/bXs0tWTmZtnNm+vlVrKbRU9K8+7cZs\u003d","encryptedMessage":"mKOoXwi8OavZ"}

signedStringForMessageSignature-এ স্বাক্ষর কীভাবে যাচাই করবেন

স্বাক্ষরিত স্ট্রিংটি একত্রিত করার সময় স্ট্যান্ডার্ড ECDSA যাচাইকরণ অ্যালগরিদম ব্যবহার করা হয়। পূর্ববর্তী ধাপে যাচাই করা intermediateSigningKey.signedKey.keyValue signedMessage যাচাই করার জন্য ব্যবহৃত হয়। Google দৃঢ়ভাবে সুপারিশ করে যে আপনি আপনার নিজস্ব যাচাইকরণ কোডের পরিবর্তে বিদ্যমান একটি ক্রিপ্টোগ্রাফিক লাইব্রেরি ব্যবহার করুন।

এনক্রিপশন স্কিমের স্পেসিফিকেশন

Google Pay API প্রতিক্রিয়ায় ফেরত আসা পেমেন্ট পদ্ধতির টোকেন সুরক্ষিত করতে Google Elliptic Curve Integrated Encryption Scheme ( ECIES ) ব্যবহার করে। এনক্রিপশন স্কিমটি নিম্নলিখিত প্যারামিটারগুলি ব্যবহার করে:

প্যারামিটার সংজ্ঞা
কী এনক্যাপসুলেশন পদ্ধতি

ECIES-KEM, ISO 18033-2 তে সংজ্ঞায়িত।

  • উপবৃত্তাকার বক্ররেখা: NIST P-256 (OpenSSL-এ prime256v1 নামেও পরিচিত)।
  • CheckMode , OldCofactorMode , SingleHashMode , এবং CofactorMode 0।
  • পয়েন্ট ফর্ম্যাটটি অসংকুচিত।
কী ডেরিভেশন ফাংশন

HMAC-ভিত্তিক SHA-256 ( HKDFwithSHA256 )।

  • লবণ দেওয়া যাবে না।
  • প্রোটোকল ভার্সন ECv2 এর জন্য তথ্য ASCII তে Google-এনকোডেড থাকতে হবে।
  • AES256 কী-এর জন্য ২৫৬ বিট এবং HMAC_SHA256 কী-এর জন্য আরও ২৫৬ বিট সংগ্রহ করতে হবে।
সিমেট্রিক এনক্রিপশন অ্যালগরিদম

DEM2, ISO 18033-2 তে সংজ্ঞায়িত

এনক্রিপশন অ্যালগরিদম: AES-256-CTR শূন্য IV সহ এবং প্যাডেড নয়।

ম্যাক অ্যালগরিদম কী ডেরিভেশন ফাংশন থেকে প্রাপ্ত একটি 256-বিট কী সহ HMAC_SHA256

এনক্রিপশন পাবলিক কী ফর্ম্যাট

গুগল পেলোডে ফিরে আসা এনক্রিপশন পাবলিক কী এবং ephemeralPublicKey আনকম্প্রেসড পয়েন্ট ফর্ম্যাটে কী-এর বেস৬৪ উপস্থাপনা সহ ফর্ম্যাট করা হয়। এতে নিম্নলিখিত দুটি উপাদান রয়েছে:

  • একটি ম্যাজিক সংখ্যা যা বিন্যাস (0x04) নির্দিষ্ট করে।
  • উপবৃত্তাকার বক্ররেখায় X এবং Y স্থানাঙ্কের প্রতিনিধিত্বকারী দুটি 32-বাইট বৃহৎ পূর্ণসংখ্যা।

এই ফর্ম্যাটটি "পাবলিক কী ক্রিপ্টোগ্রাফি ফর দ্য ফিনান্সিয়াল সার্ভিসেস ইন্ডাস্ট্রি: দ্য এলিপিটিক কার্ভ ডিজিটাল সিগনেচার অ্যালগরিদম (ECDSA)," ANSI X9.62, 1998-এ আরও বিশদে বর্ণনা করা হয়েছে।

একটি পাবলিক কী তৈরি করতে OpenSSL ব্যবহার করুন

ধাপ ১: একটি ব্যক্তিগত কী তৈরি করুন

নিম্নলিখিত উদাহরণটি NIST P-256 এর সাথে ব্যবহারের জন্য উপযুক্ত একটি Elliptic Curve private key তৈরি করে এবং এটি key.pem এ লিখে:

openssl ecparam -name prime256v1 -genkey -noout -out key.pem

ঐচ্ছিক: ব্যক্তিগত এবং পাবলিক কী দেখুন

প্রাইভেট এবং পাবলিক কী উভয়ই দেখতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন:

openssl ec -in key.pem -pubout -text -noout

কমান্ডটি নিম্নলিখিতগুলির মতো একটি আউটপুট তৈরি করে:

read EC key
Private-Key: (256 bit)
priv:
    08:f4:ae:16:be:22:48:86:90:a6:b8:e3:72:11:cf:
    c8:3b:b6:35:71:5e:d2:f0:c1:a1:3a:4f:91:86:8a:
    f5:d7
pub:
    04:e7:68:5c:ff:bd:02:ae:3b:dd:29:c6:c2:0d:c9:
    53:56:a2:36:9b:1d:f6:f1:f6:a2:09:ea:e0:fb:43:
    b6:52:c6:6b:72:a3:f1:33:df:fa:36:90:34:fc:83:
    4a:48:77:25:48:62:4b:42:b2:ae:b9:56:84:08:0d:
    64:a1:d8:17:66
ASN1 OID: prime256v1

ধাপ ২: একটি base64-এনকোডেড পাবলিক কী তৈরি করুন

পূর্ববর্তী ঐচ্ছিক ধাপের উদাহরণে যে প্রাইভেট এবং পাবলিক কী তৈরি করা হয়েছে তা হল হেক্সাডেসিমেল-এনকোডেড। আনকম্প্রেসড পয়েন্ট ফর্ম্যাটে একটি বেস64-এনকোডেড পাবলিক কী পেতে, নিম্নলিখিত কমান্ডটি ব্যবহার করুন:

openssl ec -in key.pem -pubout -text -noout 2> /dev/null | grep "pub:" -A5 | sed 1d | xxd -r -p | base64 | paste -sd "\0" - | tr -d '\n\r ' > publicKey.txt

এই কমান্ডটি একটি publicKey.txt ফাইল তৈরি করে যার বিষয়বস্তু, আনকম্প্রেসড পয়েন্ট ফর্ম্যাটে কী-এর বেস৬৪ সংস্করণ, নিম্নলিখিতটির সাথে সাদৃশ্যপূর্ণ:

BOdoXP+9Aq473SnGwg3JU1aiNpsd9vH2ognq4PtDtlLGa3Kj8TPf+jaQNPyDSkh3JUhiS0KyrrlWhAgNZKHYF2Y=

ফাইলের কন্টেন্টে অতিরিক্ত খালি জায়গা বা ক্যারেজ রিটার্ন থাকা উচিত নয়। এটি যাচাই করতে, লিনাক্স বা ম্যাকওএসে নিম্নলিখিত কমান্ডটি চালান:

od -bc publicKey.txt

ধাপ ৩: PKCS #8 ফর্ম্যাটে একটি base64-এনকোডেড প্রাইভেট কী তৈরি করুন

টিঙ্ক লাইব্রেরি আশা করে যে আপনার প্রাইভেট কীটি PKCS #8 ফর্ম্যাটে base64-এনকোডেড হবে। প্রথম ধাপে তৈরি প্রাইভেট কী থেকে এই ফর্ম্যাটে প্রাইভেট কী তৈরি করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন:

openssl pkcs8 -topk8 -inform PEM -outform DER -in key.pem -nocrypt | base64 | paste -sd "\0" -

কমান্ডটি নিম্নলিখিতগুলির মতো একটি আউটপুট তৈরি করে:

MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgWV4oK8c/MZkCLk4qSCNjW0Zm6H0CBCtSYxkXkC9FBHehRANCAAQPldOnhO2/oXjdJD1dwlFPiNs6fcdoRgFu3/Z0iKj24SjTGyLRGAtYWLGXBZcDdPj3T2bJRHRVhE8Bc2AjkT7n

পেমেন্ট পদ্ধতির টোকেন কীভাবে ডিক্রিপ্ট করবেন

টোকেনটি ডিক্রিপ্ট করতে এই পদক্ষেপগুলি অনুসরণ করুন:

  1. ECIES-KEM ব্যবহার করে এমন একটি 512-বিট দীর্ঘ শেয়ার্ড কী তৈরি করতে আপনার ব্যক্তিগত কী এবং প্রদত্ত ephemeralPublicKey ব্যবহার করুন। নিম্নলিখিত প্যারামিটারগুলি ব্যবহার করুন:
    • উপবৃত্তাকার বক্ররেখা: NIST P-256, যা OpenSSL-এ prime256v1 নামেও পরিচিত।
    • CheckMode , OldCofactorMode , SingleHashMode , এবং CofactorMode হল 0
    • এনকোডিং ফাংশন: আনকম্প্রেসড পয়েন্ট ফর্ম্যাট।
    • কী ডেরিভেশন ফাংশন: HKDFwithSHA256, যেমন RFC 5869 তে বর্ণিত হয়েছে, নিম্নলিখিত প্যারামিটার সহ:
      • লবণ সরবরাহ করা উচিত নয়। RFC অনুসারে, এটি অবশ্যই 32 শূন্য বাইটের লবণের সমতুল্য হতে হবে।
  2. জেনারেট করা কীটিকে দুটি ২৫৬-বিট-লম্বা কীতে ভাগ করুন: symmetricEncryptionKey এবং macKey
  3. যাচাই করুন যে tag ফিল্ডটি encryptedMessage এর জন্য একটি বৈধ MAC।

    প্রত্যাশিত MAC তৈরি করতে, হ্যাশ ফাংশন SHA256 সহ HMAC ( RFC 5869 ) এবং ধাপ 2 এ প্রাপ্ত macKey ব্যবহার করুন।

  4. AES-256-CTR মোড ব্যবহার করে এবং নিম্নলিখিতগুলি ব্যবহার করে encryptedMessage ডিক্রিপ্ট করুন:

    • একটি শূন্য IV.
    • প্যাডেড নয়।
    • ধাপ ২-এ প্রাপ্ত symmetricEncryptionKey

কী ব্যবস্থাপনা

মার্চেন্ট এনক্রিপশন কী

এনক্রিপশন স্কিমের স্পেসিফিকেশনে বর্ণিত স্পেসিফিকেশন অনুসারে ব্যবসায়ীরা একটি পাবলিক কী তৈরি করে।

গুগল রুট সাইনিং কী

গুগল বর্তমানে বৈধ রুট সাইনিং পাবলিক কীগুলির সেট প্রকাশ করে যা একটি পাবলিক URL থেকে আনা যায়। URL দ্বারা ফেরত পাঠানো HTTP ক্যাশে হেডারগুলি যতক্ষণ নির্দেশ করে ততক্ষণ পর্যন্ত কীগুলি বৈধ থাকে। মেয়াদ শেষ না হওয়া পর্যন্ত এগুলি ক্যাশে করা হয়, যা keyExpiration ক্ষেত্র দ্বারা নির্ধারিত হয়। আমরা সুপারিশ করি যে যখন একটি ফেচের মেয়াদ শেষ হয়ে যায়, তখন বৈধ কীগুলির বর্তমান তালিকা পেতে পাবলিক URL থেকে কীগুলি আবার আনা হয়।

ECv2 প্রোটোকলের ব্যতিক্রম: রানটাইমে যদি আপনি Google থেকে কীগুলি আনতে না পারেন, তাহলে আমাদের প্রোডাকশন URL থেকে keys.json আনুন, এটি আপনার সিস্টেমে সংরক্ষণ করুন এবং পর্যায়ক্রমে ম্যানুয়ালি রিফ্রেশ করুন। স্বাভাবিক পরিস্থিতিতে, Google দীর্ঘতম মেয়াদ শেষ হওয়ার তারিখের পাঁচ বছর আগে ECv2 এর জন্য একটি নতুন রুট সাইনিং কী জারি করে। কী আপোস করার ক্ষেত্রে, keys.json দ্রুত পুনরায় লোড করার অনুরোধ করার জন্য Google স্ব-পরিষেবা পোর্টালে প্রদত্ত যোগাযোগের তথ্যের মাধ্যমে সমস্ত ব্যবসায়ীকে অবহিত করে। আপনি যাতে নিয়মিত ঘূর্ণন মিস না করেন তা নিশ্চিত করার জন্য, আমরা সুপারিশ করি যে ব্যবসায়ীরা যারা keys.json এর বিষয়বস্তুতে Google কীগুলি সংরক্ষণ করতে চান তারা তাদের নিজস্ব বার্ষিক কী ঘূর্ণনের অংশ হিসাবে বার্ষিক রিফ্রেশ করুন।

পাবলিক URL এর মাধ্যমে প্রদত্ত কীগুলি নিম্নলিখিত বিন্যাসে ম্যাপ করা হয়েছে:

{
  "keys": [
    {
      "keyValue": "encoded public key",
      "protocolVersion": "ECv2"
      "keyExpiration":"2000000000000"
    },
    {
      "keyValue": "encoded public key",
      "protocolVersion": "ECv2"
      "keyExpiration":"3000000000000"
    }
  ]
}

keyValue হল একটি base64, মোড়ানো বা প্যাড করা নয়, X.509 স্ট্যান্ডার্ডে সংজ্ঞায়িত ASN.1 টাইপ SubjectPublicKeyInfo তে এনকোড করা কী-এর একটি সংস্করণ। জাভাতে, উল্লেখিত ASN.1 এনকোডিংটি X509EncodedKeySpec ক্লাস দ্বারা প্রতিনিধিত্ব করা হয়। এটি ECPublicKey.getEncoded() দিয়ে পাওয়া যেতে পারে।

পরীক্ষা এবং উৎপাদন পরিবেশ উভয়ের জন্য URL গুলি নিম্নলিখিত লিঙ্কগুলি দ্বারা সরবরাহ করা হয়েছে:

কী ঘূর্ণন

যদি আপনি সরাসরি ইন্টিগ্রেশনের মাধ্যমে আপনার সার্ভারে একটি পেমেন্ট পদ্ধতি টোকেন ডিক্রিপ্ট করেন, তাহলে আপনাকে বার্ষিক কীগুলি ঘোরাতে হবে।

এনক্রিপশন কী ঘোরানোর জন্য নিম্নলিখিত ধাপগুলি সম্পূর্ণ করুন:

  1. একটি নতুন কী জোড়া তৈরি করতে OpenSSL ব্যবহার করুন
  2. গুগল অ্যাকাউন্ট দিয়ে সাইন ইন করে গুগল পে এবং ওয়ালেট কনসোল খুলুন পূর্বে Google Play দিয়ে আপনার অ্যাপ পরিচালনা করতে ব্যবহৃত হত।
  3. Google Pay API ট্যাবে, Direct integration pane-এর অধীনে, আপনার বিদ্যমান পাবলিক কী-এর পাশে Manage-এ ক্লিক করুন। আরেকটি কী যোগ করুন-এ ক্লিক করুন।
  4. পাবলিক এনক্রিপশন কী টেক্সট ইনপুট ক্ষেত্রটি নির্বাচন করুন এবং আপনার নতুন জেনারেট করা পাবলিক কী বেস৬৪-এনকোডেড আনকম্প্রেসড পয়েন্ট ফর্ম্যাটে যোগ করুন।
  5. এনক্রিপশন কী সংরক্ষণ করুন ক্লিক করুন।
  6. একটি নিরবচ্ছিন্ন কী ঘূর্ণন নিশ্চিত করতে, কীগুলি স্থানান্তর করার সময় নতুন এবং পুরাতন উভয় প্রাইভেট কী ডিক্রিপশন সমর্থন করুন।

    যদি আপনি টোকেনটি ডিক্রিপ্ট করার জন্য Tink লাইব্রেরি ব্যবহার করেন, তাহলে একাধিক ব্যক্তিগত কী সমর্থন করার জন্য নিম্নলিখিত জাভা কোডটি ব্যবহার করুন:

    String decryptedMessage =
        new PaymentMethodTokenRecipient.Builder()
            .addRecipientPrivateKey(newPrivateKey)
            .addRecipientPrivateKey(oldPrivateKey);

    নিশ্চিত করুন যে ডিক্রিপশনের কোডটি প্রোডাকশনে স্থাপন করা হয়েছে এবং আপনি সফল ডিক্রিপশনগুলি পর্যবেক্ষণ করছেন।

  7. আপনার কোডে ব্যবহৃত পাবলিক কী পরিবর্তন করুন।

    PaymentMethodTokenizationSpecification parameters প্রপার্টিতে publicKey অ্যাট্রিবিউটের মান প্রতিস্থাপন করুন:

    /**
     * @param publicKey public key retrieved from your server
     */
    private static JSONObject getTokenizationSpecification(String publicKey) {
      JSONObject tokenizationSpecification = new JSONObject();
      tokenizationSpecification.put("type", "DIRECT");
      tokenizationSpecification.put(
        "parameters",
        new JSONObject()
            .put("protocolVersion", "ECv2")
            .put("publicKey", publicKey));
      return tokenizationSpecification;
    }
  8. ধাপ ৪ থেকে প্রোডাকশন পর্যন্ত কোডটি স্থাপন করুন। কোডটি স্থাপন হয়ে গেলে, এনক্রিপশন এবং ডিক্রিপশন লেনদেনগুলি নতুন কী জোড়া ব্যবহার করে।
  9. নিশ্চিত করুন যে পুরনো পাবলিক কী আর কোনও লেনদেন এনক্রিপ্ট করার জন্য ব্যবহার করা হচ্ছে না।

  10. পুরাতন প্রাইভেট কীটি সরান।
  11. Google Pay-তে ডেভেলপার হিসেবে সাইন আপ করার জন্য আপনি যে Google অ্যাকাউন্টটি আগে ব্যবহার করেছিলেন, সেই অ্যাকাউন্ট দিয়ে সাইন ইন করে Google Pay & Wallet কনসোলটি খুলুন।
  12. Google Pay API ট্যাবে, Direct integration pane-এর অধীনে, আপনার বিদ্যমান পাবলিক কী-এর পাশে Manage-এ ক্লিক করুন। আপনার পুরানো পাবলিক কী-এর পাশে Delete-এ ক্লিক করুন এবং Save encryption keys-এ ক্লিক করুন।

Google PaymentMethodTokenizationSpecification parameters অবজেক্টের মধ্যে publicKey প্রপার্টিতে নির্দিষ্ট করা কী ব্যবহার করে, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

{
  "protocolVersion": "ECv2",
  "publicKey": "BOdoXP+9Aq473SnGwg3JU1..."
}

এনক্রিপ্ট করা প্রতিক্রিয়া পরিচালনা করতে Tink লাইব্রেরি ব্যবহার করুন

স্বাক্ষর যাচাইকরণ এবং বার্তা ডিক্রিপশন করার জন্য, Tink paymentmethodtoken লাইব্রেরি ব্যবহার করুন। এই লাইব্রেরিটি শুধুমাত্র জাভাতে উপলব্ধ। এটি ব্যবহার করতে, নিম্নলিখিত পদক্ষেপগুলি সম্পূর্ণ করুন:

  1. আপনার pom.xml এ, নির্ভরতা হিসেবে Tink paymentmethodtoken অ্যাপটি যোগ করুন:

    <dependencies>
      <!-- other dependencies ... -->
      <dependency>
        <groupId>com.google.crypto.tink</groupId>
        <artifactId>apps-paymentmethodtoken</artifactId>
        <version>1.9.1</version>  <!-- or latest version -->
      </dependency>
    </dependencies>
  2. সার্ভার স্টার্টআপের সময়, মেমরিতে কীটি উপলব্ধ করার জন্য Google সাইনিং কীগুলি প্রি-ফেচ করুন। এটি ডিক্রিপশন প্রক্রিয়ায় কীগুলি আনার সময় ব্যবহারকারীকে কোনও নেটওয়ার্ক লেটেন্সি দেখতে বাধা দেয়।

    GooglePaymentsPublicKeysManager.INSTANCE_PRODUCTION.refreshInBackground();
  3. নিম্নলিখিত কোডটি ব্যবহার করে বার্তাটি ডিক্রিপ্ট করুন, যা ধরে নেয় যে paymentMethodToken encryptedMessage ভেরিয়েবলে সংরক্ষিত আছে, এবং আপনার পরিস্থিতি অনুসারে বিভাগগুলিকে মোটা অক্ষরে প্রতিস্থাপন করুন।

    অ-প্রোডাকশন পরীক্ষার জন্য, INSTANCE_PRODUCTION INSTANCE_TEST দিয়ে প্রতিস্থাপন করুন, এবং যদি আপনার ইন্টিগ্রেশন নিষ্ক্রিয় থাকে বা কোনও এনক্রিপশন কী কনফিগার করা না থাকে, তাহলে [YOUR MERCHANT ID] কে .

    • সক্রিয়
    • DIRECT ইন্টিগ্রেশন সক্রিয় আছে কি?
    • একটি এনক্রিপশন কী কনফিগার করা আছে

    [YOUR MERCHANT ID] প্রতিস্থাপন করবেন না।

    String decryptedMessage =
        new PaymentMethodTokenRecipient.Builder()
        .fetchSenderVerifyingKeysWith(
            GooglePaymentsPublicKeysManager.INSTANCE_PRODUCTION)
        .recipientId("merchant:[YOUR MERCHANT ID]")
        // This guide applies only to protocolVersion = ECv2
        .protocolVersion("ECv2")
        // Multiple private keys can be added to support graceful
        // key rotations.
        .addRecipientPrivateKey(PrivateKey1)
        .addRecipientPrivateKey(PrivateKey2)
        .build()
        .unseal(encryptedMessage);
  4. Google-এর সাথে নিবন্ধিত পাবলিক কী মানের সাথে সম্পর্কিত PrivateKey1 পরিবর্তে উপযুক্ত প্রাইভেট কী মান ব্যবহার করুন যা আপনার কীগুলি প্রস্তুত করুন এবং Google-এর সাথে নিবন্ধন করুন । পরবর্তীতে যখন আপনাকে Google-এর সাথে কীগুলি ঘোরানোর প্রয়োজন হয় তখন আপনি একাধিক অন্যান্য প্রাইভেট কী মান যোগ করতে পারেন। ভেরিয়েবলগুলি হয় একটি base64-এনকোডেড PKCS8 স্ট্রিং অথবা একটি ECPrivateKey অবজেক্ট হতে পারে। base64-এনকোডেড PKCS8 প্রাইভেট কী কীভাবে তৈরি করবেন সে সম্পর্কে আরও তথ্যের জন্য, আপনার কীগুলি প্রস্তুত করুন এবং Google-এর সাথে নিবন্ধন করুন দেখুন।

  5. যদি আপনি প্রতিবার কী ডিক্রিপ্ট করার সময় গুগল সার্ভারে কল করতে না পারেন, তাহলে নিম্নলিখিত কোডটি দিয়ে ডিক্রিপ্ট করুন এবং আপনার পরিস্থিতি অনুসারে বিভাগগুলিকে মোটা অক্ষরে প্রতিস্থাপন করুন।

    String decryptedMessage =
        new PaymentMethodTokenRecipient.Builder()
        .addSenderVerifyingKey("ECv2 key fetched from test or production url")
        .recipientId("merchant:[YOUR MERCHANT ID]")
        // This guide applies only to protocolVersion = ECv2
        .protocolVersion("ECv2")
        // Multiple private keys can be added to support graceful
        // key rotations.
        .addRecipientPrivateKey(PrivateKey1)
        .addRecipientPrivateKey(PrivateKey2)
        .build()
        .unseal(encryptedMessage);

    উৎপাদন পরিবেশে বর্তমান কীটি সাধারণ পরিস্থিতিতে 04/14/2038 পর্যন্ত বৈধ থাকে, কেবল কী আপস ছাড়া। কী আপস হলে, গুগল সেলফ-সার্ভিস পোর্টালে প্রদত্ত যোগাযোগের তথ্যের মাধ্যমে সমস্ত ব্যবসায়ীকে অবহিত করে যাতে keys.json দ্রুত পুনরায় লোড করার অনুরোধ করা যায়।

    কোড স্নিপেট নিম্নলিখিত নিরাপত্তা বিবরণ পরিচালনা করে যাতে আপনি পেলোডের ব্যবহারের উপর মনোযোগ দিতে পারেন:

    • গুগল সাইনিং কীগুলি মেমরিতে আনা এবং ক্যাশে করা হয়েছে
    • স্বাক্ষর যাচাইকরণ
    • ডিক্রিপশন