OC-开发案例收集

Swift 内购代码

2018-04-25  本文已影响1200人  任兴金

文章中仅有swift4.0 实现内购代码部分,其他设置网上很容易搜到

 var productID:String!  //购买商品的ID,外部传进来
遵守内购协议
class SureVipPayVC: BaseViewController,SKProductsRequestDelegate,SKPaymentTransactionObserver
设置内购代理
override func viewDidLoad() {
        super.viewDidLoad()
        SKPaymentQueue.default().add(self as SKPaymentTransactionObserver)
    }
//验证是否允许应用内支付
func gotoApplePay() {
        if SKPaymentQueue.canMakePayments() {
            HmyqHud.shareInstance().showStatus("")
           self.requestProductID()
        }else{
            AlertManager.alertWith("温馨提示", "请先开启应用内付费购买功能", "确定", nil, { (action) in
            }) { (action) in}
        }
    }
从苹果服务器请求商品
    func requestProductID(){
        let productArr:Array<String> = [productID]
        let sets:Set<String> = NSSet.init(array: productArr) as! Set<String>
        let skRequest:SKProductsRequest = SKProductsRequest.init(productIdentifiers: sets)
        skRequest.delegate = self
        skRequest.start()
    }
商品请求成功的回调
    func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
        let products = response.products
        HmyqHud.shareInstance().dismiss()
        for item:SKProduct in products {
            if item.productIdentifier == self.productID {
                self.buyProduct(item)
            }
        }
    }
    func buyProduct(_ product:SKProduct){
        let skpay:SKPayment = SKPayment.init(product: product)
        SKPaymentQueue.default().add(skpay)
    }
支付状态的回调
    func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
        for transaction:SKPaymentTransaction in transactions {
        
            switch transaction.transactionState {
            case .purchasing:
                HmyqHud.shareInstance().showStatus("正在购买,请稍候...")
            case .purchased:
               HmyqHud.shareInstance().dismiss()
               self.buyAppleProductSuccessWithPaymnetTransaction(transaction)
               queue.finishTransaction(transaction)
            case .failed:
                HmyqHud.shareInstance().dismiss()
                SVProgressHUD.showError(withStatus: "连接服务器失败,请重新支付")
                queue.finishTransaction(transaction)
            case .restored:
                HmyqHud.shareInstance().dismiss()
                queue.finishTransaction(transaction)
            case .deferred:
                HmyqHud.shareInstance().dismiss()
                 SVProgressHUD.showError(withStatus: "延迟支付")
                queue.finishTransaction(transaction)
            }
        }
    }
获取支付成功的凭证
    func buyAppleProductSuccessWithPaymnetTransaction(_ paymentTransaction:SKPaymentTransaction) {
//       let productIdentifier = paymentTransaction.payment.productIdentifier
       let url = Bundle.main.appStoreReceiptURL
        let appstoreRequest = URLRequest.init(url: url!)
        do {
            let reciptaData = try NSURLConnection.sendSynchronousRequest(appstoreRequest, returning: nil)
            let transactionRecipsting:String = reciptaData.base64EncodedString(options: .endLineWithLineFeed)
            self.checkAppstorePayResultWithBase64String(transactionRecipsting)
        } catch let error as NSError {
            print(error)
        }
    }
将凭证传递给后台服务器,由后台服务去和苹果服务器验证是否购买成功
    func checkAppstorePayResultWithBase64String(_ base64String:String){
        var sandBox = 1
        #if DEBUG
            sandBox = 0
        #endif
        #if APPSTORE_ASK_TO_BUY_IN_SANDBOX
            sandBox = 0
        #endif
       let str = base64String.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!
        let dict = ["sandbox":sandBox,"receipt":str] as [String : Any]
        UserInfoManager.setApplePayToken(dict)
        PPHTTPRequest.postInappPay(dict, success: {[weak self] (res) in
            SVProgressHUD.showSuccess(withStatus: "购买成功")
            DispatchQueue.main.asyncAfter(deadline: .now()+2.0) {
                self?.navigationController?.popToRootViewController(animated: true)
            }
          UserInfoManager.clearApplePay()
        }) { (error) in}
    }
上一篇 下一篇

猜你喜欢

热点阅读