expo-alikit 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.eslintrc.js ADDED
@@ -0,0 +1,5 @@
1
+ module.exports = {
2
+ root: true,
3
+ extends: ['universe/native', 'universe/web'],
4
+ ignorePatterns: ['build'],
5
+ };
package/README.md ADDED
@@ -0,0 +1,87 @@
1
+ # expo-alipay
2
+
3
+ 支付宝支付与授权登录。React Native Alipay support.
4
+
5
+ ⚠️BETA WARNING: 本项目目前处于beta版本,如有任何问题,欢迎issue联系,但目前谨慎在生产项目中使用。⚠️
6
+
7
+ # 安装
8
+
9
+ ```shell
10
+ npx expo install expo-alikit
11
+ ```
12
+ 为什么是`expo-alikit`?因为`expo-alipay`的名字在npm中已经被占用,但后者看起来只是一个demo项目,目前我正在尝试联系作者,看看是否可以让他删掉那个仓库。
13
+ # 配置
14
+
15
+ 支付宝支付和授权登录,由于会涉及到唤起支付宝,跳回你的app,为了让支付宝能识别你的app,你需要配置URL Scheme或者 Universal Link。
16
+ 配置这两项,都需要在`app.json`中进行:
17
+
18
+ ```json
19
+ "ios": {
20
+ "scheme": [
21
+ "你的url scheme,需要与支付宝后台保持一致。"
22
+ ],
23
+ "associatedDomains": [
24
+ "applinks:example.com"
25
+ ]
26
+ }
27
+ ```
28
+
29
+ 通用连接配置部分可以参考一下[苹果官方文档](https://developer.apple.com/documentation/xcode/supporting-associated-domains)。
30
+
31
+ # 使用
32
+
33
+ > 注意,不支持在expo go中直接使用,请配合`expo-dev-client`一起使用。
34
+
35
+ ```ts
36
+ import ExpoAlipay from "expo-alipay";
37
+ ```
38
+
39
+ ## 支付
40
+
41
+ ```ts
42
+
43
+ /// 安卓Only,防黑产操作,推荐在调用支付前调用此方法。
44
+ /// https://opendocs.alipay.com/open/00dn75?pathHash=22ed0058#%E5%95%86%E6%88%B7appId%E6%B3%A8%E5%86%8C
45
+ await ExpoAlipay.registerApp(appId)
46
+
47
+ /// scheme和universalLink需要与app.json中的配置保持一致,仅iOS上需要提供这两个字段。
48
+ const result = await ExpoAlipay.pay({
49
+ orderInfo: "orderString",
50
+ scheme: undefined,
51
+ universalLink: undefined,
52
+ });
53
+ ```
54
+
55
+ 获取支付结果有两种办法。对于安卓平台,`pay`方法会直接返回支付结果,同时也会发布一条`onPayResult`事件。对于iOS平台,你只能通过`onPayResult`事件来获取支付结果。
56
+
57
+ ## 授权登录
58
+
59
+ ```ts
60
+ /// scheme和universalLink需要与app.json中的配置保持一致,仅iOS上需要提供这两个字段。
61
+ const result = await ExpoAlipay.auth({
62
+ authInfo: "authString",
63
+ scheme: undefined,
64
+ universalLink: undefined,
65
+ });
66
+ ```
67
+
68
+ 获取支付结果有两种办法。对于安卓平台,`auth`方法会直接返回支付结果,同时也会发布一条`onAuthResult`事件。对于iOS平台,你只能通过`onAuthResult`事件来获取支付结果。
69
+
70
+ ## 事件监听
71
+
72
+ ```ts
73
+ import ExpoAlipay from "expo-alipay";
74
+
75
+ /// 通过这种方式监听回调结果
76
+ const onPayResultPayload = useEvent(ExpoAlipay, 'onPayResult');
77
+
78
+ console.log(onPayResultPayload);
79
+ ```
80
+
81
+ # 联系我
82
+
83
+ QQ 群:682911244
84
+
85
+ # Roadmap
86
+
87
+ - [ ] 给支付宝返回数据添加类型。
@@ -0,0 +1,48 @@
1
+ apply plugin: 'com.android.library'
2
+
3
+ group = 'expo.modules.alipay'
4
+ version = '0.1.0'
5
+
6
+ def expoModulesCorePlugin = new File(project(":expo-modules-core").projectDir.absolutePath, "ExpoModulesCorePlugin.gradle")
7
+ apply from: expoModulesCorePlugin
8
+ applyKotlinExpoModulesCorePlugin()
9
+ useCoreDependencies()
10
+ useExpoPublishing()
11
+
12
+ // If you want to use the managed Android SDK versions from expo-modules-core, set this to true.
13
+ // The Android SDK versions will be bumped from time to time in SDK releases and may introduce breaking changes in your module code.
14
+ // Most of the time, you may like to manage the Android SDK versions yourself.
15
+ def useManagedAndroidSdkVersions = false
16
+ if (useManagedAndroidSdkVersions) {
17
+ useDefaultAndroidSdkVersions()
18
+ } else {
19
+ buildscript {
20
+ // Simple helper that allows the root project to override versions declared by this library.
21
+ ext.safeExtGet = { prop, fallback ->
22
+ rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
23
+ }
24
+ }
25
+ project.android {
26
+ compileSdkVersion safeExtGet("compileSdkVersion", 34)
27
+ defaultConfig {
28
+ minSdkVersion safeExtGet("minSdkVersion", 21)
29
+ targetSdkVersion safeExtGet("targetSdkVersion", 34)
30
+ }
31
+ }
32
+ }
33
+
34
+ android {
35
+ namespace "expo.modules.alipay"
36
+ defaultConfig {
37
+ versionCode 1
38
+ versionName "0.1.0"
39
+ }
40
+ lintOptions {
41
+ abortOnError false
42
+ }
43
+ }
44
+
45
+
46
+ dependencies {
47
+ api 'com.alipay.sdk:alipaysdk-android:15.8.35'
48
+ }
@@ -0,0 +1,5 @@
1
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android">
2
+ <uses-permission android:name="android.permission.INTERNET" />
3
+ <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
4
+ <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
5
+ </manifest>
@@ -0,0 +1,73 @@
1
+ package expo.modules.alipay
2
+
3
+ import android.util.Log
4
+ import com.alipay.sdk.app.AlipayApi
5
+ import com.alipay.sdk.app.AuthTask
6
+ import com.alipay.sdk.app.EnvUtils
7
+ import com.alipay.sdk.app.PayTask
8
+ import expo.modules.kotlin.Promise
9
+ import expo.modules.kotlin.modules.Module
10
+ import expo.modules.kotlin.modules.ModuleDefinition
11
+ import java.net.URL
12
+
13
+ class ExpoAlipayModule : Module() {
14
+ override fun definition() = ModuleDefinition {
15
+ Name("ExpoAlipay")
16
+
17
+ Events("onPayResult", "onAuthResult")
18
+
19
+ AsyncFunction("registerApp") { appId: String ->
20
+ appContext.reactContext.let {
21
+ AlipayApi.registerApp(it, appId)
22
+ }
23
+ }
24
+
25
+ AsyncFunction("getVersion") {
26
+ val payTask = PayTask(appContext.currentActivity)
27
+ return@AsyncFunction payTask.version
28
+ }
29
+
30
+ AsyncFunction("setSandboxMode") { mode: String ->
31
+
32
+ when (mode) {
33
+ "sandbox" -> {
34
+ EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX)
35
+ }
36
+
37
+ "online" -> {
38
+ EnvUtils.setEnv(EnvUtils.EnvEnum.ONLINE)
39
+ }
40
+
41
+ "pre_sandbox" -> {
42
+ EnvUtils.setEnv(EnvUtils.EnvEnum.PRE_SANDBOX)
43
+ }
44
+ }
45
+ }
46
+
47
+ AsyncFunction("auth") { options: AuthOptions, promise: Promise ->
48
+ val runnable = Runnable {
49
+ val alipay = AuthTask(appContext.currentActivity)
50
+ val result = alipay.authV2(options.authInfo, true)
51
+ promise.resolve(result)
52
+ sendEvent("onAuthResult", result)
53
+ }
54
+ Thread(runnable).start()
55
+ }
56
+
57
+ AsyncFunction("pay") { options: PayOptions, promise: Promise ->
58
+ val runnable = Runnable {
59
+ val alipay = PayTask(appContext.currentActivity)
60
+ val result = alipay.payV2(options.orderInfo, true)
61
+ promise.resolve(result)
62
+ sendEvent("onPayResult", result)
63
+ }
64
+
65
+ Thread(runnable).start()
66
+ }
67
+
68
+
69
+ AsyncFunction("startLog") {
70
+
71
+ }
72
+ }
73
+ }
@@ -0,0 +1,22 @@
1
+ package expo.modules.alipay
2
+
3
+ import expo.modules.kotlin.records.Field
4
+ import expo.modules.kotlin.records.Record
5
+
6
+ class PayOptions: Record {
7
+ @Field
8
+ var orderInfo: String = ""
9
+ @Field
10
+ var scheme: String? = null
11
+ @Field
12
+ var universalLink: String? = null
13
+ }
14
+
15
+ class AuthOptions: Record {
16
+ @Field
17
+ var authInfo: String = ""
18
+ @Field
19
+ var scheme: String? = null
20
+ @Field
21
+ var universalLink: String? = null
22
+ }
@@ -0,0 +1,17 @@
1
+ export type ExpoAlipayModuleEvents = {
2
+ onPayResult: (params: any) => void;
3
+ onAuthResult: (params: any) => void;
4
+ };
5
+ export type PayResultEventPayload = {};
6
+ export type AuthResultEventPayload = {};
7
+ export type PayOptions = {
8
+ orderInfo: string;
9
+ scheme: string | null | undefined;
10
+ universalLink: string | null | undefined;
11
+ };
12
+ export type AuthOptions = {
13
+ authInfo: string;
14
+ scheme: string | null | undefined;
15
+ universalLink: string | null | undefined;
16
+ };
17
+ //# sourceMappingURL=ExpoAlipay.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpoAlipay.types.d.ts","sourceRoot":"","sources":["../src/ExpoAlipay.types.ts"],"names":[],"mappings":"AA+BA,MAAM,MAAM,sBAAsB,GAAG;IACnC,WAAW,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;IACnC,YAAY,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,EAEnC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,EAEpC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAClC,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAClC,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CAC1C,CAAC"}
@@ -0,0 +1,31 @@
1
+ /*
2
+
3
+ 回调结果现在还没有做类型支持,但是以下两个例子也许能够帮到你
4
+ {
5
+ "memo" : "xxxxx",
6
+ "result" : "{
7
+ \"alipay_trade_app_pay_response\":{
8
+ \"code\":\"10000\",
9
+ \"msg\":\"Success\",
10
+ \"app_id\":\"2014072300007148\",
11
+ \"out_trade_no\":\"081622560194853\",
12
+ \"trade_no\":\"2016081621001004400236957647\",
13
+ \"total_amount\":\"9.00\",
14
+ \"seller_id\":\"2088702849871851\",
15
+ \"charset\":\"utf-8\",
16
+ \"timestamp\":\"2016-10-11 17:43:36\"
17
+ },
18
+ \"sign\":\"NGfStJf3i3ooWBuCDIQSumOpaGBcQz+aoAqyGh3W6EqA/gmyPYwLJ2REFijY9XPTApI9YglZyMw+ZMhd3kb0mh4RAXMrb6mekX4Zu8Nf6geOwIa9kLOnw0IMCjxi4abDIfXhxrXyj********\",
19
+ \"sign_type\":\"RSA2\"
20
+ }",
21
+ "resultStatus" : "9000"
22
+ }
23
+
24
+
25
+ resultStatus=9000
26
+ memo="处理成功"
27
+ result="success=true&auth_code=d9d1b5acc26e461dbfcb6974c8ff5E64&result_code=200"
28
+
29
+ */
30
+ export {};
31
+ //# sourceMappingURL=ExpoAlipay.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpoAlipay.types.js","sourceRoot":"","sources":["../src/ExpoAlipay.types.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BE","sourcesContent":["\n/*\n\n 回调结果现在还没有做类型支持,但是以下两个例子也许能够帮到你\n {\n \"memo\" : \"xxxxx\",\n \"result\" : \"{\n \\\"alipay_trade_app_pay_response\\\":{\n \\\"code\\\":\\\"10000\\\",\n \\\"msg\\\":\\\"Success\\\",\n \\\"app_id\\\":\\\"2014072300007148\\\",\n \\\"out_trade_no\\\":\\\"081622560194853\\\",\n \\\"trade_no\\\":\\\"2016081621001004400236957647\\\",\n \\\"total_amount\\\":\\\"9.00\\\",\n \\\"seller_id\\\":\\\"2088702849871851\\\",\n \\\"charset\\\":\\\"utf-8\\\",\n \\\"timestamp\\\":\\\"2016-10-11 17:43:36\\\"\n },\n \\\"sign\\\":\\\"NGfStJf3i3ooWBuCDIQSumOpaGBcQz+aoAqyGh3W6EqA/gmyPYwLJ2REFijY9XPTApI9YglZyMw+ZMhd3kb0mh4RAXMrb6mekX4Zu8Nf6geOwIa9kLOnw0IMCjxi4abDIfXhxrXyj********\\\",\n \\\"sign_type\\\":\\\"RSA2\\\"\n }\",\n \"resultStatus\" : \"9000\"\n }\n \n \n resultStatus=9000\n memo=\"处理成功\"\n result=\"success=true&auth_code=d9d1b5acc26e461dbfcb6974c8ff5E64&result_code=200\"\n\n*/\n\nexport type ExpoAlipayModuleEvents = {\n onPayResult: (params: any) => void;\n onAuthResult: (params: any) => void;\n};\n\nexport type PayResultEventPayload = {\n\n};\n\nexport type AuthResultEventPayload = {\n\n};\n\nexport type PayOptions = {\n orderInfo: string;\n scheme: string | null | undefined;\n universalLink: string | null | undefined;\n};\n\nexport type AuthOptions = {\n authInfo: string;\n scheme: string | null | undefined;\n universalLink: string | null | undefined;\n};"]}
@@ -0,0 +1,20 @@
1
+ import { NativeModule } from 'expo';
2
+ import { AuthOptions, ExpoAlipayModuleEvents, PayOptions } from './ExpoAlipay.types';
3
+ declare class ExpoAlipayModule extends NativeModule<ExpoAlipayModuleEvents> {
4
+ getVersion(): Promise<string>;
5
+ /**
6
+ * 支付宝支付。
7
+ * @param options 支付参数。
8
+ * @returns 支付调用结果。
9
+ */
10
+ pay(options: PayOptions): Promise<any>;
11
+ /**
12
+ * 支付宝授权登录。
13
+ * @param options 授权参数。
14
+ * @returns 授权调用结果。
15
+ */
16
+ auth(options: AuthOptions): Promise<any>;
17
+ }
18
+ declare const _default: ExpoAlipayModule;
19
+ export default _default;
20
+ //# sourceMappingURL=ExpoAlipayModule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpoAlipayModule.d.ts","sourceRoot":"","sources":["../src/ExpoAlipayModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAuB,MAAM,MAAM,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErF,OAAO,OAAO,gBAAiB,SAAQ,YAAY,CAAC,sBAAsB,CAAC;IAEzE,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAE7B;;;;OAIG;IACH,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IACtC;;;;OAIG;IACH,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC;CACzC;;AAGD,wBAAmE"}
@@ -0,0 +1,4 @@
1
+ import { requireNativeModule } from 'expo';
2
+ // This call loads the native module object from the JSI.
3
+ export default requireNativeModule('ExpoAlipay');
4
+ //# sourceMappingURL=ExpoAlipayModule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpoAlipayModule.js","sourceRoot":"","sources":["../src/ExpoAlipayModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,mBAAmB,EAAE,MAAM,MAAM,CAAC;AAsBzD,yDAAyD;AACzD,eAAe,mBAAmB,CAAmB,YAAY,CAAC,CAAC","sourcesContent":["import { NativeModule, requireNativeModule } from 'expo';\n\nimport { AuthOptions, ExpoAlipayModuleEvents, PayOptions } from './ExpoAlipay.types';\n\ndeclare class ExpoAlipayModule extends NativeModule<ExpoAlipayModuleEvents> {\n\n getVersion(): Promise<string>\n\n /**\n * 支付宝支付。\n * @param options 支付参数。\n * @returns 支付调用结果。\n */\n pay(options: PayOptions): Promise<any>;\n /**\n * 支付宝授权登录。\n * @param options 授权参数。\n * @returns 授权调用结果。\n */\n auth(options: AuthOptions): Promise<any>;\n}\n\n// This call loads the native module object from the JSI.\nexport default requireNativeModule<ExpoAlipayModule>('ExpoAlipay');\n"]}
@@ -0,0 +1,7 @@
1
+ import { NativeModule } from 'expo';
2
+ import { ExpoAlipayModuleEvents } from './ExpoAlipay.types';
3
+ declare class ExpoAlipayModule extends NativeModule<ExpoAlipayModuleEvents> {
4
+ }
5
+ declare const _default: typeof ExpoAlipayModule;
6
+ export default _default;
7
+ //# sourceMappingURL=ExpoAlipayModule.web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpoAlipayModule.web.d.ts","sourceRoot":"","sources":["../src/ExpoAlipayModule.web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,YAAY,EAAE,MAAM,MAAM,CAAC;AAEvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,cAAM,gBAAiB,SAAQ,YAAY,CAAC,sBAAsB,CAAC;CAElE;;AAED,wBAAuE"}
@@ -0,0 +1,5 @@
1
+ import { registerWebModule, NativeModule } from 'expo';
2
+ class ExpoAlipayModule extends NativeModule {
3
+ }
4
+ export default registerWebModule(ExpoAlipayModule, 'ExpoAlipayModule');
5
+ //# sourceMappingURL=ExpoAlipayModule.web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpoAlipayModule.web.js","sourceRoot":"","sources":["../src/ExpoAlipayModule.web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAIvD,MAAM,gBAAiB,SAAQ,YAAoC;CAElE;AAED,eAAe,iBAAiB,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC","sourcesContent":["import { registerWebModule, NativeModule } from 'expo';\n\nimport { ExpoAlipayModuleEvents } from './ExpoAlipay.types';\n\nclass ExpoAlipayModule extends NativeModule<ExpoAlipayModuleEvents> {\n \n}\n\nexport default registerWebModule(ExpoAlipayModule, 'ExpoAlipayModule');\n"]}
@@ -0,0 +1,3 @@
1
+ export { default } from './ExpoAlipayModule';
2
+ export * from './ExpoAlipay.types';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,cAAe,oBAAoB,CAAC"}
package/build/index.js ADDED
@@ -0,0 +1,5 @@
1
+ // Reexport the native module. On web, it will be resolved to ExpoAlipayModule.web.ts
2
+ // and on native platforms to ExpoAlipayModule.ts
3
+ export { default } from './ExpoAlipayModule';
4
+ export * from './ExpoAlipay.types';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,iDAAiD;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,cAAe,oBAAoB,CAAC","sourcesContent":["// Reexport the native module. On web, it will be resolved to ExpoAlipayModule.web.ts\n// and on native platforms to ExpoAlipayModule.ts\nexport { default } from './ExpoAlipayModule';\nexport * from './ExpoAlipay.types';\n"]}
@@ -0,0 +1,10 @@
1
+ {
2
+ "platforms": ["apple", "android", "web"],
3
+ "apple": {
4
+ "modules": ["ExpoAlipayModule"],
5
+ "appDelegateSubscribers": ["AppLifecycleDelegate"]
6
+ },
7
+ "android": {
8
+ "modules": ["expo.modules.alipay.ExpoAlipayModule"]
9
+ }
10
+ }
@@ -0,0 +1,38 @@
1
+ //
2
+ // AppLifecycleDelegate.swift
3
+ // ExpoAlipay
4
+ //
5
+ // Created by Aron on 2025/7/26.
6
+ //
7
+
8
+ import Foundation
9
+ import ExpoModulesCore
10
+ import AlipaySDK
11
+
12
+ public class AppLifecycleDelegate: ExpoAppDelegateSubscriber {
13
+ public func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
14
+ if url.host == "safepay" {
15
+ AlipaySDK.defaultService().processOrder(withPaymentResult: url) { result in
16
+ ExpoAlipayModule.moduleInstance?.sendEvent("onPayResult", (result as? [String: Any]) ?? [:])
17
+ }
18
+ } else if url.host == "oauth" {
19
+ AlipaySDK.defaultService().processAuth_V2Result(url) { result in
20
+ ExpoAlipayModule.moduleInstance?.sendEvent("onAuthResult", (result as? [String: Any]) ?? [:])
21
+ }
22
+ }
23
+ return true
24
+ }
25
+
26
+ public func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
27
+ if url.host == "safepay" {
28
+ AlipaySDK.defaultService().processOrder(withPaymentResult: url) { result in
29
+ ExpoAlipayModule.moduleInstance?.sendEvent("onPayResult", (result as? [String: Any]) ?? [:])
30
+ }
31
+ } else if url.host == "oauth" {
32
+ AlipaySDK.defaultService().processAuth_V2Result(url) { result in
33
+ ExpoAlipayModule.moduleInstance?.sendEvent("onAuthResult", (result as? [String: Any]) ?? [:])
34
+ }
35
+ }
36
+ return true
37
+ }
38
+ }
@@ -0,0 +1,31 @@
1
+ require 'json'
2
+
3
+ package = JSON.parse(File.read(File.join(__dir__, '..', 'package.json')))
4
+
5
+ Pod::Spec.new do |s|
6
+ s.name = 'ExpoAlipay'
7
+ s.version = package['version']
8
+ s.summary = package['description']
9
+ s.description = package['description']
10
+ s.license = package['license']
11
+ s.author = package['author']
12
+ s.homepage = package['homepage']
13
+ s.platforms = {
14
+ :ios => '15.1',
15
+ :tvos => '15.1'
16
+ }
17
+ s.swift_version = '5.4'
18
+ s.source = { git: 'https://github.com/likeso/expo-alipay' }
19
+ s.static_framework = true
20
+
21
+ s.dependency 'ExpoModulesCore'
22
+
23
+ s.dependency 'AlipaySDK-iOS'
24
+
25
+ # Swift/Objective-C compatibility
26
+ s.pod_target_xcconfig = {
27
+ 'DEFINES_MODULE' => 'YES',
28
+ }
29
+
30
+ s.source_files = "**/*.{h,m,mm,swift,hpp,cpp}"
31
+ end
@@ -0,0 +1,57 @@
1
+ import ExpoModulesCore
2
+ import AlipaySDK
3
+
4
+ public class ExpoAlipayModule: Module {
5
+ static var moduleInstance: ExpoAlipayModule?
6
+
7
+ public func definition() -> ModuleDefinition {
8
+ Name("ExpoAlipay")
9
+
10
+
11
+ Events("onPayResult", "onAuthResult")
12
+
13
+ OnCreate {
14
+ Self.moduleInstance = self
15
+ }
16
+
17
+ AsyncFunction("setSandboxMode") { (mode: String) in
18
+ return true
19
+ }
20
+
21
+ AsyncFunction("registerApp") { (appId: String) in
22
+ return true
23
+ }
24
+
25
+ AsyncFunction("pay") { (options: PayOptions, promise: Promise) in
26
+ AlipaySDK.defaultService()
27
+ .payOrder(options.orderInfo,
28
+ fromScheme: options.scheme ?? "",
29
+ fromUniversalLink: options.universalLink) { result in
30
+ promise.resolve(result)
31
+ }
32
+ }
33
+
34
+ AsyncFunction("auth") { (options: AuthOptions, promise: Promise) in
35
+ AlipaySDK.defaultService()
36
+ AlipaySDK.defaultService()
37
+ .auth_V2(withInfo: options.authInfo,
38
+ fromScheme: options.scheme ?? "") { result in
39
+ promise.resolve(result)
40
+ }
41
+ }
42
+
43
+ AsyncFunction("getVersion") {
44
+ return AlipaySDK.defaultService().currentVersion()
45
+ }
46
+
47
+ AsyncFunction("startLog") {
48
+ AlipaySDK.startLog { log in
49
+ print("ExpoAlipayModule:\(String(describing: log))")
50
+ }
51
+ }
52
+
53
+ AsyncFunction("stopLog") {
54
+ AlipaySDK.stopLog()
55
+ }
56
+ }
57
+ }
@@ -0,0 +1,28 @@
1
+ //
2
+ // ExpoAlipayModuleTypes.swift
3
+ // ExpoAlipay
4
+ //
5
+ // Created by Aron on 2025/7/26.
6
+ //
7
+
8
+ import Foundation
9
+ import ExpoModulesCore
10
+
11
+
12
+ struct PayOptions: Record {
13
+ @Field
14
+ var orderInfo: String = ""
15
+ @Field
16
+ var scheme: String?
17
+ @Field
18
+ var universalLink: String?
19
+ }
20
+
21
+ struct AuthOptions: Record {
22
+ @Field
23
+ var authInfo: String = ""
24
+ @Field
25
+ var scheme: String?
26
+ @Field
27
+ var universalLink: String?
28
+ }
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "expo-alikit",
3
+ "version": "0.1.0",
4
+ "description": "React Native Alipay support",
5
+ "main": "build/index.js",
6
+ "types": "build/index.d.ts",
7
+ "scripts": {
8
+ "build": "expo-module build",
9
+ "clean": "expo-module clean",
10
+ "lint": "expo-module lint",
11
+ "test": "expo-module test",
12
+ "prepare": "expo-module prepare",
13
+ "prepublishOnly": "expo-module prepublishOnly",
14
+ "expo-module": "expo-module",
15
+ "open:ios": "xed example/ios",
16
+ "open:android": "open -a \"Android Studio\" example/android"
17
+ },
18
+ "keywords": [
19
+ "react-native",
20
+ "expo",
21
+ "expo-alipay",
22
+ "ExpoAlipay"
23
+ ],
24
+ "repository": "https://github.com/likeso/expo-alipay",
25
+ "bugs": {
26
+ "url": "https://github.com/likeso/expo-alipay/issues"
27
+ },
28
+ "author": "Aron <Random1996@163.com> (https://github.com/likeso)",
29
+ "license": "MIT",
30
+ "homepage": "https://github.com/likeso/expo-alipay#readme",
31
+ "dependencies": {},
32
+ "devDependencies": {
33
+ "@types/react": "~19.0.0",
34
+ "expo-module-scripts": "^4.1.9",
35
+ "expo": "~53.0.0",
36
+ "react-native": "0.79.1"
37
+ },
38
+ "peerDependencies": {
39
+ "expo": "*",
40
+ "react": "*",
41
+ "react-native": "*"
42
+ }
43
+ }
@@ -0,0 +1,55 @@
1
+
2
+ /*
3
+
4
+ 回调结果现在还没有做类型支持,但是以下两个例子也许能够帮到你
5
+ {
6
+ "memo" : "xxxxx",
7
+ "result" : "{
8
+ \"alipay_trade_app_pay_response\":{
9
+ \"code\":\"10000\",
10
+ \"msg\":\"Success\",
11
+ \"app_id\":\"2014072300007148\",
12
+ \"out_trade_no\":\"081622560194853\",
13
+ \"trade_no\":\"2016081621001004400236957647\",
14
+ \"total_amount\":\"9.00\",
15
+ \"seller_id\":\"2088702849871851\",
16
+ \"charset\":\"utf-8\",
17
+ \"timestamp\":\"2016-10-11 17:43:36\"
18
+ },
19
+ \"sign\":\"NGfStJf3i3ooWBuCDIQSumOpaGBcQz+aoAqyGh3W6EqA/gmyPYwLJ2REFijY9XPTApI9YglZyMw+ZMhd3kb0mh4RAXMrb6mekX4Zu8Nf6geOwIa9kLOnw0IMCjxi4abDIfXhxrXyj********\",
20
+ \"sign_type\":\"RSA2\"
21
+ }",
22
+ "resultStatus" : "9000"
23
+ }
24
+
25
+
26
+ resultStatus=9000
27
+ memo="处理成功"
28
+ result="success=true&auth_code=d9d1b5acc26e461dbfcb6974c8ff5E64&result_code=200"
29
+
30
+ */
31
+
32
+ export type ExpoAlipayModuleEvents = {
33
+ onPayResult: (params: any) => void;
34
+ onAuthResult: (params: any) => void;
35
+ };
36
+
37
+ export type PayResultEventPayload = {
38
+
39
+ };
40
+
41
+ export type AuthResultEventPayload = {
42
+
43
+ };
44
+
45
+ export type PayOptions = {
46
+ orderInfo: string;
47
+ scheme: string | null | undefined;
48
+ universalLink: string | null | undefined;
49
+ };
50
+
51
+ export type AuthOptions = {
52
+ authInfo: string;
53
+ scheme: string | null | undefined;
54
+ universalLink: string | null | undefined;
55
+ };
@@ -0,0 +1,24 @@
1
+ import { NativeModule, requireNativeModule } from 'expo';
2
+
3
+ import { AuthOptions, ExpoAlipayModuleEvents, PayOptions } from './ExpoAlipay.types';
4
+
5
+ declare class ExpoAlipayModule extends NativeModule<ExpoAlipayModuleEvents> {
6
+
7
+ getVersion(): Promise<string>
8
+
9
+ /**
10
+ * 支付宝支付。
11
+ * @param options 支付参数。
12
+ * @returns 支付调用结果。
13
+ */
14
+ pay(options: PayOptions): Promise<any>;
15
+ /**
16
+ * 支付宝授权登录。
17
+ * @param options 授权参数。
18
+ * @returns 授权调用结果。
19
+ */
20
+ auth(options: AuthOptions): Promise<any>;
21
+ }
22
+
23
+ // This call loads the native module object from the JSI.
24
+ export default requireNativeModule<ExpoAlipayModule>('ExpoAlipay');
@@ -0,0 +1,9 @@
1
+ import { registerWebModule, NativeModule } from 'expo';
2
+
3
+ import { ExpoAlipayModuleEvents } from './ExpoAlipay.types';
4
+
5
+ class ExpoAlipayModule extends NativeModule<ExpoAlipayModuleEvents> {
6
+
7
+ }
8
+
9
+ export default registerWebModule(ExpoAlipayModule, 'ExpoAlipayModule');
package/src/index.ts ADDED
@@ -0,0 +1,4 @@
1
+ // Reexport the native module. On web, it will be resolved to ExpoAlipayModule.web.ts
2
+ // and on native platforms to ExpoAlipayModule.ts
3
+ export { default } from './ExpoAlipayModule';
4
+ export * from './ExpoAlipay.types';
package/tsconfig.json ADDED
@@ -0,0 +1,9 @@
1
+ // @generated by expo-module-scripts
2
+ {
3
+ "extends": "expo-module-scripts/tsconfig.base",
4
+ "compilerOptions": {
5
+ "outDir": "./build"
6
+ },
7
+ "include": ["./src"],
8
+ "exclude": ["**/__mocks__/*", "**/__tests__/*", "**/__rsc_tests__/*"]
9
+ }