Swift3 苹果内购
2017-10-14 本文已影响14人
z小志
1、引入头文件
import StoreKit
2、在viewDidLoad添加
SKPaymentQueue.default().add(self)
//添加代理
SKPaymentTransactionObserver,SKProductsRequestDelegate
2、支付
if (SKPaymentQueue.canMakePayments()) {
self.getProductInfo(payID: "苹果内购商品ID")
}else{
MDHubHelper.share.showError(msg: NSLocalizedString(str: "无法购买"))
}
func getProductInfo(payID:String) {
SKPaymentQueue.default().add(self)
let array = NSArray.init(object: payID)
let request = SKProductsRequest.init(productIdentifiers: NSSet(array: array as! [Any]) as! Set<String>)
request.delegate = self
request.start()
}
func paymentQueue(_ queue: SKPaymentQueue, updatedDownloads downloads: [SKDownload]) {
}
func paymentQueue(_ queue: SKPaymentQueue, removedTransactions transactions: [SKPaymentTransaction]) {
}
func paymentQueue(_ queue: SKPaymentQueue, restoreCompletedTransactionsFailedWithError error: Error) {
}
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
switch transaction.transactionState {
case .purchased:
self.completeTransaction(transaction: transaction)
//请求服务端
case .purchasing:
MDHubHelper.share.showStatus(msg:NSLocalizedString(str: "正在支付"))
//正在交易
case .failed:
MDHubHelper.share.showError(msg: NSLocalizedString(str: "支付失败"))
self.failedTransaction(transaction: transaction)
case .restored:
MDHubHelper.share.showError(msg: NSLocalizedString(str: "已购买该商品"))
self.restoreTransaction(transaction: transaction)
default:
self.failedTransaction(transaction: transaction)
break
}
}
}
func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
let myProduct = response.products
if (myProduct.count == 0) {
MDHubHelper.share.showError(msg: NSLocalizedString(str: "无内购信息"))
return
}
lPayment = SKPayment.init(product: myProduct[0])
SKPaymentQueue.default().add(lPayment)
}
//自定义函数
func completeTransaction(transaction:SKPaymentTransaction) {
let recvURL = Bundle.main.appStoreReceiptURL
let receiptData = NSData(contentsOf: recvURL!)
let encodeStr = receiptData?.base64EncodedString(options: .endLineWithLineFeed)
MDNetRequest.share.notifyApplePaySuccess(url: UrlApplePay, params: ["order_id":self.orderId!,"receipt":encodeStr!,"transactionId":transaction.transactionIdentifier!,"session_id":MDDataSource.share.session!], successBlock: {
MDHubHelper.share.hidHubView()
MDHubHelper.share.showError(msg: NSLocalizedString(str:"购买成功"))
}, failBlock: {
MDHubHelper.share.hidHubView()
MDHubHelper.share.showError(msg: NSLocalizedString(str: "通知服务器失败"))
}) { (err) in
MDHubHelper.share.showError(msg: NSLocalizedString(str: "请求服务器错误"))
}
SKPaymentQueue.default().finishTransaction(transaction)
}
func failedTransaction(transaction:SKPaymentTransaction) {
SKPaymentQueue.default().finishTransaction(transaction)
}
func restoreTransaction(transaction:SKPaymentTransaction) {
SKPaymentQueue.default().finishTransaction(transaction)
}