支付流程:
用户支付流程.png
集成流程:
1. 创建应用
平台包括:iOS、安卓、双平台。
需要填写信息:应用名称、应用简介、iOS bundle ID、android应用包名、android签名、支付宝网关、应用网关(选填)、授权回调地址、接口内容加密方式(一般使用AES)。
添加功能:App支付、web支付、快捷手机web支付、刷脸支付等功能。
以上信息需要审核通过才能分配AppID
2. 集成方式
集成方式:通过 CocoaPods 导入、手动导入。
CocoaPods:在Podsfile文件中加入pod 'AlipaySDK-iOS',然后pod install。
手动导入:需要把资源包和SDKAlipaySDK.bundle、AlipaySDK.framework导入工程中。
这里有个问题:不同版本SDK对应不同的场景,目前两种SDK,一种是集成了UTDID库,一种是没有集成UTDID库,有其他三方SDK(友盟安全组件SDK)也包含UTDID库,导致同一个库重复引用。
添加依赖库:
在 Build Phases 选项卡的 Link Binary With Libraries 中,增加以下依赖:libc++.tbd、libz.tbd、SystemConfiguration.framework、CoreTelephony.framework、QuartzCore.framework、CoreText.framework、CoreGraphics.framework、UIKit.framework、Foundation.framework、CFNetwork.framework、CoreMotion.framework,最后还需要把AlipaySDK.framework也加入依赖库。
需要注意:添加依赖库除AlipaySDK.framework都是系统依赖库,可以直接查找到,三方或私有依赖库需要手动拖入
这里,集成就已经完成
3. 开发:
先了解一下支付宝工作流程:
工作流程.png
在需要的支付的类中添加头文件:
import <AlipaySDK/AlipaySDK.h>
组装支付宝信息:
//将商品信息赋予AlixPayOrder的成员变量
Order* order = [Order new];
// NOTE: app_id设置
order.app_id = appID;
// NOTE: 支付接口名称
order.method = @"alipay.trade.app.pay";
// NOTE: 参数编码格式
order.charset = @"utf-8";
// NOTE: 当前时间点
NSDateFormatter* formatter = [NSDateFormatter new];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
order.timestamp = [formatter stringFromDate:[NSDate date]];
// NOTE: 支付版本
order.version = @"1.0";
// NOTE: sign_type设置
order.sign_type = @"RSA";
// NOTE: 商品数据
order.biz_content = [BizContent new];
order.biz_content.body = @"我是测试数据";
order.biz_content.subject = @"1";
order.biz_content.out_trade_no = [self generateTradeNO]; //订单ID(由商家自行制定)
order.biz_content.timeout_express = @"30m"; //超时时间设置
order.biz_content.total_amount = [NSString stringWithFormat:@"%.2f", 0.01]; //商品价格
//将商品信息拼接成字符串
NSString *orderInfo = [order orderInfoEncoded:NO];
NSString *orderInfoEncoded = [order orderInfoEncoded:YES];
NSLog(@"orderSpec = %@",orderInfo);
// NOTE: 获取私钥并将商户信息签名,外部商户的加签过程请务必放在服务端,防止公私钥数据泄露;
// 需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
id<DataSigner> signer = CreateRSADataSigner(privateKey);
NSString *signedString = [signer signString:orderInfo];
// NOTE: 如果加签成功,则继续执行支付
if (signedString != nil) {
//应用注册scheme,在AliSDKDemo-Info.plist定义URL types
NSString *appScheme = @"alisdkdemo";
// NOTE: 将签名成功字符串格式化为订单字符串,请严格按照该格式
NSString *orderString = [NSString stringWithFormat:@"%@&sign=%@",
orderInfoEncoded, signedString];
// NOTE: 调用支付结果开始支付
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
NSLog(@"reslut = %@",resultDic);
}];
}
其中需要注意的点:
- 需要摘取demo中的订单信息 Order(订单)、Authinfo(授权信息)类,其中支付宝写好的属性和写好的商品信息拼接方法可以直接调用。
- 私钥一定要放在服务器,从服务器获取私钥签名过的信息。
- 调起支付宝时需要传入 Url scheme,要区分其他App,有一定个性化标识度。否则支付宝无法跳回自己的App。
配置返回Url的处理方法:
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{
if ([url.host isEqualToString:@"safepay"]) {
//跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
}];
}
return YES;
}
需要注意:
- 位置在Appdelegate中,app 代理回调中,此方法是适用iOS9以后App处理方式,现在一般都适配iOS9以上。
- 支付完成后回到自己App中的处理方式。
- 所有的从第三方应用回跳后都走这个方法,通过不同三方app的url进行判断,做不同的操作。
完成!
调研支付宝处理商品信息规则:
- 把商品信息转jsonString。
- 把订单信息和商品信息通过key进行a~z的排序拼接,转为jsonString。
- 把jsonString通过签名加密,赋值给sign。
- 把赋值好的sign拼接在已经存在的jsonString后,通过支付宝API调起支付宝。















网友评论