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

//
// 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