打造一站式应用内支付体验,助力开发者商业增长

简介: 打造一站式应用内支付体验,助力开发者商业增长

随着移动互联网的发展,应用内支付已成为数字经济的重要组成部分。用户越来越追求便捷的支付体验,应用内支付服务提供的购买和订阅等能力满足了用户快速、无缝的支付需求,方便用户一站式完成交易,帮助开发者实现收入多元化。

HarmonyOS SDK应用内支付服务(IAP Kit)为用户精心打造了一种流畅且高效的应用内支付体验,同时为开发者提供了便捷快速的接入指南。开发者能够将更多的精力投入到提升应用核心业务的质量和创新上,进而促进商业价值的实现和增长。

通过集成应用内支付服务所提供的系统级API,开发者可以迅速部署一个功能完备的支付平台,无缝地实现应用内购买功能。用户可以在应用内轻松购买一系列虚拟商品,种类丰富,包括但不限于一次性使用的消耗品、长期使用的非消耗品,以及提供持续价值的自动续期订阅服务等等。本文重点带开发者了解如何接入购买消耗型/非消耗型商品。

image
场景介绍

通过应用内支付服务,用户可以在应用内购买各种类型的虚拟商品,包括消耗型商品、非消耗型商品和自动续期订阅商品。

•消耗型商品:使用一次后即消耗掉,随使用减少,需要再次购买的商品。例:游戏货币,游戏道具等。

•非消耗型商品:一次性购买,永久拥有,无需消耗。例:游戏中额外的游戏关卡、应用中无时限的高级会员等。

•自动续期订阅商品:用户购买后在一段时间内允许访问增值功能或内容,周期结束后可以选择自动续期购买下一期的服务。例:视频连续包月会员。
购买消耗型/非消耗型商品接入流程

在接入消耗型/非消耗型商品购买能力前,需在华为AppGallery Connect网站配置商品,录入商品ID和商品价格等信息。用户在开发者应用内发起购买时,应用需要调用createPurchase接口来拉起IAP Kit收银台,收银台会展示商品名称、商品价格等信息,用户可在收银台完成商品购买。

image
开发步骤
1.判断当前登录的华为账号所在的服务地是否支持应用内支付。

在使用应用内支付之前,应用需要向IAP Kit发送queryEnvironmentStatus请求,以此判断用户当前登录的华为账号所在的服务地是否在IAP Kit支持结算的国家/地区中。

import { iap } from '@kit.IAPKit';
import { common } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';

queryEnvironmentStatus() {
const context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
iap.queryEnvironmentStatus(context).then(() => {
// 请求成功
console.info('Succeeded in querying environment status.');
}).catch((err: BusinessError) => {
// 请求失败
console.error(Failed to query environment status. Code is ${err.code}, message is ${err.message});
});
}
}

2.查询商品信息

通过queryProducts来获取在AppGallery Connect上配置的商品信息。发起请求时,需在请求参数QueryProductsParameter中携带相关的商品ID,并根据实际配置指定其productType。

当接口请求成功时,IAP Kit将返回商品信息Product的列表。应用可以使用Product包含的商品价格、名称和描述等信息,向用户展示可供购买的商品列表。

import { iap } from '@kit.IAPKit';
import { BusinessError } from '@kit.BasicServicesKit';

queryProducts() {
const queryProductParam: iap.QueryProductsParameter = {
// iap.ProductType.CONSUMABLE:消耗型商品;
// iap.ProductType.NONCONSUMABLE:非消耗型商品;
productType: iap.ProductType.CONSUMABLE,
// 查询的商品必须是开发者在AppGallery Connect网站配置的商品
productIds: ['ohos_consume_001']
};
const context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
iap.queryProducts(context, queryProductParam).then((result) => {
// 请求成功
console.info('Succeeded in querying products.');
// 展示商品信息
// ...
}).catch((err: BusinessError) => {
// 请求失败
console.error(Failed to query products. Code is ${err.code}, message is ${err.message});
});
}

3.发起购买

用户发起购买时,应用可通过向IAP Kit发送createPurchase请求来拉起IAP Kit收银台。发起请求时,需在请求参数PurchaseParameter中携带此前已在华为AppGallery Connect网站上配置并生效的商品ID,并根据实际配置指定其productType。

当用户购买成功时,应用将接收到一个CreatePurchaseResult对象,其purchaseData字段包括了此次购买的结果信息。可参见对返回结果验签对purchaseData.jwsPurchaseOrder进行解码验签,验证成功可得到PurchaseOrderPayload的JSON字符串。

当用户购买失败时,需要针对code为iap.IAPErrorCode.PRODUCT_OWNED和iap.IAPErrorCode.SYSTEM_ERROR的场景,检查是否需要补发货,确保权益发放,具体请参见权益发放。

import { iap } from '@kit.IAPKit';
import { BusinessError } from '@kit.BasicServicesKit';
// JWTUtil为自定义类,可参见Sample Code工程。
import { JWTUtil } from '../commom/JWTUtil';

createPurchase() {
const createPurchaseParam: iap.PurchaseParameter = {
// 购买的商品必须是开发者在AppGallery Connect网站配置的商品
productId: 'ohos_consume_001',
// iap.ProductType.CONSUMABLE:消耗型商品;
// iap.ProductType.NONCONSUMABLE:非消耗型商品;
productType: iap.ProductType.CONSUMABLE
}
const context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
iap.createPurchase(context, createPurchaseParam).then(async (result) => {
console.info('Succeeded in creating purchase.');
const jwsPurchaseOrder: string = JSON.parse(result.purchaseData).jwsPurchaseOrder;
const purchaseStr = JWTUtil.decodeJwtObj(jwsPurchaseOrder);
// 需自定义PurchaseOrderPayload类,包含的信息请参见PurchaseOrderPayload
const purchaseOrderPayload = JSON.parse(purchaseStr) as PurchaseOrderPayload;
// 处理发货
// ...
// 发货成功后向IAP Kit发送finishPurchase请求,确认发货,完成购买
// finishPurchase请求的参数来源于purchaseOrderPayload
// ...
}).catch((err: BusinessError) => {
// 请求失败
console.error(Failed to create purchase. Code is ${err.code}, message is ${err.message});
if (err.code === iap.IAPErrorCode.PRODUCT_OWNED || err.code === iap.IAPErrorCode.SYSTEM_ERROR) {
// 参见权益发放检查是否需要补发货,确保权益发放
// ...
}
})
}

4.完成购买

对PurchaseData.jwsPurchaseOrder解码验签成功后,如果PurchaseOrderPayload.purchaseOrderRevocationReasonCode为空,则代表购买成功,即可发放相关权益。如果开发者同时接入了服务端关键事件通知,为了避免重复发货,建议先检查此笔订单是否已发货,未发货再发放相关权益。发货成功后记录PurchaseOrderPayload等信息,用于后续检查是否已发货。

发货成功后,应用需要发送finishPurchase请求确认发货,以此通知IAP服务器更新商品的发货状态,完成购买流程。发送finishPurchase请求时,需在请求参数FinishPurchaseParameter中携带PurchaseOrderPayload中的productType、purchaseToken、purchaseOrderId。请求成功后,IAP服务器会将相应商品标记为已发货。

对于消耗型商品,应用成功执行finishPurchase之后,IAP服务器会将相应商品重新设置为可购买状态,用户即可再次购买该商品。

import { iap } from '@kit.IAPKit';
import { BusinessError } from '@kit.BasicServicesKit';

/**

  • 确认发货,完成购买
    *
  • @param purchaseOrder 购买数据,来源于购买请求
    */
    finishPurchase(purchaseOrder: PurchaseOrderPayload) {
    const finishPurchaseParam: iap.FinishPurchaseParameter = {
    productType: purchaseOrder.productType,
    purchaseToken: purchaseOrder.purchaseToken,
    purchaseOrderId: purchaseOrder.purchaseOrderId
    };
    const context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
    iap.finishPurchase(context, finishPurchaseParam).then((result) => {
    // 请求成功
    console.info('Succeeded in finishing purchase.');
    }).catch((err: BusinessError) => {
    // 请求失败
    console.error(Failed to finish purchase. Code is ${err.code}, message is ${err.message});
    });
    }

了解更多详情>>
[box.hbjlhtmf.com)
[box.snyffs.com)
[box.qzhaxf.com)
[box.shendongmcu.com)
[box.ck6.org)
[box.cnrigel.com)
[box.xmcsh.org)

相关文章
|
24天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
16天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
20天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2577 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
18天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
3天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
2天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
163 2
|
20天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1576 16
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
22天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
973 14
|
3天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
219 2
|
17天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
734 9