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