在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
一、开发前的准备工作 首先要确保商户已经开通支付能力,其次要查看签约账户的支付安全校验码(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>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key><true/> </dict>
第二种方式:
<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>alipay.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSTemporaryExceptionMinimumTLSVersion</key> <string>TLSv1.0</string> <key>NSTemporaryExceptionRequiresForwardSecrecy</key> <false/> </dict> <key>alipayobjects.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSTemporaryExceptionMinimumTLSVersion</key> <string>TLSv1.0</string> <key>NSTemporaryExceptionRequiresForwardSecrecy</key> <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";
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 <openssl/asn1.h> 找不到,这是一个很容易出现的错误,解决方法如下: 首先在工程中新建一个文件夹,将demo中的文件统一复制到这个文件夹中,在Build Setting中导入路径时,导入到新建文件夹这一层。还可以直接复制到根目录下,直接将根目录的路径导入即可。 (2) 这个错误是静态库不支持64位,重新导入支持64位的即可。 Swift集成支付宝就介绍到这里。 |
请发表评论