swift集成支付宝流程及相关问题解答

一、开发前的准备工作
首先要确保商户已经开通支付能力,其次要查看签约账户的支付安全校验码(Key)和合作id(partner),查看方式如下:查看的时候要输入支付密码,才能进入到此页
swift集成支付宝流程及相关问题解答_第1张图片

然后下载官方的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格式的文件,将私钥复制到工程中,同时将公钥上传到支付宝的官方,上传过程如图:
swift集成支付宝流程及相关问题解答_第2张图片
点击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集成支付宝就介绍到这里。

你可能感兴趣的:(集成第三方的那点事)