Android: การตรวจสอบใบเสร็จการซื้อในแอป Google Play


92

ฉันใช้กระเป๋าเงิน Google สำหรับเกตเวย์การชำระเงินของฉันหลังจากซื้อผลิตภัณฑ์แล้ว Google ให้คำตอบด้านล่างนี้

{ 
 "orderId":"12999763169054705758.1371079406387615", 
 "packageName":"com.example.app",
 "productId":"exampleSku",
 "purchaseTime":1345678900000,
 "purchaseState":0,
 "developerPayload":"bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ",
 "purchaseToken":"rojeslcdyyiapnqcynkjyyjh"
 }

ฉันกำลังพยายามใช้การตรวจสอบใบเสร็จที่ Google Play เพิ่งเปิดตัวในคอนโซลนักพัฒนาของ Google ฉันสร้างรหัสใบรับรองโดยบัญชีบริการในสิทธิ์อนุญาต แต่ฉันสับสนวิธีใช้การตรวจสอบใบเสร็จหลังจากซื้อผลิตภัณฑ์จาก Google Play-store

ดังนั้นทุกคนสามารถโปรดช่วยฉันวิธีการทำการตรวจสอบใบเสร็จรับเงินของInAppการสั่งซื้อ


สวัสดี Binil คุณได้สมัครสมาชิกเรียบร้อยแล้วหรือยัง?
Anshul Tyagi

มันคือการจัดการสินค้า @Anshul Tyag
Binil Surendran

@BinilSurendran .. คำถามของฉันแตกต่างจากคำถามของคุณ แต่ฉันต้องการทราบรหัสอีเมลที่ใช้สำหรับการซื้อในแอป คุณช่วยกรุณาช่วยฉันจะรับอีเมลนั้นได้อย่างไรเพราะฉันต้องการมันเพื่อใช้อ้างอิงเพิ่มเติมในแอปของฉัน
Pallavi

@ พัลลาวี. ขอโทษฉันไม่มีความคิดที่จะรับรหัสอีเมลของผู้ซื้อ เนื่องจากคำตอบที่ให้โดย Google หลังการซื้อไม่มี email_id
Binil Surendran

คำตอบ:


216

Google มีการตรวจสอบใบเสร็จรับเงินผ่านทางGoogle Play API นักพัฒนาซอฟต์แวร์ภายใน API ที่มีสองจุดสิ้นสุดคุณจะได้รับความสนใจมากที่สุดใน: Purchases.products: รับและPurchases.subscriptions: รับ

Purchases.products: getสามารถใช้เพื่อยืนยันการซื้อผลิตภัณฑ์ที่ไม่ต่ออายุอัตโนมัติซึ่งใช้Purchases.subscriptions: getสำหรับการยืนยันและยืนยันการสมัครสมาชิกผลิตภัณฑ์ที่ต่ออายุอัตโนมัติอีกครั้ง

หากต้องการใช้ปลายทางทั้งที่คุณต้องรู้packageName, productId, purchaseTokenสิ่งเหล่านี้สามารถพบได้ในส่วนของข้อมูลที่คุณได้รับในการซื้อ คุณต้องมีaccess_tokenสิ่งที่จะได้รับจากการสร้างบัญชีบริการ Google API

ในการเริ่มต้นใช้งานบัญชีบริการก่อนอื่นให้ไปที่หน้าการตั้งค่าการเข้าถึง API ของคอนโซลนักพัฒนาซอฟต์แวร์ Google Play แล้วคลิกปุ่มสร้างโครงการใหม่:

สร้างโครงการ Google API ใหม่

ตอนนี้คุณควรเห็นโครงการที่เชื่อมโยงใหม่และส่วนใหม่บางส่วนในส่วนบัญชีบริการให้คลิกปุ่มสร้างบัญชีบริการ

สร้างบัญชีบริการใหม่

คุณจะเห็นกล่องข้อมูลพร้อมคำแนะนำในการสร้างบัญชีบริการของคุณ คลิกลิงก์ไปยัง Google Developers Console และแท็บใหม่จะเกิดขึ้น

เปิด Google Developers Console

จากนั้นคลิกสร้างรหัสลูกค้าใหม่เลือกบัญชีบริการจากตัวเลือกแล้วคลิกสร้างรหัสลูกค้า

สร้างรหัสลูกค้าใหม่

ไฟล์ JSON จะดาวน์โหลดนี่คือ JSON Web Token ของคุณที่คุณจะใช้เพื่อแลกเปลี่ยนaccess_tokenเพื่อให้ปลอดภัย

จากนั้นสลับแท็บกลับไปที่คอนโซลนักพัฒนาซอฟต์แวร์ Google Play แล้วคลิกเสร็จสิ้นในช่องข้อมูล คุณควรเห็นบัญชีบริการใหม่ของคุณในรายการ คลิกที่ให้สิทธิ์การเข้าถึงถัดจากอีเมลบัญชีบริการ

ให้สิทธิ์การเข้าถึง

ถัดไปภายใต้เลือกบทบาทสำหรับผู้ใช้รายนี้เลือกการเงินและคลิกเพิ่มผู้ใช้

ตั้งค่าบทบาทเป็นการเงิน

ตอนนี้คุณได้ตั้งค่าบัญชีบริการของคุณแล้วและมีการเข้าถึงที่จำเป็นทั้งหมดเพื่อทำการตรวจสอบใบเสร็จ ถัดไปคือการแลกเปลี่ยน JWT ของคุณสำหรับ access_token

การaccess_tokenหมดอายุหลังจากแลกเปลี่ยนหนึ่งชั่วโมงคุณจึงต้องใช้รหัสเซิร์ฟเวอร์เพื่อจัดการสิ่งนี้และ Google ได้จัดเตรียมไลบรารีหลายแห่งในหลายภาษาเพื่อจัดการสิ่งนี้ (รายการไม่ครบถ้วนสมบูรณ์):

ฉันจะไม่ลงรายละเอียดเนื่องจากมีเอกสารมากมายเกี่ยวกับวิธีใช้ไลบรารีเหล่านี้ แต่ฉันจะพูดถึงว่าคุณต้องการใช้https://www.googleapis.com/auth/androidpublisherเป็นขอบเขต OAuth2 client_emailจาก JWT เป็นissuerและคีย์สาธารณะที่คุณจะได้รับจากprivate_keyและ รหัสผ่านnotasecretจะถูกใช้สำหรับไฟล์signing_key.

เมื่อคุณพร้อมaccess_tokenที่จะไปแล้ว (อย่างน้อยในชั่วโมงถัดไปซึ่งคุณจะต้องขอใหม่ตามขั้นตอนเดียวกันในย่อหน้าข้างบน)

ในการตรวจสอบสถานะของการซื้อสิ้นเปลือง (ไม่ต่ออายุอัตโนมัติ) ให้getส่งคำขอhttp ไปที่:https://www.googleapis.com/androidpublisher/v2/applications/com.example.app/purchases/products/exampleSku/tokens/rojeslcdyyiapnqcynkjyyjh?access_token=your_access_token

หากคุณได้รับรหัสตอบกลับ 200 http ทุกอย่างเป็นไปตามแผนและการซื้อของคุณถูกต้อง 404 หมายความว่าโทเค็นของคุณไม่ถูกต้องดังนั้นการซื้อจึงน่าจะเป็นการพยายามฉ้อโกง 401 หมายความว่าโทเค็นการเข้าถึงของคุณไม่ถูกต้องและ 403 หมายความว่าบัญชีบริการของคุณมีการเข้าถึงไม่เพียงพอตรวจสอบว่าคุณได้เปิดใช้งาน Financeสำหรับบัญชีการเข้าถึงในคอนโซลนักพัฒนาซอฟต์แวร์ Google Play

การตอบสนองจาก 200 จะมีลักษณะดังนี้:

{
  "kind": "androidpublisher#productPurchase",
  "purchaseTimeMillis": long,
  "purchaseState": integer,
  "consumptionState": integer,
  "developerPayload": string
}

สำหรับคำอธิบายของแต่ละดูทรัพย์สินhttps://developers.google.com/android-publisher/api-ref/purchases/products

การสมัครรับข้อมูลจะคล้ายกัน แต่จุดสิ้นสุดมีลักษณะดังนี้:

https://www.googleapis.com/androidpublisher/v2/applications/packageName/purchases/subscriptions/subscriptionId/tokens/token?access_token=you_access_token

และการตอบสนองควรมีคุณสมบัติเหล่านี้:

{
  "kind": "androidpublisher#subscriptionPurchase",
  "startTimeMillis": long,
  "expiryTimeMillis": long,
  "autoRenewing": boolean
}

โปรดดูhttps://developers.google.com/android-publisher/api-ref/purchases/subscriptionsสำหรับคำอธิบายคุณสมบัติและโปรดทราบว่าstartTimeMillisและexpiryTimeMillisอาจมีการเปลี่ยนแปลงขึ้นอยู่กับระยะเวลาของการสมัครสมาชิก

ขอให้มีความสุขในการตรวจสอบ!


ฉันเพิ่มผู้ใช้ใหม่ในคอนโซลนักพัฒนาซอฟต์แวร์และฉันได้รับใบรับรอง JSON ที่ได้รับจากคอนโซลคุณช่วยฉันได้ไหมในการตรวจสอบใบเสร็จรับเงินด้วยไฟล์ที่ดาวน์โหลด
@Marc

@BinilS คุณจะต้องเจาะจงมากขึ้นว่าคุณจะเขียนโค้ดในภาษาฝั่งเซิร์ฟเวอร์อะไร
Marc Greenstock

กำลังใช้ java ในฝั่งเซิร์ฟเวอร์
@Marc

3
นี่เป็นครั้งแรกที่ฉันได้เห็นคำแนะนำโดยละเอียดในการใช้การตรวจสอบการชำระเงินของเซิร์ฟเวอร์ใน 2 วันของการค้นหา ยกนิ้วให้ มีรหัสเซิร์ฟเวอร์พร้อมใช้งานที่ไหนสักแห่งหรือไม่? ฉันคิดว่ามันแปลกมากที่ไม่สามารถหาของแบบนั้นได้ทุกที่
Anonymous

2
@MarcGreenstock ขอบคุณสำหรับคำตอบโดยละเอียด
Lavakush

28

คำตอบของ Marc นั้นยอดเยี่ยมมาก ฉันจะเพิ่มเฉพาะไลบรารีไคลเอนต์ Google Play Developer API สำหรับ Javaทำให้ง่ายขึ้นมากเมื่อเชื่อมต่อจากเซิร์ฟเวอร์ของคุณไปยังเซิร์ฟเวอร์ Google Play ไลบรารีจะจัดการกับการรีเฟรชโทเค็นการตรวจสอบความถูกต้องโดยอัตโนมัติและยังมี API typesafe ดังนั้นคุณจึงไม่ต้องยุ่งกับ URL

นี่คือวิธีการตั้งค่าPublisherซิงเกิลตัน:

httpTransport = GoogleNetHttpTransport.newTrustedTransport();
jsonFactory = JacksonFactory.getDefaultInstance();      
credential = GoogleCredential.fromStream(getClass().getResourceAsStream("/path/to/your/key.json")).createScoped(Collections.singleton(AndroidPublisherScopes.ANDROIDPUBLISHER));
publisher = new AndroidPublisher.Builder(httpTransport, jsonFactory, credential).setApplicationName(APP_NAME).build();

รหัสต่อไปนี้ค้นหาการซื้อผลิตภัณฑ์:

ProductPurchase product = publisher.purchases().products().get(PACKAGE_NAME, sku, token).execute();
Integer purchaseState = product.getPurchaseState();
product.getPurchaseTimeMillis();
product.getConsumptionState();
product.getDeveloperPayload();

คุณสามารถสอบถามการสมัครสมาชิกในทำนองเดียวกัน:

SubscriptionPurchase sub = publisher.purchases().subscriptions().get(PACKAGE_NAME, sku, token).execute();
sub.getAutoRenewing();
sub.getCancelReason();
...

นี่คือรหัสบนเซิร์ฟเวอร์ Java หรือเรียกใช้บน Android ก่อนที่จะโทรออกไปยังเซิร์ฟเวอร์โดยพลการ?
ผู้ใช้

2
@jeshurun ​​ขอบคุณสำหรับรหัส APP_NAME = APP_PACKAGE_NAMEให้กับผู้อ่านอื่น ๆ
พายุหิมะ

1
แล้ว Python ล่ะ?
Babken Vardanyan

1
ขอบคุณ! สำหรับผมแทนผมใช้getClass().getResourceAsStream(... new FileInputStream(...
António Almeida

ขอบคุณ. มีประโยชน์มาก. อย่างไรก็ตามฉันต้องเพิ่ม: credential.refreshToken();ระหว่างการรับข้อมูลรับรองและผู้เผยแพร่
grooble

5

@ marc-greenstock ให้คำตอบที่ดีอย่างไรก็ตามมีสิ่งที่สำคัญมากเกี่ยวกับการตรวจสอบใบเสร็จโดยใช้ Google Play Android Developer API

หากคุณมีปัญหาในการใช้ API นี้และคุณได้เพิ่มผลิตภัณฑ์ที่ซื้อในแอปของคุณก่อนที่จะให้สิทธิ์หรือเชื่อมโยงกับบัญชีบริการของคุณคุณจะต้องเปิด "ผลิตภัณฑ์ที่ซื้อในแอป" และทำการอัปเดตบางอย่าง คุณสามารถตัวอย่างเช่นแก้ไขคำอธิบายผลิตภัณฑ์ของคุณและบันทึก คุณควรได้รับอนุญาตทันที

ฉันใช้เวลาสองสามชั่วโมงในการคิดว่าฉันทำอะไรผิด ...


2

คำตอบนี้ดีเยี่ยม อีกปัญหาหนึ่งที่เราพบขณะปฏิบัติตามคำแนะนำคือบัญชีบริการไม่ปรากฏใน Google Play Console เราพบวิธีแก้ปัญหานี้เพื่อช่วย: บัญชีบริการไม่ปรากฏใน Google Console หลังจากการสร้าง

โดยทั่วไปให้ไปที่ IAM บน Google API Console และเพิ่มบัญชีบริการใหม่จากนั้นบัญชีจะปรากฏบน Google Play Console ภาพหน้าจอ


คุณสามารถเพิ่มคำอธิบายได้ที่นี่ อีกครั้งถ้าลิงก์ถูกเพิกถอนคำตอบของคุณกลายเป็นไม่ถูกต้อง
Mathews Sunny

1
บทบาทของบัญชีที่เพิ่มเข้ามาควรเป็นอย่างไร?
Adi

0

ฉันประสบปัญหาที่คล้ายกันปัญหาอยู่ในการตั้งค่าที่เราทำในโครงการ Google Developer

อ้างถึงcreate-play-service-credentialsสำหรับการตั้งค่า ใช้บัญชีหลักเดียวกับที่คุณสร้างผลิตภัณฑ์ที่ซื้อในแอป

ตรวจสอบให้แน่ใจว่าคุณลบก่อนหน้านี้

ลิงก์ไปยังโครงการนักพัฒนาของ Google บัญชีนักพัฒนาซอฟต์แวร์ Play ของคุณต้องเชื่อมโยงกับโครงการนักพัฒนาซอฟต์แวร์ของ Google

1a. เปิดการตั้งค่า> เมนูบัญชีนักพัฒนาและเลือกการเข้าถึง API

การเข้าถึง API

1b. เลือกลิงก์เพื่อเชื่อมต่อบัญชี Play ของคุณกับโครงการ Google Developer

เลือกโครงการลิงค์

1 ค. ยอมรับข้อกำหนดและเงื่อนไข

ตกลงเงื่อนไขเงื่อนไข

2. สร้างบัญชีบริการ ต่อไปเราต้องสร้างบัญชีบริการ สิ่งนี้ทำได้จากคอนโซล Google API

2a. เลือกสร้างบัญชีบริการ

สร้างบัญชีบริการ

2b. สร้างข้อมูลรับรองคีย์บัญชีบริการ

บัญชีบริการ

2 ค. ป้อนรายละเอียดสำหรับบัญชีบริการ

เข้าสู่บริการบัญชีรายละเอียด

2d. ดาวน์โหลดข้อมูลรับรอง JSON ของคุณ: json- หนังสือรับรอง

3. ให้สิทธิ์การเข้าถึง

3a. ใน Play Console ให้เลือกให้สิทธิ์การเข้าถึงในบัญชีบริการที่สร้างขึ้นใหม่

ให้สิทธิ์เข้าถึง

3b. ให้สิทธิ์ต่อไปนี้:

ใช้สิทธิ์

หลังจากนี้ให้รอ 48 ชั่วโมงเพื่อให้ Google เผยแพร่สิทธิ์การเข้าถึงทั้งหมดสำหรับ API

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.