#import "TobiasPlugin.h" #import <AlipaySDK/AlipaySDK.h> __weak TobiasPlugin* __tobiasPlugin; @interface TobiasPlugin() @property (readwrite,copy,nonatomic) FlutterResult callback; @end @implementation TobiasPlugin -(id)init{ if(self = [super init]){ __tobiasPlugin = self; } return self; } -(void)dealloc{ } + (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar { FlutterMethodChannel* channel = [FlutterMethodChannel methodChannelWithName:@"com.jarvanmo/tobias" binaryMessenger:[registrar messenger]]; TobiasPlugin* instance = [[TobiasPlugin alloc] init]; [registrar addMethodCallDelegate:instance channel:channel]; [registrar addApplicationDelegate:instance]; } - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { if ([@"pay" isEqualToString:call.method]) { [self pay:call result:result]; } else if([@"version" isEqualToString:call.method]){ [self getVersion:call result:result]; } else if([@"auth" isEqualToString:call.method]){ [self _auth:call result:result]; } else if([@"isAliPayInstalled" isEqualToString:call.method]){ [self _isAliPayInstalled:call result:result]; }else{ result(FlutterMethodNotImplemented); } } - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [self handleOpenURL:url]; } // NOTE: 9.0以后使用新API接口 - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *, id> *)options { return [self handleOpenURL:url]; } +(BOOL)handleOpenURL:(NSURL*)url{ if(!__tobiasPlugin)return NO; return [__tobiasPlugin handleOpenURL:url]; } -(BOOL)handleOpenURL:(NSURL*)url{ if ([url.host isEqualToString:@"safepay"]) { __weak TobiasPlugin* __self = self; [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) { [__self onPayResultReceived:resultDic]; }]; [[AlipaySDK defaultService] processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) { [__self onAuthResultReceived:resultDic]; }]; return YES; } return NO; } -(void)onPayResultReceived:(NSDictionary*)resultDic{ if(self.callback!=nil){ NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionaryWithDictionary:resultDic]; [mutableDictionary setValue:@"iOS" forKey:@"platform"]; self.callback(mutableDictionary); self.callback = nil; } } -(void)onAuthResultReceived:(NSDictionary*)resultDic{ if(self.callback!=nil){ NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionaryWithDictionary:resultDic]; [mutableDictionary setValue:@"iOS" forKey:@"platform"]; self.callback(mutableDictionary); self.callback = nil; } } -(void) pay:(FlutterMethodCall*)call result:(FlutterResult)result{ NSString* urlScheme = [self fetchUrlScheme]; if(!urlScheme){ result([FlutterError errorWithCode:@"AliPay UrlScheme Not Found" message:@"Config AliPay First" details:nil]); return; } [self _pay:call result:result urlScheme:urlScheme]; } -(void) _pay:(FlutterMethodCall*)call result:(FlutterResult)result urlScheme:(NSString *)urlScheme{ self.callback = result; __weak TobiasPlugin* __self = self; [[AlipaySDK defaultService] payOrder:call.arguments[@"order"] fromScheme:urlScheme callback:^(NSDictionary *resultDic) { [__self onPayResultReceived:resultDic]; }]; } -(void) _auth:(FlutterMethodCall*)call result:(FlutterResult)result { NSString* urlScheme = [self fetchUrlScheme]; if(!urlScheme){ result([FlutterError errorWithCode:@"AliPay UrlScheme Not Found" message:@"Config AliPay First" details:nil]); return; } self.callback = result; __weak TobiasPlugin* __self = self; [[AlipaySDK defaultService] auth_V2WithInfo:call.arguments fromScheme:urlScheme callback:^(NSDictionary *resultDic) { [__self onAuthResultReceived:resultDic]; }]; } -(void) getVersion:(FlutterMethodCall*)call result:(FlutterResult)result{ NSString *version = [AlipaySDK defaultService].currentVersion; if(version == nil){ version = @""; } result(version); } -(NSString*)fetchUrlScheme{ NSDictionary *infoDic = [[NSBundle mainBundle] infoDictionary]; NSArray* types = infoDic[@"CFBundleURLTypes"]; for(NSDictionary* dic in types){ if([@"alipay" isEqualToString:dic[@"CFBundleURLName"]]){ return dic[@"CFBundleURLSchemes"][0]; } } return nil; } -(void) _isAliPayInstalled:(FlutterMethodCall*)call result:(FlutterResult)result { BOOL isAliPayInstalled = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"alipays://"]]||[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"alipay://"]]; result(@(isAliPayInstalled)); } @end