最近在做支付宝快捷支付,整整鼓捣了一个星期,流程:Alipay SDK导入到项目中,手机上装有支付宝钱包跳转到支付宝钱包进行支付,否则直接采用H5页面进行支付。
详细就不多说了,支付宝提供的文档蛮详细,现在把步骤以及常见问题,分享一下。
一、导入SDK 就是将
WS_MOBILE_PAY_SDK_BASE.zip 压缩包进行解压缩,把其中的
AlipaySDK.bundle
AlipaySDK.framework
把这两个文件放到一个文件夹里比如"Alipay",之后将Alipay 文件夹导入到项目文件中,文档说需要配置Head search 但是我这边没有配置也可以调用成功,因此就没有配置了,若需要配置如下操作即可
Build Settings -->Header Search Paths-->$(SRCROOT)/(AlipaySDK.bundle 文件路径)
AlipaySDK.framework
项目中需要有以上两个.framework,没有就直接加入SystemConfiguration.framework
Build Phases -->Link Binary with Librarles -->点击下面的"+"即可加入。
在需要用到支付的界面比如:payViewController.m
导入头文件#import <AlipaySDK/AlipaySDK.h>
支付demo
UIWindow *firstWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:0];
firstWindow.hidden = NO;
[[AlipaySDK defaultService] payOrder:orderSignString
fromScheme:@"hkjjjjjj"
callback:^(NSDictionary *resultDic) {
firstWindow.hidden = YES;
NSString *resultStatus = [NSString toNotNullString:[resultDic objectForKey:@"resultStatus"]];
if (resultStatus.integerValue == 9000) {
[self alipaySuccessCallBack];
}
else {
[UIAlertView showWithMessage:[NSString toNotNullString:[resultDic objectForKey:@"memo"]]];
}
}];
其中OrderSignString 是由服务端进行拼接,其中注意拼接格式key=”value“&key=”value“
fromScheme 按照支付宝文档来设置即可
样例支付宝提供:
partner="2088101568358171"&seller_id="xxx@alipay.com"&out_trade_no="0819145412-6177"&subject="测 试 "&body="测 试 测 试"&total_fee="0.01"¬ify_url="http://notify.msp.hk/notify.htm"&service="mobile.securitypay.pay"&payment_type="1"&_input_charset="utf-8"&it_b_pay="30m"&sign="lBBK%2F0w5LOajrMrji7DUgEqNjIhQbidR13GovA5r3TgIbNqv231yC1NksLdw%2Ba3JnfHXoXuet6XNNHtn7VE%2BeCoRO1O%2BR1KugLrQEZMtG5jmJIe2pbjm%2F3kb%2FuGkpG%2BwYQYI51%2BhA3YBbvZHVQBYveBqK%2Bh8mUyb7GM1HxWs9k4%3D"&sign_type="RSA"
一定严格按照该格式来,最好和样例一模一样,除开自己的partner seller_id等赋值自己商户的参数,
我这边遇到的问题,刚开始是一直启动不了支付宝钱包客户端/H5页面,报错”系统繁忙请稍后重试,ALI64“,支付宝技术支持说是我这边发过去的
orderString 验证不通过,因为商户首先生成私钥--->转换为PKCS8格式,随后生成公钥此时公钥需要去头去尾,作一行上传到支付宝平台上,注意此处上传,用签约帐号登录支付宝平台-->签约管理-->我的签约管理--->查看PID|KEY输入支付密码,进入到一堆的密钥管理--->其中有合作伙伴密钥管理、开放平台密钥管理、无线WAP密钥管理,之前将公钥上传到开放平台某个应用里,因此导致验证不通过,解决办法当然是将公钥重新上传一遍,注意是上传到”合作伙伴密钥管理-->RSA加密:查看密钥“,此处上传即可。
好的这下技术支持说我们有上传记录,再去试着测试偶尔能调用SDK 但是还是时不时报错ALI64,支付宝技术支持说需要把RSA签名好的sign再进行UrlEncode
编码,OK每次点击都会跳转到支付宝钱包,但是启动不了H5页面,有微妙的变化,我们起初设置状态栏为白色,现在变成了黑色,说明还是有唤起H5页面,但是被遮住了,最后将Appdelegate.m中
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法中的一句demo影响的:
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
UIWindow *firstWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:0];
firstWindow.hidden = NO;
然后在回调代码块中
firstWindow.hidden = YES;
这样就都OK了,算是完成了,还有需要注意的就是调用支付宝钱包客户端时候,回调需要在Appdelegate 中处理回调
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
//如果极简 SDK不可用,会跳转支付宝钱包进行支付,需要将支付宝钱包的支付结果回传给 SDK
DLog(@"url = %@",url);
if ([url.host isEqualToString:@"safepay"]) {
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
NSLog(@"result = %@",[resultDic objectForKey:@"result"]);
NSString *resultStatus = [NSString toNotNullString:[resultDic objectForKey:@"resultStatus"]];
if (resultStatus.integerValue == 9000) {
[[NSNotificationCenter defaultCenter] postNotificationName:N_ALIPAYSUCCESS object:nil];
}
else {
[UIAlertView showWithMessage:[NSString toNotNullString:[resultDic objectForKey:@"memo"]]];
}
}];
}
return YES;
}