# 接入

# 账号接入

1、Maven 形式引入账号 SDK:在要引入的 app 工程下的的 build.gradle 文件的 dependencies{}里面 implementation '{SDK 名称+版本号}',如需 facebook 登录添加 facebooksdk 依赖,如下所示

implementation 'com.machbird:machbird-account:1.2.0-rc12'
//facebook sdk依赖(rc11版本号及以后版本不需要facebook依赖了)
//implementation 'com.facebook.android:facebook-core:6.0.0'
//implementation 'com.facebook.android:facebook-login:6.0.0'
//implementation 'com.facebook.android:facebook-share:6.0.0'
//implementation 'com.facebook.android:facebook-places:6.0.0'
//implementation 'com.facebook.android:facebook-messenger:6.0.0'
//implementation 'com.facebook.android:facebook-applinks:6.0.0'

2、在工程根目录下的 build.gradle 文件中的 repositories {}里面添加 maven center 依赖:

mavenCentral()

3、在工程的 value 文件夹中的 string.xml 或者自定义 config.xml 中添加 account id(MC_ACCOUNT_ID), facebook id(facebook_app_id) 和 google id(default_web_client_id):相关 ID 号值运营人员会提供

    <string name="facebook_app_id">xxxx</string>
    <string name="MC_ACCOUNT_ID">xxxxxx</string>
    <string name="default_web_client_id">xxxxxxx</string>
    //以下两个分别为debug模式下和release模式下的账号服务器地址配置,如果没有配置,我们会走sdk内部默认的账号服务器
    <string name="DEBUG_MC_ACCOUNT_HOST_URL">http://test-xxxx</string> <!-- debug模式下测试服务器地址-->
    <string name="USER_MC_ACCOUNT_HOST_URL">https://xxxx</string> <!-- 正式服务器地址,会覆盖sdk内部默认服务器地址-->

在 AndroidManifest.xml 里的标签之内添加以下内容,xxxxx 值运营人员会提供

<meta-data
      android:name="com.facebook.sdk.ApplicationId"
      android:value="@string/facebook_app_id" />
<meta-data android:name="com.adjustX.sdk.appToken" android:value="xxxxx"/>

# 账号接口

1、无需初始化,直接用以下单例模式获得 Machbirdkit 的实体类

MachbirdKit.getInstance()

2、Machbirdkit 实体类一共包括 15 个接口,详细使用如下所示:

MachbirdKit.getInstance().isLogin(); //判断是否登录状态 true登录 false未登录
MachbirdKit.getInstance().getAccount();//获得账户信息 Account对象,Account 对象可能为空,为空就是未登录
MachbirdKit.getInstance().logout()//登出接口
~~MachbirdKit.getInstance().startLoginPage(); //弹出登录对话框,1.2.0-rc01版本以上已删除~~
MachbirdKit.getInstance().startEasyLoginPage(Activity activity, CGAccountCallBack callback);//弹出新版登录对话框
MachbirdKit.getInstance().startGoogleLogin(Activity activity, CGAccountCallBack callback)//无界面绑定(游客登录情况下登录未绑定的谷歌号就是游客账号和谷歌账号绑定)或登录谷歌账号接口(此谷歌账号已绑定游戏账号)
MachbirdKit.getInstance().startFaceBookLogin(Activity activity, CGAccountCallBack callback)//无界面绑定或登录facebook账号(逻辑与谷歌绑定或登录一致)
MachbirdKit.getInstance().startAccountInfo(Activity activity, CGAccountCallBack callback)//打开账号信息对话框
MachbirdKit.getInstance().startRegisterPage(Activity activity, CGAccountCallBack callback)//打开注册对话框
MachbirdKit.getInstance().autoLogin(CGAccountCallBack callback)//自动登录接口
MachbirdKit.getInstance().startGuestLogin(Activity activity, CGAccountCallBack callback)//游客登录接口,无账号时调用游客登录
//rc11 版本增加的接口
MachbirdKit.getInstance().startBindInfoPage(Activity activity, CGAccountCallBack callback)//打开收到绑定/解绑对话框UI
MachbirdKit.getInstance().getAccountBindInfo(Context context,  CGAccountBindInfoCallBack BindInfoCallBack);//获得绑定信息
/**
 * 对外接口 绑定
 * @param activity
 * @param callback
 * 解绑与绑定参数 bindType 支持以下三种类型的绑定
 * @param bindType :Constant.LoginType.FACEBOOK //facebook的绑定
 *                 :Constant.LoginType.GOOGLE //谷歌绑定
 *                 :Constant.LoginType.EMAIL //邮箱绑定
 */
MachbirdKit.getInstance().startBind(Activity activity,CGAccountCallBack callback,int bindType);//手动绑定账号接口
MachbirdKit.getInstance().startUnBind(Activity activity, CGAccountCallBack callback, int bindType);//手动解绑账号接口


----注意:所有接口中的回调CGAccountCallBack类中方法都是在java主线程中调用的。如果回调中有游戏渲染之类需要在游戏线程中做的事情,请切换到游戏线程中处理。---

游戏首页打开逻辑示例:
    private void mainPageShow() {
        Account account = MachbirdKit.getInstance().getAccount();
        if (account == null) {
            //第一次登录或者账号数据被清空时:
            MachbirdKit.getInstance().startGuestLogin(this,new CGAccountCallBack() {
                @Override
                public void onSuccess(int actionType) {
                    //do something when suc
                }

                @Override
                public void onFailed(int actionType, int errorCode, String msg) {
                    //do something when failed
                }
            });
        } else {
            //有账号数据时:
            MachbirdKit.getInstance().autoLogin(new CGAccountCallBack() {
                @Override
                public void onSuccess(int actionType) {
                    //do something when suc
                }

                @Override
                public void onFailed(int actionType, int errorCode, String msg) {
                    //do something when failed
                }
            });
        }
    }

其他接口调用示例:
@Override
public void onClick(View view) {
    switch (view.getId()) {
        case R.id.mach_login_status:
            boolean isLogin = MachbirdKit.getInstance().isLogin();
            break;
        case R.id.mach_login_account:
            Account info = MachbirdKit.getInstance().getAccount());
            break;
        case R.id.mach_login:
            MachbirdKit.getInstance().startLoginPage(this, new CGAccountCallBack() {
                @Override
                public void onSuccess(int actionType) {
                    Toast.makeText(MainActivity.this,"登录成功",Toast.LENGTH_SHORT);
                }


                @Override
                public void onFailed(int actionType, int errorCode, String msg) {
                    Toast.makeText(MainActivity.this,"登录失败",Toast.LENGTH_SHORT);
                }
            });
            break;
        case R.id.mach_logout:
            MachbirdKit.getInstance().logout(MainActivity.this, new CGAccountCallBack() {
                @Override
                public void onSuccess(int actionType) {
                    //登出成功
                }


                @Override
                public void onFailed(int actionType, int errorCode, String msg) {
                    //登出失败
                }
            });
            break;
    }
    //CGAccountCallBack为回调接口,处理登录和登出失败的情况

3、MachbirdKit.getInstance().isLogin() 返回值为 boolean 值:true 为登录状态 false 为未登录状态

4、MachbirdKit.getInstance().getAccount() 返回值为 org.n.account.core.model.Account 实例对象,null 表示没有账号信息 拿到的账号信息里面有登录状态和类型信息: Account account = MachbirdKit.getInstance().getAccount(); if(account!=null) { if(account.mLoginType == Constant.LoginType.FACEBOOK) { //facebook登录状态 } else if(account.mLoginType == Constant.LoginType.GOOGLE) { //谷歌登录状态 } else if(account.mLoginType == Constant.LoginType.EMAIL) { //邮箱登录状态 } else if(account.mLoginType == Constant.LoginType.GUEST) { //游客登录状态 } } else { //未登录状态 }

5、MachbirdKit.getInstance().logout(final Activity activity, CGAccountCallBack callback) 参数为 Activity 和 CGAccountCallBack 接口实现

6、MachbirdKit.getInstance().startLoginPage(Activity activity, CGAccountCallBack callback) 参数为 Activity 和 CGAccountCallBack 接口实现

7、CGAccountCallBack 接口如下所示:

/**
 * 对外回调接口
 */
public interface CGAccountCallBack {
    //成功回调处理:loginType为登录类型
    void onSuccess(int actionType);
    //错误回调:loginType为登录类型,errorCode为错误码,msg为错误信息
    void onFailed(int actionType, int errorCode, String msg);
}

参数actionType类型有以下几种:
Constant.LoginType.GUEST //游客登录
Constant.LoginType.FACEBOOK //facebook的登录
Constant.LoginType.GOOGLE //谷歌登录
Constant.LoginType.EMAIL  //邮箱登录

MachbirdKit.LOGIN_TYPE_REGISTER; //注册
MachbirdKit.LOGIN_TYPE_LOGIN_OUT; //登出
MachbirdKit.AUTO_LOGIN_IN_TYPE; //自动登录

8、CGAccountBindInfoCallBack接口及获取账号绑定信息示例

/**
 * 对外回调绑定信息接口
 */
public interface CGAccountBindInfoCallBack {
    //成功回调处理
    void onSuccess(Map<String, BindInfo> bindInfoMap);
    //错误回调:errorCode为错误码,msg为错误信息
    void onFailed(int errorCode, String msg);
}
//账号登录回调
final CGAccountCallBack callBack = new CGAccountCallBack() {
    @Override
    public void onSuccess(int loginType) {

    }

    @Override
    public void onFailed(int loginType, int errorCode, String msg) {

    }
};
//账号信息回调
CGAccountBindInfoCallBack BindInfoCallBack = new CGAccountBindInfoCallBack() {
    @Override
    public void onSuccess(Map<String, BindInfo> bindInfoMap) {
        if(bindInfoMap!=null) {
            if(bindInfoMap.size()==1 && bindInfoMap.get(Integer.toString(Constant.LoginType.GUEST)) != null) {
                //单独游客,切换账号有损失账号的风险
                //给与提示和后续操作
                //popup toast or dialog
            } else {
                MachbirdKit.getInstance().startEasyLoginPage(MainActivity.this,callBack);//callback 为CGAccountCallBack
            }
        } else {
            //popup toast or dialog
        }
    }

    @Override
    public void onFailed(int errorCode, String msg) {
        //popup toast or dialog
    }
};
MachbirdKit.getInstance().getAccountBindInfo(MainActivity.this,BindInfoCallBack);

# 打点接口

# 必调接口

/**
 * 记录游戏进入主界面
 */
MachBirdSDK.logMainPageShow()

# 游戏关卡

/**
 * 记录游戏关卡开始
 *
 * @param questIndex 关卡的索引号、大章节的编号。
 * @param questId    小章节的编号。
 * @param questType  当前的关卡的类型;例如主线任务[main]、新手任务[new]、支线任务[sub]
 * @param roleId     角色Id。
 * @param serverId   服务器Id。
 * @param accountId  账户Id。
 */
MachBirdSDK.logQuestBegin(int questIndex, String questId, String questType,
                     String roleId, String serverId, String accountId)

/**
 * 记录游戏关卡完成
 *
 * @param questIndex 关卡的索引号、大章节的编号。
 * @param questId    小章节的编号。
 * @param questType  当前的关卡的类型;例如主线任务[main]、新手任务[new]、支线任务[sub]。
 * @param roleId     角色Id。
 * @param serverId   服务器Id。
 * @param accountId  账户Id。
 */
MachBirdSDK.logQuestCompleted(int questIndex, String questId, String questType,
                     String roleId, String serverId, String accountId)

/**
 * 记录游戏关卡失败
 *
 * @param questIndex 关卡的索引号、大章节的编号。
 * @param questId    小章节的编号。
 * @param questType  当前的关卡的类型;例如新手任务[new]、主线任务[main]、支线任务[sub]。。
 * @param roleId     角色Id。
 * @param serverId   服务器Id。
 * @param accountId  账户Id。
 */
MachBirdSDK.logQuestFailed(int questIndex, String questId, String questType,
                      String roleId, String serverId, String accountId)

# 游戏角色

/**
 * 记录游戏角色升级
 *
 * @param roleId    角色Id。
 * @param serverId  服务器Id。
 * @param accountId 账户Id。
 */
MachBirdSDK.logRoleUpgrade(String roleId, String serverId, String accountId)

# 游戏奖励

/**
 * 记录游戏奖励领取
 *
 * @param rewardName 奖励名称。
 * @param roleId     角色Id。
 * @param serverId   服务器Id。
 * @param accountId  账户Id。
 */
MachBirdSDK.logRewardAcquire(String rewardName, String roleId, String serverId, String accountId)

# 游戏任务

/**
 * 记录游戏任务开始
 *
 * @param taskName  任务名称。
 * @param taskType  任务类型。
 * @param roleId    角色Id。
 * @param serverId  服务器Id。
 * @param accountId 账户Id。
 */
MachBirdSDK.logTaskBegin(String taskName, String taskType, String roleId, String serverId, String accountId)

/**
 * 记录游戏任务完成
 *
 * @param taskName  任务名称。
 * @param taskType  任务类型。
 * @param roleId    角色Id。
 * @param serverId  服务器Id。
 * @param accountId 账户Id。
 */
MachBirdSDK.logTaskCompleted(String taskName, String taskType, String roleId, String serverId, String accountId)

/**
 * 记录游戏任务失败
 *
 * @param taskName  任务名称。
 * @param taskType  任务类型。
 * @param roleId    角色Id。
 * @param serverId  服务器Id。
 * @param accountId 账户Id。
 */
MachBirdSDK.logTaskFailed(String taskName, String taskType, String roleId, String serverId, String accountId)

# 游戏卡牌

/**
 * 记录游戏卡牌获取
 *
 * @param cardName  卡牌名称。
 * @param cardType  卡牌类型。
 * @param cardLevel 卡牌等级。
 * @param roleId    角色Id。
 * @param serverId  服务器Id。
 * @param accountId 账户Id。
 */
MachBirdSDK.logCardAcquire(String cardName, String cardType, String cardLevel, String roleId, String serverId, String accountId)

/**
 * 记录游戏卡牌使用
 *
 * @param cardName  卡牌名称。
 * @param cardType  卡牌类型。
 * @param cardLevel 卡牌等级。
 * @param roleId    角色Id。
 * @param serverId  服务器Id。
 * @param accountId 账户Id。
 */
MachBirdSDK.logCardWield(String cardName, String cardType, String cardLevel, String roleId, String serverId, String accountId)

/**
 * 记录游戏卡牌卸下
 *
 * @param cardName  卡牌名称。
 * @param cardType  卡牌类型。
 * @param cardLevel 卡牌等级。
 * @param roleId    角色Id。
 * @param serverId  服务器Id。
 * @param accountId 账户Id。
 */
MachBirdSDK.logCardUnwield(String cardName, String cardType, String cardLevel, String roleId, String serverId, String accountId)

/**
 * 记录游戏卡牌升级
 *
 * @param cardName  卡牌名称。
 * @param cardType  卡牌类型。
 * @param cardLevel 卡牌等级。
 * @param roleId    角色Id。
 * @param serverId  服务器Id。
 * @param accountId 账户Id。
 */
MachBirdSDK.logCardUpgrade(String cardName, String cardType, String cardLevel, String roleId, String serverId, String accountId)

# 游戏装备

/**
 * 记录游戏装备获取
 *
 * @param equipName 装备名称。
 * @param roleId    角色Id。
 * @param serverId  服务器Id。
 * @param accountId 账户Id。
 */
MachBirdSDK.logEquipAcquire(String equipName, String roleId, String serverId, String accountId)

/**
 * 记录游戏装备使用
 *
 * @param equipName 装备名称。
 * @param roleId    角色Id。
 * @param serverId  服务器Id。
 * @param accountId 账户Id。
 */
MachBirdSDK.logEquipWield(String equipName, String roleId, String serverId, String accountId)

/**
 * 记录游戏装备卸下
 *
 * @param equipName 装备名称。
 * @param roleId    角色Id。
 * @param serverId  服务器Id。
 * @param accountId 账户Id。
 */
MachBirdSDK.logEquipUnwield(String equipName, String roleId, String serverId, String accountId)

/**
 * 记录游戏装备升级
 *
 * @param equipName 装备名称。
 * @param roleId    角色Id。
 * @param serverId  服务器Id。
 * @param accountId 账户Id。
 */
MachBirdSDK.logEquipUpgrade(String equipName, String roleId, String serverId, String accountId)

# 游戏核心业务

/**
 * 记录核心控件的点击,通常由用户操作触发,比如某些核心道具按钮
 *
 * @param name      核心控件的名称。
 * @param roleId    角色Id。
 * @param serverId  服务器Id。
 * @param accountId 账户Id。
 */
MachBirdSDK.logCoreClick(String name, String roleId, String serverId, String accountId)

# 游戏虚拟交易

/**
 * 记录游戏购买
 *
 * @param itemName 游戏内购买的虚拟物品的名称。
 */
MachBirdSDK.logBuy(String itemName)

/**
 * 记录游戏购买
 *
 * @param itemName  游戏内购买的虚拟物品的名称。
 * @param roleId    角色Id。
 * @param serverId  服务器Id。
 * @param accountId 账户Id。
 */
MachBirdSDK.logBuy(String itemName, String roleId, String serverId, String accountId)

/**
 * 记录游戏出售
 *
 * @param itemName 游戏内出售的虚拟物品的名称。
 */
MachBirdSDK.logSell(String itemName)

/**
 * 记录游戏出售
 *
 * @param itemName  游戏内出售的虚拟物品的名称。
 * @param roleId    角色Id。
 * @param serverId  服务器Id。
 * @param accountId 账户Id。
 */
MachBirdSDK.logSell(String itemName, String roleId, String serverId, String accountId)

# 游戏内购

/**
 * 记录游戏订阅
 *
 * @param subscriptionId 订阅的流水号。
 * @param paymentType    支付类型;例如支付宝、银联、微信等,若为系统赠送,则传free。
 * @param currencyType   货币类型;例如CNY人民币,USD美金等。
 * @param realCoinNum    支付的真实货币的金额。
 * @param roleId         角色Id。
 * @param serverId       服务器Id。
 * @param accountId      账户Id。
 */
MachBirdSDK.logSubscribe(String subscriptionId, String paymentType, String currencyType, double realCoinNum, String roleId, String serverId, String accountId)

# 游戏账号

/**
 * 记录账户登录
 *
 * @param accountId    账户id,唯一标识一个账户。
 * @param accountLevel 账户等级。
 * @param serverId     服务器id。
 * @param roleId       角色id。
 */
MachBirdSDK.logLogin(String accountId, String accountLevel, String serverId, String roleId)

# Adjust 打点

/**
 * adjust打点
 * @param eventToken 事件token
 */
MachBirdSDK.logByAdjust(String eventToken)

/**
 * adjust打点
 *
 * @param eventToken             事件token
 * @param callbackParameterKey   回调参数key
 * @param callbackParameterValue 回调参数value
 */
 MachBirdSDK.logByAdjust(String eventToken, String callbackParameterKey, String callbackParameterValue)

/**
 * adjust打点
 * @param eventToken 事件token
 * @param revenue 收入
 * @param currency 货币
 */
MachBirdSDK.logByAdjust(String eventToken, double revenue, String currency)

/**
 * adjust打点
 *
 * @param eventToken             事件token
 * @param revenue                收入
 * @param currency               货币
 * @param callbackParameterKey   回调参数key
 * @param callbackParameterValue 回调参数value
 */
MachBirdSDK.logByAdjust(String eventToken, double revenue, String currency, String callbackParameterKey, String callbackParameterValue)

# 支付接口

# 初始化

必须调用初始化方法后才能使用后续功能 调用初始化时机尽量提前,参照其他 SDK 调用位置

import org.trade.billing.VegalSDK
import org.trade.billing.error.BillingError;

    /**
     * 初始化SDK
     * @param context
     * @param appKey APUS IAP 后台配置的AppKey
     * @param privateKey APUS IAP 后台配置的产品私钥
     * @param serverUrl APUS IAP 服务地址
     */
    private void initBilling(Context context, String appKey,
                             String privateKey, String serverUrl) {
        // IAP SDK单例对象,后续发起IAP操作均使用此对象
        VegalSDK bp = VegalSDK.getInstance(context);
        //设置初始化回调
        bp.setInitListener(new VegalSDK.InitListener() {

            /**
             * 初始化成功回调
             */
            @Override
            public void onInitialized() {


            }
            /**
             * 初始化失败回调
             * @param error 错误信息
             */
            @Override
            public void onInitializeFail(BillingError error) {

            }

           	/**
             * 距离程序上次启动 未通过验证或未消费的商品 本次成功消费的回调
             * @param transactionDetails 已成功消费的商品
             */
            @Override
            public void onConsumed(TransactionDetails transactionDetails) {

            }
        });
        //初始化SDK
        bp.init(appKey, privateKey, serverUrl);
    }

# 获取商品

获取一次性商品接口

import org.trade.billing.error.BillingError;
import org.trade.billing.VegalSDK;
import org.trade.billing.model.Product;
import org.trade.billing.callback.SkuDetailCallback;

/**
 * 获取一次性商品
 * @param context
 */
private void getPurchaseListingDetails(Context context){
   VegalSDK bp = VegalSDK.getInstance(context);
   //获取一次性商品
   bp.getPurchaseListingDetails(filter, new SkuDetailCallback() {
      /**
       * 成功回调
       * @param productList 商品列表 包含Google 官方 及 APUS 后台配置信息
       */
      @Override
      public void onSuccess(List<Product> productList) {

      }

      /**
       * 失败回调
       * @param error 错误信息
       */
      @Override
      public void onFail(BillingError error) {

      }
   });
}

# 从缓存中获取商品

由于获取商品需要经过网络请求,请通过缓存获取商品列表进行购买。

此列表从SDK初始化后拉取了商品列表并进行了缓存

//从缓存获取商品列表
List<Product> purchaseList = ProductCacheManager.getInstance().getPurchaseList();
//从缓存获取订阅列表
List<Product> subscriptionList = ProductCacheManager.getInstance().getSubscriptionList();

# 发起应用内购买

/**
 * 发起购买
 * @param activity
 * @param product 通过 {{@link VegalSDK#getPurchaseListingDetails(SkuDetailCallback)}} 获取
 * @param purchaseUiData 界面打点数据
 * @param payload 设置Payload 你想传给服务端的任意内容
 * @param userNumber 设置UserNumber 取 org.n.account.core.model.Account.mSupaNo
 */
private void purchaseProduct(Activity activity,Product product, 
									PurchaseUiData purchaseUiData,
                  String payload, String userNumber) {
   // 设置Payload
   PurchasePayload.setPayload(payload);
   // 设置UserNumber
   PurchasePayload.setUserNo(userNumber);

   VegalSDK bp = VegalSDK.getInstance(activity);
   //发起购买
   bp.purchase(activity, product, purchaseUiData, new PurchaseCallback() {
      /**
       * 成功回调
       * @param productId 商品id
       * @param details 内购事务
       */
      @Override
      public void onSuccess(@NonNull String productId, @Nullable TransactionDetails details) {

      }

      /**
       * 失败回调
       * @param error 错误信息
       */
      @Override
      public void onFail(BillingError error) {

      }
   });
}

# 可选 Google弹窗回调

VegalSDK.getInstance(context).setPurchaseLaunchListener(new VegalSDK.OnPurchaseLaunchListener() {

  @Override
  public void onLaunch() {
    //即将调起GooglePlay支付页面
    Log.d(TAG, "#onLaunch");
  }
  
});

# 四. 附录

# 4.1.错误码

# 4.1.1. 客户端错误码

错误码 错误描述
-1 购买商品返回数据为空
-2 发起购买参数异常
-3 恢复购买查询数据为空
-4 Google Play IAP服务未初始化
-5 确认购买失败
-6 获取服务端商品列表为空

# 4.1.2. 服务端错误码

错误码 错误描述
1 成功
0 失败
1000 系统异常
1101 系统异常
3102 参数错误
5001 请求appstore异常
5002 重复的订单
5003 写入数据库错误
5004 没有对应商品的价格信息,即productList中缺少商品信息
5004 没有对应产品的商品配置,即没在apollo中配置对应的产品的商品信息
5005 没有对应的商品配置,即在apollo配置中缺少对应的商品信息
5006 商品的配置信息不匹配,即在Apollo中配置商品为非连续订阅类型,在appstore配置的是连续订阅类型
5007 商品的配置没有持续时间,即在Apollo配置中针对非自动订阅类型的产品

# 4.1.3. Google错误码

https://developer.android.com/reference/com/android/billingclient/api/BillingClient.BillingResponseCode

# 4.1.4. 客户登录相关错误码

错误码 错误描述
101 未知错误
20002 验证码错误(邮箱注册支持验证码方式时)
20005 用户未验证
40001 邮箱账号未注册
40004 用户已存在
40005 Cookie校验失败
40012 没有权限
40014 用户已在黑名单
40016 重复绑定
40017 账号已绑定
40018 解绑了未绑定的账号类型
40019 当前账号只有唯一绑定账号,无法解绑
40020 账号或密码错误
40022 操作太频繁
40023 用户已注销
40024 Session未被验证
40025 60秒以后再请求验证码
40602 获取第三方账号错误
40603 获取第三方账号错误

# 4.2. 相关链接

https://developer.android.com/google/play/billing/billing_library_overview

[https://developer.android.com/reference/com/android/billingclient/classes

# 4.3.SDK Reference

# Product

public class Product

com.apus.billing.model.Product


获取商品列表返回数据

# Summary

Constants
String productId商品id
String intro个性文案:商品描述
String ERRORFatal error during the API action
String name个性文案:商品名字
ProductType productType商品类型
ContentDisplayType showStrategy文案显示类型
int verifyType支付校验方式,0:服务端校验; 1:本地校验;默认值0,缺省值0
long subsDuration订阅的持续时长
SkuDetails skuDetails官方商品信息
ProductData productDataAPUS IAP后台配置商品信息

# ProductType

public enum ProductType

com.apus.billing.enmus.ProductType


获取商品列表返回数据

# Summary

Constants
int Consumable可消耗
int Permanent永久商品
int Subscription订阅型
int ContinuousSubscription连续订阅型

# ContentDisplayType

public enum ContentDisplayType

com.apus.billing.enmus.ContentDisplayType


显示文案类型

# Summary

Constants
int OFFICIAL显示官方文案
int PERSONALITY显示个性文案

# ProductData

public class ProductData

com.apus.billing.protocol.product.ProductData


APUS IAP产品信息

# Summary

Constants
String productId产品id
String intro个性文案:商品描述
String name个性文案:商品名字
ProductType productType商品类型
ContentDisplayType showStrategy文案显示类型
int verifyType支付校验方式,0:服务端校验; 1:本地校验;默认值0,缺省值0
long subsDuration订阅的持续时长

# TransactionDetails

public class TransactionDetails

com.apus.billing.model.TransactionDetails


内购事务

# Summary

Constants
String productId产品id
String orderId订单id
String purchaseToken内购token
Date purchaseTime购买时间
PurchaseInfo purchaseInfoAPUS IAP产品信息

# PurchaseInfo

public class PurchaseInfo

com.apus.billing.model.PurchaseInfo


APUS IAP产品信息

# Summary

Constants
Purchase purchaseGoogle IAP 购买成功后返回的内购信息对象
String signature签名
PurchaseData purchaseData内购信息详细数据
String responseData内购信息详细数据json格式数据
ProductData productDataAPUS IAP产品信息
String productJsonDataAPUS IAP产品信息Json格式数据

# PurchaseData

public class PurchaseData

com.apus.billing.protocol.product.ProductData


Google IA内购信息详细数据

# Summary

Constants
String orderIdGoogle IAP 购买成功后返回的内购信息对象
String packageName包名
String productId商品id
Data purchaseTime内购时间
PurchaseState purchaseState内购状态
String developerPayloadpayload信息
String purchaseToken内购token
boolean autoRenewing是否自动续订
boolean acknowledged是否被确认购买

# PurchaseState

public enum PurchaseState

com.apus.billing.enmus.PurchaseState


内购状态

# Summary

Constants
int PENDING待处理交易
int PURCHASED已购买状态
int UNSPECIFIED_STATE未定义状态

# PurchaseUiData

public class PurchaseUiData

org.trade.billing.model.PurchaseUiData


界面打点数据

# Summary

Constants
String orderType点击的付费页分类
String payStyle展示的样式(样式名,Default/Style_A/Style_B...)
String windowType展示的窗口类型(popup/fullscreen/window)
String fromSource用来定义IAP 路径的唯一ID,“功能名_入口名”
String contentId用来标识模版ID的字段(多用在内容产品的模版付费上,)
最后更新: 1/26/2021, 5:43:52 PM