iOS集成支付寶支付--Swift

       若是要了解整個支付流程能夠閱讀文章《手機App集成微信支付&支付寶-iOS&Android完整版》。
若是不想看本文的話能夠直接到Github下載Demo源碼。下載源碼後只須要修改MyConstants.swift文件中的支付寶相關帳號便可運行。php

申請PID

到支付寶商家服務網頁申請快捷支付。android

SDK

首先從支付寶開放平臺下載SDK. 解壓後的目錄下包含「服務端demo」和「客戶端demo」。「客戶端demo」包含了集成支付寶所須要的全部文件。ios

RSA加密

整個支付流程我在文章《手機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中,增長如下依賴:
alipay依賴
其中,須要注意的是:
若是是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

到這一步,整個配置過程就已經完成了。下面的工做就是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 += "&notify_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

如需轉載請保留原文連接

相關文章
相關標籤/搜索