You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
453 lines
16 KiB
453 lines
16 KiB
// |
|
// APHandleManager.m |
|
// LekangGuard |
|
// |
|
// Created by ecell on 2022/10/10. |
|
// |
|
|
|
#import "APHandleManager.h" |
|
#import "NSString+XHMD5.h" |
|
#import <AFNetworking/AFNetworking.h> |
|
|
|
@interface APHandleManager()<WXApiDelegate> |
|
|
|
@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
|
|
|