如何使用google-play-purchase-validator在应用程序和node.js服务器之间进行有效购买

我有一个应用程序,我正在testing,可以自由使用,但在应用程序购买。 我已经运行在谷歌Play商店的阿尔法,我过去使用android.test SKU,然后安装我自己的工作。 现在,当有人进行购买时,我希望应用程序能够向我的服务器传达我的服务器需要的信息,以便向Google询问应用程序购买是否合法,然后转向并妥善地logging他们的帐户,因为控制服务已完成由服务器。 到目前为止,我有这样的:

在我的节点服务器的index.js文件中,我有一个像这样的段:

var Verifier = require('google-play-purchase-validator'); function validUserPurchases (receipt) { var options = { email: "#################@developer.gserviceaccount.com", key: "-----BEGIN PRIVATE madness -----END PRIVATE KEY-----\n", keyFile: "./Google Play Android Developer-##########.json" }; var verifier = new Verifier(options); verifier.verify(receipt, function cb(err, response) { if (err) { console.log("there was an error validating the receipt"); console.log(err); } else { console.log("sucessfully validated the receipt"); //do crap on my server to grant that account new privileges console.log(response); } }); } 

其中收据是string是应用程序中mainactivity.java中的以下代码行中的purchase.getOriginalJson()对象:

 @Override public void StartPayment(String payment) { pricing = payment; // this is a SKU set by the user in a fragment my_socket.getDeveloperPayload(); //this gets a public key for the app from my server } @Override public void yourDeveloperPayLoad(String s) { your_pay_load = s; //something I am doing to uniquely stamp each transaction on my end if (your_pay_load.isEmpty()) { toastShort("Your account was not billed, something went wrong, try again."); } else { mHelper.launchPurchaseFlow(this, pricing, 100001, mPurchaseFinishedListener, your_pay_load); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (!mHelper.handleActivityResult(requestCode, resultCode, data)) { super.onActivityResult(requestCode, resultCode, data); } } IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { @Override public void onIabPurchaseFinished(IabResult result, Purchase info) { if (result.isFailure()) { //handle errors return; } else if (info.getSku().equals(pricing)) { consumeItem(); } } }; private void consumeItem() { mHelper.queryInventoryAsync(mReceivedInventoryListener); } IabHelper.QueryInventoryFinishedListener mReceivedInventoryListener = new IabHelper.QueryInventoryFinishedListener() { @Override public void onQueryInventoryFinished(IabResult result, Inventory inv) { if (result.isFailure()) { //handle failure } else { mHelper.consumeAsync(inv.getPurchase(pricing), mConsumeFinishedListener); } } }; IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() { @Override public void onConsumeFinished(Purchase purchase, IabResult result) { if (result.isSuccess()) { System.out.println("Checkout was successful"); //System.out.println("Purchase has: " + purchase); //System.out.println("Purchase SKU: " + purchase.getSku()); System.out.println("Purchase getDeveloperPayload: " + purchase.getDeveloperPayload()); System.out.println("Purchase getItemType: " + purchase.getItemType()); System.out.println("Purchase getOriginalJson(): " + purchase.getOriginalJson()); System.out.println("Purchase getOrderId(): " + purchase.getOrderId()); System.out.println("Purchase getPackageName(): " + purchase.getPackageName()); System.out.println("Purchase getSignature(): " + purchase.getSignature()); System.out.println("Purchase getToken(): " + purchase.getToken()); System.out.println("Purchase getPurchaseState(): " + purchase.getPurchaseState()); System.out.println("Purchase getPurchaseTime(): " + purchase.getPurchaseTime()); System.out.println("Purchase hashCode(): " + purchase.hashCode()); my_socket.sendPaymentVerification(purchase.getOriginalJson()); } else { System.out.println("Checkout was not successful"); } } }; 

我认为purchase.getOriginalJson()将构成服务器需要通过verifier.verify(receipt, function cb(err, response)发送到谷歌的一切verifier.verify(receipt, function cb(err, response)但是,当我尝试使用testing购买我得到:

validation收据时出错

[错误:找不到给定的软件包名称的应用程序。]

不知道我在做什么错,是否purchase.getOriginalJson()不构成我需要放入收据谷歌,以确认这是一个真正的购买发生? 我无法在alpha或betatesting频道中testing此function吗? Ty为你的时间。

我改变了这个function:

 IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() { @Override public void onConsumeFinished(Purchase purchase, IabResult result) { if (result.isSuccess()) { System.out.println("Checkout was successful"); System.out.println("Purchase getDeveloperPayload: " + purchase.getDeveloperPayload()); System.out.println("Purchase getItemType: " + purchase.getItemType()); System.out.println("Purchase getOriginalJson(): " + purchase.getOriginalJson()); System.out.println("Purchase getOrderId(): " + purchase.getOrderId()); System.out.println("Purchase getPackageName(): " + purchase.getPackageName()); System.out.println("Purchase getSignature(): " + purchase.getSignature()); System.out.println("Purchase getToken(): " + purchase.getToken()); System.out.println("Purchase getPurchaseState(): " + purchase.getPurchaseState()); System.out.println("Purchase getPurchaseTime(): " + purchase.getPurchaseTime()); System.out.println("Purchase hashCode(): " + purchase.hashCode()); try { JSONObject json = new JSONObject(purchase.getOriginalJson()); JSONObject obj = new JSONObject(); obj.put("data",json); obj.put("signature", purchase.getSignature()); my_socket.sendPaymentVerification(obj); } catch (JSONException e) { e.printStackTrace(); } } else { System.out.println("Checkout was not successful"); } } }; 

我正在使用node.js,在“iab_verifier”模块中定位:

 var IABVerifier = require('iab_verifier'); function validUserPurchases(purchase) { var receiptData = JSON.stringify(purchase.data); var receiptSignature = JSON.stringify(purchase.signature); console.log("data: " + receiptData); console.log("signature: " + receiptSignature); var googleplayVerifier = new IABVerifier(googleplay_public_key); Receipts.findOne({ data: receiptData, signature: receiptSignature }, function (err, result) { if (err) { console.log("In receipt error"); } else if (result == null) { console.log("No result for receipt found"); var isValid = googleplayVerifier.verifyReceipt(receiptData, receiptSignature); if (isValid) { console.log("The receipt is valid"); Clients.findOne({ socket_id: socket.id }, function (err, client) { if (client) { var receipt = new Receipts({ client_ID: client._id, data: receiptData, unique: true, signature: receiptSignature, unique: true }); receipt.save(function (err, result) { if (err) { console.log("Error saving the receipt"); } else { console.log("Update the clients account time"); var productID = JSON.parse(receiptData).productId; updateSubscription(productID); } }); } }); } else { console.log("The receipt is not valid"); } } else { console.log("This receipt is already in use"); } }); } 

希望这能节省一些时间,gl。

Interesting Posts