App Inventor 2 应用内支付IAP教程

覆盖:Google Play支付、应用内购买、虚拟货币、订阅

一、IAP基础

1.1 支付类型

类型说明示例
消耗型一次购买,可重复购买虚拟货币、金币
非消耗型一次购买,永久拥有去广告、付费功能
订阅定期扣费VIP会员、月卡

1.2 接入流程

  1. 在Google Play Console创建应用
  2. 添加商品(内购项目)
  3. 配置License测试
  4. 接入SDK

二、初始化支付

2.1 初始化

当 Screen1.初始化 时
  调用 应用内购买1.初始化()

2.2 查询商品

定义 查询商品列表()
  调用 应用内购买1.查询商品(
    创建列表("coin_100", "coin_500", "vip_month")
  )

当 应用内购买1.查询完成 时(商品列表)
  设置 全局变量 可购商品 = 商品列表
  
  // 显示商品
  对于 每个 商品 在 商品列表 中
    初始化局部变量 ID = 获取键的值(商品, "productId", "")
    初始化局部变量 价格 = 获取键的值(商品, "price", "")
    初始化局部变量 描述 = 获取键的值(商品, "description", "")
    // 添加到界面
    追加列表项(全局变量 商品展示列表, ID + " - " + 价格)

三、购买商品

3.1 发起购买

当 按钮_购买100金币.被点击 时
  调用 应用内购买1.购买("coin_100")

当 应用内购买1.购买成功 时(商品ID, 交易ID)
  // 发放商品
  如果 商品ID = "coin_100" 则
    设置 全局变量 金币数 = 全局变量 金币数 + 100
    调用 TinyDB1.存储值("coins", 全局变量 金币数)
    调用 对话框1.显示消息对话框("购买成功!金币+100", "提示", "确定")

当 应用内购买1.购买失败 时(商品ID, 错误信息)
  调用 对话框1.显示消息对话框("购买失败: " + 错误信息, "错误", "确定")

四、消耗型商品

4.1 虚拟货币

定义 购买金币(商品ID, 数量)
  调用 应用内购买1.购买(商品ID)

当 应用内购买1.购买成功 时(商品ID, 交易ID)
  初始化局部变量 获得数量 = 0
  
  如果 商品ID = "coin_100" 则
    设置 获得数量 = 100
  否则如果 商品ID = "coin_500" 则
    设置 获得数量 = 550    // 首充奖励
  否则如果 商品ID = "coin_1000" 则
    设置 获得数量 = 1200
  
  // 更新本地数据
  设置 全局变量 金币数 = 全局变量 金币数 + 获得数量
  调用 TinyDB1.存储值("coins", 全局变量 金币数)
  调用 TinyDB1.存储值("交易ID_" + 商品ID, 交易ID)
  
  // 消耗商品(告知Google已发货)
  调用 应用内购买1.消耗商品(交易ID)

当 应用内购买1.消耗成功 时
  调用 对话框1.显示消息对话框("金币到账: " + 获得数量, "提示", "确定")

五、非消耗型商品

5.1 去广告

当 应用内购买1.购买成功 时(商品ID, 交易ID)
  如果 商品ID = "remove_ad" 则
    // 标记已购买
    调用 TinyDB1.存储值("已购买去广告", 真)
    设置 全局变量 已购去广告 = 真
    调用 对话框1.显示消息对话框("感谢支持,广告已移除!", "提示", "确定")

5.2 检查购买状态

定义 检查已购商品()
  调用 应用内购买1.查询已购()

当 应用内购买1.查询已购完成 时(已购列表)
  对于 每个 已购商品 在 已购列表 中
    初始化局部变量 商品ID = 获取键的值(已购商品, "productId", "")
    
    如果 商品ID = "remove_ad" 则
      设置 全局变量 已购去广告 = 真
    否则如果 商品ID = "vip_month" 或 商品ID = "vip_year" 则
      设置 全局变量 VIP到期时间 = 获取键的值(已购商品, "expiryTime", 0)

六、订阅

6.1 月卡/季卡

当 应用内购买1.购买成功 时(商品ID, 交易ID)
  初始化局部变量 当前时间 = 获取毫秒数(现在)
  
  如果 商品ID = "vip_month" 则
    // 订阅一个月
    设置 全局变量 VIP到期时间 = 当前时间 + 30 * 24 * 60 * 60 * 1000
  否则如果 商品ID = "vip_year" 则
    // 订阅一年
    设置 全局变量 VIP到期时间 = 当前时间 + 365 * 24 * 60 * 60 * 1000
  
  调用 TinyDB1.存储值("VIP到期时间", 全局变量 VIP到期时间)
  调用 对话框1.显示消息对话框("VIP开通成功!", "提示", "确定")

6.2 验证订阅状态

定义 检查VIP状态()
  初始化局部变量 到期时间 = 获取键的值(调用 TinyDB1.获取值("VIP到期时间", 0), "time", 0)
  
  如果 到期时间 = 0 则
    设置 标签_VIP状态.文本 = "VIP: 否"
  否则如果 到期时间 > 获取毫秒数(现在) 则
    设置 标签_VIP状态.文本 = "VIP: 是"
  否则
    设置 标签_VIP状态.文本 = "VIP: 已过期"
    设置 全局变量 VIP到期时间 = 0

七、支付安全

7.1 服务端验证

实际生产环境应在服务端验证购买
定义 服务端验证购买(商品ID, 交易Token)
  设置 Web客户端1.URL = "https://your-server.com/verify-purchase"
  调用 Web客户端1.发送POST文本(
    "product_id=" + 商品ID + "&token=" + 交易Token
  )

当 Web客户端1.获得文本 时(URL, 响应码, 响应类型, 响应内容)
  初始化局部变量 结果 = 调用 字典.JSON转字典(响应内容)
  
  如果 获取键的值(结果, "valid", 假) = 假 则
    // 验证失败,不发放商品
    调用 对话框1.显示消息对话框("验证失败", "错误", "确定")

八、常见问题

Q1:支付返回错误码?

常见错误:商品未发布、签名错误、应用未发布

Q2:无法测试支付?

需要添加测试账号到License测试

Q3:如何查看收入?

在Google Play Console财务报告中查看
文档版本:2026.03 | 作者:App Inventor 2 中文网 www.fun123.cn

参考资料与版权声明

原文来源

版权声明

本文档基于 MIT App Inventor 官方文档及社区资源整理,版权归原作者所有:
  • MIT App Inventor 官方文档采用 CC BY-SA 4.0 授权
  • MIT App Inventor Community 帖子版权归原作者所有
本文档由 ai2claw 🐝 整理,仅供学习参考,如有侵权请联系删除。