我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android三方支付:Google Play支付、MyCard支付、ONE store支付

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android三方支付:Google Play支付、MyCard支付、ONE store支付

Google Play支付:
详情可通过VPN:https://developer.android.com/google/play/billing/billing_library_overview#java
下面记录为个人摘录
1、更新应用程序的依赖关系
将以下行添加到build.gradle您应用的文件的“依赖项”部分:
dependencies {
    ...
    implementation 'com.android.billingclient:billing:2.1.0'
}
2、连接到Google Play
在发出Google Play结算请求之前,您必须先通过以下步骤建立与Google Play的连接:
调用newBuilder() 以创建的实例。 BillingClient 您还必须调用 setListener(),将传递给引用, PurchasesUpdatedListener 以接收有关您的应用发起的购买以及Google Play商店发起的购买的更新。
建立与Google Play的连接。设置过程是异步的,BillingClientStateListener 一旦客户端的设置完成并且可以发出进一步的请求,您就必须实现A 来接收回调。
覆盖 onBillingServiceDisconnected() 回调方法,并实施您自己的重试策略,以在客户端断开连接的情况下处理与Google Play的连接丢失。例如,BillingClient如果Google Play商店服务在后台更新,则可能会失去其连接。 在发出进一步的请求之前,BillingClient必须调用 startConnection()方法重新启动连接。
private BillingClient billingClient;
...
billingClient = BillingClient.newBuilder(activity).setListener(this).build();
billingClient.startConnection(new BillingClientStateListener() {
    @Override
    public void onBillingSetupFinished(BillingResult billingResult) {
        if (billingResult.getResponseCode() ==  BillingResponseCode.OK) {
            // The BillingClient is ready. You can query purchases here.
        }
    }
    @Override
    public void onBillingServiceDisconnected() {
        // Try to restart the connection on the next request to
        // Google Play by calling the startConnection() method.
    }
});
注意:强烈建议您实施自己的连接重试策略并覆盖该 onBillingServiceDisconnected() 方法。BillingClient执行任何方法时,请确保维护连接。
3、查询应用内商品详细信息
您在配置应用内商品时创建的唯一商品ID用于异步查询Google Play的应用内商品详细信息。要在Google Play中查询应用内商品详情,请致电 querySkuDetailsAsync()。调用此方法时,传递一个实例,SkuDetailsParams 该实例 指定产品ID字符串列表和一个SkuType。该SkuType可以是SkuType.INAPP一次性产品或SkuType.SUBS订阅费。
注意:要查询产品详细信息,您的应用将使用您在Google Play控制台中配置产品时定义的产品ID。有关更多信息,请参阅 添加一次性产品特定功能 或添加订阅特定功能。
要处理异步操作的结果,还必须指定一个实现该SkuDetailsResponseListener 接口的侦听 器。然后onSkuDetailsResponse() ,您可以重写 以在查询结束时通知侦听器,如以下示例代码所示:

List skuList = new ArrayList ();
skuList.add("premium_upgrade");
skuList.add("gas");
SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList).setType(SkuType.INAPP);
billingClient.querySkuDetailsAsync(params.build(),
    new SkuDetailsResponseListener() {
        @Override
        public void onSkuDetailsResponse(BillingResult billingResult,
                List skuDetailsList) {
            // Process the result.
        }
    });
注意:premium_upgrade产品ID代表用户可以购买一次但无限期使用的新游戏车。可以无限期使用的一次性产品称为非消耗品。气体产品ID代表气体,用户可以多次购买该气体。非无限使用的一次性产品称为消耗品。要处理临时资源的消耗,请参阅指示一次性产品已消耗。
您的应用应通过将其与APK捆绑在一起或从您自己的安全后端服务器中查询来维护自己的产品ID列表。
调用 getResponseCode() 以检索响应代码。如果请求成功,则响应代码为BillingResponse.OK。有关Google Play其他可能的响应代码的列表,请参见 BillingClient.BillingResponse。
如果发生错误,您可以 getDebugMessage() 用来查看相关的错误消息。
该谷歌Play结算库存储查询结果中List的 SkuDetails 对象。然后,您可以SkuDetails 在列表中的每个对象上调用各种方法,以查看有关应用内商品的相关信息,例如其价格或说明。要查看可用的产品详细信息,请参阅SkuDetails类中的方法列表。
以下示例显示了如何使用SkuDetails上一个代码段返回的对象来检索应用内商品的价格:

if (result.getResponseCode() == BillingResponse.OK && skuDetailsList != null) {
   for (SkuDetails skuDetails : skuDetailsList) {
       String sku = skuDetails.getSku();
       String price = skuDetails.getPrice();
       if ("premium_upgrade".equals(sku)) {
           premiumUpgradePrice = price;
       } else if ("gas".equals(sku)) {
           gasPrice = price;
       }
   }
}

4、允许购买应用内商品
某些Android手机可能具有较旧版本的Google Play商店应用,该版本不支持某些产品类型,例如订阅。因此,在您的应用进入计费流程之前,请致电 isFeatureSupported() 以检查设备是否支持您要销售的产品。有关产品类型的列表,请参见 BillingClient.FeatureType。
要从您的应用发出购买请求,请launchBillingFlow()从UI线程调用 方法。将引用传递给BillingFlowParams 包含相关数据的 对象以完成购买,例如商品的商品ID(skuId)和商品类型(SkuType.INAPP针对一次性商品或SkuType.SUBS订阅商品)。要获取的实例 BillingFlowParams ,请使用 BillingFlowParams.Builder 类:

// Retrieve a value for "skuDetails" by calling querySkuDetailsAsync().
BillingFlowParams flowParams = BillingFlowParams.newBuilder()
        .setSkuDetails(skuDetails)
        .build();
int responseCode = billingClient.launchBillingFlow(flowParams);

当您调用该 launchBillingFlow() 方法时,系统会显示Google Play购买屏幕。

该 launchBillingFlow() 方法返回中列出的几个响应代码之一 BillingClient.BillingResponse。Google Play调用将 onPurchasesUpdated() 购买操作的结果传递给实现该PurchasesUpdatedListener接口的侦听 器的方法。使用setListener()前面在“ 连接到Google Play”部分中演示的方法指定了侦听器 。
您必须实现该 onPurchasesUpdated() 方法以处理可能的响应代码。以下代码段显示了如何覆盖该 onPurchasesUpdated() 方法:

@Override
void onPurchasesUpdated(BillingResult billingResult, List purchases) {
    if (billingResult.getResponseCode() == BillingResponse.OK
            && purchases != null) {
        for (Purchase purchase : purchases) {
            handlePurchase(purchase);
        }
    } else if (billingResult.getResponseCode() == BillingResponse.USER_CANCELED) {
        // Handle an error caused by a user cancelling the purchase flow.
    } else {
        // Handle any other error codes.
    }
}

成功购买会产生一个Google Play成功屏幕。

成功的购买还会生成购买令牌,该令牌是代表用户及其所购买的应用内商品的产品ID的唯一标识符。您的应用程序可以将购买令牌存储在本地,或者理想情况下,可以将其传递到安全的后端服务器,该服务器可以用来验证购买并防止欺诈。购买令牌对于每次一次性产品购买都是唯一的。但是,由于订阅是一次性购买的,并且会在常规结算周期自动更新,因此订阅的购买令牌在每个结算周期都保持不变。

还通过电子邮件向用户发送包含订单ID或交易唯一ID的交易收据。用户会收到一封电子邮件,其中包含每次一次性产品购买以及首次订阅购买和随后定期自动续订的唯一订单ID。您可以使用订单ID在Google Play控制台中管理退款。有关更多详细信息,请参阅 查看和退款您的应用程序的订单和订阅。

注意:代表订购重复性的订单号有一个附加整数,代表该订购的特定重复性。例如,初始订阅订单ID可能 GPA.1234-5678-9012-34567与后续订购ID分别为GPA.1234-5678-9012-34567..0(第一次重复orderID), GPA.1234-5678-9012-34567..1(第二次重复orderID)等等。
注意:如果用户在购买应用内商品时(例如在免费试用订阅期间)没有欠款,则订单ID为$ 0。例如,当用户取消订阅时,订阅将保持有效,直到计费期结束。如果用户决定重新注册,则其帐户中会保留一些贷方。在这种情况下,将创建一个新的购买令牌,为$ 0创建一个订单ID,并在信用用完后续订。

5、确认购买(消费掉才算真正的完结该订单)
如果您使用的是Google Play结算库2.0版或更高版本,则必须在三天内确认所有购买。未正确确认购买会导致这些购买被退款。
Google Play支持从应用内(应用内)或应用外(应用外)购买产品。为了使Google Play无论用户在哪里购买产品,都能够确保一致的购买体验,您必须SUCCESS在授予用户权利后尽快确认所有通过Google Play计费库收到状态的购买。如果您在三天内不确认购买,则用户会自动收到退款,Google Play会撤消购买。对于待处理的交易,购买PENDING状态为3天的窗口不适用。相反,它在购买移至该SUCCESS状态时开始。
您可以使用以下方法之一确认购买:
对于易耗品,请使用 consumeAsync()客户端API中的。
对于未消费的产品,请使用 acknowledgePurchase()客户端API中的。
acknowledge()服务器API中也提供了一种新方法。
对于订阅,您必须确认任何包含新购买令牌的购买。这意味着需要确认所有初始购买,计划变更和重新注册,但您无需确认后续续订。要确定采购是否需要确认,您可以检查采购中的确认字段。
该Purchase对象包括isAcknowledged() 指示是否已经确认购买的 方法。此外,服务器端API包括用于确认布尔值 Product.purchases.get()和Product.subscriptions.get()。在确认购买之前,请使用以下方法确定是否已确认购买。
此示例显示如何确认订阅购买:

BillingClient client = ...
AcknowledgePurchaseResponseListener acknowledgePurchaseResponseListener = ...

void handlePurchase(Purchase purchase) {
    if (purchase.getPurchaseState() == PurchaseState.PURCHASED) {
        // Grant entitlement to the user.
        ...

        // Acknowledge the purchase if it hasn't already been acknowledged.
        if (!purchase.isAcknowledged()) {
            AcknowledgePurchaseParams acknowledgePurchaseParams =
                AcknowledgePurchaseParams.newBuilder()
                    .setPurchaseToken(purchase.getPurchaseToken())
                    .build();
            client.acknowledgePurchase(acknowledgePurchaseParams, acknowledgePurchaseResponseListener);
        }
    }
}

ONE store支付:

详情可通过VPN:https://dev.onestore.co.kr/devpoc/reference/view/IAP_v17_cn

1、什么是ONE store应用内支付(IAP)
一家商店应用内部支付(下称IAP)是一家商店使用的,支付服务,开发者销售手机应用程序的应用内部商品时,利用一个商店的验证和支付系统完成向用户支付费用,解决等价流程。一店服务(一店服务,OSS)替代开发的应用商品,OSS与一店总服务器连接执行支付工作,用于响应用户的应用内部商品购买请求。

2、开发环境配置建议安卓应用程序程序适用的IAP SDK所需的开发环境如下:
Android 4.0及以上版本(API版本14以上)
Java SDK 1.6版本
Android studio 2.0及以上版本

3、事先准备
详情可通过VPN:https://dev.onestore.co.kr/devpoc/reference/view/IAP_v17_04_preparation_cn
3-1、配置应用ID
3-2、填写银行信息
3-3、应用内商品注册
3-3.1应用内商品个别注册
3-3.2应用内商品批量注册
3-4、配置认证密钥
3-5、下载示例应用
3-6、新增应用内支付库(Library)
3-7、设置 Android Manifest文档
3-8、安装ONE store应用

4、实现应用内支付
详情可通过VPN:https://dev.onestore.co.kr/devpoc/reference/view/IAP_v17_05_implementation_cn

使用SDK实现应用内支付
4-1、发起ONE store登录的请求
调用 launchLoginFlowAsync,请求登录于ONE store。
以参数传递的requestCode用于以后确认返回至onActivityResult的数据。


PurchaseClient.LoginFlowListener mLoginFlowListener = new PurchaseClient.LoginFlowListener() {
    @Override
    public void onSuccess() {
        Log.d(TAG, "launchLoginFlowAsync onSuccess");
        // 开发者应自行编写登录成功后的方案。
    }
 
    @Override
    public void onError(IapResult result) {
        Log.e(TAG, "launchLoginFlowAsync onError, " + result.toString());
    }
 
    @Override
    public void onErrorRemoteException() {
        Log.e(TAG, "launchLoginFlowAsync onError, 无法连接ONE store服务");
    }
 
    @Override
    public void onErrorSecurityException() {
        Log.e(TAG, "launchLoginFlowAsync onError, 应用状态异常下请求支付");
    }
 
    @Override
    public void onErrorNeedUpdateException() {
        Log.e(TAG, "launchLoginFlowAsync onError, 需要更新ONE store客户端 ");
    }
 
};

int IAP_API_VERSION = 5;
int LOGIN_REQUEST_CODE = 2000; // 向onActivityResult 返回的 request code
mPurchaseClient.launchLoginFlowAsync(IAP_API_VERSION, "调用Activity".this, LOGIN_REQUEST_CODE, mLoginFlowListener)

4-2、应用内支付初始化与连接

使用应用内支付SDK时,应进行初始化,创建PurchaseClient对象并执行购买方法。首先在创建PurchaseClient对象时,输入当前Activity的Context信息和签名密钥值。创建对象后,执行connect连接。在此过程中,SDK中与应用内支付服务连接,启动为购买的各种参数设定的操作。


PurchaseClient.ServiceConnectionListener mServiceConnectionListener = new PurchaseClient.ServiceConnectionListener() {
    @Override
    public void onConnected() {
        Log.d(TAG, "Service connected");
    }
 
    @Override
    public void onDisconnected() {
        Log.d(TAG, "Service disconnected");
    }
 
    @Override
    public void onErrorNeedUpdateException() {
        Log.e(TAG, "connect onError, 需要更新ONE store客户端 ");
  PurchaseClient.launchUpdateOrInstallFlow(this);
    }
};
 
 
@Override
public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
    // PurchaseClient 初始化——将公钥作为参数传递,以验证context和Signature。
    mPurchaseClient = new PurchaseClient(this, AppSecurity.getPublicKey());
 
    // 请求绑定ONE store服务,以启动应用内支付。
    mPurchaseClient.connect(mServiceConnectionListener);
}

请注意连接时未安装ONE store客户端或ONE store客户端版本不支持应用内支付 V17版本的情况,会调用 ServiceConnectionListener之onErrorNeedUpdateException()。出现该错误时,调用安装或更新ONE store客户端的方法,即PurchaseClient.launchUpdateOrInstallFlow。

退出Activity时,在 onDestroy方法中输入解除PurchaseClient的代码。

@Override
protected void onDestroy() {
    super.onDestroy();
 
    if (mPurchaseClient == null) {
        Log.d(TAG, "PurchaseClient is not initialized");
        return;
    }
 
    // 关闭应用时,使用PurchaseClient中断服务。
    mPurchaseClient.terminate();
}

4-3、查询是否支持

开发者在正式使用应用内支付方法之前,应先调用相应方法,确认能否启动应用内支付。
如果SDK方法是使用AIDL提供的API,以回调形式返回成功及失败的结果。
对失败的返回会提供使用SDK的开发者必须处理的三大错误(onErrorRemoteException、onErrorSecurityException、onErrorNeedUpdateException)和普通错误(onError)。向onError监听器返回的IapResult有返回码和对返回码进行说明的Enum,开发者应根据开发方案,处理相应错误。


PurchaseClient.BillingSupportedListener mBillingSupportedListener = new PurchaseClient.BillingSupportedListener() {
 
    @Override
    public void onSuccess() {
        Log.d(TAG, "isBillingSupportedAsync onSuccess");
    }
 
    @Override
    public void onError(IapResult result) {
        Log.e(TAG, "isBillingSupportedAsync onError, " + result.toString());
    }
 
    @Override
    public void onErrorRemoteException() {
        Log.e(TAG, "isBillingSupportedAsync onError, 无法连接ONE store服务");
    }
 
    @Override
    public void onErrorSecurityException() {
        Log.e(TAG, "isBillingSupportedAsync onError, 应用状态异常下请求支付");
    }
 
    @Override
    public void onErrorNeedUpdateException() {
        Log.e(TAG, "isBillingSupportedAsync onError, 需要更新ONE store客户端");
    }
};
// ONE store应用内支付API版本
int IAP_API_VERSION = 5;
mPurchaseClient.isBillingSupportedAsync(IAP_API_VERSION, mBillingSupportedListener);

4-4、查询商品信息

开发者在 ArrayList输入采用queryProductAsync方法的参数中放入想要获取信息的应用内商品ID并调用,返回结果至已注册的监听器。
商品ID指开发者在开发者中心注册商品时自定义的商品ID。商品信息会以 ProductDetail形式返回至 onSuccess监听器。


PurchaseClient.QueryProductsListener mQueryProductsListener = new PurchaseClient.QueryProductsListener() {
    @Override
    public void onSuccess(List productDetails) {
        Log.d(TAG, "queryProductsAsync onSuccess, " + productDetails.toString());
    }
 
    @Override
    public void onErrorRemoteException() {
        Log.e(TAG, "queryProductsAsync onError, 无法连接ONE store服务 ");
    }
 
    @Override
    public void onErrorSecurityException() {
        Log.e(TAG, "queryProductsAsync onError, 应用状态异常下请求支付 ");
    }
 
    @Override
    public void onErrorNeedUpdateException() {
        Log.e(TAG, "queryProductsAsync onError, 需要更新ONE store客户端");
    }
 
    @Override
    public void onError(IapResult result) {
        Log.e(TAG, "queryProductsAsync onError, " + result.toString());
    }
};
 
int IAP_API_VERSION = 5;
String productType = IapEnum.ProductType.IN_APP.getType(); // "inapp"
ArrayList productCodes = new ArrayList();
productCodes.add("p5000");
productCodes.add("p10000");
mPurchaseClient.queryProductsAsync(IAP_API_VERSION, productCodes, productType, mQueryProductsListener);

4-5、发起购买请求

调用launchPurchaseFlowAsync方法执行购买。调用方法时,输入想要购买的应用内商品ID、商品名称、商品类别和开发者任意决定的launchPurchaseFlowAsync(不超过100byte),该值用于支付成功后确认数据的正确性和附加数据,并以参数传递的requestCode用于确认返回至onActivityResult的数据。
购买成功时结果返回至onSuccess监听器,以SDK的 PurchaseData规格返回。开发者基于收到的结果,再通过 developerPayload确认数据的正确性和附加数据,以签名信息来验证。
管理型商品,通过设置商品消耗处理为用户提供商品。
ONE store面向用户开展发送优惠券、 购物返现(cashback)等各种优惠推广活动。开发者发起购买请求时,可通过gameUserId、promotionApplicable参数,允许或控制用户参加推广活动。开发者选择应用的唯一标识符及是否参与活动并传递给ONE store,ONE store基于该值处理用户的活动优惠。

注意:gameUserId,protectionApplicable参数必须事先应用于ONE store经理的促销工作。一般说来,该值不应发送。
此外,gameUserId参数应当送到散列单一值,以便在事先发送价值信息时,没有隐私信息保护问题。


PurchaseClient.PurchaseFlowListener mPurchaseFlowListener = new PurchaseClient.PurchaseFlowListener() {
    @Override
    public void onSuccess(PurchaseData purchaseData) {
  Log.d(TAG, "launchPurchaseFlowAsync onSuccess, " + purchaseData.toString());
        // 购买成功后检查开发者payload。
        if (!isValidPayload(purchaseData.getDeveloperPayload())) {
            Log.d(TAG, "launchPurchaseFlowAsync onSuccess, Payload is not valid.");
            return;
        }
 
        // 购买成功后检查签名。
        boolean validPurchase = AppSecurity.isValidPurchase(purchaseData.getPurchaseData(), purchaseData.getSignature());
        if (validPurchase) {
            if (product5000.equals(purchaseData.getProductId())) {{
                // 管理型商品(inapp)购买成功后消耗。
                consumeItem(purchaseData);
            }
        } else {
            Log.d(TAG, "launchPurchaseFlowAsync onSuccess, Signature is not valid.");
            return;
        }
    }
 
    @Override
    public void onError(IapResult result) {
        Log.e(TAG, "launchPurchaseFlowAsync onError, " + result.toString());
    }
 
    @Override
    public void onErrorRemoteException() {
        Log.e(TAG, "launchPurchaseFlowAsync onError, 无法连接ONE store服务 ");
    }
 
    @Override
    public void onErrorSecurityException() {
        Log.e(TAG, "launchPurchaseFlowAsync onError, 应用状态异常下请求支付 ");
    }
 
    @Override
    public void onErrorNeedUpdateException() {
        Log.e(TAG, "launchPurchaseFlowAsync onError, 需要更新ONE store客户端 ");
    }
};
 
int IAP_API_VERSION = 5;
int PURCHASE_REQUEST_CODE = 1000; // 返回至onActivityResult的request code
String product5000 = "p5000"; // 请求购买的商品ID
String productName = ""; // ""时显示开发者中心注册的商品名称
String productType = IapEnum.ProductType.IN_APP.getType(); // "inapp"
String devPayload = AppSecurity.generatePayload();
String gameUserId = ""; // 默认 ""
boolean promotionApplicable = false;
 
mPurchaseClient.launchPurchaseFlowAsync(IAP_API_VERSION, "调用Activity".this, PURCHASE_REQUEST_CODE, product5000, productName, productType, devPayload, gameUserId, promotionApplicable, mPurchaseFlowListener);

支付成功时返回至监听器的Purchase信息参考“应用内支付参考 - getPurchaseIntent() 发起购买请求”。
支付结果会返回至调用launchPurchaseFlowAsync的Activity的onActivityResult,在这里须添加handlePurchaseData方法,以SDK处理购买结果。启动handlePurchaseData方法时,如果作为请求购买的参数输入的 PurchaseFlowListener为null的话,会返回false(失败)。成功或错误的处理结果会通过 PurchaseFlowListener来返回。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.e(TAG, "onActivityResult resultCode " + resultCode);
 
    switch (requestCode) {
        case PURCHASE_REQUEST_CODE:
           
            if (resultCode == Activity.RESULT_OK) {
                if (mPurchaseClient.handlePurchaseData(data) == false) {
                    Log.e(TAG, "onActivityResult handlePurchaseData false ");
                    // listener is null
                }
            } else {
                Log.e(TAG, "onActivityResult user canceled");
                // user canceled , do nothing..
            }
            break;
        default:
    }
}

4-6、商品消耗

如为管理型商品(inapp),未消耗已购商品时无法再次购买。用户购买商品后,其购买信息托管给ONE store,商品被消耗,ONE store立刻收回用户购买商品的权限。也就是说,如过购买了管理型商品而未消耗,可作为永久性商品,如购买后立刻消耗商品,可作为消耗型商品,如超过一定期限消耗已购商品,可作为限期型商品。要发起商品消耗请求时,将返回至launchPurchaseFlowAsync或queryPurchasesAsync的购买信息,作为 consumeAsync 方法的参数传递并调用。


PurchaseClient.ConsumeListener mConsumeListener = new PurchaseClient.ConsumeListener() {
    @Override
    public void onSuccess(PurchaseData purchaseData) {
  Log.d(TAG, "consumeAsync onSuccess, " + purchaseData.toString());
  // 商品消耗成功后,按各开发者编写的购买成功方案进行。
    }
 
    @Override
    public void onErrorRemoteException() {
        Log.e(TAG, "consumeAsync onError, 无法连接ONE store服务");
    }
 
    @Override
    public void onErrorSecurityException() {
        Log.e(TAG, "consumeAsync onError, 应用状态异常下请求支付");
    }
 
    @Override
    public void onErrorNeedUpdateException() {
        Log.e(TAG, "consumeAsync onError, 需要更新ONE store客户端 ");
    }
 
    @Override
    public void onError(IapResult result) {
        Log.e(TAG, "consumeAsync onError, " + result.toString());
    }
};
int IAP_API_VERSION = 5;
PurchaseData purchaseData; // 查询购买记录及请求购买后接到的PurchaseData
mPurchaseClient.consumeAsync(IAP_API_VERSION, purchaseData, mConsumeListener);

4-7、查询购买记录

调用queryPurchasesAsync方法来获取用户已购但未消耗的管理型商品(inapp)和用户订阅的包月自动支付商品(auto)。SDK会验证签名以确认购买信息数据伪造与否,如签名验证失败,会将“IapResult”内定义的 IapResult.IAP_ERROR_SIGNATURE_VERIFICATION值返回至onError监听器。出现错误表示购买信息数据有伪造的可能,有必要确认是否有abusing袭击。
开发者查询购买记录获得管理型商品(inapp),可通过设置商品消耗向用户提供商品。


PurchaseClient.QueryPurchaseListener mQueryPurchaseListener = new PurchaseClient.QueryPurchaseListener() {
    @Override
    public void onSuccess(List purchaseDataList, String productType) {
  Log.d(TAG, "queryPurchasesAsync onSuccess, " + purchaseDataList.toString());
        if (IapEnum.ProductType.IN_APP.getType().equalsIgnoreCase(productType)) {
            // 如为查询购买记录后获取的管理型商品( inapp),先验证签名,成功后消耗商品。
        } else if (IapEnum.ProductType.AUTO.getType().equalsIgnoreCase(productType)) {
            // 如为查询购买记录后获取的包月自动支付商品( auto),先验证签名,成功后根据开发者应用处理需求编写方案。
        }
    }
    @Override
    public void onErrorRemoteException() {
        Log.e(TAG, "queryPurchasesAsync onError, 无法连接ONE store服务");
    }
 
    @Override
    public void onErrorSecurityException() {
        Log.e(TAG, "queryPurchasesAsync onError, 应用状态异常下请求支付");
    }
 
    @Override
    public void onErrorNeedUpdateException() {
        Log.e(TAG, "queryPurchasesAsync onError, 需要更新ONE store客户端 ");
    }
 
    @Override
    public void onError(IapResult result) {
        Log.e(TAG, "queryPurchasesAsync onError, " + result.toString());
    }
};
int IAP_API_VERSION = 5;
String productType = IapEnum.ProductType.IN_APP.getType(); // "inapp"
mPurchaseClient.queryPurchasesAsync(IAP_API_VERSION, productType, mQueryPurchaseListener);

MyCard支付:

1、通过商务联系MyCard进行技术对接,获得最新MyCardPaySDK.jar和接入文档
2、导入MyCardPaySDK.jar
3、根据MyCard提供文档设置AndroidManifest.xml
4、根据自身需求确定是走SDK支付方式还是WebView支付方式
4-1、SDK支付方式
        MyCardSDK sdk = new MyCardSDK(activity);
        //flag   true代表测试环境,false代表正式环境
        sdk.StartPayActivityForResult(flag, bean.getAuthCode());

        // 通过onActivityResult接收SDK結果
        if (requestCode == Config.Payment_RequestCode) {
            if( resultCode == -1)
            {
                JSONObject js = null;
                try {
                    js = new JSONObject(data.getStringExtra(Config.PaySDK_Result));
                    MLog.e(data.getStringExtra(Config.PaySDK_Result));
                    if (js.optInt("returnCode") == 1 && js.optInt("payResult") == 3) {
                        String orderNo = js.getString("facTradeSeq");
                        //进行你的操作
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                } catch (Exception e){
                }
            }else{
            }
        }

4-2、WEB支付方式
测试环境链接(http://test.mycard*)、正式环境链接(https://www.mycard*)不搞混乱就好,后面拼接字段需要注意

Gtc0401 原创文章 49获赞 204访问量 21万+ 关注 私信 展开阅读全文
作者:Gtc0401


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android三方支付:Google Play支付、MyCard支付、ONE store支付

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android三方支付:Google Play支付、MyCard支付、ONE store支付

Google Play支付: 详情可通过VPN:https://developer.android.com/google/play/billing/billing_library_overview#java 下面记录为个人摘录1、更新应用程
2022-06-06

Android 支付宝支付、微信支付、银联支付 整合第三方支付接入方法(后台订单支付API设计)

客户端获取后台支付API请求参数的设计参数样例:{ data: { method: 1, platform: 1, version:"1.0", relate_orders:"B201602031023,B2016020310231", o
2022-06-06

Android app第三方支付宝支付接入教程

支付宝的接入相对比较简单,看看支付宝官网的文档基本都能搞定,但是切记一点让你们的后台也要搞清楚支付宝的流程,重中之重。 1、注意事项 开发前一定要阅读支付宝官方文档 强烈建议签名等处理在后台处理,我这个是测试是在自己本地写的,不要吐槽
2022-06-06

python如何搭建支付宝三方支付

这篇文章将为大家详细讲解有关python如何搭建支付宝三方支付,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。为什么使用三方支付?  再没有三方支付平台之前,用户发起支付请求的时候,用户要去和银行签约(转账
2023-06-22

Android支付宝支付封装代码

在做Android支付的时候肯定会用到支付宝支付, 根据官方给出的demo做起来非常费劲,所以我们需要一次简单的封装。 封装的代码也很简单,就是将官网给的demo提取出一个类来方便使用。public class Alipay {// 商户
2022-06-06

Android支付宝支付开发实例

在移动应用满天飞的时代,随着移动支付的盛行,很多应用中都集成了支付功能。之前的支付一直不是我负责,近期这个项目我负责订单模块少不了要做支付,每每提起支付就觉得怕怕,觉得很难,但当真正做的时候却远远没有想象中的那么难。支付宝的SDK提供了de
2022-06-06

微信支付、支付宝支付等常用第三方支付通道接口手续费对比

微信支付、支付宝等第三方支付,需要和银联、网联对接,有清算机构和银行的交易处理通道成本。费率指支付手续费的费率,不同行业、不同的支付平台、不同的支付额度或次数所对应的通道费率是不一样的。
2023-01-28

Android支付宝支付设计开发

在移动支付领域,支付宝支付占用巨大份额,根据艾瑞咨询公布的报告数据:2014Q3,支付宝斩获了82.6%的市场份额,在移动支付的霸主地位越来越稳固。财付通支付的发力点在微信支付和手Q支付,在移动支付格局中取得了10.0%的市场份额
2022-06-06

Android支付宝和微信支付集成

场景 随着移动支付的兴起,在我们的app'中,会经常有集成支付的需求.这时候一般都会采用微信和支付宝的sdk 来集成 (一)支付宝支付 在使用支付宝支付的过程中,我们是在服务器端生成订单,客户端访问接口,并得到订单信息,调用接口支付,支付成
2022-06-06

Android中PathMeasure仿支付宝支付动画

前言在 Android 自定义 View 中,Path 可能用的比较多,PathMeasure 可能用的比较少,就我而言,以前也没有使用过 PathMeasure 这个 api,看到别人用 PathMeasure 和 ValueAnimat
2023-05-30

Android支付宝支付的示例代码

上一篇,我们已经详细讲解了Android微信支付,今天接着为大家带来支付宝支付,支付宝支付相对微信支付要简单一些,吐槽一下,而且支付宝文档确实比微信的文档好了不少,下面开始讲解支付流程。1、首先给出官方文档的地址Android集成支付宝流程
2023-05-30

Android仿支付宝支付密码输入框

本文实例为大家分享了Android实现一个仿支付宝支付密码的输入框,主要实现如下: PasswordView.javapackage com.jackie.alipay.password; import android.annotatio
2022-06-06

Android集成支付宝支付功能示例

公司项目中需要支付功能,现在支付宝、微信支付很方便,也很多人使用,因此,他们是首选。在此记录一下支付宝集成过程,下期为微信支付,敬请期待首先去支付宝官网下载其最新的Android的SDK集成Dmeo支付宝 选择SDK&Dmeo进行下载 将支
2023-05-30

Android 支付宝支付功能封装实现

在做Android支付的时候肯定会用到支付宝支付, 根据官方给出的demo做起来非常费劲,所以我们需要一次简单的封装。封装的代码也很简单,是将官网给的demo提取出一个类来方便使用。
2022-06-06

Android App支付系列(一):微信支付接入详细指南(附官方支付demo)

写在前面 一家移动互联网公司,说到底,要盈利总是需要付费用户的,自己开发支付系统显然是不明智的,国内已经有多家成熟的移动支付提供商,腾讯就是其中之一。梳理了下微信支付的接入,今天给大家分享下腾讯旗下的微信支付SDK的接入流程。 接入流程 1
2022-06-06

Android App支付系列(二):支付宝SDK接入详细指南(附官方支付demo)

一家移动互联网公司,说到底,要盈利总是需要付费用户的,自己开发支付系统对于资源有限的公司来说显然不太明智,国内已经有多家成熟的移动支付提供商,阿里就是其中之一。 笔者在此总结了下阿里旗下支付宝Android SDK支付的接入流程,供后来者参
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录