一.创建支付类

1.创建一个类继承NSObject为内购付款类

import UIKit
class AppPayManager: NSObject {}

2.类内引入头文件

import StoreKit

3.实现单利,方便支付结果的回调

let payManager = AppPayManager()class var shareInstance : AppPayManager {return payManager
}

二.发起购买请求

1.发起购买请求前的准备工作声明商品id String类型,声明回调闭包,以及支付结果状态码后面会用到

var proId:String!
//21008表示生产换使用  21007表示测试环境使用
var state = 21008
var resultBlock:(_ result:String)->Void = { (_ result:String)->Void in}

2.声明并实现发起购买请求的方法,并在方法中添加购买结果的监听。

增加监听的协议

class AppPayManager: NSObject ,SKPaymentTransactionObserver{

实现发起购买请求,参数一商品id,参数2回调逃逸闭包(商品id,也就是在开发者网站添加商品的id,在这里可以先提供一个com.saixin.eduline6)

//MARK:发起购买请求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()}

3.发起请求后里面设置了一个SKProductsRequst的代理,所以需要遵循协议并实现协议方法

增加一个SKProductsRequst协议


class AppPayManager: NSObject ,SKProductsRequestDelegate,SKPaymentTransactionObserver{

实现协议方法

//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)}

三.获取购买结果

实现SKPaymentTransactionObserver的协议方法监听购买结果

//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)}

五.校验支付凭证完成支付

方式一.客户端校验支付凭证

首先验证正式环境,如果返回结果为21007则表示为沙盒环境,再去校验沙盒环境,当status为0时则表示校验成功

//沙盒验证地址
let url_receipt_sandbox = "https://sandbox.itunes.apple.com/verifyReceipt"
//生产环境验证地址
let url_receipt_itunes = "https://buy.itunes.apple.com/verifyReceipt"
//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()}

方式二.服务器端校验

一般来讲是将获取到的支付凭证转化为base64编码格式传递后台便可以,和普通接口没有区别。

六.漏单处理

一般是客户已经完成支付,但尚未来得及校验支付凭证便退出了APP。一般我们可以在用户完成支付的同时存储支付凭证到本地,校验完支付凭证之后将数据清除。每次启动应用如果支付凭证还在则表示有漏单情况,直接发起校验请求便可。

七.内购工具类连接

https://download.csdn.net/download/weixin_39339407/14240375

八.开放者账号内购配置连接

https://blog.csdn.net/weixin_39339407/article/details/112671902

iOS内购(代码部分,swift)相关推荐

  1. iOS内购代码(苹果支付ApplePay)

    转载注明出处:https://www.jianshu.com/p/8c958e75f98f 刚刚做了内购, 记录一下 这里直接上代码, 至于写代码之前的一些设置工作参考以下文章: http://www ...

  2. Unity iOS内购

    前言:最近项目需要切换到iOS平台做一些提交审核和支付对接相关的工作,上一篇刚分享了最新的iOS10提交审核的一些坑,这篇分享一些内购相关的流程. Unity iOS内购 思路: Unity调用iOS ...

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

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

  4. iOS内购-防越狱破解刷单

    ---------------------------2018.10.16更新--------------------------- 最近我们公司丢单率上涨,尤其是10月份比9月份来说丢单率翻了3倍, ...

  5. IOS内购验证 (Java版)

    此处给各位贴出apple官方文档 App 内购买项目配置流程 apple 收据文档 apple 收据responseBody字段释义 IOS内购逻辑图 IOS内购验证相关代码 package xxxx ...

  6. iOS内购项目的接入与审核问题

    一.内购项目的创建 游戏内购项目就跟商品一样,需要在appstoreconnect后台对应用下创建APP内购买项目 app内购项目分为四种 消耗型项目–这类内购项目是指游戏内一次性购买的道具,元宝等 ...

  7. iOS 内购的最新讲解

    来源:简书 - IIronMan 链接:http://www.jianshu.com/p/4f8a854ff427(点击尾部阅读原文前往) 一.总说内购的内容 1.协议.税务和银行业务 信息填写 2. ...

  8. ios内购二次验证安全性问题_苹果IOS内购二次验证返回state为21002的坑

    项目是三四年前的老项目,之前有IOS内购二次验证的接口,貌似很久都没用了,然而最近IOS的妹子说接口用不了,让我看看啥问题.接口流程时很简单的,就是前端IOS在购买成功之后,接收到receipt后进行 ...

  9. IOS内购SDK和U7SDK接入文档

    IOS内购SDK和U7SDK接入文档 一.IOS内购SDK接入 1.前置操作需要有IOS开发者账号,然后: 2.代码逻辑 (1)C#调用Objective-c的写法 首先在C#中给需要再C++中调用的 ...

  10. iOS 内购(In-App Purchase)详解

    iOS 内购(In-App Purchase)详解 概述 IAP 全称:In-App Purchase,是指苹果 App Store 的应用内购买,是苹果为 App 内购买虚拟商品或服务提供的一套交易 ...

最新文章

  1. 防火墙iptables之常用脚本
  2. 同一数据库如果处理多个完全不同的业务?
  3. carsim学习笔记5——carsim与simulink联合仿真
  4. CAN总线技术 | 物理层01 - CAN信号电平
  5. 超过千字的文章,才统计勤写标兵
  6. JVM优化之压缩普通对象指针(CompressedOops)与压缩类指针(CompressedClassPointers)
  7. [Github实战]双重认证2FA 如何 设置/更改[手把手][2022]
  8. console用法java_Java Console printf(String, Object)用法及代码示例
  9. 读书印记 - 《反脆弱》
  10. MAC系统IDEA快捷键大全
  11. 解决MAC系统字体模糊发虚,并更换默认中文字体为微软雅黑
  12. win7无线手柄测试软件,win7系统设置和调试游戏手柄的方法
  13. java word 2003_[Java教程]POI 读取word (word 2003 和 word 2007)(转)
  14. 用js写一个身份证号码籍贯
  15. 如何远程访问公司的电脑?
  16. 弱函数(weak)使用
  17. c语言实现爬虫功能,用C/C 扩展Python语言_python 调用c语言 python实现简单爬虫功能_python实现简单爬虫...
  18. 港科夜闻|香港科大教授冯雁等10人入选2022 AAAI Fellow榜单
  19. RX 7900XT和RTX 4080哪个好 RX 7900XT和RTX 4080差距
  20. 纯CSS3制作卡通场景汽车动画效果

热门文章

  1. MySQL 游标(CURSOR)
  2. 解读Depth Map Prediction from a Single Image using a Multi-Scale Deep Network (3)
  3. Linux系统与服务构建(一)
  4. python tts库_python 使用百度tts 库合成语音
  5. java图书管理系统课程设计_JAVA课程设计图书管理系统课程设计.doc
  6. NSString 与 Unicode
  7. HTB-oscplike-Bounty+Jerry+Conceal
  8. android tv 蓝牙服务_5款面向Android TV的优秀文件管理器
  9. 象棋正确的学习步骤是什么?入门和提高方法全都教给你!
  10. 最新云EC在线商城系统网站源码V1.3版 开源版