Swift 内购代码

作者: 任兴金 | 来源:发表于2018-04-25 13:13 被阅读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}
    }

相关文章

  • Swift 内购代码

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

  • swift 内购

    1.0 内购类型 a. 消耗型商品:只可以使用一次的产品,使用以后即失效,必须再次购买。示例:小说App购买的书币...

  • 内购代码

    内购 #import"ViewController.h" #import @interfaceViewContro...

  • 内购 代码

    不管有没有用 参考一下 总没错。。 /********一下是iap内购*************/ 测试地址 ht...

  • iOS swift4.0 IAP内购代码

  • swift iOS内购

    一.使用轮子SwiftyStoreKit 二.方法 在程序入口didFinishLaunchingWithOpti...

  • iOS 苹果内购流程

    本文参考: iOS开发之内购完全笔记 iOS开发内购全套图文教程 iOS应用程序内购/内付费(一) 代码...

  • iOS 内购代码

    1:配置一个明确的APPID 2:配置和相关的项目 配置内购的物品 配置测试账号 配置银行相关 3:代码实现...

  • 内购代码和充值界面的封装

    前言:项目中用到了内购,这里主要想记录一下内购代码封装和充值界面的封装,其实内购代码也参考了网上其他的人的,只是好...

  • iOS 内购最新讲解

    一.总说内购的内容 协议、税务和银行业务 信息填写 内购商品的添加 添加沙盒测试账号 内购代码的具体实现 内购的注...

网友评论

    本文标题:Swift 内购代码

    本文链接:https://www.haomeiwen.com/subject/iuoelftx.html