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

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

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

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

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

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

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

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

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

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

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

নাম প্রকার বর্ণনা
protocolVersion স্ট্রিং এটি সেই এনক্রিপশন বা স্বাক্ষর পদ্ধতিকে শনাক্ত করে, যার অধীনে বার্তাটি তৈরি করা হয়েছে। প্রয়োজনে, এটি প্রোটোকলটিকে সময়ের সাথে সাথে বিকশিত হতে সাহায্য করে।
signature স্ট্রিং বার্তাটি যে গুগল থেকে এসেছে, তা যাচাই করে। এটি বেস৬৪-এনকোডেড এবং ইন্টারমিডিয়েট সাইনিং কী দ্বারা ECDSA ব্যবহার করে তৈরি করা হয়েছে।
intermediateSigningKey বস্তু একটি JSON অবজেক্ট, যাতে গুগলের ইন্টারমিডিয়েট সাইনিং কী থাকে। এতে signedKey সাথে keyValue , keyExpiration এবং signatures থাকে। ইন্টারমিডিয়েট সাইনিং কী-এর সিগনেচার যাচাই প্রক্রিয়া সহজ করার জন্য এটিকে সিরিয়ালাইজ করা হয়।
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 স্ট্রিং একটি বেস৬৪-এনকোডেড বার্তা, যাতে কী-টির পেমেন্টের বিবরণ রয়েছে।
signatures স্ট্রিং যাচাই করা হয়েছে যে ইন্টারমিডিয়েট সাইনিং কী-টি গুগল থেকে এসেছে। এটি বেস৬৪-এনকোডেড এবং ECDSA দিয়ে তৈরি।

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

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

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

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

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

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

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

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

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

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

কার্ড

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

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

কার্ড লেনদেনের মার্চেন্ট টোকেন আইডি। এই ঐচ্ছিক ফিল্ডটি শুধুমাত্র তখনই ফেরত দেওয়া হয়, যখন নিম্নলিখিত সমস্ত শর্ত পূরণ হয়:

  • মার্চেন্ট অনুরোধে একটি MIT *TransactionInfo অবজেক্ট নির্দিষ্ট করে।
  • মার্চেন্ট অনুরোধে একটি tokenUpdateUrl অন্তর্ভুক্ত করে।
  • ব্যবহারকারী একটি টোকেনাইজড বাদ্যযন্ত্র (যেমন, ডিপিএএন) নির্বাচন করেন।

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

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

নাম প্রকার বর্ণনা
cryptogram স্ট্রিং একটি 3-D সুরক্ষিত ক্রিপ্টোগ্রাম।
eciIndicator স্ট্রিং এই স্ট্রিংটি সবসময় উপস্থিত থাকে না। এটি শুধুমাত্র অ্যান্ড্রয়েডে প্রমাণীকৃত ডিভাইস টোকেন লেনদেনের (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",
    "merchantTokenId": "merchant-token-id",
    
  },
  
  "messageId": "some-message-id",
  "messageExpiration": "1759309000000"
}

eciসূচক

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

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

eciসূচক মান কার্ড নেটওয়ার্ক দায়বদ্ধ পক্ষ প্রমাণীকরণ পদ্ধতি
""(empty) মাস্টারকার্ড বণিক/অধিগ্রহণকারী ক্রিপ্টোগ্রাম_3DS
02 মাস্টারকার্ড কার্ড প্রদানকারী ক্রিপ্টোগ্রাম_3DS
06 মাস্টারকার্ড বণিক/অধিগ্রহণকারী ক্রিপ্টোগ্রাম_3DS
05 ভিসা কার্ড প্রদানকারী ক্রিপ্টোগ্রাম_3DS
07 ভিসা বণিক/অধিগ্রহণকারী ক্রিপ্টোগ্রাম_3DS
""(empty) অন্যান্য নেটওয়ার্ক বণিক/অধিগ্রহণকারী ক্রিপ্টোগ্রাম_3DS

ভিসা এবং মাস্টারকার্ডের অন্য কোনো ECI মান, যা এই সারণিতে নেই, তা ফেরত দেওয়া হবে না।

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

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

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

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

গুগল 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

"||" চিহ্নটির অর্থ হলো সংযুক্ত করা। প্রতিটি উপাদান— 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 এ থাকা মেয়াদোত্তীর্ণ নয় এমন গুগল সাইনিং কী দিয়ে প্রত্যেকটিকে যাচাই করার চেষ্টা করতে হবে। যদি অন্তত একটি সিগনেচার যাচাইকরণ সফল হয়, তবে যাচাইকরণ সম্পূর্ণ বলে ধরে নিন। পরবর্তীতে signedStringForMessageSignature যাচাই করার জন্য intermediateSigningKey.signedKey.keyValue ব্যবহার করুন। গুগল আপনার নিজের যাচাইকরণ কোডের পরিবর্তে বিদ্যমান কোনো ক্রিপ্টোগ্রাফিক লাইব্রেরি ব্যবহার করার জন্য দৃঢ়ভাবে সুপারিশ করে।

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

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

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

"||" চিহ্নটির অর্থ হলো সংযুক্ত করা। প্রতিটি উপাদান— sender_id , recipient_id , protocolVersion , signedMessage —অবশ্যই UTF-8 এনকোড করা থাকতে হবে। লিটল-এন্ডিয়ান ফরম্যাটে প্রতিটি উপাদানের বাইট দৈর্ঘ্য হলো ৪ বাইট। বাইট স্ট্রিংটি তৈরি করার সময়, 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 । এই merchantId সেইসব মার্চেন্টদের জন্য Google Pay ও Wallet Console- এ থাকা মানের সাথে মেলে, যাদের প্রোডাকশন অ্যাক্সেস রয়েছে।

যদি 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 Pay API রেসপন্সে ফেরত আসা পেমেন্ট মেথড টোকেনটি সুরক্ষিত করতে Google, Elliptic Curve Integrated Encryption Scheme ( ECIES ) ব্যবহার করে। এই এনক্রিপশন স্কিমটি নিম্নলিখিত প্যারামিটারগুলো ব্যবহার করে:

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

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

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

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

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

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

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

MAC অ্যালগরিদম কী ডিরাইভেশন ফাংশন থেকে প্রাপ্ত ২৫৬-বিট কী সহ HMAC_SHA256 ।

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

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

  • একটি জাদুকরী সংখ্যা যা ফরম্যাটটি নির্দিষ্ট করে (0x04)।
  • দুটি ৩২-বাইট আকারের পূর্ণসংখ্যা যা এলিপটিক কার্ভে X এবং Y স্থানাঙ্ককে নির্দেশ করে।

এই ফরম্যাটটি "Public Key Cryptography For The Financial Services Industry: The Elliptic Curve Digital Signature Algorithm (ECDSA)" ANSI X9.62, 1998-এ আরও বিশদভাবে বর্ণনা করা হয়েছে।

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

ধাপ ১: একটি প্রাইভেট কী তৈরি করুন

নিম্নলিখিত উদাহরণটি NIST P-256-এর সাথে ব্যবহারের জন্য উপযুক্ত একটি এলিপটিক কার্ভ প্রাইভেট কী তৈরি করে এবং সেটি 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

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

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

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=

ফাইলের বিষয়বস্তুতে অতিরিক্ত ফাঁকা স্থান বা ক্যারেজ রিটার্ন থাকা যাবে না। এটি যাচাই করার জন্য, Linux বা MacOS-এ নিম্নলিখিত কমান্ডটি চালান:

od -bc publicKey.txt

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

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

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

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

MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgWV4oK8c/MZkCLk4qSCNjW0Zm6H0CBCtSYxkXkC9FBHehRANCAAQPldOnhO2/oXjdJD1dwlFPiNs6fcdoRgFu3/Z0iKj24SjTGyLRGAtYWLGXBZcDdPj3T2bJRHRVhE8Bc2AjkT7n

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

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

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

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

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

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

মূল ব্যবস্থাপনা

বণিক এনক্রিপশন কী

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

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

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

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

পাবলিক ইউআরএল-এর মাধ্যমে প্রদত্ত কী-গুলো নিম্নলিখিত বিন্যাসে ম্যাপ করা হয়:

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

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

টেস্ট এবং প্রোডাকশন উভয় এনভায়রনমেন্টের ইউআরএল নিম্নলিখিত লিঙ্কগুলিতে দেওয়া হয়েছে:

চাবি ঘূর্ণন

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

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

  1. OpenSSL ব্যবহার করে একটি নতুন কী পেয়ার তৈরি করুন ।
  2. Google অ্যাকাউন্টে সাইন ইন থাকা অবস্থায় Google Pay ও Wallet Console খুলুন। পূর্বে গুগল প্লে-এর মাধ্যমে আপনার অ্যাপ পরিচালনা করতে ব্যবহৃত হত।
  3. Google Pay API ট্যাবের অধীনে, Direct integration প্যানেলে, আপনার বিদ্যমান পাবলিক কী-এর পাশে থাকা Manage-এ ক্লিক করুন। Add another key-তে ক্লিক করুন।
  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 Console খুলুন।
  12. Google Pay API ট্যাবের অধীনে Direct integration প্যানেলে, আপনার বিদ্যমান পাবলিক কী-এর পাশে থাকা Manage-এ ক্লিক করুন। আপনার পুরোনো পাবলিক কী-এর পাশে থাকা Delete-এ ক্লিক করুন এবং Save encryption keys-এ ক্লিক করুন।

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

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

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

স্বাক্ষর যাচাইকরণ এবং বার্তা ডিক্রিপশন করার জন্য, 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. সার্ভার চালু হওয়ার সময়, গুগল সাইনিং কীগুলো আগে থেকেই সংগ্রহ করে মেমরিতে উপলব্ধ করা হয়। এর ফলে, ডিক্রিপশন প্রক্রিয়া চলাকালীন নেটওয়ার্ক বিলম্বের বিষয়টি ব্যবহারকারীকে দেখতে হয় না।

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

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

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

    [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. আপনার কী প্রস্তুত করুন এবং গুগলে নিবন্ধন করুন থেকে, PrivateKey1 উপযুক্ত প্রাইভেট কী ভ্যালু দিয়ে প্রতিস্থাপন করুন যা গুগলে নিবন্ধিত পাবলিক কী ভ্যালুর সাথে যুক্ত। পরবর্তীতে যখন গুগলে কী ঘোরানোর (Rotate keys with Google) প্রয়োজন হবে, তখন আপনি আরও একাধিক প্রাইভেট কী ভ্যালু যোগ করতে পারেন। ভ্যারিয়েবলগুলো একটি বেস৬৪-এনকোডেড PKCS8 স্ট্রিং অথবা একটি ECPrivateKey অবজেক্ট হতে পারে। কীভাবে একটি বেস৬৪-এনকোডেড PKCS8 প্রাইভেট কী তৈরি করতে হয় সে সম্পর্কে আরও তথ্যের জন্য, আপনার কী প্রস্তুত করুন এবং গুগলে নিবন্ধন করুন দেখুন।

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

    কী কম্প্রোমাইজ ছাড়া, সাধারণ পরিস্থিতিতে প্রোডাকশন এনভায়রনমেন্টের বর্তমান কী-টি ০৪/১৪/২০৩৮ পর্যন্ত বৈধ থাকবে। কী কম্প্রোমাইজের ক্ষেত্রে, keys.json দ্রুত রিলোড করার অনুরোধ জানানোর জন্য গুগল সেলফ-সার্ভিস পোর্টালে দেওয়া যোগাযোগের তথ্যের মাধ্যমে সমস্ত মার্চেন্টকে অবহিত করে।

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

    • গুগলের স্বাক্ষর কীগুলো মেমরিতে ফেচ ও ক্যাশ করা হয়েছে।
    • স্বাক্ষর যাচাইকরণ
    • ডিক্রিপশন