⽀付、⽀付宝⽀付回调处理总结
做APP⽀付已经做了两三次了,每次都要花点时间去调试回调,很浪费时间,所以这次总结了⼀下我们需要在AppDelegate中做的事情。本⽂已经总结并解析了常⽤的错误码errorCode:
⾸先,遵守协议<WXApiDelegate>。
其次,需要注意的就是版本适配问题了,这个地⽅贴出两个版本适配的常⽤代码(宏定义/预编译宏),⼤家⾃⾏去了解相关⽤法:
/*不是我不说怎么⽤,因为我也搞不清楚怎么⽤才是准确的,⾥⾯有许多坑,还有其他适配⽅法,⽐如 if (@available (iOS 10.0, *)) { //这⾥执⾏iOS10.0以上的代码⽚段}。
__IPHONE_OS_VERSION_MAX_ALLOWED 允许最⾼的系统版本
__IPHONE_OS_VERSION_MIN_REQUIRED 要求最低的系统版本
*/
1.直接贴代码了,分别实现两个⽅法(系统版本适配),注意⽅法内部的代码是⼀样的!巡回检察组电视剧演员表
#pragma mark - 、⽀付宝⽀付配置
//iOS 2.0-9.0
//- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
// return YES;
//}
//iOS 4.2-9.0
- (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);
[self alipayResult:resultDic];
}];
// 授权跳转⽀付宝钱包进⾏⽀付,处理⽀付结果
[[AlipaySDK defaultService] processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) { NSLog(@"result = %@",resultDic);
// 解析 auth code
NSString *result = resultDic[@"result"];
NSString *authCode = nil;
if (result.length>0) {
NSArray *resultArr = [result componentsSeparatedByString:@"&"];
for (NSString *subResult in resultArr) {
if (subResult.length > 10 && [subResult hasPrefix:@"auth_code="]) {
authCode = [subResult substringFromIndex:10];
break;
}
}
}
NSLog(@"⽀付宝授权结果 authCode = %@", authCode?:@"");
}];
}else if ([url.host isEqualToString:@"pay"]){//② ⽀付回调
[WXApi handleOpenURL:url delegate:self];
}
return YES;
}
黑石深渊在哪里//iOS 9.0以后
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options{
//这⾥的代码直接拷贝上⾯的,iOS9.0以上的版本会⾛这⾥。
}
2.实现回调代理
#pragma mark -- WXApiDelegate 实现回调代理
- (void)onResp:(BaseResp *)resp{
//判断是否是⽀付回调 (注意是PayResp ⽽不是PayReq) if ([resp isKindOfClass:[PayResp class]]){
//⽀付返回的结果, 实际⽀付结果需要去服务器端查询 switch (Code) {
case WXSuccess:
[self sendNotificationToSkipPayResult];
break;
default:
[self Code];
学生会面试问题大全break;
}
}
}
3.⾃⼰封装的⽅法,解析回调信息
#pragma mark -- ⽀付失败结果解析
-
(void)onPayFail:(int)errCode {
NSString *message = nil;
if (errCode == WXErrCodeCommon) {
message = @"⽀付失败";
} else if (errCode == WXErrCodeUserCancel) {
message = @"⽤户取消⽀付";
} else if (errCode == WXErrCodeSentFail) {
message = @"⽀付失败";
} else if (errCode == WXErrCodeAuthDeny) {
message = @"授权失败";
} else if (errCode == WXErrCodeUnsupport) {
message = @"未知错误";
} else {
message = @"未知错误";
}
if (!kIsEmptyString(message)) {
//⽀付失败后的回调
[self sendNotificationToPayFail:message];
}
成都美发}
#pragma mark -- ⽀付宝⽀付结果处理
- (void)alipayResult:(id)result{
NSDictionary * dic = (NSDictionary *)result;
NSString * errorCode = [dic objectForKey:@"resultStatus"];
NSString * resultStr = [dic objectForKey:@"result"];
成都最好的理发店NSString *message;
BOOL isPaySuccess = NO;
/*
在⽀付过程结束后,会通过 callbackBlock 同步返回⽀付结果。
返回结果需要通过 resultStatus 以及 result 字段的值来综合判断并确定⽀付结果。 在 resultStatus=9000,并且success="true"以及 sign="xxx"校验通过的情况下,证明⽀付成功。其它情况归为失败。较低安全级别的场合,也可以只通过检查 resultStatus 以及 success="true"来判定⽀付结果。*/山东省专科学校
if ([@"9000" isEqualToString:errorCode]) {
NSString * success;
if (resultStr) {
NSArray *array = [resultStr componentsSeparatedByString:@"&"];
if (array && [array count]>0) {
for (int i=0; i<[array count]; i++) {
NSString * subStr = [array objectAtIndex:i];
if ([subStr rangeOfString:@"success=\""].location != NSNotFound) { NSArray *signArr = [subStr componentsSeparatedByString:@"="]; success = [signArr objectAtIndex:1];
break;
}
}
}
}
if ([@"\"true\"" isEqualToString:success]) {
message = @"⽀付成功!";
isPaySuccess = YES;
}else{
message = @"未知错误";
}
}else if ([@"8000" isEqualToString:errorCode]) {
message = @"正在处理中";
}else if ([@"4000" isEqualToString:errorCode]) {
message = @"⽀付失败";
}else if ([@"6001" isEqualToString:errorCode]) {
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论