若是要了解整個支付流程能夠閱讀文章《手機App集成微信支付&支付寶-iOS&Android完整版》。
若是不想看本文的話能夠直接到Github下載Demo源碼。下載源碼後只須要修改MyConstants.swift文件中的支付寶相關帳號便可運行。php
到支付寶商家服務網頁申請快捷支付。android
首先從支付寶開放平臺下載SDK. 解壓後的目錄下包含「服務端demo」和「客戶端demo」。「客戶端demo」包含了集成支付寶所須要的全部文件。ios
整個支付流程我在文章《手機App集成微信支付&支付寶-iOS&Android完整版》中有詳細描述。
爲了保證安全,防止支付結果被截獲,在生成訂單和處理支付結果的時候就須要作安全校驗。生成訂單時對數據簽名,收到支付結果時對數據進行簽名驗證,以檢驗數據是否被篡改過。支付寶目前採用RSA加密方式作簽名驗證。c++
RSA加密算法除了可加解密外,還可用來做簽名校驗。
簡單的說,RSA會生成一個私鑰和一個公鑰,私鑰你應該獨自保管,公鑰你能夠分發出去。
作簽名驗證時,你能夠用私鑰對須要傳輸的數據作簽名加密,生成一個簽名值,以後分發數據,接收方經過公鑰對簽名值作校驗,若是一致則認爲數據無篡改。git
用openssl生成商戶的公鑰和私鑰,私鑰用於提交支付申請時加密,而公鑰要在商家服務頁面上提交,換取到支付寶的公鑰。
對於iOS來講,私鑰要轉爲PKCS8格式,即下述代碼的第三行!github
openssl genrsa -out rsa_private_key.pem 1024 openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
首先吧 AlipaySDK.framework 和 AlipaySDK.bundle 拖到你的項目裏面。而後把demo目錄下面的openssl和Util兩個目錄拖到你的工程下面。而後在 Build Settings => Header Search Paths => 添加 "$(SRCROOT)/openssl" 和 "$(SRCROOT)/Util"
不然會有相似報錯:"openssl/asn1.h file not found"。算法
在Build Phases選項卡的Link Binary With Libraries中,增長如下依賴:
其中,須要注意的是:
若是是Xcode 7.0以後的版本,須要添加libc++.tbd、libz.tbd;
若是是Xcode 7.0以前的版本,須要添加libc++.dylib、libz.dylibswift
新建一個Bridging-Header.h文件,並把該文件的路徑添加到 Build Settings => Objective-C Bridging Header。而後在該文件中添加下面兩行:安全
#import <AlipaySDK/AlipaySDK.h> #import "RSADataSigner.h"
若是你的服務器不支持Https,請在info.plist文件裏面添加以下代碼:服務器
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
因爲支付包支付成功後須要返回App,那麼你就須要設置你App獨有的Schema:選擇你的項目,選擇Info,在URL Types中添加一個schema,並設置Url Schemas.
到這一步,整個配置過程就已經完成了。下面的工做就是Coding部分了。
let aliOrder = AlipayOrder(partner: AlipayPartner, seller: AlipaySeller, tradeNO: order.id, productName: order.title, productDescription: order.content, amount: order.price, notifyURL: AlipayNotifyURL, service: "mobile.securitypay.pay", paymentType: "1", inputCharset: "utf-8", itBPay: "30m", showUrl: "m.alipay.com", rsaDate: nil, appID: nil) let orderSpec = aliOrder.description //orderA.description let signer = RSADataSigner(privateKey: AlipayPrivateKey) let signedString = signer.signString(orderSpec) let orderString = "\(orderSpec)&sign=\"\(signedString)\"&sign_type=\"RSA\"" print(orderString) AlipaySDK.defaultService().payOrder(orderString, fromScheme: AppScheme, callback: {[weak self] resultDic in if let strongSelf = self { print("Alipay result = \(resultDic as Dictionary)") let resultDic = resultDic as Dictionary if let resultStatus = resultDic["resultStatus"] as? String { if resultStatus == "9000" { strongSelf.delegate?.paymentSuccess(paymentType: .Alipay) let msg = "支付成功!" let alert = UIAlertView(title: nil, message: msg, delegate: nil, cancelButtonTitle: "好的") alert.show() //strongSelf.navigationController?.popViewControllerAnimated(true) } else { strongSelf.delegate?.paymentFail(paymentType: .Alipay) let alert = UIAlertView(title: nil, message: "支付失敗,請您從新支付!", delegate: nil, cancelButtonTitle: "好的") alert.show() } } } })
AlipayOrder的description屬性以下:
var description:String { var desc = "" desc += "partner=\"\(partner)\"" desc += "&seller_id=\"\(seller)\"" desc += "&out_trade_no=\"\(tradeNO)\"" desc += "&subject=\"\(productName)\"" desc += "&body=\"\(productDescription)\"" desc += "&total_fee=\"" + amount.format("0.2") + "\"" desc += "¬ify_url=\"\(notifyURL)\"" desc += "&service=\"\(service)\"" desc += "&payment_type=\"\(paymentType)\"" desc += "&_input_charset=\"\(inputCharset)\"" desc += "&it_b_pay=\"\(itBPay)\"" desc += "&show_url=\"\(showUrl)\"" if let rsaDate = rsaDate { desc += "&sign_date=\(rsaDate)" } if let appID = appID { desc += "&app_id=\(appID)" } return desc }
若是支付成功後,支付寶服務器會向你的服務器 notify URL 發起支付成功的請求。這樣就能夠在服務端實現一些相關的業務邏輯,好比標記訂單爲已支付,發短信給用戶等。notify URL的具體實現請查看文章《iOS&Android集成支付寶-server篇(PHP)》
查看完整代碼請移步Github
如需轉載請保留原文連接