在使用IAP进行支付时,基本都要用到payload,才能方便的绑定和检查支付人的信息,避免代充等操作.
安卓平台下:
GooglePlay支付结算库在3.0开始就不支持payload(https://developer.android.google.cn/google/play/billing/developer-payload),其推荐使用setObfuscatedAccountId()
(https://developer.android.com/google/play/billing/security).实际上就是变相的把payload的功能更明确化:一个混淆的指向性ID,并用一个单独的方法来进行设置. 该值还是会回传给我们自己的服务器(服务器进行远程验证时会得到此值).
IAP代码中controller.InitiatePurchase(productID, payload)
,传入也变得无效.
同时IAP也不再推荐使用google的"Unity结算库插件"(https://developer.android.com/google/play/billing/unity#abstraction-layer), 如果引入该插件,并尝试执行流程中的 Fix, 就会报错.
IAP3.0版本使用SetObfuscatedAccountId()
来进行同样逻辑的处理:(https://docs.unity3d.com/Packages/com.unity.purchasing@3.2/api/UnityEngine.Purchasing.IGooglePlayStoreExtensions.html):
// IExtensionProvider m_extensions
var ext = m_extensions.GetExtension<IGooglePlayStoreExtensions>();
ext.SetObfuscatedAccountId(String)
IAP4.0开始,该函数移动到了ConfigurationBuilder
中,变动日志为: https://docs.unity.cn/Packages/com.unity.purchasing@4.0/changelog/CHANGELOG.html
if (Application.platform == RuntimePlatform.Android)
{
var config = m_builder.Configure<IGooglePlayConfiguration>();
config.SetObfuscatedAccountId(payload);
}
// IStoreController m_controller
m_controller.InitiatePurchase(product, payload);
在每次购买前都调用SetObfuscatedAccountId(),传入不同的值,服务器在验证时均能收到正确的值.
如果使用订单混淆验证(UnityEngine.Purchasing.Security.CrossPlatformValidator),则需要用到GooglePlayTangle和AppleTangle类,该类是由IAP工具生成的,参考:
https://docs.unity3d.com/Packages/com.unity.purchasing@4.0/manual/UnityIAPValidatingReceipts.html
如果有出现Google提示要求版本为4以上的问题:
则手动编辑工程目录下的Packages/manifest.json,修改purchasing版本为4.5以上:
"com.unity.purchasing": "4.5.0",