文章中仅有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}
}
网友评论