支付接入说明

支付流程说明

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

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需要更新