045-IAP Kit应用内支付
045 — IAP Kit 应用内支付会员订阅全流程实现简介付费会员是记账应用实现商业闭环的重要途径。MoneyTrack 通过 IAP Kit 实现了完整的应用内购买功能支持自动续费订阅AUTORENEWABLE和非续费订阅NONRENEWABLE两种商品类型。从商品信息配置、购买流程发起、收银台拉起、收据验签到会员状态管理形成了一条完整的支付链路。MemberSubscriptionPage 作为订阅入口页面通过 ProductInfo 配置商品列表结合 JWSUtil 对支付平台返回的 JWS 收据进行解码验证。完整购买流程IAP Kit 的完整购买流程分为五个关键步骤自有服务端应用市场IAP KitMoneyTrack用户自有服务端应用市场IAP KitMoneyTrack用户进入会员订阅页1. queryProductInfo() 查询商品返回 ProductInfo 列表展示商品月度/年度选择商品点击购买2. createPurchase() 创建订单返回 PurchaseResult3. purchase() 拉起收银台调用系统支付能力支付完成返回收据返回 JWS 收据4. JWSUtil 解码验证5. 发送收据到服务端验签验证签名 解析 payload返回激活结果提示会员已激活商品配置ProductInfo 完整定义商品信息通过iap.ProductInfo对象定义在查询商品时由系统返回import{iap}fromkit.IAPKit;// 查询商品信息asyncfunctionqueryProducts():Promiseiap.ProductInfo[]{constproductIds[moneytrack_monthly,moneytrack_yearly];constresultawaitiap.queryProductInfo({productIds:productIds,type:iap.ProductType.AUTORENEWABLE});returnresult.productInfoList;}// ProductInfo 包含以下完整字段interfaceProductInfo{productId:string;// 商品唯一 ID在 AGC 控制台配置type:iap.ProductType;// 商品类型title:string;// 商品名称本地化description:string;// 商品描述price:string;// 显示价格如 ¥12.00microPrice:number;// 微单位价格如 1200单位分currency:string;// 货币代码如 CNYstatus:number;// 商品状态0正常1下架subscriptionPeriod:string;// 订阅周期如 P1M 表示每月freeTrialPeriod:string;// 免费试用期如 P7D 表示 7 天}订阅状态管理会员订阅不是一次性操作需要持续管理会员状态、检测过期、处理续费import{iap}fromkit.IAPKit;exportclassMembershipManager{// 检测当前会员状态staticasynccheckMembershipStatus():PromiseMembershipStatus{try{constreceiptsawaitiap.getPurchaseRecords({type:iap.ProductType.AUTORENEWABLE});if(receipts.length0){return{isActive:false,level:none,expireDate:null};}// 取最新的收据constlatestReceiptreceipts[0];constdecodedJWSUtil.decode(latestReceipt.receipt);constpayloaddecoded.payload;constexpireDatenewDate(payload.expirationDate);constnownewDate();return{isActive:expireDatenow,level:this.getProductLevel(payload.productId),expireDate:expireDate,autoRenew:payload.autoRenewStatus1,daysRemaining:Math.ceil((expireDate.getTime()-now.getTime())/86400000)};}catch(error){console.error(Check membership failed:,error);return{isActive:false,level:none,expireDate:null};}}// 处理续费提醒staticasynchandleRenewReminder(){conststatusawaitthis.checkMembershipStatus();if(status.isActivestatus.daysRemaining7status.daysRemaining0){// 会员即将过期推送续费提醒this.showRenewPrompt(status.daysRemaining);}elseif(!status.isActivestatus.level!none){// 会员已过期引导重新订阅this.showExpiredPrompt();}}// 恢复购买跨设备同步staticasyncrestorePurchases(){constreceiptsawaitiap.getPurchaseRecords({type:iap.ProductType.AUTORENEWABLE});// 将收据列表发送到服务端验证并激活for(constreceiptofreceipts){awaitthis.verifyOnServer(receipt.receipt);}}}支付安全JWS 解码验签与服务端验证支付安全是应用内购买的核心。IAP Kit 返回的收据采用 JWSJSON Web Signature格式需要在服务端完成签名验证后才能激活会员权益// 客户端解析 JWS 收据exportclassJWSUtil{// JWS 格式为header.payload.signaturestaticdecode(jwsString:string):DecodedJWS{constpartsjwsString.split(.);if(parts.length!3){thrownewError(Invalid JWS format);}return{header:JSON.parse(this.base64UrlDecode(parts[0])),payload:JSON.parse(this.base64UrlDecode(parts[1])),signature:parts[2],// 客户端仅解析验证由服务端完成verify():boolean{returnfalse;// 客户端不做签名验证}};}privatestaticbase64UrlDecode(str:string):string{// Base64 URL 解码实现constbase64str.replace(/-/g,).replace(/_/g,/);returndecodeURIComponent(Array.from(atob(base64),c%(00c.charCodeAt(0).toString(16)).slice(-2)).join());}}// 服务端验证逻辑Node.js 示例/* async function verifyReceipt(receipt: string) { // 1. 获取 IAP Kit 公钥从华为 IAP 服务端获取 const publicKey await getIAPPublicKey(); // 2. 使用 JWS 库验证签名 const jws jose.generalVerify(receipt, publicKey); // 3. 验证 payload 中的关键字段 const payload jws.payload; if (payload.productId ! expectedProductId) throw new Error(Product mismatch); if (payload.purchaseTime 3600000 Date.now()) throw new Error(Receipt expired); // 4. 检查 purchaseToken 是否已被使用防止重放攻击 if (await isTokenUsed(payload.purchaseToken)) throw new Error(Token already used); // 5. 标记 token 已使用并激活会员 await markTokenUsed(payload.purchaseToken); await activateMembership(payload); } */安全要点说明客户端可以解析 JWS 查看收据内容但绝不能仅凭客户端解析结果就激活会员。签名验证必须在自有服务端完成以防止伪造收据。服务端还需校验purchaseToken的唯一性防止重放攻击。最佳实践服务端强制验签所有会员激活逻辑必须在服务端完成客户端仅做展示和收据透传。支持恢复购买提供恢复购买按钮通过getPurchaseRecords获取历史收据确保用户在不同设备间已购权益同步。处理收据重复回调purchase操作可能因网络原因收到重复回调需通过purchaseToken去重。订阅状态本地缓存定期检测会员状态并缓存到本地避免每次打开应用都调用网络接口。提前 7 天续费提醒在会员到期前 7 天开始提示续费降低流失率。测试商品与正式商品隔离开发阶段使用 AGC 控制台配置的测试商品价格为零上架前切换为正式商品。项目代码案例文件路径feature_membership/ProductInfo.etsimport{iap}fromkit.IAPKit;exportconstPRODUCTS:iap.ProductInfo[][{productId:moneytrack_monthly,type:iap.ProductType.AUTORENEWABLE,title:月度会员,description:解锁所有高级功能按月订阅,price:¥12.00,microPrice:1200,currency:CNY,status:0,subscriptionPeriod:P1M,freeTrialPeriod:P7D},{productId:moneytrack_yearly,type:iap.ProductType.AUTORENEWABLE,title:年度会员,description:解锁所有高级功能按年订阅享优惠,price:¥98.00,microPrice:9800,currency:CNY,status:0,subscriptionPeriod:P1Y,freeTrialPeriod:P7D}];文件路径feature_membership/MemberSubscriptionPage.etsimport{iap}fromkit.IAPKit;asyncfunctionstartPurchase(productId:string){try{// 1. 创建订单constpurchaseResultawaitiap.createPurchase({productId});// 2. 拉起收银台awaitiap.purchase(purchaseResult);// 3. 获取 JWS 收据constjwsReceiptpurchaseResult.inAppPurchaseResponse.receipt;// 4. 客户端解码查看constdecodedJWSUtil.decode(jwsReceipt);console.info(Purchase payload:,decoded.payload);// 5. 发送到服务端验证constverifiedawaitverifyOnServer(jwsReceipt);if(verified){awaitactivateLocalMembership(decoded.payload);showSuccessPrompt();}}catch(error){console.error(Purchase failed:,error);showErrorPrompt(error.message);}}推荐参考文档IAP Kit 应用内支付指南IAP Kit 服务端验签指南JWS 解码与验签规范

相关新闻

基于TI TDAx DSP的ADAS环视系统:从鱼眼畸变校正到3D视图的工程实现

基于TI TDAx DSP的ADAS环视系统:从鱼眼畸变校正到3D视图的工程实现

1. 项目概述:从鱼眼畸变到上帝视角的工程实现在汽车智能化浪潮中,泊车一直是让新手司机头疼、老司机也难免失手的场景。传统的倒车影像只能看到车尾一隅,车身两侧和车头的盲区依然存在。高级驾驶辅助系统(ADAS)中的环视…

2026/8/3 2:39:32 阅读更多 →
AIGC应用Prompt Injection防护:多层防御框架与实战方案

AIGC应用Prompt Injection防护:多层防御框架与实战方案

你的 AIGC 应用即将上线,但有没有想过:用户输入的一段看似普通的文本,可能让整个系统"叛变"?这不是危言耸听。最近一项研究显示,未经防护的 RAG 系统在面对 Prompt Injection 攻击时,平均攻击成功…

2026/8/2 6:05:22 阅读更多 →
XMove Studio体感管理系统架构与插件化开发实践

XMove Studio体感管理系统架构与插件化开发实践

1. XMove Studio管理系统概述 XMOVE体感方案作为一套完整的动作捕捉与交互系统,其PC端管理中枢XMove Studio基于XFrmWork框架构建,实现了对分布式体感节点的集中管控。这套系统最显著的特点是采用了"通信-节点-应用"三级架构设计,将…

2026/7/30 16:54:23 阅读更多 →

最新新闻

OpenClaw生产级K8s部署实战:从架构设计到安全运维全解析

OpenClaw生产级K8s部署实战:从架构设计到安全运维全解析

1. 项目概述与核心价值最近在团队里折腾一个叫 OpenClaw 的开源项目,目标是把它从一个“能跑起来”的 Demo 状态,升级成一个能在真实生产环境里扛得住、管得好、还足够安全的服务。这项目本身挺有意思,但直接扔服务器上跑,总感觉心…

2026/8/4 7:40:07 阅读更多 →
5步深度诊断与修复:Reset Windows Update Tool专业指南

5步深度诊断与修复:Reset Windows Update Tool专业指南

5步深度诊断与修复:Reset Windows Update Tool专业指南 【免费下载链接】Reset-Windows-Update-Tool Troubleshooting Tool with Windows Updates (Developed in Dev-C). 项目地址: https://gitcode.com/gh_mirrors/re/Reset-Windows-Update-Tool Windows更新…

2026/8/4 7:40:07 阅读更多 →
5个关键步骤:电脑完美运行Switch游戏终极指南

5个关键步骤:电脑完美运行Switch游戏终极指南

5个关键步骤:电脑完美运行Switch游戏终极指南 【免费下载链接】yuzu 任天堂 Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu 想要在电脑上体验任天堂Switch游戏的魅力吗?yuzu模拟器为你打开了这扇大门。作为当前最受欢迎的…

2026/8/4 7:40:07 阅读更多 →
LVGL动态加载中文字体:FreeType引擎集成与嵌入式GUI优化实践

LVGL动态加载中文字体:FreeType引擎集成与嵌入式GUI优化实践

1. 项目缘起:为什么要在LVGL中动态加载中文字体?在嵌入式GUI开发中,尤其是使用LVGL这类轻量级图形库时,中文字体的支持一直是个老大难问题。很多开发者,包括我自己,都经历过这样的阶段:为了显示…

2026/8/4 7:40:07 阅读更多 →
NVIDIA Profile Inspector终极深度探索:解锁显卡隐藏性能的完整指南

NVIDIA Profile Inspector终极深度探索:解锁显卡隐藏性能的完整指南

NVIDIA Profile Inspector终极深度探索:解锁显卡隐藏性能的完整指南 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 你是否曾想过,你的NVIDIA显卡其实还有大量未开发的性能潜力&…

2026/8/4 7:40:07 阅读更多 →
深入理解JVM:从内存模型到垃圾回收的实战调优指南

深入理解JVM:从内存模型到垃圾回收的实战调优指南

1. 项目概述:为什么我们需要深入理解JVM?如果你是一名Java开发者,无论你是刚入行还是已经写了几年CRUD,迟早有一天你会被问到JVM相关的问题。这可能是面试官抛出的“说说JVM内存模型”,也可能是线上服务突然OOM&#x…

2026/8/4 7:39:07 阅读更多 →

日新闻

AI Agent白手起家26: 使用标准事件驱动大模型实践

AI Agent白手起家26: 使用标准事件驱动大模型实践

纲要 练习目标:掌握大模型标准事件的调用回顾 LangChain 中的核心标准事件 invokestreambatchastream_eventswith_structured_output 环境准备实战代码:多种事件调用对比 同步调用与流式输出批量处理异步事件流监听结构化输出 运行说明与预期结果总结与扩…

2026/8/4 0:00:40 阅读更多 →
dealsea是什么?跨境卖家必知的美国deal站入门指南

dealsea是什么?跨境卖家必知的美国deal站入门指南

说实话,第一次听说美国这个老牌折扣网站的跨境卖家,十个有八个会问同一个问题:这个平台到底是干嘛的?我见过一个做家居出口的朋友,他在亚马逊上月销二十万美金,却从来没用过它。我给他看了首页——一屏一屏…

2026/8/4 0:01:40 阅读更多 →
清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

通讯作者:邓兵、刘建国通讯单位:清华大学DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清洁能源技术与电子器件不可或缺的核心原料,然而传统提取方式依赖能耗高、排放大的采矿与强…

2026/8/4 0:01:40 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/3 4:58:13 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/3 1:53:31 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/4 5:26:40 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/3 13:07:03 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/3 5:19:38 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/3 8:27:36 阅读更多 →