我正在尝试在我的应用中实施应用内结算,google payload sample's MainActivity就像这样说:
/ * TODO:为了安全起见,请在此处生成有效负载以进行验证。请参阅评论 * verifyDeveloperPayload()获取更多信息。由于这是一个SAMPLE,我们只是使用 *一个空字符串,但在生产应用程序上,您应该仔细生成它。 * /
我在Android Developers - Security and Design上找了它,并说明:
您应该传入一个字符串令牌,以帮助您的应用程序识别进行购买的用户,以便您以后可以验证这是该用户的合法购买。对于消耗品,您可以使用随机生成的字符串,但对于非消耗品,您应该使用唯一标识用户的字符串。
我还不清楚如何生成字符串,最重要的是如何“使用唯一标识用户的字符串”
也许你可以提供一个例子,并简要说明它是如何运作的。
修改 Android Developers - Security and Design中的Google甚至建议不要使用用户电子邮件。
注意:请勿在有效内容字符串中使用用户的电子邮件地址,因为该地址可能会更改。
我可以使用什么呢?
答案 0 :(得分:0)
根据Android文档,这里说明了
第五个参数包含一个'developer payload'字符串,您可以使用该字符串发送有关订单的补充信息(它可以是空字符串)。通常,这用于传递唯一标识此购买请求的字符串标记。如果您指定字符串值,Google Play会将此字符串与购买回复一起返回。随后,当您对此次购买进行查询时,Google Play会将此字符串与购买详情一起返回。
安全建议:最好传入一个字符串,帮助您的应用程序识别进行购买的用户,以便稍后验证这是该用户的合法购买。对于消耗品,您可以使用随机生成的字符串,但对于非消耗品,您应该使用唯一标识用户的字符串。
因此,对于产品ID SKU_2006,如果您使用String payload = email + item1启动了购买流程;那么Google Play将在响应中返回相同的有效负载,因此您可以在此处获取
boolean verifyDeveloperPayload(Purchase p) {
String payload = p.getDeveloperPayload();
..
}
现在,让我根据代码定义整个场景:
首先,您将发起购买请求,如下所示
String payload = getUserEmailFromAndroidAccounts() + itemUniqueId;
mHelper.launchPurchaseFlow(new PurchaseFinishListener(itemUniqueId), SKU_GAS, 10001,
mPurchaseFinishedListener, payload);
如果采购订单成功,Google Play的响应数据将存储在传递回收件人的Purchase对象中。
private class PurchaseFinishListener implements IabHelper.OnIabPurchaseFinishedListener {
private final String mItemUniqeId;
public PurchaseFinishListener(String itemUniqeId) {
mItemUniqeId = itemUniqeId;
}
public void onIabPurchaseFinished(IabResult result, Purchase purchase)
{
if (result.isFailure()) {
Log.d(TAG, "Error purchasing: " + result);
return;
}
if (!verifyDeveloperPayLoad(mItemUniqeId , purchase)) {
Log.d(TAG, "Authenticity verification failed");
return;
}
// set your product as purchased in your DB or server
}
}
现在,您的verifyDeveloperPayLoad(购买)方法应如下所示: