内购
import UIKit
import StoreKit
class ViewController: UITableViewController {
var products:[SKProduct] = [SKProduct]() {
didSet {
tableView
}
}
override func viewDidLoad() {
super.viewDidLoad()
let iapIds:Set<String> = ["tx_25k","tx_56k","tx_160k","tx_350k","tx_790k","tx_2600k","tx_4200k","tx_6000k","tx_removeAd"]
let request: SKProductsRequest = SKProductsRequest(productIdentifiers: iapIdspng)
request.delegate = self
request.start()
}
deinit {
SKPaymentQueue.default().remove(self)
}
@IBAction func restore(_ sender: Any) {
SKPaymentQueue.default().restoreCompletedTransactions()
SKPaymentQueue.default().add(self)
}
}
extension ViewController: SKProductsRequestDelegate {
func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
print(response.products)
print(response.invalidProductIdentifiers)
products = response.products
}
}
extension ViewController {
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return products.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell")
cell?.textLabel?.text = products[indexPath.row].localizedTitle
cell?.detailTextLabel?.text = "¥" + String(describing: products[indexPath.row].price) + "元"
return cell!
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let product = products[indexPath.row]
guard SKPaymentQueue.canMakePayments() else {
return
}
let payment = SKPayment(product: product)
SKPaymentQueue.default().add(payment)
SKPaymentQueue.default().add(self)
}
}
extension ViewController: SKPaymentTransactionObserver {
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
switch transaction.transactionState {
case .deferred:
print("延时处理")
case .failed:
print("支付失败")
case .purchased:
print("支付成功")
case .purchasing:
print("正在支付")
case .restored:
print("已恢复购买")
}
}
}
}
class IAPTestViewController: UIViewController ,SKProductsRequestDelegate, SKPaymentTransactionObserver{
let VERIFY_RECEIPT_URL = "https://buy.itunes.apple.com/verifyReceipt"
let ITMS_SANDBOX_VERIFY_RECEIPT_URL = "https://sandbox.itunes.apple.com/verifyReceipt"
var productDict:NSMutableDictionary!
override func viewDidLoad() {
super.viewDidLoad()
SKPaymentQueue.defaultQueue().addTransactionObserver(self)
requestProducts()
}
deinit{
SKPaymentQueue.defaultQueue().removeTransactionObserver(self)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func onSelectRechargePackages(productId: String){
if(SKPaymentQueue.canMakePayments()){
buyProduct(productDict[productId] as! SKProduct)
}
else{
println("============不支持内购功能")
}
}
func requestProducts(){
var set = NSSet(array: ["你的产品id1","产品id2"。。。。更多])
let request = SKProductsRequest(productIdentifiers: set as Set<NSObject>)
request.delegate = self;
request.start()
}
func productsRequest(request: SKProductsRequest!, didReceiveResponse response: SKProductsResponse!) {
if (productDict == nil) {
productDict = NSMutableDictionary(capacity: response.products.count)
}
for product in response.products as! [SKProduct] {
println("=======Product id=======\(product.productIdentifier)")
println("===产品标题 ==========\(product.localizedTitle)")
println("====产品描述信息==========\(product.localizedDescription)")
println("=====价格: =========\(product.price)")
productDict.setObject(product, forKey: product.productIdentifier)
}
}
func buyProduct(product: SKProduct){
var payment = SKPayment(product: product)
SKPaymentQueue.defaultQueue().addPayment(payment)
}
func paymentQueue(queue: SKPaymentQueue!, updatedTransactions transactions: [AnyObject]!){
for transaction in transactions {
if (SKPaymentTransactionState.Purchased == transaction.transactionState) {
println("支付成了==================")
self.verifyPruchase()
SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)
}
else if(SKPaymentTransactionState.Failed == transaction.transactionState){
println("支付失败==================")
SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)
}
else if (SKPaymentTransactionState.Restored == transaction.transactionState) {
SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)
}
}
}
func verifyPruchase(){
let receiptURL = NSBundle.mainBundle().appStoreReceiptURL
let receiptData = NSData(contentsOfURL: receiptURL!)
let url = NSURL(string: ITMS_SANDBOX_VERIFY_RECEIPT_URL)
let request = NSMutableURLRequest(URL: url!, cachePolicy: NSURLRequestCachePolicy.UseProtocolCachePolicy, timeoutInterval: 10.0)
request.HTTPMethod = "POST"
let encodeStr = receiptData?.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.EncodingEndLineWithLineFeed)
let payload = NSString(string: "{\"receipt-data\" : \"" + encodeStr! + "\"}")
println(payload)
let payloadData = payload.dataUsingEncoding(NSUTF8StringEncoding)
request.HTTPBody = payloadData;
let result = NSURLConnection.sendSynchronousRequest(request, returningResponse: nil, error: nil)
if (result == nil) {
println("验证失败")
return
}
var dict: AnyObject? = NSJSONSerialization.JSONObjectWithData(result!, options: NSJSONReadingOptions.AllowFragments, error: nil)
if (dict != nil) {
println(dict)
}
}
func restorePurchase(){
SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
}
}