Android ONE store支付,身为一个安卓程序员Context都没弄明白

2023-10-29 22:31

本文主要是介绍Android ONE store支付,身为一个安卓程序员Context都没弄明白,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

4、实现应用内支付

详情可通过VPN:https://dev.onestore.co.kr/devpoc/reference/view/IAP_v17_05_implementation_cn(已更新至v6版本文章最后有电梯)

使用SDK实现应用内支付

4-1、发起ONE store登录的请求

调用 launchLoginFlowAsync,请求登录于ONE store。

以参数传递的requestCode用于以后确认返回至onActivityResult的数据。

/*

* PurchaseClient的 launchLoginFlowAsync API(登录)回调监听器

*/

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的 connect API 回调监听器

* 返回绑定成功或失败以及是否要更新ONE store服务的结果。

*/

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的isBillingSupportedAsync (查询是否支持)回调监听器

*/

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的 queryProductsAsync API (商品信息查询)回调监听器

*/

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的 launchPurchaseFlowAsync API (购买)回调监听器

*/

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客户端 ");

}

学习分享,共勉

Android高级架构师进阶之路

题外话,我在阿里工作多年,深知技术改革和创新的方向,Android开发以其美观、快速、高效、开放等优势迅速俘获人心,但很多Android兴趣爱好者所需的进阶学习资料确实不太系统,完整。今天我把我搜集和整理的这份学习资料分享给有需要的人,若有关Android学习进阶可以与我在Android终极开发交流群一起讨论交流。 点击这里前往我的Git领取资料 的同时,还可以加入一个好的学习交流圈,何乐而不为呢?加入我们和我们一起吧!!

  • Android进阶知识体系学习脑图

  • Android进阶高级工程师学习全套手册

  • 对标Android阿里P7,年薪50w+学习视频

  • 大厂内部Android高频面试题,以及面试经历

b.com/a120464/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)** 的同时,还可以加入一个好的学习交流圈,何乐而不为呢?加入我们和我们一起吧!!

  • Android进阶知识体系学习脑图

[外链图片转存中…(img-Y0jwXEsD-1644988594690)]

  • Android进阶高级工程师学习全套手册

[外链图片转存中…(img-Y0fRCRQI-1644988594691)]

  • 对标Android阿里P7,年薪50w+学习视频

[外链图片转存中…(img-Uf89JitC-1644988594692)]

  • 大厂内部Android高频面试题,以及面试经历

这篇关于Android ONE store支付,身为一个安卓程序员Context都没弄明白的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/303792

相关文章

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

Android WebView无法加载H5页面的常见问题和解决方法

《AndroidWebView无法加载H5页面的常见问题和解决方法》AndroidWebView是一种视图组件,使得Android应用能够显示网页内容,它基于Chromium,具备现代浏览器的许多功... 目录1. WebView 简介2. 常见问题3. 网络权限设置4. 启用 JavaScript5. D

Android如何获取当前CPU频率和占用率

《Android如何获取当前CPU频率和占用率》最近在优化App的性能,需要获取当前CPU视频频率和占用率,所以本文小编就来和大家总结一下如何在Android中获取当前CPU频率和占用率吧... 最近在优化 App 的性能,需要获取当前 CPU视频频率和占用率,通过查询资料,大致思路如下:目前没有标准的

SpringBoot基于沙箱环境实现支付宝支付教程

《SpringBoot基于沙箱环境实现支付宝支付教程》本文介绍了如何使用支付宝沙箱环境进行开发测试,包括沙箱环境的介绍、准备步骤、在SpringBoot项目中结合支付宝沙箱进行支付接口的实现与测试... 目录一、支付宝沙箱环境介绍二、沙箱环境准备2.1 注册入驻支付宝开放平台2.2 配置沙箱环境2.3 沙箱

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干