首页 > 编程知识 正文

google付款资料设置,你的一种或多种付款方式需要验证

时间:2023-05-05 19:22:38 阅读:161944 作者:453

最近的项目访问订阅产品。 这里总结一下公司强大面包的经验和我整理的脚本。

一.关于订阅

1 )与消耗性和非消耗性采购类似,开发商记账后后台建设订阅型商品。 订阅型商品有两种,自动续订和非自动续订,一般使用自动续订。

2 )有免费期。 例如,一个月的订阅期有三天的免费试用期。 用户购买后,取消前三天就不收费了。 试用期过后,用户可以在苹果的设置中取消以后的续订。 这样的话,在一个订阅周期结束后,苹果就不会自动扣费了。

3、订阅商品需要解决的问题

a、用户卸载后再重新安装。 如何恢复订阅的功能可以使用苹果拥有的一套恢复机制。 如果一个用户订阅了这个APP的一个商品,当用户再次购买时,苹果有自己的一组恢复机制。 暗示以前更改了商品,为了你恢复了。 所以恢复机制可以直接采用苹果持有的方案

b、如何验证用户订阅是否已完成! *用户每次购买商品,苹果都会生成receipt。 这相当于我们购买时的证书,该证书可以用于验证这次购买是否有效。 购买证明是苹果自己保存的,要验证这个产品是否买过,验证这个receipt就可以了。

验证方法有两种。

一个是本地验证,根据苹果的机制,解析为receipt后,会得到相应的字段。 但是,这种检查的机制已经被破解。 因为hacker可以修改本地receipt以禁用本地验证。 但是,对于内购不占特别大比例的产品,这个可以使用。 就像我们的休闲游戏一样,内购的比重不能采用这种方式。

另一种方式是将receipt发送给苹果,苹果通过服务器自己验证。 该验证100%正确,后台通过苹果分析的字段,可以判断此次购买是否正确。

对于具有订阅性的商品,在服务器端验证时,需要在后台添加配置。 服务器端对具有订阅能力的商品进行验证时,必须使用此字段。 这是消耗性和非消耗性的不同之处。

另一方面,Google只需要autoRenewing属性来确定是否存在过期日期,如果为true,则进入订阅状态;如果为false,则禁用订阅。

C、如何测试订阅的沙箱环境与其他类型的略有不同,以及其过期时间与后台设置的不匹配? 具体请参照下表。

那么,客户端要执行的操作是什么呢?

一.采购

购买订阅商品和购买一般商品没有区别,所以按照通常的流程购买就可以了。

对此有问题的人请参考我的另一个博客unityiapGoogle支付、ios支付

注意:初始化商品类型时,请在订阅产品时选择配对类型。

选择“预订类型”(ProductType.Subscription )以预订商品,如图中的位置所示。

二.验证

订阅商品的难点主要是判断订阅商品是否过期。

由于Unity附带的IAP插件找不到用于分析receipt的接口,因此必须导入以下脚本来分析receipt

using UnityEngine; classgooglepurchasedata {//in app _ purchase _ datapublicstringinappurchasedata; //in app _ data _ signaturepublicstringinappdatasignature; 公共googlepurchasejson JSON; [ system.serializable ] privatestructgooglepurchasereceipt { public string payload; } [ system.serializable ] privatestructgooglepurchasepayload { public string JSON; 公共字符串信号; } [ system.serializable ] publicstructgooglepurchasejson { publicstringautorenewing; 公共字符串顺序; public string packageName; 公共字符串产品id; public string purchaseTime; 公共字符串采购状态; 公共字符串开发人员支付; public string purchaseToken; } publicgooglepurchasedata (string receipppt ) try ) varpurchasereceipt=JSON utility.fromjsongooglepurchasereceipt ) receipt

on<GooglePurchasePayload>(purchaseReceipt.Payload); var inAppJsonData = JsonUtility.FromJson<GooglePurchaseJson>(purchasePayload.json); inAppPurchaseData = purchasePayload.json; inAppDataSignature = purchasePayload.signature; json = inAppJsonData; } catch { Debug.Log("Could not parse receipt: " + receipt); inAppPurchaseData = ""; inAppDataSignature = ""; } }}

脚本2 判断是否处于订阅状态

using UnityEngine.Purchasing;using UnityEngine.Purchasing.Security;/* 以下两个方法都是封装好检测是否订阅过的方法。 仅针对有一个订阅商品的检测,多个订阅商品可能需要区分ID。暂时未做测试。 注意一点,判断订阅状态必须得在商品初始化之后判断。*///订阅控制脚本public class SubscriptionCtrl:MonoBehaviour{ public void Start() {//每次进入游戏调用检查订阅方法#if UNITY_ANDROID CheckSubscribeReceiptAndorid();#elif UNITY_IOS || UNITY_STANDALONE_OSX CheckSubscribeReceipt();#endif } public void CheckOk() { //如果检查处于订阅状态,可以在这里做客户端逻辑处理 } public void CheckWrong() { //如果检查处于非订阅状态,可以在这里做客户端逻辑处理 } //检查谷歌订阅状态的方法,该方法需要同时导入另外一个脚本GooglePurchaseData 解析谷歌支付的receipt public void CheckSubscribeReceiptAndorid() { foreach (Product p in Purchaser.m_StoreController.products.all) { if (p.hasReceipt) { Debug.Log("recepit all:" + p.receipt); GooglePurchaseData data = new GooglePurchaseData(p.receipt); Debug.Log("recepit autoRenewing:" + data.json.autoRenewing); /* Debug.Log("recepit orderId:" + data.json.orderId); Debug.Log("recepit packageName:" + data.json.packageName); Debug.Log("recepit productId:" + data.json.productId); Debug.Log("recepit purchaseTime:" + data.json.purchaseTime); Debug.Log("recepit purchaseState:" + data.json.purchaseState); Debug.Log("recepit purchaseToken:" + data.json.purchaseToken); */ if (bool.Parse(data.json.autoRenewing)) { CheckOk(); Debug.Log("sub is active"); } else { CheckWrong(); Debug.Log("sub not active"); } } } } //检查IOS订阅状态的方法, 这里是通过receipt里面的expiredate和当前时间对比来判断当前的订阅商品是否过期。 public void CheckSubscribeReceipt() { try { var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance()); // Get a reference to IAppleConfiguration during IAP initialization. var appleConfig = builder.Configure<IAppleConfiguration>(); if (appleConfig == null || string.IsNullOrEmpty(appleConfig.appReceipt)) { return; } //Debug.LogError("appReceipt:" + appleConfig.appReceipt); var receiptData = System.Convert.FromBase64String(appleConfig.appReceipt); if (receiptData == null) { return; } AppleReceipt receipt = new AppleReceiptParser().Parse(receiptData); if (receipt == null) { return; } foreach (AppleInAppPurchaseReceipt productReceipt in receipt.inAppPurchaseReceipts) { if (productReceipt.productType == 3) { Debug.Log("sub productid = " + productReceipt.productID); DateTime expirationDate = productReceipt.subscriptionExpirationDate; Debug.Log("sub ExpirationDate = " + expirationDate.ToString()); DateTime now = DateTime.Now.ToUniversalTime(); //DateTime cancellationDate = apple.cancellationDate; if (DateTime.Compare(now, expirationDate) < 0) { Debug.Log("sub is active"); CheckOk(); } else { CheckWrong(); Debug.Log("sub not active"); } } } } catch (Exception exp) { Debug.Log(exp); } }}

以上 是客户端需要对订阅商品的操作。

另外,订阅页面在UI显示的方面也要遵循一些规则,具体可以参考官方文档。晚些也会更新一篇关于后台配置和遵循规则的博客。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。