一、开发前的准备工作
首先要确保商户已经开通支付能力,其次要查看签约账户的支付安全校验码(Key)和合作id(partner),查看方式如下:查看的时候要输入支付密码,才能进入到此页
然后下载官方的Demo,将官方demo中的openssl、Order.h、Order.m、Util、libcrypto.a、libssl.a、AlipaySDK.bundle导入工程,将用到的文件的头导入到桥接文件中。此时可能会报错,我们下面再详细说。
首先要生产私钥和公钥,可以在桌面建一个文件夹,cd进去,然后在终端操作如下:
OpenSSL> genrsa -out rsa_private_key.pem 1024 #生成私钥
OpenSSL> rsa_private_key.pem -outform PEM -nocrypt -out rsa_private_key_pkcs8.pem
OpenSSL> rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem #生成公钥
OpenSSL> exit
此处注意,一定要将私钥转换成pkcs8格式,不然运行工程时会报错。这是就会在刚刚新建的文件夹中生成三个文件,然后用文本编辑器打开私钥的pkcs8格式的文件,将私钥复制到工程中,同时将公钥上传到支付宝的官方,上传过程如图:
点击RSA加密,查看密钥,就可以上传了,但是复制的时候最好不要全选复制,那样会将不识别的字符选中,比如空格,这样上传时会出错,可以一行一行的复制,虽然有些麻烦,但是不会出错。
二、开始集成代码
(1)首先导入相关的依赖库,这个官方文档中已经写的很详细了,就不多赘述了
(2)配置urlScheme:点击项目名称,点击“Info”选项卡,在“URL Types”选项中,点击“+”,在“URL Schemes”中根据实际情况填写独立的scheme,不能与其他商户app重复。
(3)适配iOS9:
第一种方式:
<key>NSAppTransportSecuritykey>
<dict>
<key>NSAllowsArbitraryLoadskey><true/>
dict>
第二种方式:
<key>NSAppTransportSecuritykey>
<dict>
<key>NSExceptionDomainskey>
<dict>
<key>alipay.comkey>
<dict>
<key>NSIncludesSubdomainskey>
<true/>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoadskey>
<true/>
<key>NSTemporaryExceptionMinimumTLSVersionkey>
<string>TLSv1.0string>
<key>NSTemporaryExceptionRequiresForwardSecrecykey>
<false/>
dict>
<key>alipayobjects.comkey>
<dict>
<key>NSIncludesSubdomainskey>
<true/>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoadskey>
<true/>
<key>NSTemporaryExceptionMinimumTLSVersionkey>
<string>TLSv1.0string>
<key>NSTemporaryExceptionRequiresForwardSecrecykey>
<false/>
dict>
dict>
dict>
很明显啊,都是用第一种方式的。
(4)生成订单
let partner = ""//合作id
let seller = ""//收款账号
let privateKey = "" //私钥
let order = Order()
order.partner = partner;
order.sellerID = seller;
order.outTradeNO = orderNum; //订单ID(由商家自行制定)
order.subject = "商品标题"
order.body = "商品描述"
order.totalFee = "0.01"//商品价格
order.notifyURL = ""; //回调URL,这个URL是在支付之后,支付宝通知后台服务器,使数据同步更新,必须填,不然支付无法成功
//下面的参数是固定的,不需要改变
order.service = "mobile.securitypay.pay";
order.paymentType = "1";
order.inputCharset = "utf-8";
order.itBPay = "30m";
order.showURL = "m.alipay.com";
//应用注册scheme
let appScheme = "";
let orderSpec = order.description;
let signer = CreateRSADataSigner(privateKey);//用私钥做签名
let signedString = signer.signString(orderSpec);
if signedString != nil {
let orderString = "\(orderSpec)&sign=\"\(signedString)\"&sign_type=\"RSA\"";
//支付方法
AlipaySDK.defaultService().payOrder(orderString, fromScheme: appScheme) { (dic)-> Void in
print(dic)
let vc = OrderDetailViewController()
self.navigationController?.pushViewController(vc, animated: true)
}
}
回调URL可以填写本公司后台的某个地址,目的就是通知后台服务器支付
结果。
三、支付完成后的回调
我刚开始使用的是callback进行回调,具体方法如下:
AlipaySDK.defaultService().payOrder(orderString, fromScheme: appScheme, callback: { (resultDic)->Void in
})
后来发现,支付完成之后根本不会调用callback方法,原因是:当我们跳转支付宝进行支付的时候,我们的应用可能被kill掉了,所以不会调用callback方法。但是如果我们想在支付成功之后跳转到我们指定的界面,那应该怎么办呢?解决方法如下:在AppDelegate添加如下方法
func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {
if url.host == "safepay"{
AlipaySDK.defaultService().processOrderWithPaymentResult(url, standbyCallback: { (resultDic:[NSObject : AnyObject]!) in
print(resultDic)
print("reslut = \(resultDic)");
if let Alipayjson = resultDic as? NSDictionary{
let resultStatus = Alipayjson.valueForKey("resultStatus") as! String
if resultStatus == "9000"{
print("OK") NSNotificationCenter.defaultCenter().postNotificationName("payResult", object: "success", userInfo: nil)
}else if resultStatus == "8000" {
print("正在处理中") self.navigationController?.popViewControllerAnimated(true)
}else if resultStatus == "4000" {
print("订单支付失败");
}else if resultStatus == "6001" {
print("用户中途取消")
}else if resultStatus == "6002" {
print("网络连接出错")
}
}
})
}
return true
}
在AppDelegate是不能进行页面跳转的,所以支付成功时,我用通知中心来传递支付成功这个事件,再支付的controller中进行监听,然后跳转到指定的界面。
四、集成过程中遇到的问题
(1)在我们导入支付宝官方demo中的文件时,报错.#include
找不到,这是一个很容易出现的错误,解决方法如下:
首先在工程中新建一个文件夹,将demo中的文件统一复制到这个文件夹中,在Build Setting中导入路径时,导入到新建文件夹这一层。还可以直接复制到根目录下,直接将根目录的路径导入即可。
(2)
这个错误是静态库不支持64位,重新导入支持64位的即可。
swift集成支付宝就介绍到这里。