ios 苹果支付(IAP)

news/2024/10/15 22:26:36/

一.简介

什么是IAP,即in-app-purchase。(虚拟商品如:课程、视频、音乐等数字产品只能走apple 的内购),苹果要扣除30%的销售额,再扣除一点相关的交易税,用户到手将不到7成。

官方参考文档

内购流程
1.获取内购列表(从App内读取或从自己服务器读取)
2.App Store请求可用的内购列表
3.向用户展示内购列表
4.用户选择了内购列表,再发个购买请求,收到购买完成的回调(购买完成后会把钱打给申请内购的银行卡内)
5.购买流程结束后, 向服务器发起验证凭证以及支付结果的请求
6.自己的服务器将支付结果信息返回给前端并发放虚拟产品
7.服务端的工作比较简单,分4步:
  7.1.接收ios端发过来的购买凭证。
  7.2.判断凭证是否已经存在或验证过,然后存储该凭证。
  7.3.将该凭证发送到苹果的服务器验证,并将验证结果返回给客户端。
7.4.如果需要,修改用户相应的会员权限。
7.5.考虑到网络异常情况,服务器的验证应该是一个可恢复的队列,如果网络失败了,应该进行重试。
简单来说就是将该购买凭证用Base64编码,然后POST给苹果的验证服务器,苹果将验证结果以JSON形式返回。

二、流程

1.登录苹果开发者网站新建一个App应用:
在这里插入图片描述

2.填写协议、税务、银行信息:
在这里插入图片描述

3.创建内购商品:
(1).商品名称根据你的消费道具的实际意义来说明,比如“100颗宝石”,“100金币”等。

(2).产品ID是比较重要的,由项目自定义,只要唯一即可,我一般都是用App的bundleID加一个后缀来表示,这样既跟项目关联又具有唯一性。

(3).价格等级的话“查看价格表”中有对应的说明,可以对照着表中每个国家的货币价格与等级来选择。

在这里插入图片描述

4.添加沙盒测试者
沙盒测试环境下苹果不会抽成,购买成功后直接返回商品。
在这里插入图片描述
appid 需要时从未与apple id 从未关联过的账号
appid 可以是任何有效的邮箱地址

在这里插入图片描述

5.内购代码封装IapManager.swift:

//
//  IapManager.swift
//  tai_chi
//
//  Created by vincent on 2019/10/9.
//  Copyright © 2019 vincent. All rights reserved.
//import Foundation
import StoreKit//内购协议
@objc protocol IapManagerProtocol {//商品请求结果回调func productsResponse(_ response:SKProductsResponse?,error:Error?)//交易成功回调func completedTransaction(_ transaction:SKPaymentTransaction)//交易失败回调@objc optional func transactionFail(transaction:SKPaymentTransaction)}//内购管理
class IapManager : NSObject,SKProductsRequestDelegate,SKPaymentTransactionObserver {private static var instance:IapManager?var delegate:IapManagerProtocol?var requestResponse:SKProductsResponse?var requestErr:Error?override init() {super.init()SKPaymentQueue.default().add(self)}//静态方法static func shared() -> IapManager{if instance == nil {instance = IapManager()}return instance!}//判断app 是否允许apple payfunc canPayments() -> Bool{return SKPaymentQueue.canMakePayments()}//请求商品//productIds        内购商品id 集合func requestProducts(productIds:Set<String>){let request = SKProductsRequest(productIdentifiers: productIds)request.delegate = selfrequest.start()}//购买商品func addPayment(_ payment:SKPayment){SKPaymentQueue.default().add(payment)}//监听商品返回信息,然后使用返回的商品信息发起购买请求func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {print("--------------收到产品反馈消息---------------------")self.requestResponse = response}func request(_ request: SKRequest, didFailWithError error: Error) {print("--------------收到产品反馈错误消息---------------------")print(error)self.requestErr = error}func requestDidFinish(_ request: SKRequest) {print("--------------反馈消息结束---------------------")self.delegate?.productsResponse(self.requestResponse, error: self.requestErr)}//获取内购成功后apple server 返回给客户端的数据func receiptData() -> NSData? {let url = Bundle.main.appStoreReceiptURLvar data:NSData? = nilif url != nil {data = NSData(contentsOf: url!)}return data}//监听购买结果func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {for transaction in transactions{if transaction.transactionState == .purchasing {print("--------------updatedTransactions---------------------purchasing")}else if transaction.transactionState == .purchased {print("--------------updatedTransactions---------------------purchased")SKPaymentQueue.default().finishTransaction(transaction)self.delegate?.completedTransaction(transaction)}else if transaction.transactionState == .failed {print("--------------updatedTransactions---------------------failed")SKPaymentQueue.default().finishTransaction(transaction)self.delegate?.transactionFail?(transaction: transaction)}else if transaction.transactionState == .restored {print("--------------updatedTransactions---------------------restored")SKPaymentQueue.default().finishTransaction(transaction)}else if transaction.transactionState == .deferred {print("--------------updatedTransactions---------------------deferred")}}}deinit {SKPaymentQueue.default().remove(self)}
}

6.交易相关代码:

ViewController

func completedTransaction(_ transaction: SKPaymentTransaction) {let data = IapManager.shared().receiptData()if data != nil {//获取交易成功凭证let base64Str = (data! as NSData).base64EncodedString()//本地记录充值成功 以防后台请求失败时下次进入app 时再网络请求UserDefaults.standard.set(base64Str, forKey: "iap_transaction_key")//网络通知服务器和苹果服务器验证是否交易成功 并给相关账号充值}}

AppDelegate 检测是否有漏单请求,并把漏单通知服务器

 //用户内购成功后需要通知服务器,此过程可能网络请求失败//检测是否有充值还未提交给服务器
if let pams = UserDefaults.standard.dictionary(forKey:"iap_transaction_key" ) {//网络通知服务器}

三.测试:

1.沙盒环境测试appStore内购流程的时候,请使用没越狱的设备。

2.请务必使用真机来测试,一切以真机为准。

3.项目的Bundle identifier需要与您申请AppID时填写的bundleID一致,不然会无法请求到商品信息。

4.退成App Store 账号:

在这里插入图片描述

测试截屏如下:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


http://www.ppmy.cn/news/234122.html

相关文章

java 苹果cms 萌果_苹果cms打包app

苹果cms打包app zxnjfh 苹果cms打包app遵循一屏一概规则如果信息准确且专注&#xff0c;人们就能够更容易地吸收信息&#xff0c;入门屏幕应该分块信息&#xff0c;使用单个屏幕来描述概念&#xff0c;以避免用户使用信息过载&#xff0c;这种做法对于面向功能和以利益为导向的…

JAVA基于JSP的在线人才招聘求职系统【数据库设计、论文、源码、开题报告】

主要使用技术 ServletJSPCSSJSMysql 数据库脚本 /* SQLyog Ultimate v9.30 MySQL - 5.5.40 : Database - jsp_qzzp_sys ********************************************************************* *//*!40101 SET NAMES utf8 */;/*!40101 SET SQL_MODE*/;/*!40014 SET OLD_U…

windows10正版多少钱_惠安正版OA系统好不好用,高性价比无纸化办公系统大概多少钱_泉州登泽...

惠安正版OA系统好不好用,高性价比无纸化办公系统大概多少钱,的“智能型办公自动化系统”将成为未来的发展方向&#xff0c;智能型OA能够提供决策支持知识挖掘商务智能等服务&#xff0c;并且更关注企业的决策效率。阶段2011年后&#xff0c;智能型办公自动化。随着企业组织流程…

计算机组成原理(复试)

​​​​​目录 ​​​ 一&#xff0e;计算机硬件系统组成的基本概念 二&#xff0e;计算机中的信息表示 三&#xff0e;CPU子系统 四&#xff0e;存储子系统 五&#xff0e;I/O子系统及输入输出设备 一&#xff0e;计算机硬件系统组成的基本概念 1.什么是计算机系统&am…

找商网获得找商网商品详情 API 返回值说明

API 名称 APIitem_get - 获得找商网商品详情 请求参数&#xff1a;num_iid237846770 参数说明&#xff1a;num_iid:商品ID API测试工具 点击申请试用 响应参数 Version: Date: 名称类型必须示例值描述num_iidString01999629976商品IDtitleString02019新款女装短袖t恤女夏…

【信管1.5】计算机网络基础(三)网络存储与网络接入

计算机网络基础&#xff08;三&#xff09;网络存储与网络接入 大家不要急&#xff0c;网络这一块是非常重要的内容&#xff0c;所以我们的学习还要继续。在上一篇文章中简单地学习到了 IP 的一些基础知识。其实在网络中最底层也是最核心的东西我们就已经学完了。后面将要学习的…

手机、PDA、车载GPS导航入门手册

第一章 什么是GPS 第二章 GPS系统的特点 第三章 GPS的用途 第四章 GPS的定位原理 第五章 GPS的发展 第六章 GPS系统的组成 第七章 GPS的常用术语 第八章 GPS卫星现代化 第九章 GPS的性能指标 第十章 最常用的GPS接收器及其分类 第十一章 我国的GPS定位技术应用和发展情况 第十二…

苹果证书缴费

对于个人或公司苹果程序开发&#xff0c;要想将开发好的产品发布到APPStore上&#xff0c;则必须要购买苹果开发者账号。但是苹果官网并不支持国内的在线购买或续 费服务&#xff0c;到支付这一步&#xff0c;会告诉我们下载一个苹果官方的支付单&#xff08;PDF格式&#xff0…