文档章节

iOS集成支付宝支付--Swift

上官尘
 上官尘
发布于 2016/02/26 16:42
字数 1122
阅读 1541
收藏 5

       如果要了解整个支付流程可以阅读文章《手机App集成微信支付&支付宝-iOS&Android完整版》。
如果不想看本文的话可以直接到Github下载Demo源码。下载源码后只需要修改MyConstants.swift文件中的支付宝相关账号即可运行。

申请PID

到支付宝商家服务网页申请快捷支付。

SDK

首先从支付宝开放平台下载SDK. 解压后的目录下包含「服务端demo」和「客户端demo」。「客户端demo」包含了集成支付宝所需要的所有文件。

RSA加密

整个支付流程我在文章《手机App集成微信支付&支付宝-iOS&Android完整版》中有详细描述。
为了保证安全,防止支付结果被截获,在生成订单和处理支付结果的时候就需要做安全校验。生成订单时对数据签名,收到支付结果时对数据进行签名验证,以检验数据是否被篡改过。支付宝目前采用RSA加密方式做签名验证。

RSA加密算法除了可加解密外,还可用来作签名校验。
简单的说,RSA会生成一个私钥和一个公钥,私钥你应该独自保管,公钥你可以分发出去。
做签名验证时,你可以用私钥对需要传输的数据做签名加密,生成一个签名值,之后分发数据,接收方通过公钥对签名值做校验,如果一致则认为数据无篡改。

生成公钥和私钥

用openssl生成商户的公钥和私钥,私钥用于提交支付申请时加密,而公钥要在商家服务页面上提交,换取到支付宝的公钥。
对于iOS来说,私钥要转为PKCS8格式,即下述代码的第三行!

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.dylib

新建一个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

如需转载请保留原文链接


本文转载自:http://www.qinyejun.com/ios/ios-alipay-swift/

共有 人打赏支持
上一篇: Swift -- 闭包
上官尘
粉丝 6
博文 38
码字总数 9881
作品 0
普陀
程序员
私信 提问
Phonegap各类商业插件

【Phonegap商业插件服务】[目前插件已经支持到Phonegap最新版本] 1.phonegap-百度社会化分享-andriod插件 v2.0 【该插件支持微信分享和朋友圈分享,qq好友分享,微博分享】 2.phonegap百度社...

夜澜小雨
2015/07/15
1K
0
iOS常用的三方库

UI相关:(转载http://www.jianshu.com/p/be0401e35e06) 上拉下拉刷新控件: 链接:MJRefresh 动态启动图: 链接:YFStartView MBProgressHUD: 链接:MBProgressHUD 一个效果很好的弹出下拉框:...

oschina6k
2016/05/11
416
1
OpenCart App正式发布!

OpenCart App正式发布! 国内首创OpenCart手机APP公测啦!! 经过数月奋战,国内首创OpenCart手机APP商城已开发完成。我们遵循原生开发,一体化系统建设思想,完成了OpenCart的APP 开发,包括...

OpenCart中文官方
2015/12/10
1
0
苹果将推出 Swift 2.0 编程语言,应用容量将变小

除了重组开发团队,改进对旧款 iOS 设备的支持,苹果正准备升级 Swift 编程语言。Swift 在2014年 WWDC 上正式发布,而新版 Swift 将会同时为开发者和用户带来更好的体验。因为 Swift 仍然是开...

oschina
2015/05/24
4.2K
19
IOS集成微信支付/支付宝支付并提供简洁调用接口

1. IOS集成微信支付/支付宝支付 2. 提供简洁调用接口 3. 代码托管在 git.ochina.net

SDK4
2017/08/09
2
0

没有更多内容

加载失败,请刷新页面

加载更多

ActiveMQ消息传送机制以及ACK机制详解

AcitveMQ是作为一种消息存储和分发组件,涉及到client与broker端数据交互的方方面面,它不仅要担保消息的存储安全性,还要提供额外的手段来确保消息的分发是可靠的。 一. ActiveMQ消息传送机...

watermelon11
16分钟前
1
0
HashTable和Vector为什么逐渐被废弃

HashTable,不允许键值为null,还一个就是put方法使用sychronized方法进行线程同步,单线程无需同步,多线程可用concurren包的类型。 如编程思想里面说的作为工具类,封闭性做的不好没有一个...

noob_chr
昨天
0
0
Win10 下安装Win7双系统

很多人买了预装64位Win8/8.1的电脑后想重装(或者再安装一个)Win7系统,但是折腾半天发现以前的方法根本不奏效。这是因为预装Win8/8.1的电脑统一采用了UEFI+GPT引导模式,传统的BIOS(Legacy...

yaly
昨天
2
0

中国龙-扬科
昨天
2
0
假若明天来临——《AI.未来》读后感3900字

假若明天来临——《AI.未来》读后感3900字: 你有没有想过,如果有一天你被确诊为癌症患者,你会做些什么?你有没有想过,在你百年之后,你希望你的墓碑上刻写着什么内容? 在我翻开李开复老...

原创小博客
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部