若是要了解整个支付流程能够阅读文章《手机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
如需转载请保留原文连接