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

一、开发前的准备工作 

首先要确保商户已经开通支付能力,其次要查看签约账户的支付安全校验码(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";

//应用注册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 <openssl/asn1.h> 找不到,这是一个很容易出现的错误,解决方法如下: 

首先在工程中新建一个文件夹,将demo中的文件统一复制到这个文件夹中,在Build Setting中导入路径时,导入到新建文件夹这一层。还可以直接复制到根目录下,直接将根目录的路径导入即可。 

(2) 

这个错误是静态库不支持64位,重新导入支持64位的即可。 

Swift集成支付宝就介绍到这里。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值