# 1.2 充值部分

## 1.2.1 是否开启年龄限制

**说明**

检测游戏是否开启年龄限制，在游戏对接阶段就已经确定是否开启年龄限制，对游戏来说是个固定值。

**接口**

```
public Boolean isInAppBillingAgeLimitOn()
```

**参数说明**

无

**示例**

```java
mCydoniaSDK.isInAppBillingAgeLimitOn()
```

## 1.2.3 玩家是否设定生日

**说明**

在开启年龄限制的前提下，检测玩家是否设定了生日。如果没有设定需要弹出设定UI.

**接口**

```
public Boolean isBirthdaySet()
```

**参数说明**

无

**示例**

```java
  if (mCydoniaSDK.isBirthdaySet()) {
                    Log.d(SDKDEMOTAG, "birthday set");
                    System.out.println("Demo isBirthdaySet: yes");
                } else {
                    System.out.println("Demo isBirthdaySet: no");
                    Log.d(SDKDEMOTAG, "birthday not set");
                }
```

## 1.2.4 玩家设定生日

**说明**

在开启年龄限制的前提下，需要此API设定玩家生日，配合前面的UI需求。

**接口**

```
public void setBirthday(String birthday, final CydoniaJPSDKCallbackListener sdkCallback)
```

**参数说明**

* birthday：玩家选择的生日，格式是"yyyyMM"。例如:"200012"

**示例**

```java
 mCydoniaSDK.setBirthday("201010", new CydoniaJPSDKCallbackListener() {

                    @Override
                    public void onResult(String params) {
                        try {
                            JSONObject resultObject = new JSONObject(params);
                            Log.d(SDKDEMOTAG, "status:" + resultObject.get("status") + ", message:" + resultObject.get("msg"));
                            System.out.println("Demo setBirthday result:" + "status:" + resultObject.get("status")
                                    + ", message:" + resultObject.get("msg"));
                        }catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                });
```

## 1.2.5 玩家是否在充值限制内

**说明**

在开启年龄限制的前提下，每次充值都要检测本次充值是否在充值范围内。

**接口**

```
public void isInChargeLimit(Long itemPrice, final CydoniaJPSDKCallbackListener sdkCallback)
```

**参数说明**

* itemPrice：需要购买的item的价格

**示例**

```java
//购买的前提是在充值限定范围内
                    mCydoniaSDK.isInChargeLimit(120L, new CydoniaJPSDKCallbackListener() {

                        @Override
                        public void onResult(String params) {

                            try {
                                JSONObject resultObject = new JSONObject(params);
                                if (resultObject.getInt("status") == 200) {
                                    /////////////////
                                    //允许购买
                                    //billingPara一般传入本单所在服务器等信息，主要用于掉单后的补单处理,根据实际需求设定,例如服务器id_服务器商品id
                                    //billingPara不能用特殊符号，仅能使用a-zA-Z0-9_
                                    ////////////////
                                    

                                } else {
                                    ////超出了本月年龄限制，本月无法充值, 需要给玩家弹窗提示
                                    Log.d(SDKDEMOTAG, "status:" + resultObject.get("status") + ", message:" + resultObject.get("msg"));
                                    System.out.println("Demo isInChargeLimit result:" + "status:" + resultObject.get("status")
                                            + ", message:" + resultObject.get("msg"));

                                }
                            }catch (JSONException e) {
                                e.printStackTrace();
                            }

                        }
                    });

```

## 1.2.6 充值

**说明**

实现充值功能

**接口**

```
public void purchaseItem(String itemSku, String billingPara, final UserPurchaseCallbackListener sdkCallback)
```

**参数说明**

* productId：商品ID
* billingPara：便于未消除订单的重新充值，需要自定义标识来识别此订单属于哪个服等

**示例**

```java
//billingPara一般传入本单所在服务器等信息，主要用于掉单后的补单处理,根据实际需求设定,例如服务器id_服务器商品id
//billingPara不能用特殊符号，仅能使用a-zA-Z0-9_
mCydoniaSDK.purchaseItem("com.cydoniajp.sdkdevelop.item1","J1_I_10001", new UserPurchaseCallbackListener() {

                                        @Override
                                        public void onUserPurchaseResult(String params) {
                                            try {
                                                JSONObject iapResultObject = new JSONObject(params);
                                                //安卓客户端SDK返回200：购买成功，300：购买失败 301:购买取消
                                                if (iapResultObject.get("status").equals("200")) {
                                                    Log.d(SDKDEMOTAG,
                                                            "status:" + iapResultObject.get("status") + ", receipt:" + iapResultObject.get("receipt") + ", signature:" + iapResultObject.get("signature") + ", googleOrderId:"+ iapResultObject.get("googleOrderId")+ ", productId:"+ iapResultObject.get("productId"));
                                                    System.out.println("Demo purchaseItem result:" + "status:" + iapResultObject.get("status") + ", receipt:" + iapResultObject.get("receipt") + ", signature:" + iapResultObject.get("signature") + ", googleOrderId:"+ iapResultObject.get("googleOrderId") + ", productId:"+ iapResultObject.get("productId")+ ",para:" + iapResultObject.get("para"));
                                                } else {
                                                    Log.d(SDKDEMOTAG, "status:" + iapResultObject.get("status") + ", message:" + iapResultObject.get("msg"));
                                                    System.out.println("Demo purchaseItem result:" + "status:" + iapResultObject.get("status")
                                                            + ", message:" + iapResultObject.get("msg"));
                                                }
                                            } catch (JSONException e) {
                                                e.printStackTrace();
                                            }

                                        }
                                    });
```

## 1.2.7 检测是否有未消除订单

**说明**

充值有时会有掉单发生，这时候订单会缓存在客户端，在玩家重启游戏或者重新打开充值界面时可以调用此API检测是否有掉单发生，如果有未清除订单需要继续跟服务端通讯完成充值，完成充值后进行下面的消单操作。

**接口**

```
public String checkIsPayInfoLeft()
```

**参数说明**

无

**示例**

```java
 String leftPayInfo = mCydoniaSDK.checkIsPayInfoLeft();
                Log.d(SDKDEMOTAG,"leftPayInfo:" + leftPayInfo );
                System.out.println("Demo 如果游戏服务器完成了订单校验并通知了客户端发货，应该清除leftPayInfo,返回空，否则返回字符串.leftPayInfo:" + leftPayInfo);
                if (leftPayInfo.length() > 0){
                    for(String oneReceipt : leftPayInfo.split(";")){
                        try {
                            JSONObject payInfoObject = new JSONObject(oneReceipt);
                            System.out.println("Demo leftPayInfo:" + "status:" + payInfoObject.get("status")+ ", receipt:" + payInfoObject.get("receipt") + ", googleOrderId:"
                                    + payInfoObject.get("googleOrderId") + ", signature:" + payInfoObject.get("signature") + ",purchaseToken:" + payInfoObject.get("purchaseToken") + ",productId:" + payInfoObject.get("productId")+ ",para:" + payInfoObject.get("para"));
                        }catch (JSONException e){
                            System.out.println("Demo 订单格式错误");
                        }
                    }

                }
```

## 1.2.8 消单

**说明**

充值完成之后调用消单

**接口**

```
public void clearPayInfo()
```

**参数说明**

无

**示例**

```
mCydoniaSDK.clearPayInfo();
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://cydonia.gitbook.io/doc/cydonia-sdk/android-integration/android-sdk-api-doc/1.2-billing.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
