پیشنیازها
پیشاز ادامه دادن، مطمئن شوید مراحل زیر را تکمیل کردهاید:
حسابی را که میخواهید برای Smart Tap فعال شود تعیین کنید
قبلاز ادامه، باید مشخص کنید کدام حساب بهعنوان حساب «صادرکننده پسخرید» تعیین خواهد شد. دو روش برای تعیین این موضوع وجود دارد:
ایجاد حساب «صادرکننده» جدید
اطلاعات تماس حساب جدید باید حاوی اطلاعات فروشنده باشد. برای دستورالعملهای مربوط به نحوه انجام این کار در «کنسول Google Pay و کیف پول»، به این مقاله پشتیبانی مراجعه کنید. نمونه کد زیر نحوه ایجاد حساب «صادرکننده» را بااستفاده از Google Wallet API نشان میدهد:
جاوا
/** * Create a new Google Wallet Issuer account. * * @param issuerName The Issuer's name. * @param issuerEmail The Issuer's email address. * @throws IOException */ public void CreateIssuerAccount(String issuerName, String issuerEmail) throws IOException { // New Issuer information Issuer issuer = new Issuer() .setName(issuerName) .setContactInfo(new IssuerContactInfo().setEmail(issuerEmail)); Issuer response = service.issuer().insert(issuer).execute(); System.out.println("Issuer insert response"); System.out.println(response.toPrettyString()); }
PHP
/** * Create a new Google Wallet issuer account. * * @param string $issuerName The Issuer's name. * @param string $issuerEmail The Issuer's email address. */ public function createIssuerAccount(string $issuerName, string $issuerEmail) { // New Issuer information $issuer = new Google_Service_Walletobjects_Issuer([ 'name' => $issuerName, 'contactInfo' => new Google_Service_Walletobjects_IssuerContactInfo([ 'email' => $issuerEmail, ]), ]); $response = $this->service->issuer->insert($issuer); print "Issuer insert response\n"; print_r($response); }
Python
def create_issuer_account(self, issuer_name: str, issuer_email: str): """Create a new Google Wallet Issuer account. Args: issuer_name (str): The Issuer's name. issuer_email (str): The Issuer's email address. """ # New Issuer information issuer = {'name': issuer_name, 'contactInfo': {'email': issuer_email}} # Make the POST request response = self.http_client.post(url=self.issuer_url, json=issuer) print('Issuer insert response') print(response.text)
C#
/// <summary> /// Create a new Google Wallet Issuer account. /// </summary> /// <param name="issuerName">The Issuer's name.</param> /// <param name="issuerEmail">The Issuer's email address.</param> public void CreateIssuerAccount(string issuerName, string issuerEmail) { // New issuer information Issuer issuer = new Issuer() { ContactInfo = new IssuerContactInfo() { Email = issuerEmail }, Name = issuerName, }; Stream responseStream = service.Issuer .Insert(issuer) .ExecuteAsStream(); StreamReader responseReader = new StreamReader(responseStream); JObject jsonResponse = JObject.Parse(responseReader.ReadToEnd()); Console.WriteLine("Issuer insert response"); Console.WriteLine(jsonResponse.ToString()); }
Node.js
/** * Create a new Google Wallet Issuer account. * * @param {string} issuerName The Issuer's name. * @param {string} issuerEmail The Issuer's email address. */ async createIssuerAccount(issuerName, issuerEmail) { // New Issuer information let issuer = { name: issuerName, contactInfo: { email: issuerEmail } }; let response = await this.httpClient.request({ url: this.issuerUrl, method: 'POST', data: issuer }); console.log('Issuer insert response'); console.log(response); }
در ابتدا، فقط اصیل (حساب سرویس یا کاربر) که حساب «صادرکننده» را ایجاد کرده است دسترسی خواهد داشت. باید اجازههای حساب «صادرکننده» را بهروز کنید تا هر کاربر یا حساب سرویس دیگری را که باید بتواند مجوزها را مدیریت کند دربرگیرد. نمونه کد زیر نحوه بهروزرسانی اجازههای حساب «صادرکننده» را نشان میدهد.
جاوا
/** * Update permissions for an existing Google Wallet Issuer account. * * <p><strong>Warning:</strong> This operation overwrites all existing permissions! * * <p>Example permissions list argument below. Copy the add entry as needed for each email address * that will need access. Supported values for role are: 'READER', 'WRITER', and 'OWNER' * * <pre><code> * ArrayList<Permission> permissions = new ArrayList<Permission>(); * permissions.add(new Permission().setEmailAddress("emailAddress").setRole("OWNER")); * </code></pre> * * @param issuerId The Issuer ID being used for this request. * @param permissions The list of email addresses and roles to assign. * @throws IOException */ public void UpdateIssuerAccountPermissions(String issuerId, ArrayList<Permission> permissions) throws IOException { Permissions response = service .permissions() .update( Long.parseLong(issuerId), new Permissions().setIssuerId(Long.parseLong(issuerId)).setPermissions(permissions)) .execute(); System.out.println("Issuer permissions update response"); System.out.println(response.toPrettyString()); }
PHP
/** * Update permissions for an existing Google Wallet Issuer account. * * **Warning:** This operation overwrites all existing permissions! * * Example permissions list argument below. Copy the entry as * needed for each email address that will need access. Supported * values for role are: 'READER', 'WRITER', and 'OWNER' * * $permissions = array( * new Google_Service_Walletobjects_Permission([ * 'emailAddress' => 'email-address', * 'role' => 'OWNER', * ]), * ); * * @param string $issuerId The Issuer ID being used for this request. * @param array $permissions The list of email addresses and roles to assign. */ public function updateIssuerAccountPermissions(string $issuerId, array $permissions) { // Make the PUT request $response = $this->service->permissions->update( $issuerId, new Google_Service_Walletobjects_Permissions([ 'issuerId' => $issuerId, 'permissions' => $permissions, ]) ); print "Permissions update response\n"; print_r($response); }
Python
def update_issuer_account_permissions(self, issuer_id: str, permissions: List): """Update permissions for an existing Google Wallet Issuer account. **Warning:** This operation overwrites all existing permissions! Example permissions list argument below. Copy the dict entry as needed for each email address that will need access. Supported values for role are: 'READER', 'WRITER', and 'OWNER' permissions = [ { 'emailAddress': 'email-address', 'role': 'OWNER' } ] Args: issuer_id (str): The Issuer ID being used for this request. permissions (List): The list of email addresses and roles to assign. """ response = self.http_client.put(url=f'{self.permissions_url}/{issuer_id}', json={ 'issuerId': issuer_id, 'permissions': permissions }) print('Permissions update response') print(response.text)
C#
/// <summary> /// Update permissions for an existing Google Wallet Issuer account. /// <para /> /// <strong>Warning:</strong> This operation overwrites all existing permissions! /// <para /> /// Example permissions list argument below. Copy the add entry as needed for each email /// address that will need access.Supported values for role are: 'READER', 'WRITER', and 'OWNER' /// <para /> /// <![CDATA[List<Permission> permissions = new List<Permission>();]]> /// <para /> /// permissions.Add(new Permission { EmailAddress = "emailAddress", Role = "OWNER"}); /// </summary> /// <param name="issuerId">The issuer ID being used for this request.</param> /// <param name="permissions">The list of email addresses and roles to assign.</param> public void UpdateIssuerAccountPermissions(string issuerId, List<Permission> permissions) { Stream responseStream = service.Permissions .Update(new Permissions { IssuerId = long.Parse(issuerId), PermissionsValue = permissions }, long.Parse(issuerId)) .ExecuteAsStream(); StreamReader responseReader = new StreamReader(responseStream); JObject jsonResponse = JObject.Parse(responseReader.ReadToEnd()); Console.WriteLine("Issuer permissions update response"); Console.WriteLine(jsonResponse.ToString()); }
Node.js
/** * Update permissions for an existing Google Wallet Issuer account. * * **Warning:** This operation overwrites all existing permissions! * * Example permissions list argument below. Copy the dict entry as * needed for each email address that will need access. Supported * values for role are: 'READER', 'WRITER', and 'OWNER' * * let permissions = [ * { * 'emailAddress': 'email-address', * 'role': 'OWNER', * }, * ]; * * @param {string} issuerId The Issuer ID being used for this request. * @param {Array} permissions The list of email addresses and roles to assign. */ async updateIssuerPermissions(issuerId, permissions) { let response = await this.httpClient.request({ url: `${this.permissionsUrl}/${issuerId}`, method: 'PUT', data: { issuerId: issuerId, permissions: permissions } }); console.log('Permissions update response'); console.log(response); }
استفاده از حساب موجود
برای تعیین اینکه آیا میتوانید از حساب «صادرکننده» که حاوی کلاسهای مجوز موجود است استفاده کنید، باید از معیارهای زیر استفاده شود.
- اگر حساب «صادرکننده» برای توسعه مجوز حاوی کلاسهایی برای فروشندگان دیگر است، باید حساب جدیدی ازطرف فروشنده راهاندازی کنید.
- اگر حساب صادرکننده شما برای توسعه مجوز فقط حاوی کلاسهایی برای آن فروشنده خاص باشد، میتوان از آن استفاده کرد.
اگر حساب این معیارها را برآورده میکند، باید اطلاعات تماس را در نمایه کسبوکار با اطلاعات فروشنده بهروز کنید تا مطمئن شوید نام حساب، فروشنده را شناسایی میکند. فقط شما باید به این حساب دسترسی میانای برنامهسازی کاربردی داشته باشید. توسعهدهندگان مجوز دیگر باید حساب «صادرکننده» خودشان را ایجاد کنند.
پیکربندی حساب صادرکننده پسخرید
استفاده از «کنسول Pay و کیف پول Google»
در حساب «صادرکننده پسخرید»، باید مراحل زیر را دنبال کنید:
- به بخش Google Wallet API بروید
- ویژگیهای دیگر را انتخاب کنید
- افزودن کلید اصالتسنجی را انتخاب کنید
- کلید عمومی (فایل
.pem) بارگذاری کنید و نسخه کلید را مشخص کنید - ایجاد کلید اصالتسنجی را انتخاب کنید
پساز بارگذاری موفقیتآمیز کلید اصالتسنجی، «شناسه جمعآورنده» به شما ارائه خواهد شد.
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEchyXj869zfmKhRi9xP7f2AK07kEo
4lE7ZlWTN14jh4YBTny+hRGRXcUzevV9zSSPJlPHpqqu5pEwlv1xyFvE1w==
-----END PUBLIC KEY-----
استفاده از Google Wallet API
بارگذاری کردن کلید عمومی
برای اختصاص دادن کلیدهای عمومی و نسخههای کلید بااستفاده از Google Wallet API، باید
درخواست PATCH به نقطه پایانی «صادرکنندگان» ارسال کنید.
PATCH https://walletobjects.googleapis.com/walletobjects/v1/issuer/{issuerId}
متن درخواست PATCH مشابه زیر خواهد بود:
{
"smartTapMerchantData": {
"authenticationKeys": [
{
"id": 1,
"publicKeyPem": "-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----"
},
{
"id": 2,
"publicKeyPem": "-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----"
}
]
}
}
نمونه کد زیر بهروزرسانی حساب «صادرکننده» را برای گنجاندن کلید عمومی نمایشی که قبلاً ذکر شد نشان میدهد:
جاوا
/** * Add a new public key to an Issuer account. * * @param issuerId The issuer ID being used for this request. * @throws IOException */ public void AddSmartTapKey(Long issuerId) throws IOException { // New smart tap key information Issuer patchBody = new Issuer() .setSmartTapMerchantData( new SmartTapMerchantData() .setAuthenticationKeys( Arrays.asList( new AuthenticationKey() .setId(1) .setPublicKeyPem( "-----BEGIN PUBLIC KEY-----\n" + "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEchyXj869zfmKhRi9xP7f2AK07kEo\n" + "4lE7ZlWTN14jh4YBTny+hRGRXcUzevV9zSSPJlPHpqqu5pEwlv1xyFvE1w==\n" + "-----END PUBLIC KEY-----")))); Issuer response = service.issuer().patch(issuerId, patchBody).execute(); System.out.println("Issuer patch response"); System.out.println(response.toPrettyString()); }
PHP
/** * Add a new public key to an Issuer account. * * @param string $issuerId The issuer ID being used for this request. */ public function addSmartTapKey(string $issuerId) { // New smart tap key information $patchBody = new Google_Service_Walletobjects_Issuer([ 'smartTapMerchantData' => new Google_Service_Walletobjects_SmartTapMerchantData([ 'authenticationKeys' => [ new Google_Service_Walletobjects_AuthenticationKey([ 'id' => 1, 'publicKeyPem' => "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEchyXj869zfmKhRi9xP7f2AK07kEo\n4lE7ZlWTN14jh4YBTny+hRGRXcUzevV9zSSPJlPHpqqu5pEwlv1xyFvE1w==\n-----END PUBLIC KEY-----" ]) ] ]) ]); $response = $this->service->issuer->patch($issuerId, $patchBody); print "Issuer patch response\n"; print_r($response); }
Python
def add_smart_tap_key(self, issuer_id: str) -> str: """Add a new public key to an Issuer account. Args: issuer_id (str): The issuer ID being used for this request. """ # New smart tap key information patch_body = { 'smartTapMerchantData': { 'authenticationKeys': [{ 'id': 1, 'publicKeyPem': '-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEchyXj869zfmKhRi9xP7f2AK07kEo\n4lE7ZlWTN14jh4YBTny+hRGRXcUzevV9zSSPJlPHpqqu5pEwlv1xyFvE1w==\n-----END PUBLIC KEY-----' }] } } # Make the PATCH request response = self.http_client.patch(url=f'{self.issuer_url}/{issuer_id}', json=patch_body) print('Issuer patch response') print(response.text) return response.json()['smartTapMerchantData']['smartTapMerchantId']
C#
/// <summary> /// Add a new public key to an Issuer account. /// </summary> /// <param name="issuerId">The issuer ID being used for this request.</param> public void AddSmartTapKey(long issuerId) { // New smart tap key information Issuer patchBody = new Issuer() { SmartTapMerchantData = new SmartTapMerchantData { AuthenticationKeys = new List<AuthenticationKey> { new AuthenticationKey { Id = 1, PublicKeyPem = "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEchyXj869zfmKhRi9xP7f2AK07kEo\n4lE7ZlWTN14jh4YBTny+hRGRXcUzevV9zSSPJlPHpqqu5pEwlv1xyFvE1w==\n-----END PUBLIC KEY-----" } } } }; Stream responseStream = service.Issuer .Patch(patchBody, issuerId) .ExecuteAsStream(); StreamReader responseReader = new StreamReader(responseStream); JObject jsonResponse = JObject.Parse(responseReader.ReadToEnd()); Console.WriteLine("Issuer patch response"); Console.WriteLine(jsonResponse.ToString()); }
Node.js
/** * Add a new public key to an Issuer account. * * @param {string} issuerId The issuer ID being used for this request. */ async addSmartTapKey(issuerId) { // New smart tap key information let patchBody = { smartTapMerchantData: { authenticationKeys: [ { id: 1, publicKeyPem: '-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEchyXj869zfmKhRi9xP7f2AK07kEo\n4lE7ZlWTN14jh4YBTny+hRGRXcUzevV9zSSPJlPHpqqu5pEwlv1xyFvE1w==\n-----END PUBLIC KEY-----' } ] } }; let response = await this.httpClient.request({ url: `${this.issuerUrl}/${issuerId}`, method: 'PATCH', data: patchBody }); console.log('Issuer patch response'); console.log(response); }
پاسخ شامل بدنه ارسالی شما و یک فیلد اضافی،
smartTapMerchantData.smartTapMerchantId خواهد بود. این شناسه گردآورنده حساب صادرکننده پسخرید است.
دریافت شناسه جمعآورنده
پساز افزودن کلیدها و نسخههای کلید، میتوانید از Google Wallet API برای دریافت
«شناسه جمعآوریکننده» خود با ایجاد درخواست GET به نقطه پایانی «صادرکنندگان» استفاده کنید.
GET https://walletobjects.googleapis.com/walletobjects/v1/issuer/{issuerId}
جاوا
/** * Get the Collector ID for an Issuer account. * * @param issuerId The issuer ID being used for this request. * @return The Collector ID * @throws IOException */ public Long GetCollectorId(Long issuerId) throws IOException { Issuer response = service.issuer().get(issuerId).execute(); System.out.println("Issuer patch response"); System.out.println(response.toPrettyString()); return response.getSmartTapMerchantData().getSmartTapMerchantId(); }
PHP
/** * Get the Collector ID for an Issuer account. * * @param string $issuerId The issuer ID being used for this request. * @return string The Collector ID. */ public function getCollectorId(string $issuerId) { $response = $this->service->issuer->get($issuerId); print "Issuer get response\n"; print_r($response); return $response['smartTapMerchantData']['smartTapMerchantId']; }
Python
def get_collector_id(self, issuer_id: str) -> str: """Get the Collector ID for an Issuer account. Args: issuer_id (str): The issuer ID being used for this request. """ # Make the GET request response = self.http_client.get(url=f'{self.issuer_url}/{issuer_id}') print('Issuer get response') print(response.text) return response.json()['smartTapMerchantData']['smartTapMerchantId']
C#
/// <summary> /// Get the Collector ID for an Issuer account. /// </summary> /// <param name="issuerId">The issuer ID being used for this request.</param> /// <returns>The Collector ID</returns> public string GetCollectorId(long issuerId) { Stream responseStream = service.Issuer .Get(issuerId) .ExecuteAsStream(); StreamReader responseReader = new StreamReader(responseStream); JObject jsonResponse = JObject.Parse(responseReader.ReadToEnd()); Console.WriteLine("Issuer get response"); Console.WriteLine(jsonResponse.ToString()); return jsonResponse["smartTapMerchantData"]["smartTapMerchantId"].Value<string>(); }
Node.js
/** * Get the Collector ID for an Issuer account. * * @param {string} issuerId The issuer ID being used for this request. * * @returns {string} The Collector ID */ async getCollectorId(issuerId) { let response = await this.httpClient.request({ url: `${this.issuerUrl}/${issuerId}`, method: 'GET' }); console.log('Issuer patch response'); console.log(response); return response.data.smartTapMerchantData.smartTapMerchantId; }
پاسخ شامل فیلد smartTapMerchantData.smartTapMerchantId خواهد بود.
این شناسه Collector حساب «صادرکننده پسخرید» است.
مدیریت حساب صادرکننده
سازمان مجوز
دو رویکرد رایج برای مدیریت کلاسها و اشیای مجوز برای چندین فروشنده وجود دارد:
- یک حساب صادرکننده مرکزی برای همه فروشندگان
- یک حساب «صادرکننده» جدید برای هر فروشنده
برای مثال، Foo-Loyalty برنامههای وفاداری جداگانهای را برای دو فروشنده مدیریت میکند: ILuvCoffee و TeaLuv. کلاسهای مجوز آنها را میتوان به یکی از روشهای زیر مدیریت کرد:
| رویکرد | شرح |
|---|---|
| حساب «صادرکننده» تکی | همه کلاسهای وفاداری را در یک حساب صادرکننده «Foo-Loyalty» قرار دهید. اگر قصد دارید پیگیری کنید که مجوزهایتان در کجا در سطح کلاس قابلپسخریدن هستند، این گزینه توصیه میشود. همچنین اگر هرگز به فروشندگان خود دسترسی API به آن حساب «صادرکننده» را اعطا نکنید، گزینه خوبی است. |
| حسابهای «صادرکننده» جداگانه | دو حساب «صادرکننده» جداگانه ایجاد کنید: «iLuvCoffee ازطریق Foo-Loyalty» و «teaLuv ازطریق Foo-Loyalty». اگر میخواهید فرض کنید که همه کلاسهای تحت یک حساب «صادرکننده» خاص در سطح فروشنده قابلپسخریدن هستند، یا اگر قصد دارید به فروشندگان دسترسی API به حساب «صادرکننده» بدهید، این گزینه توصیه میشود. |
حساب صادرکننده پسخرید
هنگام تعیین حساب «صادرکننده پسخرید» صحیح برای استفاده، دو سناریو وجود دارد که باید درنظر گرفته شود.
سناریو ۱: فروشنده ازقبل از «ضربه هوشمند» استفاده میکند
اگر فروشنده تأیید کند که ازقبل میتواند با پایانههای خود از «کیف پول Google» پسخرید کند (فروشنده ازقبل بهعنوان «صادرکننده پسخرید» راهاندازی شده است)، مراحل زیر را دنبال کنید:
- درخواست «شناسه صادرکننده پسخرید» فروشنده
- «شناسه صادرکننده پسخرید» فروشنده را به ویژگی
redemptionIssuersکلاس مجوزتان اضافه کنید
سناریو ۲: فروشنده با Smart Tap آشنایی ندارد
در این سناریو، فروشنده پایانههایی دارد که از Smart Tap پشتیبانی میکنند اما از این ویژگی استفاده نکرده است. فروشنده، ارائهدهنده پایانه، یا توسعهدهنده مجوز باید یکبار راهاندازی را انجام دهد تا Smart Tap در پایانههای فروشنده فعال شود.
برای اطلاعات بیشتر، پیکربندی فروشنده را ببینید.