// // KWMAPIManager.m // iXiaoWeiOA // // Created by kevin on 3/14/15. // Copyright (c) 2015 kollway. All rights reserved. // #import "KWMAPIManager.h" #import "KWMStringUtil.h" #import "KWMRequestListResult.h" #import "KWMBaseModel.h" #import "KWMUser.h" #import "NSString+SAMAdditions.h" #import "KWMAPIManager.h" #import <UIImageView+WebCache.h> #import "KWMUserDao.h" #import "KWMCustomer.h" #import "KWMCustomerResult.h" #import "KWMBrandsTypeResult.h" #import "KWMBrandsTypeModel.h" #import "KWMDictionaryResult.h" #import <RegexKitLite/RegexKitLite.h> #import <SAMKeychain/SAMKeychain.h> #import "KWMUserModel.h" #import "KWMHttpUtil.h" typedef NS_ENUM(NSInteger, KWMHTTPMethod) { KWMHTTPMethodGET = 0, KWMHTTPMethodPOST, KWMHTTPMethodPUT, KWMHTTPMethodDELETE }; @implementation KWMAPIManager + (KWMAPIManager *)sharedManager { static KWMAPIManager *_sharedManager = nil; static dispatch_once_t oncePredicate; dispatch_once(&oncePredicate, ^{ _sharedManager = [[self alloc] init]; }); return _sharedManager; } - (NSString *)toAbsoluteUrl:(NSString *)relativeUrl { if([KWMStringUtil isEmpty:relativeUrl]){ return self.baseUrl; } if([relativeUrl rangeOfString:@"http"].location == 0){ return relativeUrl; } return [[NSString alloc] initWithFormat:@"%@%@", self.baseUrl, relativeUrl]; } - (NSString *)baseUrl { if(! _baseUrl){ if (API_HOST_PORT != 8088) { _baseUrl = [[NSString alloc] initWithFormat:@"https://%@:%d", API_HOST, API_HOST_PORT]; }else{ _baseUrl = [[NSString alloc] initWithFormat:@"https://%@", API_HOST]; } } return _baseUrl; } /** * 根据API返回类型,模型类型创建成功callback */ - (void(^)(NSURLSessionDataTask *, id ))buildSuccessCallbackWithResultClass:(Class)requestResultClass modelClass:(Class)modelClass success:(void (^)(NSURLSessionDataTask *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure{ void(^successCallback)(NSURLSessionDataTask *, id ) = ^(NSURLSessionDataTask *task, id jsonDict){ NSError *error; id result = nil; @try { //#ifdef DEBUG // NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDict options:NSJSONWritingPrettyPrinted error:&error]; // NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; // NSLog(@"%@", jsonString); //#endif result = [[requestResultClass alloc] initWithDictionary:jsonDict modelClass:modelClass error:&error]; } @catch (NSException *e){ NSLog(@"%@", [e description]); } @finally{ [self checkRequestResult:result]; if(error){ failure(task, error); }else{ success(task, result); } } }; return successCallback; } /** * 检测API返回错误号 */ - (void)checkRequestResult:(id)requestResult { if(! requestResult) { return; } NSString *message = nil; NSInteger responseCode = 0; if([requestResult isKindOfClass:[KWMRequestResult class]]){ responseCode = ((KWMRequestResult *)requestResult).code; message = ((KWMRequestResult *)requestResult).message; }else if([requestResult isKindOfClass:[KWMRequestListResult class]]){ responseCode = ((KWMRequestListResult *)requestResult).code; message = ((KWMRequestListResult *)requestResult).message; }else{ return; } switch (responseCode){ case 1: { [[NSNotificationCenter defaultCenter] postNotificationName:KWMReceiverNoLogin object:nil userInfo: nil]; break; } default:break; } } /** * 处理列表API的请求参数 */ - (NSDictionary *)processListAPIParameters:(NSDictionary *)parameters { static NSString *KEY_PAGE = @"page"; static NSString *KEY_PAGE_SIZE = @"pagesize"; NSMutableDictionary *mutableParameters = [[NSMutableDictionary alloc] initWithDictionary:parameters]; NSAssert((mutableParameters && mutableParameters[KEY_PAGE]), @"required parameter: page"); if(!mutableParameters[KEY_PAGE_SIZE]){ mutableParameters[KEY_PAGE_SIZE] = @(KWM_PAGE_SIZE).stringValue; } return [[NSDictionary alloc] initWithDictionary:mutableParameters]; } //账号 密码 //正式 static NSString *const userName = @"868f335328bf6ea61fc94448ed314ace"; static NSString *const password = @"ae6dc70d26e9315f370ebade3e86d21b"; //测试 static NSString *const userNameTest = @"55275437287d63252b80dc5a784b3b8f"; static NSString *const passwordTest = @"9e84aae218c57cdf0762763c4cf5a651"; - (AFHTTPSessionManager *)buildSessionManager{ return [self buildSessionManager:NO]; } - (AFHTTPSessionManager *)buildSessionManager:(BOOL)isJsonParameter{ NSURL *url = [NSURL URLWithString:self.baseUrl]; AFHTTPSessionManager *sessionManager = [[AFHTTPSessionManager alloc] initWithBaseURL:url]; //设置超时时间为10秒 [sessionManager.requestSerializer willChangeValueForKey:@"timeoutInterval"]; sessionManager.requestSerializer.timeoutInterval = 10.f; [sessionManager.requestSerializer didChangeValueForKey:@"timeoutInterval"]; if (isJsonParameter) { sessionManager.requestSerializer = [AFJSONRequestSerializer serializerWithWritingOptions:0]; } // 使用系统cookie管理 2017年5月18日 因为改动cart需要使用cookie // [[KWMUserDao shareDao] checkSession]; sessionManager.requestSerializer.HTTPShouldHandleCookies = YES; sessionManager.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments]; //测试 if([TestModel isEqualToString:@"YES"]){ [sessionManager.requestSerializer setAuthorizationHeaderFieldWithUsername:userNameTest password:passwordTest]; } //正式 else{ [sessionManager.requestSerializer setAuthorizationHeaderFieldWithUsername:userName password:password]; } return sessionManager; } - (NSURLSessionDataTask *)startSessionTask:(KWMHTTPMethod)httpMethod apiPath:(NSString *)apiPath parameters:(NSDictionary *)parameters filePaths:(NSDictionary *)filePaths images:(NSArray *)images jsonParameter:(BOOL)isJsonParameter result:(Class)result model:(Class)model success:(void (^)(NSURLSessionDataTask *task, id result))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure{ NSAssert((result == [KWMRequestResult class] || result == [KWMRequestListResult class] || result == [KWMCheckoutPayResult class] || result == [KWMCemaroseResult class] || [result isSubclassOfClass:[KWMCemaroseResult class]]), @"result class must either be KWMRequestResult or KWMRequestListResult!"); NSAssert((!model || (model && [model isSubclassOfClass:[JSONModel class]])), @"model class must be sub class of JSONModel"); void(^successCallback)(NSURLSessionDataTask *, id ) = [self buildSuccessCallbackWithResultClass:result modelClass:model success:success failure:failure]; AFHTTPSessionManager *sessionManager = [self buildSessionManager:isJsonParameter]; //app version code // static NSString *KEY_VERSION_CODE = @"version_code"; // NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; NSMutableDictionary *mutableParameters = [[NSMutableDictionary alloc] initWithDictionary:parameters]; // mutableParameters[KEY_VERSION_CODE] = build; //os_version统一添加 // static NSString *KEY_OS_VERSION = @"os_version"; // mutableParameters[KEY_OS_VERSION] = [NSString stringWithFormat:@"ios%@", [UIDevice currentDevice].systemVersion]; // NSLog(@"os_version:%@=====", mutableParameters[KEY_OS_VERSION]); if (filePaths != nil && filePaths.count > 0) { return [sessionManager POST:apiPath parameters:mutableParameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { NSFileManager *fileManager = [NSFileManager defaultManager]; NSEnumerator *e = [filePaths keyEnumerator]; for (NSString *key in e) { NSString *filePath = filePaths[key]; if (![KWMStringUtil isEmpty:filePath]) { if ([fileManager fileExistsAtPath:filePath]) { [formData appendPartWithFileURL:[NSURL fileURLWithPath:filePath] name:key error:nil]; }else if([filePath sam_containsString:@"http"]){//网络图片 NSURL *url = [[NSURL alloc] initWithString:filePath]; [formData appendPartWithFileURL:url name:key error:nil]; } } } } success:successCallback failure:failure]; } if (images != nil && images.count > 0) { return [sessionManager POST:apiPath parameters:mutableParameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { NSFileManager *fileManager = [NSFileManager defaultManager]; for (NSInteger i = 0; i < images.count; i++) { NSString *filePath = images[i]; if (![KWMStringUtil isEmpty:filePath] && [fileManager fileExistsAtPath:filePath]) { if (images.count == 1) { [formData appendPartWithFileURL:[NSURL fileURLWithPath:filePath] name:@"image" error:nil]; }else{ [formData appendPartWithFileURL:[NSURL fileURLWithPath:filePath] name:[NSString stringWithFormat:@"image%@", @(i+1)] error:nil]; } } } } success:successCallback failure:failure]; } if(parameters.allKeys==nil || parameters.allKeys.count==0){ parameters = nil; } switch (httpMethod) { case KWMHTTPMethodGET:{ return [sessionManager GET:apiPath parameters:parameters success:successCallback failure:failure]; } case KWMHTTPMethodPOST:{ return [sessionManager POST:apiPath parameters:parameters success:successCallback failure:failure]; } case KWMHTTPMethodPUT:{ return [sessionManager PUT:apiPath parameters:parameters success:successCallback failure:failure]; } case KWMHTTPMethodDELETE:{ return [sessionManager DELETE:apiPath parameters:parameters success:successCallback failure:failure]; } default:{ NSString *reason = [[NSString alloc] initWithFormat:@"Don't use this way to build your NSURLSessionDataTask!"]; NSAssert(NO, reason); return nil; } } } - (NSURLSessionDataTask *)startSessionTask:(KWMHTTPMethod)httpMethod apiPath:(NSString *)apiPath parameters:(NSDictionary *)parameters filePaths:(NSDictionary *)filePaths jsonParameter:(BOOL)isJsonParameter result:(Class)result model:(Class)model success:(void (^)(NSURLSessionDataTask *task, id result))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure { return [self startSessionTask:httpMethod apiPath:apiPath parameters:parameters filePaths:filePaths images:nil jsonParameter:isJsonParameter result:result model:model success:success failure:failure]; } - (NSURLSessionDataTask *)makeSessionTask:(KWMHTTPMethod)httpMethod apiPath:(NSString *)apiPath parameters:(NSDictionary *)parameters result:(Class)result model:(Class)model success:(void (^)(NSURLSessionDataTask *task, id result))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure { void(^successCallback)(NSURLSessionDataTask *, id ) = [self buildSuccessCallbackWithResultClass:result modelClass:model success:success failure:failure]; AFHTTPSessionManager *sessionManager = [self buildSessionManager:NO]; NSString *method = httpMethod == KWMHTTPMethodPOST ? @"POST" : @"GET"; NSURLRequest *request = [sessionManager.requestSerializer requestWithMethod:method URLString:apiPath parameters:parameters error:nil]; __block id task = [sessionManager dataTaskWithRequest:request completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { if (error) { failure(task,error); }else{ successCallback(task,responseObject); } }]; return task; } - (NSURLSessionDataTask *)startSessionTask:(KWMHTTPMethod)httpMethod apiPath:(NSString *)apiPath parameters:(NSDictionary *)parameters result:(Class)result model:(Class)model success:(void (^)(NSURLSessionDataTask *task, id result))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure { return [self startSessionTask:httpMethod apiPath:apiPath parameters:parameters filePaths:nil jsonParameter:NO result:result model:model success:success failure:failure]; } - (NSString *)toIds:(NSArray<__kindof NSString *> *)idsArray { NSMutableString *tmp = [NSMutableString new]; for (NSString *s in idsArray) { [tmp appendFormat:@"%@,", s]; } if (tmp.length > 0) { return [tmp substringToIndex:tmp.length - 1]; }else{ return @""; } } - (void)loginWebSuccess:(void (^)())success failure:(void (^)(NSError *))failure { KWMUserModel *user= [KWMUserModel shareUser]; NSString *account = user.email; NSString *password = user.password; if (!password) { password = [SAMKeychain passwordForService:@"cemarose.account" account:account]; } // 没登陆过不做处理 if (!password) { return; } NSLog(@"loginTask username:%@,password:%@",account,password); AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; [manager.responseSerializer setAcceptableContentTypes:[NSSet setWithObject:@"text/html"]]; [manager setTaskWillPerformHTTPRedirectionBlock:^NSURLRequest * _Nonnull(NSURLSession * _Nonnull session, NSURLSessionTask * _Nonnull task, NSURLResponse * _Nonnull response, NSURLRequest * _Nonnull request) { NSString *url = request.URL.absoluteString; if ([url isEqualToString:[NSString stringWithFormat:@"https://%@/account",Shopify_SHOP_DOMAIN]]) { if(success) success(); }else{ NSError *error = [[NSError alloc] initWithDomain:url code:401 userInfo:@{NSLocalizedDescriptionKey:@"email & password is invalid !"}]; if(failure) failure(error); } return nil; }]; NSString *loginUrl = [NSString stringWithFormat:@"https://%@/account/login",Shopify_SHOP_DOMAIN]; id param = @{ @"from_type":@"customer_login", @"utf8":@"✓", @"customer[email]":account, @"customer[password]":password, }; [manager POST:loginUrl parameters:param success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) { } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { if(failure) failure(error); }]; } /** * 手机登录API * @param parameters {mobile=?手机号,code=?收到的短信验证码} * @param success 成功callback * @param failure 失败callback * @return NSURLSessionDataTask */ - (NSURLSessionDataTask *) phoneLogin:(NSDictionary *)parameters success:(void(^)(NSURLSessionDataTask *task,KWMCustomerResult *result))success failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{ NSString *apiPath = [NSString stringWithFormat:@"/shopifyapps/china_social_login/%@/api-check-code",Cemarose_KEY]; return [self startSessionTask:KWMHTTPMethodPOST apiPath:apiPath parameters:parameters result:[KWMCustomerResult class] model:[KWMCustomer class] success:success failure:failure]; } #pragma mark - 购物车接口 - (NSURLSessionDataTask *)changeProductWithVariantId:(NSNumber *)variantId quantity:(NSInteger) quantity success:(void (^)(NSURLSessionDataTask *, KWMCartResult *))success failure:(void (^)(NSURLSessionDataTask *, NSError *))failure { NSString *apiPath = [NSString stringWithFormat:@"https://%@/cart/change/%@.js",Shopify_SHOP_DOMAIN,variantId]; id params = @{ @"quantity": @(quantity) }; return [self makeSessionTask:KWMHTTPMethodGET apiPath:apiPath parameters:params result:[KWMCartResult class] model:nil success:success failure:failure]; } - (NSURLSessionDataTask *)updateProductWithVariantIds:(NSArray<NSNumber *> *)variantIds quantities:(NSArray<NSNumber *> *)quantities success:(void (^)(NSURLSessionDataTask *, KWMCartResult *))success failure:(void (^)(NSURLSessionDataTask *, NSError *))failure { NSString *apiPath = [NSString stringWithFormat:@"https://%@/cart/update.js",Shopify_SHOP_DOMAIN]; NSMutableDictionary *params = [NSMutableDictionary new]; for (int i=0; i<quantities.count; i++) { [params setObject:quantities[i] forKey:[NSString stringWithFormat:@"updates[%@]",variantIds[i]]]; } return [self makeSessionTask:KWMHTTPMethodPOST apiPath:apiPath parameters:params result:[KWMCartResult class] model:nil success:success failure:failure]; } - (NSURLSessionDataTask *)addProductWithVariantId:(NSNumber *)variantId quantity:(NSInteger)quantity success:(void (^)(NSURLSessionDataTask *, KWMRequestResult *))success failure:(void (^)(NSURLSessionDataTask *, NSError *))failure { NSString *apiPath = [NSString stringWithFormat:@"https://%@/cart/add.js",Shopify_SHOP_DOMAIN]; id params = @{ @"id":variantId, @"quantity":@(quantity), }; return [self makeSessionTask:KWMHTTPMethodPOST apiPath:apiPath parameters:params result:[KWMDictionaryResult class] model:nil success:success failure:failure]; } -(NSURLSessionDataTask *)getCartSuccess:(void (^)(NSURLSessionDataTask *, KWMCartResult *))success failure:(void (^)(NSURLSessionDataTask *, NSError *))failure { NSString *apiPath = [NSString stringWithFormat:@"https://%@/cart.js",Shopify_SHOP_DOMAIN]; return [self makeSessionTask:KWMHTTPMethodGET apiPath:apiPath parameters:nil result:[KWMCartResult class] model:nil success:success failure:failure]; } - (NSURLSessionDataTask *)tmpCartWithVariantId:(NSNumber *)variantId quantity:(NSInteger)quantity success:(void (^)(NSURLSessionDataTask *, NSString *))success failure:(void (^)(NSURLSessionDataTask *, NSError *))failure { NSString *apiPath = [NSString stringWithFormat:@"https://%@/cart/add.js",Shopify_SHOP_DOMAIN]; id params = @{ @"id":variantId, @"quantity":@(quantity), }; AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; [manager.requestSerializer setHTTPShouldHandleCookies:NO]; NSString *cookie = [[KWMHttpUtil buildRequestCookieString] stringByReplacingOccurrencesOfRegex:@"cart=.*?; ?" withString:@""]; [manager.requestSerializer setValue:cookie forHTTPHeaderField:@"Cookie"]; return [manager POST:apiPath parameters:params success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) { NSHTTPURLResponse *response = (NSHTTPURLResponse *)task.response; NSString *cartCookie = [response.allHeaderFields[@"Set-Cookie"] stringByMatching:@"cart=(.*?);" capture:1]; success(task,cartCookie); } failure:failure]; } /** * 手机登录-获取短信API * @param parameters {mobile=?手机号} * @param success 成功callback * @param failure 失败callback * @return NSURLSessionDataTask */ - (NSURLSessionDataTask *) phoneSms:(NSDictionary *)parameters success:(void(^)(NSURLSessionDataTask *task,KWMCemaroseResult *result))success failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{ NSString *apiPath = [NSString stringWithFormat:@"/shopifyapps/china_social_login/%@/api-verify-code",Cemarose_KEY]; return [self startSessionTask:KWMHTTPMethodGET apiPath:apiPath parameters:parameters result:[KWMCemaroseResult class] model:nil success:success failure:failure]; } /** * 获取所有品牌 * @return NSURLSessionDataTask */ - (NSURLSessionDataTask *) getAllBrand:(NSDictionary *)parameters success:(void(^)(NSURLSessionDataTask *task,KWMBrandsResult *result))success failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{ NSString *apiPath = @"shopifyapps/product_search/cemarose/brands"; return [self startSessionTask:KWMHTTPMethodGET apiPath:apiPath parameters:parameters result:[KWMBrandsResult class] model:nil success:success failure:failure]; } /** * 搜索API * @param parameters {keyword=?搜索内容} * @return NSURLSessionDataTask */ - (NSURLSessionDataTask *) searchProduct:(NSDictionary *)parameters success:(void(^)(NSURLSessionDataTask *task,KWMSearchResult *result))success failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{ NSString *apiPath = @"shopifyapps/product_search/cemarose/search"; return [self startSessionTask:KWMHTTPMethodGET apiPath:apiPath parameters:parameters result:[KWMSearchResult class] model:nil success:success failure:failure]; } /** * 博客API * @return NSURLSessionDataTask */ - (NSURLSessionDataTask *) getAllBlog:(NSDictionary *)parameters success:(void(^)(NSURLSessionDataTask *task,KWMBlogResult *result))success failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure;{ NSString *apiPath = [[NSString alloc] initWithFormat:@"https://%@/admin/articles.json",Shopify_SHOP_DOMAIN]; return [self startSessionTask:KWMHTTPMethodGET apiPath:apiPath parameters:parameters result:[KWMBlogResult class] model:nil success:success failure:failure]; } /** * 商品——新品API * @return NSURLSessionDataTask */ - (NSURLSessionDataTask *) getNewProducts:(NSDictionary *)parameters success:(void(^)(NSURLSessionDataTask *task,KWMNewProducts *result))success failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{ NSString *apiPath = @"https://ogbgohpla.qnssl.com/App.Home.New.json"; NSTimeInterval interval = [[NSDate date] timeIntervalSince1970]/100; long long time = interval; apiPath = [[NSString alloc] initWithFormat:@"%@?_=%llu", apiPath, time]; return [self startSessionTask:KWMHTTPMethodGET apiPath:apiPath parameters:parameters result:[KWMNewProducts class] model:[KWMNewGoodsModel class] success:success failure:failure]; } /** * 商品——打折API * @return NSURLSessionDataTask */ - (NSURLSessionDataTask *) getDiscountProducts:(NSDictionary *)parameters success:(void(^)(NSURLSessionDataTask *task,KWMNewProducts *result))success failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{ NSString *apiPath = @"https://ogbgohpla.qnssl.com/App.Home.SALE.json"; NSTimeInterval interval = [[NSDate date] timeIntervalSince1970]/100; long long time = interval; apiPath = [[NSString alloc] initWithFormat:@"%@?_=%llu", apiPath, time]; return [self startSessionTask:KWMHTTPMethodGET apiPath:apiPath parameters:parameters result:[KWMNewProducts class] model:[KWMNewGoodsModel class] success:success failure:failure]; } /** * 获取商品分类API * @return NSURLSessionDataTask */ - (NSURLSessionDataTask *) getProductTypes:(NSDictionary *)parameters type:(NSInteger)type success:(void(^)(NSURLSessionDataTask *task,KWMProductTypeResult *result))success failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{ NSString *apiPath = @"https://ogbgohpla.qnssl.com/Baby.Navigation.json"; if(type == 0){ apiPath = @"https://ogbgohpla.qnssl.com/Baby.Navigation.json"; }else if(type == 1){ apiPath = @"https://ogbgohpla.qnssl.com/Girls.Navigation.json"; }else if(type == 2){ apiPath = @"https://ogbgohpla.qnssl.com/Boys.Navigation.json"; }else if(type == 3){ apiPath = @"https://ogbgohpla.qnssl.com/Shoes.Navigation.json"; } NSTimeInterval interval = [[NSDate date] timeIntervalSince1970]/100; long long time = interval; apiPath = [[NSString alloc] initWithFormat:@"%@?_=%llu", apiPath, time]; return [self startSessionTask:KWMHTTPMethodGET apiPath:apiPath parameters:parameters result:[KWMProductTypeResult class] model:[KWMProductType class] success:success failure:failure]; } /** * 品牌类型--API * @return NSURLSessionDataTask */ - (NSURLSessionDataTask *) getBrandsType:(NSDictionary *)parameters success:(void(^)(NSURLSessionDataTask *task,KWMBrandsTypeResult *result))success failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{ NSString *apiPath = @"https://ogbgohpla.qnssl.com/Designers.json"; NSTimeInterval interval = [[NSDate date] timeIntervalSince1970]/100; long long time = interval; apiPath = [[NSString alloc] initWithFormat:@"%@?_=%llu", apiPath, time]; return [self startSessionTask:KWMHTTPMethodGET apiPath:apiPath parameters:parameters result:[KWMBrandsTypeResult class] model:[KWMBrandsTypeModel class] success:success failure:failure]; } /** * 汇率--API * @return NSURLSessionDataTask */ - (NSURLSessionDataTask *) getExchangeRate:(NSDictionary *)parameters success:(void(^)(NSURLSessionDataTask *task,KWMExchangeRateResult *result))success failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{ #if DEBUG NSString *apiPath = @"https://liang.tofnews.com/app/exchange/rate"; #else NSString *apiPath = @"https://apps.cemarose.com/app/exchange/rate"; #endif // NSString *sign = [KWMStringUtil MD5:[KWMStringUtil BASE64:@"currency=EUR&key=bd3f58f5cd3d7a217ac8c8e655ab52f8"]]; // NSLog(@"rate sign: %@",sign); // NSDictionary *params = @{@"currency":@"EUR",@"sign":sign}; NSDictionary *params = @{@"currency":@"EUR",@"sign":@"665d9716511eb11f68a1a7a862ed2ddd"}; return [self startSessionTask:KWMHTTPMethodPOST apiPath:apiPath parameters:params result:[KWMExchangeRateResult class] model:nil success:success failure:failure]; } /** * 获取相关图片api * @return NSURLSessionDataTask */ - (NSURLSessionDataTask *) getProductImages:(NSDictionary *)parameters productId:(NSNumber *)productId success:(void(^)(NSURLSessionDataTask *task,KWMImagesResult *result))success failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{ NSString *apiPath = [[NSString alloc] initWithFormat:@"https://%@/admin/products/%@/metafields.json",Shopify_SHOP_DOMAIN,productId.stringValue]; return [self startSessionTask:KWMHTTPMethodGET apiPath:apiPath parameters:parameters result:[KWMImagesResult class] model:[KWMImage class] success:success failure:failure]; } /** * 获取获取某个订单api * @return NSURLSessionDataTask */ - (NSURLSessionDataTask *) getAdminOrder:(NSDictionary *)parameters orderId:(NSNumber *)orderId success:(void(^)(NSURLSessionDataTask *task,KWMOrdersResult *result))success failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{ NSString *apiPath = [[NSString alloc] initWithFormat:@"https://%@/admin/orders.json?ids=%@",Shopify_SHOP_DOMAIN,orderId.stringValue]; return [self startSessionTask:KWMHTTPMethodGET apiPath:apiPath parameters:parameters result:[KWMOrdersResult class] model:[KWMOrder class] success:success failure:failure]; } /** * 获取商品api,因為admin商品有剩余库存数量字段,所以商品詳細還需要請求此api。 * @return NSURLSessionDataTask */ - (NSURLSessionDataTask *) getAdminProduct:(NSDictionary *)parameters productId:(NSNumber *)productId success:(void(^)(NSURLSessionDataTask *task,KWMProductResult *result))success failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{ NSString *apiPath = [[NSString alloc] initWithFormat:@"https://%@/admin/products/%@.json",Shopify_SHOP_DOMAIN,productId.stringValue]; return [self startSessionTask:KWMHTTPMethodGET apiPath:apiPath parameters:parameters result:[KWMProductResult class] model:[KWMProduct class] success:success failure:failure]; } /** * 取消订单api * amount 退款金额 (default: false)(十进制:21.20)If set, Shopify will attempt to void/refund the payment depending on the status. * restock 是否将此订单商品重新包装会商店 (default: false) * reason 订单取消原因 (用户customer, 库存inventory, 假货fraud, 其他other)(default: other) * email 发送邮箱通知用户 (default: false) * refund 更复杂的退款方式 As specified in the Refund documentation. Required for some more complex refund situations. * @return NSURLSessionDataTask */ - (NSURLSessionDataTask *) cancelOrder:(NSDictionary *)parameters orderId:(NSNumber *)orderId success:(void(^)(NSURLSessionDataTask *task,KWMProductResult *result))success failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{ NSString *apiPath = [[NSString alloc] initWithFormat:@"https://%@/admin/orders/%@/cancel.json",Shopify_SHOP_DOMAIN,orderId.stringValue]; return [self startSessionTask:KWMHTTPMethodGET apiPath:apiPath parameters:parameters result:[KWMCemaroseResult class] model:nil success:success failure:failure]; } /** * 微信统一下单API * checkout_token shopify订单token * total_price 订单总金额 * ip_address 手机IP * subject 订单描述 * sign 签名验证 * 签名规则 * str_sign = "ip_address=127.0.0.1&checkout_token=5173547165345&subject=test&total_price=23423&key=bd3f58f5cd3d7a217ac8c8e655ab52f8"; * sign = md5(base64_encode($str_sign)); * * @return NSURLSessionDataTask */ - (NSURLSessionDataTask *) wechatPayUnifiedOrder:(NSDictionary *)parameters success:(void(^)(NSURLSessionDataTask *task,KWMCheckoutPayResult *result))success failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{ NSString *apiPath = @"https://peter.tofnews.com/wechatpay/app/unified_order"; return [self startSessionTask:KWMHTTPMethodPOST apiPath:apiPath parameters:parameters result:[KWMCheckoutPayResult class] model:[KWMWechatPayData class] success:success failure:failure]; } /** * 支付宝统一下单API * checkout_token shopify订单token * total_price 订单总金额 * subject 订单描述 * sign 签名验证 * 签名规则 * str_sign = checkout_token=5173547165345&subject=test&total_price=23423&key=bd3f58f5cd3d7a217ac8c8e655ab52f8"; * sign = md5(base64_encode($str_sign)); * * @return NSURLSessionDataTask */ - (NSURLSessionDataTask *) aliPayUnifiedOrder:(NSDictionary *)parameters success:(void(^)(NSURLSessionDataTask *task,KWMCheckoutPayResult *result))success failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{ NSString *apiPath = @"https://peter.tofnews.com/alipay/app/unified_order"; return [self startSessionTask:KWMHTTPMethodPOST apiPath:apiPath parameters:parameters result:[KWMCheckoutPayResult class] model:nil success:success failure:failure]; } - (NSURLSessionDataTask *) wechatPayOrderQuery:(NSDictionary *)parameters success:(void(^)(NSURLSessionDataTask *task,KWMCheckoutPayResult *result))success failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{ NSString *apiPath = @"https://peter.tofnews.com/wechatpay/order/query"; return [self startSessionTask:KWMHTTPMethodPOST apiPath:apiPath parameters:parameters result:[KWMCheckoutPayResult class] model:nil success:success failure:failure]; } - (NSURLSessionDataTask *) aliPayOrderQuery:(NSDictionary *)parameters success:(void(^)(NSURLSessionDataTask *task,KWMCheckoutPayResult *result))success failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{ NSString *apiPath = @"https://peter.tofnews.com/alipay/order/query"; return [self startSessionTask:KWMHTTPMethodPOST apiPath:apiPath parameters:parameters result:[KWMCheckoutPayResult class] model:nil success:success failure:failure]; } @end