支付宝
支付宝开发步骤:
- 创建应用
- 配置应用
- 设计
- 开发
- 调试
- 上线
创建应用
接入App支付能力,需要在开放平台创建一个应用,通过该应用来接入各种能力。
配置应用
配置应用一般分为三个部分
- 第一部分:给应用添加相应的功能
- 第二部分:签约
- 第三部分:配置秘钥
这些一般都是TeamLeader和运营总监来做
设计
设计一般分为:
-
架构设计
架构设计一般采用支付宝推荐设计架构,附上一张图片吧
- 安全设计
- 采用HTTPS协议传输交易数据,防止数据被截获,解密。
- 采用RSA非对称秘钥,明确交易双方的身份,保证交易主体的正确性和唯一性
开发
开发就先上图了,让大家了解一下支付的基本流程:
了解基本流程后就要开始进行服务端和客户端的开发集成了.
后台的开发任务相比客户端相对来说繁琐一些,因为后台要做订单的订单信息的拼接和签名,将签好名的订单串给客户端,这样做是因为原则上不允许将签名放在客户端进行,不安全.
客户端的任务是调起支付宝并监听回调结果,并展示给用户支付结果.
具体的支付状态一定要以服务端的回调为准.
ios客户端配置
- 导入支付宝SDK和bundle文件
AlipaySDK.bundle
AlipaySDK.framework
- 集成第三方的第一个步骤导入依赖库
- 配置info.plist
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>CFBundleURLTypes</key>
<array>
<!-- 支付宝 用来应用之间跳转的 -->
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>alipay</string>
<key>CFBundleURLSchemes</key>
<array>
<string>DovAlipayDemo</string>
</array>
</dict>
</array>
Show me the code!
导入头文件
#import <AlipaySDK/AlipaySDK.h>
/**
发起支付,调起支付宝应用
orderString 从后天获取的拼接好的签过名的订单串
schemes 用来进行应用跳转的schemes,支付成功或者失败跳回应用
callback 支付回调(但是我并没有发现有什么软用) 原因:【由于在跳转支付宝客户端支付的过程中,商户app在后台很可能被系统kill了,所以pay接口的callback就会失效】
*/
[[AlipaySDK defaultService] payOrder:orderString
fromScheme:@"DovAlipayDemo" //这个一定要和info.plist里面配置的一样,并确保唯一性
callback:^(NSDictionary *resultDic) {
//这里的回调是供网页支付使用的
if ([[resultDic objectCheckForKey:@"resultStatus"] isEqualToString:@"9000"]) {
//支付成功
}
else {
//支付失败
}
}];
//支付接口的回调是不管用了,我们一下面的方式进行回调结果的监听
//ios 9.0 以下使用此方法进行回调监听
- (BOOL) application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
//支付宝
if ([url.host isEqualToString:@"safepay"]) {
[self alipayCallbackWithUrl:url];
}
return YES;
}
//ios 9.0 以上使用此方法进行回调监听
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
//支付宝
if ([url.host isEqualToString:@"safepay"]) {
[self alipayCallbackWithUrl:url];
}
return YES;
}
- (void)alipayCallbackWithUrl:(NSURL *)url {
//跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
if ([[resultDic objectForKey:@"resultStatus"] integerValue] == 9000) {
//代表你支付成功了
}
else {
//失败了
}
}];
}
调试
支付宝推出了一个沙盒测试,我们开发的时候基本没有使用,因为测试的时候使用的小金额测试.
上线
商户本身应用上线时候,也要把支付宝开放平台的应用上线.
扩展介绍
订单信息签名过程模拟(这个一定要放在服务端来做)
//================== 生成支付订单信息 =================//
/*
*生成订单信息及签名
*/
//将商品信息赋予AlixPayOrder的成员变量
Order *order = [[Order alloc] init];
order.partner = alipayParterID; //合作商ID (支付宝开发平台里面)
order.sellerID = alipaySellerID; //商家ID
order.outTradeNO = @"78797348634858734673899"; //订单ID(由商家自行制定)
order.subject = @"篮球"; //商品标题
order.body = @"室内室外两用"; //商品描述
order.totalFee = [NSString stringWithFormat:@"%.2f",100.5]; //商品价格
order.notifyURL = @"http://www.baidu.com"; //回调URL
//这些值是固定值不用修改
order.service = @"mobile.securitypay.pay";
order.paymentType = @"1";
order.inputCharset = @"utf-8";
order.itBPay = @"30m";
order.showURL = @"m.alipay.com";
//将商品信息拼接成字符串
NSString *orderSpec = [order description];
NSLog(@"orderSpec = %@",orderSpec);
//================== 签名 =================//
//获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
id<DataSigner> signer = CreateRSADataSigner(@"私钥");
NSString *signedString = [signer signString:orderSpec];
//将签名成功字符串格式化为订单字符串,请严格按照该格式
NSString *orderString = nil;
if (signedString != nil) {
orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
orderSpec, signedString, @"RSA"];
[[AlipaySDK defaultService] payOrder:orderString fromScheme:self.scheme callback:^(NSDictionary *resultDic) {
}];
}
注意事项
- 支付宝的签名过程一定要在服务端完成
- 支付宝的回调以服务端的为准,客户端的只是做参考
- 支付宝的发起支付方法附带的回调是当你没有安装支付宝app的时候,使用网页支付时候用到,安装支付宝APP后需要使用url的回调
- 如果是Xcode 7.0之后的版本,需要添加libc++.tbd、libz.tbd;如果是Xcode7.0之前的版本,需要添加libc++.dylib、libz.dylib