// // PayVM.m // #import "PayVM.h" #import "KBNetworkManager.h" #import "KBAPI.h" #import "KBHUD.h" @implementation PayVM - (void)applePayReqWithParams:(NSDictionary *)params needShow:(BOOL)needShow completion:(KBPayCompletion)completion { if (needShow) { [KBHUD show]; } [[KBNetworkManager shared] POST:KB_API_IAP_VERIFY jsonBody:params headers:nil completion:^(id _Nullable jsonOrData, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (needShow) { [KBHUD dismiss]; } if (error) { if (completion) completion(ERROR_CODE, error.localizedDescription ?: KBLocalized(@"Network error")); return; } NSInteger sta = [self.class extractStatusFromResponseObject:jsonOrData response:response]; NSString *msg = [self.class extractMessageFromResponseObject:jsonOrData] ?: (sta == SUCCESS_CODE ? @"OK" : KBLocalized(@"Failed")); if (completion) completion(sta, msg); }]; } #pragma mark - Helpers + (NSInteger)extractStatusFromResponseObject:(id)obj response:(NSURLResponse *)resp { // 优先从 JSON 提取 code/status/success if ([obj isKindOfClass:NSDictionary.class]) { NSDictionary *d = (NSDictionary *)obj; id code = d[@"code"] ?: d[@"status"] ?: d[@"retcode"]; if ([code isKindOfClass:NSNumber.class]) { return [((NSNumber *)code) integerValue] == 0 ? SUCCESS_CODE : ERROR_CODE; } if ([code isKindOfClass:NSString.class]) { // 常见:"0" 视为成功 return [((NSString *)code) integerValue] == 0 ? SUCCESS_CODE : ERROR_CODE; } id success = d[@"success"] ?: d[@"ok"]; if ([success respondsToSelector:@selector(boolValue)]) { return [success boolValue] ? SUCCESS_CODE : ERROR_CODE; } } // 无明显字段,按 HTTP 2xx 视为成功 NSInteger http = 0; if ([resp isKindOfClass:NSHTTPURLResponse.class]) { http = ((NSHTTPURLResponse *)resp).statusCode; } return (http >= 200 && http < 300) ? SUCCESS_CODE : ERROR_CODE; } + (NSString *)extractMessageFromResponseObject:(id)obj { if (![obj isKindOfClass:NSDictionary.class]) return nil; NSDictionary *d = (NSDictionary *)obj; NSString *msg = d[@"message"] ?: d[@"msg"] ?: d[@"error"]; if (![msg isKindOfClass:NSString.class]) msg = nil; return msg; } @end