diff --git a/node_modules/expo-native-alipay/ios/ExpoNativeAlipayDelegate.swift b/node_modules/expo-native-alipay/ios/ExpoNativeAlipayDelegate.swift index d5c3506..331addd 100644 --- a/node_modules/expo-native-alipay/ios/ExpoNativeAlipayDelegate.swift +++ b/node_modules/expo-native-alipay/ios/ExpoNativeAlipayDelegate.swift @@ -9,34 +9,17 @@ import ExpoModulesCore import AlipaySDK public class ExpoNativeAlipayDelegate: ExpoAppDelegateSubscriber { - // 适配 iOS 9 及以上 - public func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:], appContext: AppContext?) -> Bool { + // 适配标准 UIApplicationDelegate (3 参数签名,匹配 ExpoAppDelegateSubscriberManager 的调用) + public func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { if url.host == "safepay" { // 支付跳转支付宝钱包进行支付,处理支付结果 AlipaySDK.defaultService()?.processOrder(withPaymentResult: url, standbyCallback: { resultDic in - self.sendAlipayResult(resultDic, appContext: appContext) + self.sendAlipayResult(resultDic) }) // 授权跳转支付宝钱包进行支付,处理支付结果 AlipaySDK.defaultService()?.processAuth_V2Result(url, standbyCallback: { resultDic in - self.sendAlipayResult(resultDic, appContext: appContext) - }) - return true - } - return false - } - - // 兼容 iOS 8 及以下(如需支持) - public func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any, appContext: AppContext?) -> Bool { - if url.host == "safepay" { - // 支付跳转支付宝钱包进行支付,处理支付结果 - AlipaySDK.defaultService()?.processOrder(withPaymentResult: url, standbyCallback: { resultDic in - self.sendAlipayResult(resultDic, appContext: appContext) - }) - - // 授权跳转支付宝钱包进行支付,处理支付结果 - AlipaySDK.defaultService()?.processAuth_V2Result(url, standbyCallback: { resultDic in - self.sendAlipayResult(resultDic, appContext: appContext) + self.sendAlipayResult(resultDic) }) return true } @@ -44,36 +27,26 @@ public class ExpoNativeAlipayDelegate: ExpoAppDelegateSubscriber { } // 处理 Universal Link 回调 - public func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void, appContext: AppContext?) -> Bool { + public func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { if userActivity.activityType == NSUserActivityTypeBrowsingWeb { AlipaySDK.defaultService()?.handleOpenUniversalLink(userActivity, standbyCallback: { resultDic in - self.sendAlipayResult(resultDic, appContext: appContext) + self.sendAlipayResult(resultDic) }) } return true } - private func sendAlipayResult(_ resultDic: [AnyHashable: Any]?, appContext: AppContext?) { - var module: ExpoNativeAlipayModule? = nil - - if let appContext = appContext { - // 新版优先 - if let moduleRegistry = appContext.value(forKey: "moduleRegistry") as? NSObject, - let m = moduleRegistry.perform(NSSelectorFromString("getModuleImplementingProtocol:"), with: ExpoNativeAlipayModule.self)?.takeUnretainedValue() as? ExpoNativeAlipayModule { - module = m - } else if let m = appContext.perform(NSSelectorFromString("getModule:"), with: ExpoNativeAlipayModule.self)?.takeUnretainedValue() as? ExpoNativeAlipayModule { - // 旧版 - module = m - } + private func sendAlipayResult(_ resultDic: [AnyHashable: Any]?) { + guard let module = ExpoNativeAlipayModule.shared else { + print("[ExpoNativeAlipay] WARNING: Module.shared is nil, cannot resolve pay promise!") + return } - if let module = module { - // 判断是支付还是授权,根据 resultDic 内容区分 - if let result = resultDic?["result"] as? String, result.contains("auth_code=") { - module.handleAlipayAuthResult(resultDic ?? [:]) - } else { - module.handleAlipayResult(resultDic ?? [:]) - } + // 判断是支付还是授权,根据 resultDic 内容区分 + if let result = resultDic?["result"] as? String, result.contains("auth_code=") { + module.handleAlipayAuthResult(resultDic ?? [:]) + } else { + module.handleAlipayResult(resultDic ?? [:]) } } } \ No newline at end of file diff --git a/node_modules/expo-native-alipay/ios/ExpoNativeAlipayModule.swift b/node_modules/expo-native-alipay/ios/ExpoNativeAlipayModule.swift index 2d925ec..a72ae4e 100644 --- a/node_modules/expo-native-alipay/ios/ExpoNativeAlipayModule.swift +++ b/node_modules/expo-native-alipay/ios/ExpoNativeAlipayModule.swift @@ -2,6 +2,7 @@ import ExpoModulesCore import AlipaySDK public class ExpoNativeAlipayModule: Module { + public static var shared: ExpoNativeAlipayModule? private var alipayScheme: String? private var payPromise: Promise? private var authPromise: Promise? @@ -10,6 +11,11 @@ public class ExpoNativeAlipayModule: Module { public func definition() -> ModuleDefinition { Name("ExpoNativeAlipay") + + OnCreate { + ExpoNativeAlipayModule.shared = self + } + /** * 注册接口 * @@ -46,6 +52,17 @@ public class ExpoNativeAlipayModule: Module { let version = AlipaySDK.defaultService()?.currentVersion() ?? "" promise.resolve(version) } + + AsyncFunction("processOrder") { (urlStr: String, promise: Promise) in + if let url = URL(string: urlStr) { + AlipaySDK.defaultService()?.processOrder(withPaymentResult: url, standbyCallback: { resultDic in + self.handleAlipayResult(resultDic ?? [:]) + promise.resolve(resultDic) + }) + } else { + promise.resolve(nil) + } + } } // 处理支付结果 diff --git a/node_modules/expo-native-alipay/src/ExpoNativeAlipay.types.ts b/node_modules/expo-native-alipay/src/ExpoNativeAlipay.types.ts index 0969717..310aeec 100644 --- a/node_modules/expo-native-alipay/src/ExpoNativeAlipay.types.ts +++ b/node_modules/expo-native-alipay/src/ExpoNativeAlipay.types.ts @@ -48,6 +48,11 @@ export interface OrderResultStr { sign_type: 'RSA2' | 'RSA'; } +/** + * 处理外部跳转回来的支付宝 URL (主要是为了给拦截了 URL 的框架手动处理用) + */ +export declare function processOrder(url: string): Promise; + /** * 支付订单返回结果 * @returns 成功返回 diff --git a/node_modules/expo-native-alipay/src/ExpoNativeAlipayModule.ts b/node_modules/expo-native-alipay/src/ExpoNativeAlipayModule.ts index 2f22a8f..03dead7 100644 --- a/node_modules/expo-native-alipay/src/ExpoNativeAlipayModule.ts +++ b/node_modules/expo-native-alipay/src/ExpoNativeAlipayModule.ts @@ -60,6 +60,14 @@ export function getVersion(): Promise { return ExpoNativeAlipay.getVersion() } +/** + * 手动处理外部唤起返回的支付 URL + * @param url App 唤起的 URL + */ +export function processOrder(url: string): Promise { + return ExpoNativeAlipay.processOrder(url) +} + /** * 设置支付宝跳转Scheme,仅 iOS * @param scheme diff --git a/node_modules/expo-native-alipay/src/index.ts b/node_modules/expo-native-alipay/src/index.ts index 1a1b5d0..3e7f3cb 100644 --- a/node_modules/expo-native-alipay/src/index.ts +++ b/node_modules/expo-native-alipay/src/index.ts @@ -1,4 +1,5 @@ // Reexport the native module. On web, it will be resolved to ExpoNativeAlipayModule.web.ts // and on native platforms to ExpoNativeAlipayModule.ts export * from './ExpoNativeAlipay.types'; -export { authInfo, default, getVersion, alipay, setAlipaySandbox, setAlipayScheme } from './ExpoNativeAlipayModule'; +export { alipay, authInfo, default, getVersion, processOrder, setAlipaySandbox, setAlipayScheme } from './ExpoNativeAlipayModule'; +