支付接入说明

支付流程说明

注意:接入登录和支付后如果有关类找不到,需要接入核心库和网络库

1
2
implementation 'com.github.muyishuangfeng:YKCore:1.0.0'
implementation 'com.github.muyishuangfeng:YKNet:1.0.1'
为了保证支付的安全,sdk采用了Android支付平台(Google Play和OneStore)验证和LT服务器验证两种方式,业务流程图如下:

GooglePlay 接入

(1)、客户端调用支付模块代码,由SDK向LT服务器发起一个订单请求;
(2)、拿到服务器给的订单ID后,SDK发起Google Play支付;
(3)、Google Play支付返回结果后,拿到Google Play支付成功的token信息;
(4)、SDK把Google play返回的订单号token等信息发给服务端,LT服务器向Google Play服务器校验;
(5)、服务端对Google play服务器响应数据做处理和校验订单的合法性;
(6)、通过服务器验证的结果来确定支付的结果;
(7)、支付成功回调 支付成功回调的使用方法: 需要CP服务器建立一个API供乐推服务调用 回调地址所接受的参数格式

1
2
METHOD: POST 
HEADER:Content-Type:application/json

Google Play 网络库接入说明

  • 1、接入前提
    1、手机必须支持Google 服务

  • 2、手机必须有Google服务的套件,并且Google Play 服务账号和Google Play 账号必须保持一致(要不会导致Google 支付调不起来)

  • 3、VPN必须保持打开状态

  • 2、在project 下的build 导入仓库地址

     maven {
      url "https://jitpack.io"
    
    }
  • 3、在moudle下面的build文件下添加网络库依赖

    implementation 'com.github.muyishuangfeng:YKGooglePlay:1.0.2'
  • 4、在moudle的build文件夹下的android —>defaultConfig 相关配置

      defaultConfig {
      ...
    
      javaCompileOptions {
          annotationProcessorOptions {
              includeCompileClasspath false
          }
      }
    }

1、初始化参数说明

参数 类型 是否必须 说明
debug boolean 否 是否开启debug模式
goodsID String 是 服务器配置的id
requestCode int 是 支付请求码
productID String 是 内购商品唯一ID
googlePlay boolean 是 是否添加GooglePlay支付
payTest int 是 是否是沙盒测试:1是,0否
publicKey String 是 Google console配置的公钥
Target int 是 是否开启Google Play支付
RechargeObject bean 是 支付配置的参数
OnRechargeListener Interface 是 支付回调接口

2、支付调用方式

  • 1、初始化(刚进入应用或者支付页面的时候配置)

      private void init() {
      YKGameOptions options = new YKGameOptions.Builder(this)
              .debug(true)
              .publicKey(base64EncodedPublicKey)
              .payTest(0)
              .goodsID(productID, mGoodsID)
              .googlePlay(true)
              .requestCode(selfRequestCode)
              .build();
      YKGameSdk.init(options);
    }
    • 2、接口回调(可以写成匿名内部类的方式也可以写成全局方式)
      OnRechargeListener mOnRechargeListener = new OnRechargeListener() {
    @Override
    public void onState(Activity activity, RechargeResult result) {
    switch (result.state) {
    case RechargeResult.STATE_RECHARGE_SUCCESS://支付成功回调
    mTxtResult.setText(result.getResultModel().getCode() + "======");
    break;
    case RechargeResult.STATE_RECHARGE_START://支付开始回调
    Log.e(TAG, "开始支付");
    break;
    case RechargeResult.STATE_RECHARGE_FAILED://支付失败回调
    Log.e(TAG, "支付错误" + result.getErrorMsg());
    break;
    }
   }

};
  • 3、支付开始
RechargeObject result = new RechargeObject();
result.setUserToken(mUserToken);//用户token
result.setOrderID(mOrderID);//订单号
result.setSku(productID);//商品
result.setGoodsID("16");//商品ID(在服务器配置)
result.setPublicKey(base64EncodedPublicKey);//公钥
result.setPayTest(1);//是否是沙盒测试

      RechargeManager.recharge(GooglePlayActivity.this, Target.RECHARGE_GOOGLE,
              result, mOnRechargeListener);
1、 STATE_RECHARGE_START  开始支付
2、 STATE_RECHARGE_SUCCESS 支付成功
3、 STATE_RECHARGE_FAILED 支付失败
4、order create failed:user token is empty 订单创建失败:原因是乐推token为空或者未登录

OneStore 接入

前提:

手机上必须支持OneStore服务并且安装OneStore客户端

接入说明
如果在project下的build文件下添加了 远程依赖,请忽略2、4配置,直接看3

  • 2、在project 下的build 导入仓库地址

      maven {
      url "https://jitpack.io"
    
    }
  • 3、在moudle下面的build文件下添加网络库依赖

    implementation 'com.github.muyishuangfeng:YKOneStore:1.0.0'
  • 4、在moudle的build文件夹下的android —>defaultConfig 相关配置

      defaultConfig {
      ...
    
      javaCompileOptions {
          annotationProcessorOptions {
              includeCompileClasspath false
          }
      }
    }

参数说明

参数 类型 是否必须 说明
debug boolean 否 是否开启debug模式
userToken String 是 用户token,没有赋值时不能支付
orderID String 是 订单号
goodsType String 商品类型 商品类型(管理型商品(inapp), 包月自动支付商品(auto)
goodsID String 是 服务器配置的id
packageId String 是 每个应用的包名
requestCode int 是 支付请求码
productID String 是 内购商品唯一ID
oneStore boolean 是 是否添加OneStore支付
payTest int 是 是否是沙盒测试:1是,0否
publicKey String 是 OneStore后台配置的公钥
Target int 是 是否开启OneStore支付
RechargeObject bean 是 支付配置的参数
OnRechargeListener Interface 是 支付回调接口

2、支付调用方式

  • 1、初始化(刚进入应用或者支付页面的时候配置)

    private void init() {
     YKGameOptions options = new YKGameOptions.Builder(this)
                    .debug(true)
                    .publicKey(PUBLIC_KEY)
                    .goodsType("inapp")
                    .payTest(1)
                    .oneStore()
                    .goodsID(productID, "11")
                    .googlePlay(true)
                    .requestCode(selfRequestCode)
                    .build();
            YKGameSdk.init(options);
            }

    ​

  • 2、接口回调(可以写成匿名内部类的方式也可以写成全局方式)

    OnRechargeListener mOnRechargeListener = new OnRechargeListener() {
    @Override
    public void onState(Activity activity, RechargeResult result) {
        BaseEntry entry=result.getBaseEntry();
                if (entry!=null){
                    if (entry.getCode()== YKGameValues.ONE_STORE_FAILED){
                        Log.e("successOne",entry.getResult());
                    }
                }
                switch (result.state) {
                    case RechargeResult.STATE_RECHARGE_SUCCESS:
                        mTxtResult.setText(result.getResultModel().getCode() + "======");
                        break;
                    case RechargeResult.STATE_RECHARGE_START:
                        Log.e(TAG, "开始支付");
                        break;
                    case RechargeResult.STATE_RECHARGE_RESULT:
                        if (result.getResult() != null) {
                            switch (result.getResult()) {
                                case RESULT_BILLING_NEED_UPDATE: {
                                    Log.e(TAG, "RESULT_BILLING_NEED_UPDATE");
                                    break;
                                }
                                case RESULT_CLIENT_UN_CONNECTED: {
                                    Log.e(TAG, "RESULT_CLIENT_UN_CONNECTED");
                                    break;
                                }
                                case RESULT_CLIENT_CONNECTED: {
                                    Log.e(TAG, "RESULT_CLIENT_CONNECTED");
                                    break;
                                }
                                case RESULT_PURCHASES_REMOTE_ERROR: {
                                    Log.e(TAG, "RESULT_PURCHASES_REMOTE_ERROR");
                                    break;
                                }
                                case RESULT_PURCHASES_SECURITY_ERROR: {
                                    Log.e(TAG, "RESULT_PURCHASES_SECURITY_ERROR");
                                    break;
                                }
                                case RESULT_CLIENT_NOT_INIT: {
                                    Log.e(TAG, "RESULT_CLIENT_NOT_INIT");
                                    break;
                                }
                                case RESULT_BILLING_OK: {
                                    Log.e(TAG, "RESULT_BILLING_OK");
                                    break;
                                }
                                case RESULT_CONNECTED_NEED_UPDATE: {
                                    Log.e(TAG, "RESULT_BILLING_OK");
                                    break;
                                }
                                case RESULT_BILLING_REMOTE_ERROR: {
                                    Log.e(TAG, "RESULT_BILLING_REMOTE_ERROR");
                                    break;
                                }
                                case RESULT_BILLING_SECURITY_ERROR: {
                                    Log.e(TAG, "RESULT_BILLING_SECURITY_ERROR");
                                    break;
                                }
                                case IAP_ERROR_UNDEFINED_CODE: {
                                    Log.e(TAG, "IAP_ERROR_UNDEFINED_CODE");
                                    break;
                                }
                            }
                        }
                        break;
                    case RechargeResult.STATE_RECHARGE_FAILED:
                        Log.e(TAG, "支付错误" + result.getErrorMsg());
                        break;
    
                }
            }
    
     };
    • 3、支付开始
RechargeObject result = new RechargeObject();
result.setOrderID("123456");//订单号
result.setUserToken("1111111");//用户token    
result.setSku(productID);//商品
result.setGoodsID("11");//商品ID(服务器配置的)
result.setmGoodsType("inapp");//支付类型
result.setPublicKey(PUBLIC_KEY);//公钥
result.setPayTest(1);//是否是沙盒测试
RechargeManager.recharge(OneStoreActivity.this,     Target.RECHARGE_ONE_STORE,result, mOnRechargeListener);

结果码

  • 5、结果码(具体以接口回调结果为准)
1、ONE_STORE_FAILED  支付失败
2、ONE_STORE_SUCCESS  支付成功
3、 STATE_RECHARGE_START  开始支付
 4、 STATE_RECHARGE_SUCCESS 支付成功
 5、order create failed:user token is empty 订单创建失败:原因是乐推token为空或者未登录
 6、 STATE_RECHARGE_FAILED 支付失败(具体结果码参考下面的结果码)

  RESULT_PAY_OK(0, "Payment success") 支付成功
  RESULT_USER_CANCELED(1, "User cancel") 用户取消
  RESULT_SERVICE_UNAVAILABLE(2, "service unavailable") 未连接上服务器
  RESULT_BILLING_UNAVAILABLE(3, "billing unavailable") 不支持oneStore支付
  RESULT_ITEM_UNAVAILABLE(4, "item unavailable") 商品不可用
  RESULT_DEVELOPER_ERROR(5, "developer error")开发账户异常
  RESULT_CONNECTED_SUCCESS(6, "PurchaseClient connect success") 连接成功
  RESULT_DISCONNECT_ERROR(7, "PurchaseClient Disconnect") 连接失败
  RESULT_CONNECTED_NEED_UPDATE(8, "Connected need update") oneStore客户端需要更新
  RESULT_BILLING_OK(9, "Billing success") 支持支付
  RESULT_BILLING_REMOTE_ERROR(10, "Billing Remote Connection Failed") 查询是否支持oneStore服务时提示远端服务器连接异常(未连接到服务器)
  RESULT_BILLING_SECURITY_ERROR(11, "Billing Apply State exceptions")查询是否支持oneStore服务时提示支付状态异常
 RESULT_BILLING_NEED_UPDATE(12, "Billing need update")查询是否支持oneStore服务时提示oneStore客户端需要更新
 RESULT_PURCHASES_OK(13, "Purchases success")查询购买信息成功
 RESULT_PURCHASES_REMOTE_ERROR(14, "Purchases Remote Connection Failed")查询购买信息时提示oneStore远程服务器连接异常(未连接到服务器)
 RESULT_PURCHASES_SECURITY_ERROR(15, "Purchases Apply State exceptions")查询购买信息时提示支付状态异常
 RESULT_PURCHASES_NEED_UPDATE(16, "Purchases need update")查询购买信息时提示oneStore客户端需要更新
 RESULT_CONSUME_OK(17, "Consume success")消费成功
 RESULT_CONSUME_REMOTE_ERROR(18, "Consume Remote Connection Failed")购买时提示远端服务器连接异常(未连接到oneStore)
 RESULT_CONSUME_SECURITY_ERROR(19, "Consume Apply State exceptions")购买时提示支付状态异常
 RESULT_CONSUME_NEED_UPDATE(20, "Consume need update")购买时提示oneStore客户端需要更新
 RESULT_SIGNATURE_FAILED(21, "Signature failed")签名异常
 RESULT_PURCHASES_FLOW_OK(22, "Purchases Flow success")购买成功
 RESULT_PURCHASES_FLOW_REMOTE_ERROR(23, "Purchases Flow Remote Connection 
 Failed")购买时提示远端服务器连接异常(未连接到服务器)
 RESULT_PURCHASES_FLOW_SECURITY_ERROR(24, "Purchases Flow Apply State 
  exceptions")购买时提示支付状态异常
 RESULT_PURCHASES_FLOW_NEED_UPDATE(25, "Purchases Flow need update")购买时提 
 示oneStore需要更新