// // APHandleManager.m // LekangGuard // // Created by ecell on 2022/10/10. // #import "APHandleManager.h" #import "NSString+XHMD5.h" #import @interface APHandleManager() @property(nonatomic,copy) void(^wachatSuccessBlock)(NSDictionary *authInfo); @property(nonatomic,copy) void(^successBlock)(HandleStatus code); @property(nonatomic,copy) void(^failBlock)(HandleStatus code); @end @implementation APHandleManager + (instancetype)sharedManager{ static dispatch_once_t onceToken; static APHandleManager *instance; dispatch_once(&onceToken, ^{ instance = [[APHandleManager alloc] init]; }); return instance; } - (void)registerHandle { [WXApi registerApp:WXAPPID universalLink:@"https://www.jrhx.com.cn/"]; //[WeiboSDK registerApp:WEIBO_OPEN_APPID]; } - (BOOL)handleOpenURL:(NSURL *)url { if ([url.absoluteString containsString:WXAPPID]) { //微信或者分享 return [WXApi handleOpenURL:url delegate:self]; } // else if ([url.host isEqualToString:@"safepay"]) // { // // 支付跳转宝钱包进行支付,处理支付结果 // [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) { // //【由于在跳转支付宝客户端支付的过程中,商户app在后台很可能被系统kill了,所以pay接口的callback就会失效,请商户对standbyCallback返回的回调结果进行处理,就是在这个方法里面处理跟callback一样的逻辑】 // NSLog(@"result = %@",resultDic); // NSInteger resultCode = [resultDic[@"resultStatus"] integerValue]; // switch (resultCode) { // case 9000:{ // //支付成功 // self.successBlock ? self.successBlock(HandleStatus_Success) : nil; // self.payReturnMsg(resultDic); // break; // } // case 6001:{ // //支付取消 // self.failBlock ? self.failBlock(HandleStatus_Cancel) : nil; // break; // } // default:{ // //支付失败 // self.failBlock ? self.failBlock(HandleStatus_Error) : nil; // break; // } // } // }]; // // // 授权跳转宝钱包进行支付,处理支付结果 // [[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?:@""); // }]; // } return YES; } #pragma mark - WXApiDelegate //微信和分享和QQ分享回调都会调用这个方法 - (void)onResp:(BaseResp *)resp { NSLog(@"%d",resp.errCode); if ([resp isKindOfClass:SendMessageToWXResp.class]) { //微信分享 switch (resp.errCode) { case WXSuccess: { self.successBlock ? self.successBlock(HandleStatus_Success) : nil; break; } case WXErrCodeUserCancel: { self.failBlock ? self.failBlock(HandleStatus_Cancel) : nil; break; } default: { self.failBlock ? self.failBlock(HandleStatus_Error) : nil; break; } } } else if ([resp isKindOfClass:SendAuthResp.class]) { //微信登录、绑定微信 SendAuthResp *authResp = (SendAuthResp *)resp; switch (resp.errCode) { case WXSuccess:{ NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; [parameters setValue:authResp.code forKey:@"code"]; [parameters setValue:WXAPPID forKey:@"appid"]; [parameters setValue:@"authorization_code" forKey:@"grant_type"]; [parameters setValue:WXAPPSecret forKey:@"secret"]; [self GetWXUserMessage:parameters]; break; } case WXErrCodeUserCancel:{ self.failBlock ? self.failBlock(HandleStatus_Cancel) : nil; break; } default:{ self.failBlock ? self.failBlock(HandleStatus_Error) : nil; break; } } } else if ([resp isKindOfClass:PayResp.class]) { //微信 switch (resp.errCode) { case WXSuccess:{ self.successBlock ? self.successBlock(HandleStatus_Success) : nil; break; } case WXErrCodeUserCancel:{ self.failBlock ? self.failBlock(HandleStatus_Cancel) : nil; break; } default:{ self.failBlock ? self.failBlock(HandleStatus_Error) : nil; break; } } } } - (void)wxAppletPayWithUserName:(NSString *)userName path:(NSString *)path success:(void(^)(HandleStatus code))successBlock failure:(void(^)(HandleStatus code))failBlock { self.successBlock = successBlock; self.failBlock = failBlock; WXLaunchMiniProgramReq *launchMiniProgramReq = [WXLaunchMiniProgramReq object]; launchMiniProgramReq.userName = userName; launchMiniProgramReq.path = path; launchMiniProgramReq.miniProgramType = WXMiniProgramTypeRelease; if(![WXApi isWXAppInstalled]) { failBlock ? failBlock(HandleStatus_Error) : nil; return ; } if (![WXApi isWXAppSupportApi]) { failBlock ? failBlock(HandleStatus_Error) : nil; return ; } [WXApi sendReq:launchMiniProgramReq completion:^(BOOL success) { }]; //[WXApi sendReq:launchMiniProgramReq]; } /// 微信 /// @param model 订单信息 /// @param successBlock 成功回调 /// @param failBlock 失败回调 - (void)wxPay:(NSDictionary *)model success:(void(^)(HandleStatus code))successBlock failure:(void(^)(HandleStatus code))failBlock { self.successBlock = successBlock; self.failBlock = failBlock; PayReq *req = [PayReq new]; req.partnerId = [model objectForKey:@"mchId"]; req.prepayId = [model objectForKey:@"prepay_id"]; req.nonceStr = [model objectForKey:@"noncestr"]; req.timeStamp = [[model objectForKey:@"timestamp"] intValue]; req.package = @"Sign=WXPay"; req.sign = [model objectForKey:@"sign"]; if(![WXApi isWXAppInstalled]) { failBlock ? failBlock(HandleStatus_Error) : nil; return ; } if (![WXApi isWXAppSupportApi]) { failBlock ? failBlock(HandleStatus_Error) : nil; return ; } [WXApi sendReq:req completion:^(BOOL success) { }]; } //#pragma mark - 支付宝客户端 //- (void) //aliPayWithPayParam:(NSString *)pay_param // success:(void(^)(HandleStatus code))successBlock // failure:(void(^)(HandleStatus code))failBlock{ // // self.successBlock = successBlock; // self.failBlock = failBlock; // NSString *appScheme = @"zfb93d41c37680e5656"; // [[AlipaySDK defaultService] payOrder:pay_param fromScheme:appScheme callback:^(NSDictionary *resultDic) { // NSInteger resultCode = [resultDic[@"resultStatus"] integerValue]; // switch (resultCode) { // case 9000:{ // //支付成功 // self.successBlock ? self.successBlock(HandleStatus_Success) : nil; // break; // } // case 6001:{ // //支付取消 // self.failBlock ? self.failBlock(HandleStatus_Cancel) : nil; // break; // } // default:{ // //支付失败 // self.failBlock ? self.failBlock(HandleStatus_Error) : nil; // break; // } // } // }]; // //} // //#pragma mark - 支付宝网页 //- (void)aliPayHtmlWithURL:(NSString *)url // success:(void(^)(HandleStatus code))successBlock // failure:(void(^)(HandleStatus code))failBlock //{ // // self.successBlock = successBlock; // self.failBlock = failBlock; // NSString *appScheme = @"zfb93d41c37680e5656"; // // [[AlipaySDK defaultService] payInterceptorWithUrl:url fromScheme:appScheme callback:^(NSDictionary *resultDic) { // NSInteger resultCode = [resultDic[@"resultStatus"] integerValue]; // switch (resultCode) { // case 9000:{ // //支付成功 // self.successBlock ? self.successBlock(HandleStatus_Success) : nil; // break; // } // case 6001:{ // //支付取消 // self.failBlock ? self.failBlock(HandleStatus_Cancel) : nil; // break; // } // default:{ // //支付失败 // self.failBlock ? self.failBlock(HandleStatus_Error) : nil; // break; // } // } // }]; // //} - (void)shareToPlatform:(SharePlatform)platform image:(UIImage *)image success:(void(^)(HandleStatus code))successBlock failure:(void(^)(HandleStatus code))failBlock{ self.successBlock = successBlock; self.failBlock = failBlock; if (platform == SharePlatform_Session || platform == SharePlatform_Timeline) { //微信 SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; //发送消息的类型,包括文本消息和多媒体消息两种,两者只能选择其一,不能同时发送文本和多媒体消息 req.bText = NO; if (platform == SharePlatform_Session) { req.scene = WXSceneSession; }else{ req.scene = WXSceneTimeline; } WXImageObject *imageObj = [WXImageObject object]; imageObj.imageData = UIImageJPEGRepresentation(image, 1.0); WXMediaMessage *message = [WXMediaMessage message]; message.mediaObject = imageObj; req.message = message; [WXApi sendReq:req completion:^(BOOL success) { }]; // [WXApi sendReq:req]; } } - (void)shareToPlatform:(SharePlatform)platform title:(NSString *)title description:(NSString *)description image:(UIImage *)image link:(NSString *)link success:(void(^)(HandleStatus code))successBlock failure:(void(^)(HandleStatus code))failBlock { self.successBlock = successBlock; self.failBlock = failBlock; if (platform == SharePlatform_Session || platform == SharePlatform_Timeline) { //微信 SendMessageToWXReq *req = [[SendMessageToWXReq alloc]init]; // 是否是文档 req.bText = NO; if (platform == SharePlatform_Session) { req.scene = WXSceneSession; } else { req.scene = WXSceneTimeline; } //创建分享内容对象 WXMediaMessage *urlMessage = [WXMediaMessage message]; //分享标题 urlMessage.title = title; //分享描述 urlMessage.description = description; //分享图片,使用SDK的setThumbImage方法可压缩图片大小 [urlMessage setThumbImage:image]; //创建多媒体对象 WXWebpageObject *webObj = [WXWebpageObject object]; //分享链接 webObj.webpageUrl = link; //完成发送对象实例 urlMessage.mediaObject = webObj; req.message = urlMessage; //发送分享信息 [WXApi sendReq:req completion:^(BOOL success) { }]; } } - (void)authorizationWachat:(void(^)(NSDictionary *authInfo))successBlock failure:(void(^)(HandleStatus code))failBlock{ self.wachatSuccessBlock = successBlock; self.failBlock = failBlock; NSInteger random = arc4random() % 1000; NSString *state = [NSString stringWithFormat:@"wx_auth_hx_%zd",random]; //构造SendAuthReq结构体 SendAuthReq* req = [[SendAuthReq alloc] init]; req.scope = @"snsapi_userinfo"; req.state = [state MD5Hash]; //第三方向微信终端发送一个SendAuthReq消息结构 [WXApi sendReq:req completion:^(BOOL success) { }]; } - (BOOL)handleOpenUniversalLink:(NSUserActivity *)userActivity { NSString *path = userActivity.webpageURL.path; if ([path containsString:WXAPPID]) { return [WXApi handleOpenUniversalLink:userActivity delegate:self]; } return YES; } - (void)GetWXUserMessage:(NSDictionary *)parameters { kWeakSelf(self) AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager.requestSerializer = [AFJSONRequestSerializer serializer]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; [manager GET:@"https://api.weixin.qq.com/sns/oauth2/access_token" parameters:parameters headers:nil progress:^(NSProgress * _Nonnull downloadProgress) {} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSData *data = (NSData *)responseObject; NSDictionary *obj = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; NSLog(@"%@",obj); if (obj) { NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; [userDefaults setObject:obj forKey:@"WXOPENMSG"]; [userDefaults synchronize]; [weakself getUserInfoWithAccessToken:obj[@"access_token"] andOpenId:obj[@"openid"]]; } } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { weakself.failBlock ? weakself.failBlock(HandleStatus_Error) : nil; }]; } - (void)getUserInfoWithAccessToken:(NSString *)accessToken andOpenId:(NSString *)openId { kWeakSelf(self) NSString *urlString =[NSString stringWithFormat:@"https://api.weixin.qq.com/sns/userinfo?access_token=%@&openid=%@",accessToken,openId]; NSURL *url = [NSURL URLWithString:urlString]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSString *dataStr = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil]; NSData *data = [dataStr dataUsingEncoding:NSUTF8StringEncoding]; dispatch_async(dispatch_get_main_queue(), ^{ if (data) { NSMutableDictionary *dict = [NSMutableDictionary new]; dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; if ([dict objectForKey:@"errcode"]) { //AccessToken失效 weakself.failBlock ? self.failBlock(HandleStatus_Error) : nil; } else { //dict[@"sex"] = [dict[@"sex"]integerValue] == 0 ? @"0" : @"1"; weakself.wachatSuccessBlock ? weakself.wachatSuccessBlock(dict) : nil; } } }); }); } @end