之前写了银联支付,今天研究了一下支付宝支付。
1.首先下载支付宝sdk开发包以及demo:https://doc.open.alipay.com/doc2/detail.htm?treeId=54&articleId=104509&docType=1
2.支付流程:其实所有的支付,包括银联,微信,支付宝等差不多都是这个流程,没多少区别。
3.集成流程:开发文档在这里:https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.0GIB7L&treeId=204&articleId=105295&docType=1
把iOS包中的压缩文件中以下文件拷贝到项目文件夹下,并导入到项目工程中。
AlipaySDK.bundle
AlipaySDK.framework
在Build Phases选项卡的Link Binary With Libraries中,增加以下依赖:
其中,需要注意的是:
如果是Xcode 7.0之后的版本,需要添加libc++.tbd、libz.tbd;
如果是Xcode 7.0之前的版本,需要添加libc++.dylib、libz.dylib。
3.调用支付接口
// NOTE: 调用支付结果开始支付
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
NSLog(@"reslut = %@",resultDic);
}];
- @param orderStr 订单信息(后台生成给我们,需要签名,其中签名为了安全起见要放在后台做)
- @param schemeStr 调用支付的app注册在info.plist中的scheme
@param compltionBlock 支付结果回调Block,用于wap支付结果回调(非跳转钱包支付)
如果手机内没安装支付宝的app,会直接展现支付宝web支付界面,通过callback返回支付结果;
如果手机内安装了支付宝的app,会跳转到支付宝的app支付,然后通过openURL的回调返回支付结果。
4.支付完成回调:点击项目名称,点击“Info”选项卡,在“URL Types”选项中,点击“+”,在“URL Schemes”中输入“alisdkdemo”。“alisdkdemo”来自于文件“APViewController.m”的NSString *appScheme = @“alisdkdemo”;。
注意:这里的URL Schemes中输入的alisdkdemo,为测试demo,实际商户的app中要填写独立的scheme,建议跟商户的app有一定的标示度,要做到和其他的商户app不重复,否则可能会导致支付宝返回的结果无法正确跳回商户app。
然后在appdelegate实现以下方法:
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
if ([url.host isEqualToString:@"safepay"]) {
//跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
}];
}
return YES;
}
// NOTE: 9.0以后使用新API接口
- (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;
}
补充:
其实支付宝集成到此为止应该是可以了,如果你想研究一下支付宝的demo还有签名问题,那就接着往下看:
首先,我们想办法把demo运行起来,然后能够调起支付:
打开demo我们发现,无法调用支付宝控件,原因是没有appid和PrivateKey。
appid就是我们在支付宝上申请的应用里会有,详细文档看这里:https://doc.open.alipay.com/doc2/detail.htm?treeId=204&articleId=105297&docType=1#s0
PrivateKey配置密钥在这里:https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=105971&docType=1
我们可以在支付宝开发中心,首先创建一个应用,随便创建就行,也不需要认证。主要是想使用它们的沙箱环境,然后会有一个沙箱环境,我们打开,然后把里面的appid拿过来用就行了,然后上传公钥。(注意,配置密钥会生成一个公钥和一个私钥,私钥就是我们在支付宝demo中要填的rsa2PrivateKey,这里我们上传的是公钥,别搞迷糊了)。
如果报错:rsa_private read error : private key is NULL :
解决方法:
1)在RSADataSigner.m文件中 搜索代码 [result appendString:@”—–BEGIN PRIVATE KEY—–\n”]; 将其改成 [result appendString:@”—–BEGIN RSA PRIVATE KEY—–\n”];
2)在RSADataSigner.m文件中 搜索代码 [result appendString:@”\n—–END PRIVATE KEY—–”]; 将其改成 [result appendString:@”\n—–END RSA PRIVATE KEY—–”];
补充:这个demo测试里面只是调起了支付宝控件,并不可以登录支付宝测试支付结果等,沙箱账号只是安卓上才能用,因此如果我们需要测试支付完成之后的函数等,则需要线上环境了。别问我怎么知道的,我也是被坑了半天之后网上各种找账号无果后问他们的技术人员才得知。。。