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实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

android应用中res目录说明

Android应用的res目录是一个特殊的项目,该项目里存放了Android应用所用的全部资源,包括图片、字符串、颜色、尺寸、样式等,类似于web开发中的public目录,js、css、image、style。。。。 Android按照约定,将不同的资源放在不同的文件夹中,这样可以方便的让AAPT(即Android Asset Packaging Tool , 在SDK的build-tools目

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使

Android Environment 获取的路径问题

1. 以获取 /System 路径为例 /*** Return root of the "system" partition holding the core Android OS.* Always present and mounted read-only.*/public static @NonNull File getRootDirectory() {return DIR_ANDR

消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法

消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法   消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法 [转载]原地址:http://blog.csdn.net/x605940745/article/details/17911115 消除SDK更新时的“