//
//  AppPayManager.swift
//  testInpuarse
//
//  Created by n 2022/3/21.
//import UIKit
import StoreKitclass AppPayManager: NSObject {var proId:String!//沙盒验证地址let url_receipt_sandbox = "https://sandbox.itunes.apple.com/verifyReceipt"//生产环境验证地址let url_receipt_itunes = "https://buy.itunes.apple.com/verifyReceipt"//21008表示生产换使用  21007表示测试环境使用var state = 21008let verify_type = 0var resultBlock:(_ result:String)->Void = { (_ result:String)->Void in}static var shared: AppPayManager = AppPayManager()private override init() {}override class func copy() -> Any {return self}}extension AppPayManager: SKPaymentTransactionObserver {//MARK:发起购买请求 实现发起购买请求,参数一商品id,参数2回调逃逸闭包(商品id,也就是在开发者网站添加商品的id,在这里可以先提供一个com.saixin.eduline6)func startPay(proId:String,resultBlock:@escaping ((_ result:String)->Void))  {self.resultBlock = resultBlockif !SKPaymentQueue.canMakePayments() {print("不可使用苹果支付")return}//监听购买结果SKPaymentQueue.default().add(self)self.proId = proIdlet set = Set.init([proId])let requst = SKProductsRequest.init(productIdentifiers: set)requst.delegate = selfrequst.start()}}extension AppPayManager: SKProductsRequestDelegate {//MARK:发起购买请求回调代理方法func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {let productArray = response.productsif productArray.count == 0 {print("此商品id没有对应的商品")return}var product:SKProduct!for pro in productArray {if pro.productIdentifier == proId {product = probreak}}print(product.description)print(product.localizedTitle)print(product.localizedDescription)print(product.price)print(product.productIdentifier)let payment = SKMutablePayment.init(product: product)payment.quantity = 1SKPaymentQueue.default().add(payment)}//MARK:购买结果 监听回调func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {for tran in transactions {switch tran.transactionState {case .purchased://购买完成SKPaymentQueue.default().finishTransaction(tran)completePay(transaction: tran)breakcase.purchasing://商品添加进列表breakcase.restored://已经购买过该商品SKPaymentQueue.default().finishTransaction(tran)breakcase.failed://购买失败SKPaymentQueue.default().finishTransaction(tran)breakdefault:break}}}//MARK:购买成功验证凭证func completePay(transaction:SKPaymentTransaction) {//获取交易凭证let recepitUrl = Bundle.main.appStoreReceiptURLlet data = try! Data.init(contentsOf: recepitUrl!)if recepitUrl == nil {self.resultBlock("交易凭证为空")print("交易凭证为空")return}if verify_type == 0 {//客户端验证verify(data: data,transaction: transaction)}else{//服务器端校验}//注销交易SKPaymentQueue.default().finishTransaction(transaction)}//MARK:客户端验证func verify(data:Data,transaction:SKPaymentTransaction)  {let base64Str = data.base64EncodedString(options: .endLineWithLineFeed)let params = NSMutableDictionary()params["receipt-data"] = base64Strlet body = try! JSONSerialization.data(withJSONObject: params, options: .prettyPrinted)var request = URLRequest.init(url: URL.init(string: state == 21008 ? url_receipt_itunes : url_receipt_sandbox)!, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 20)request.httpMethod = "POST"request.httpBody = bodylet session = URLSession.sharedlet task = session.dataTask(with: request) { (data, response, error) inlet dict = try! JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! NSDictionaryprint(dict)SKPaymentQueue.default().finishTransaction(transaction)let status = dict["status"] as! Intswitch(status){case 0:self.resultBlock("购买成功")breakcase 21007:self.state = 21007self.verify(data: data!, transaction: transaction)breakdefault:self.resultBlock("验证失败")break}//移除监听SKPaymentQueue.default().remove(self)}task.resume()}}

iOS项目内购(IAP)纯代码相关推荐

  1. iOS 应用内购(iAP)

    国内银行CNAPS CODE 查询 http://weekend.blog.163.com/blog/static/746895820127961346724/ 在iTunesConnect创建内购商 ...

  2. iOS 内购IAP(In-App Purchases)代码实现(上)

    iOS 内购IAP(In-App Purchases)代码实现(上) iOS 内购,也叫内支付,是在iOS应用内部,向苹果服务器发起购买请求的过程.我们在这边来讲一讲代码的实现过程.还有,在做内购的时 ...

  3. iOS开发支付篇——内购(IAP)详解

    iOS开发支付篇--内购(IAP)详解 苹果客户端购买虚拟商品是需要走内购 先看gif图 具体步骤: 协议.税务和银行业务 信息填写 内购商品的添加 添加沙盒测试账号 内购代码的具体实现 内购的注意事 ...

  4. IOS 内购IAP 自动订阅收据验证文档服务端翻译

    将收据数据发送到App Store: 提交此JSON对象作为HTTP POST请求的有效负载. 中文文档:https://help.apple.com/app-store-connect/#/dev7 ...

  5. iOS应用突然无法从App Store获取到内购(IAP)产品列表的解决

    问题现象 Apple开发中,在应用中嵌入内购(IAP)功能的小伙伴们可能会发现,吃着火锅唱着歌,突然App就无法获取到产品列表了,而且产品请求操作并不会返回任何错误. 此时检查发现,并没有对App的内 ...

  6. iOS应用内付费(IAP)开发步骤列表

    iOS应用内付费(IAP)开发步骤列表 前两天和服务端同事一起,完成了应用内付费(以下简称IAP, In app purchase)的开发工作.步骤繁多,在此把开发步骤列表整理如下.因为只是步骤列表, ...

  7. 苹果内购IAP记录-1

    这段时间做了苹果内购IAP,做一个整理记录,主要是开发层面. 一.前期工作:在开发者账号中添加银行信息同意协议等,添加沙盒账号,添加内购商品 二.项目开发,因为项目需要支持iOS15一下的版本所以使用 ...

  8. iOS苹果内购流程(Apple Pay)

    好文:https://github.com/lintide/ApplePayDemo 苹果内购流程 字数631 阅读133 评论1 喜欢6 1.登录开发者中心[开发者中心链接](https://dev ...

  9. Cocos2d-x使用iOS游戏内付费IAP(C++篇)

    source file url: http://www.tairan.com/archives/5515 Cocos2d-x使用iOS游戏内付费IAP(C++篇) 前期准备 设备与账号 在开始编码之前 ...

  10. uni app ios 苹果内购

    app ios 苹果内购 的步骤 1,准备工作先要uniapp 开发ios 内购需要准备的沙盒 测试账号,在苹果手机登录沙盒账号 也就是把自己的Apple ID退出登录沙盒账号,manifest.js ...

最新文章

  1. vue全家桶+Koa2开发笔记(5)--nuxt
  2. 从未在一起更让人遗憾_擦肩而过的遗憾,远离家乡逆行武汉,盘点《在一起》那些泪目瞬间...
  3. 2.6 multimap
  4. GPL以及Copyleft协议使用率下降明显
  5. 【福利】3980元的web前端视频教程限量领取!!!
  6. 设计模式(结构型模式)——装饰模式(Decorator)
  7. Perl语言及安装运行环境
  8. Java解析魔兽争霸3录像W3G文件(二):压缩数据块解压合并
  9. Openproj 在64位操作系统报错errno=193
  10. 电气CAD批量打印为PDF笔记
  11. 药品计算机数据备份管理制度,药品记录与数据管理规范(征求意见稿)
  12. 开篇一:基于ESP8266的电子墨水屏万年历
  13. linux下ssd4k对齐,linux查看硬盘4K对齐方法
  14. VF2, VF3算法
  15. 与迭代次数有关的一种差值结构
  16. Android Studio Error:前言中不允许有内容
  17. Job for postfix.service failed because the control process exited with error code. See systemctl st
  18. ios全网通插电信卡显示无服务器,iPhone6/6 Plus全网通无法使用电信4G 苹果称将很快解决...
  19. AI驱动制药的一种典范模式
  20. 在程序员行业,找师傅跟找对象差不多,这些点你得注意!

热门文章

  1. 模仿人人网客户端应用源码
  2. java编程对电脑配置_java编程对电脑配置有什么要求?如何选择合适电脑?
  3. JavaSE网络编程练习
  4. 音视频编解码技术(二):AAC 音频编码技术
  5. 计算机网络 第四章网络层笔记
  6. interlib系统服务器,Interlib图书馆集群管理系统.docx
  7. Java素数怎么判断
  8. 《JAVA程序设计教程(第7版)英文版》pdf 附下载链接
  9. 惠普服务器c盘格式化提示win7系统盘,c盘格式化,小编告诉你怎么格式化c盘
  10. Pikachu-暴力破解