پیش نیازها
قبل از ادامه، مطمئن شوید که مراحل زیر را کامل کرده اید:
حسابی را برای فعال کردن Smart Tap تعیین کنید
قبل از ادامه، باید شناسایی کنید که کدام حساب به عنوان حساب صادرکننده بازخرید تعیین می شود. دو راه برای تعیین این وجود دارد:
یک حساب صادرکننده جدید ایجاد کنید
اطلاعات تماس حساب حساب جدید باید حاوی اطلاعات تاجر باشد. برای دستورالعملهای نحوه انجام این کار در Google Pay & Wallet Console، به این مقاله پشتیبانی مراجعه کنید. نمونه کد زیر ایجاد یک حساب صادرکننده با استفاده از 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); }
پایتون
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)
سی شارپ
/// <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); }
پایتون
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)
سی شارپ
/// <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); }
از یک حساب کاربری موجود استفاده کنید
معیارهای زیر باید برای تعیین اینکه آیا میتوانید از یک حساب صادرکننده که حاوی کلاسهای عبور موجود است استفاده کنید، استفاده شود.
- اگر حساب صادرکننده برای توسعه مجوز دارای کلاسهایی برای سایر بازرگانان باشد، باید یک حساب جدید از طرف تاجر راهاندازی کنید.
- اگر حساب صادرکننده شما برای توسعه مجوز فقط دارای کلاسهایی برای آن تاجر خاص باشد، میتوان از آن استفاده کرد.
اگر حساب دارای این معیارها باشد، باید اطلاعات تماس در نمایه کسبوکار را با اطلاعات تاجر بهروزرسانی کنید تا مطمئن شوید نام حساب تاجر را شناسایی میکند. فقط شما باید به این حساب دسترسی API داشته باشید. توسعه دهندگان مجوز اضافی باید حساب های صادر کننده خود را ایجاد کنند.
پیکربندی حساب صادرکننده Redemption
از Google Pay & Wallet Console استفاده کنید
در حساب Redemption Issuer، باید مراحل زیر را دنبال کنید:
- به بخش 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); }
پایتون
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']
سی شارپ
/// <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
خواهد بود. این شناسه جمعآوری حساب Redemption Issuer است.
شناسه جمع کننده را دریافت کنید
پس از افزودن کلیدها و نسخههای کلید، میتوانید از 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']; }
پایتون
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']
سی شارپ
/// <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
خواهد بود. این شناسه جمعآوری حساب Redemption Issuer است.
مدیریت حساب صادرکننده
سازمان پاس
دو رویکرد متداول برای مدیریت کلاسها و اشیاء عبور برای چند تاجر وجود دارد:
- یک حساب صادرکننده مرکزی برای همه بازرگانان
- یک حساب صادرکننده جدید برای هر تاجر
برای مثال، Foo-Loyalty برنامههای وفاداری جداگانه را برای دو تاجر مدیریت میکند: ILuvCoffee و TeaLuv. کلاس های پاس آنها را می توان به یکی از روش های زیر مدیریت کرد:
رویکرد | توضیحات |
---|---|
حساب صادرکننده واحد | شامل همه کلاسهای وفاداری تحت یک حساب صادرکننده "Foo-Loyalty" باشد. این گزینه توصیه می شود اگر قصد دارید پاس های خود را در سطح کلاس ردیابی کنید. همچنین اگر هرگز به بازرگانان API خود اجازه دسترسی به آن حساب صادرکننده را ندهید، گزینه خوبی است. |
حساب های صادرکننده مجزا | دو حساب صادرکننده جداگانه ایجاد کنید: «iLuvCoffee via Foo-Loyalty» و «teaLuv via Foo-Loyalty». اگر میخواهید فرض کنید همه کلاسهای تحت یک حساب صادرکننده خاص در سطح فروشنده قابل بازخرید هستند، یا اگر قصد دارید به تاجران API دسترسی به حساب صادرکننده بدهید، این گزینه توصیه میشود. |
حساب صادرکننده بازخرید
هنگام تعیین حساب صحیح Redemption Issuer برای استفاده، دو سناریو باید در نظر گرفته شود.
سناریو 1: تاجر در حال حاضر از Smart Tap استفاده می کند
اگر تاجر تأیید کرد که میتواند با پایانههای خود از کیف پول Google استفاده کند (تاجر قبلاً بهعنوان صادرکننده بازخرید راهاندازی شده است)، مراحل زیر را دنبال کنید:
- شناسه صادرکننده بازخرید تاجر را درخواست کنید
- شناسه صادرکننده Redemption تاجر را به ویژگی
redemptionIssuers
کلاس پاس خود اضافه کنید
سناریو 2: تاجر تازه وارد Smart Tap شده است
در این سناریو، تاجر دارای پایانه هایی است که از Smart Tap پشتیبانی می کنند اما از این ویژگی استفاده نکرده است. تاجر، ارائهدهنده ترمینال یا توسعهدهنده مجوز برای فعال کردن Smart Tap در پایانههای تاجر، باید یک بار راهاندازی را انجام دهد.
برای اطلاعات بیشتر، به پیکربندی Merchant مراجعه کنید.