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 +5 -0
- package/README.md +87 -0
- package/android/build.gradle +48 -0
- package/android/src/main/AndroidManifest.xml +5 -0
- package/android/src/main/java/expo/modules/alipay/ExpoAlipayModule.kt +73 -0
- package/android/src/main/java/expo/modules/alipay/ExpoAlipayModuleTypes.kt +22 -0
- package/build/ExpoAlipay.types.d.ts +17 -0
- package/build/ExpoAlipay.types.d.ts.map +1 -0
- package/build/ExpoAlipay.types.js +31 -0
- package/build/ExpoAlipay.types.js.map +1 -0
- package/build/ExpoAlipayModule.d.ts +20 -0
- package/build/ExpoAlipayModule.d.ts.map +1 -0
- package/build/ExpoAlipayModule.js +4 -0
- package/build/ExpoAlipayModule.js.map +1 -0
- package/build/ExpoAlipayModule.web.d.ts +7 -0
- package/build/ExpoAlipayModule.web.d.ts.map +1 -0
- package/build/ExpoAlipayModule.web.js +5 -0
- package/build/ExpoAlipayModule.web.js.map +1 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +5 -0
- package/build/index.js.map +1 -0
- package/expo-module.config.json +10 -0
- package/ios/AppLifecycleDelegate.swift +38 -0
- package/ios/ExpoAlipay.podspec +31 -0
- package/ios/ExpoAlipayModule.swift +57 -0
- package/ios/ExpoAlipayModuleTypes.swift +28 -0
- package/package.json +43 -0
- package/src/ExpoAlipay.types.ts +55 -0
- package/src/ExpoAlipayModule.ts +24 -0
- package/src/ExpoAlipayModule.web.ts +9 -0
- package/src/index.ts +4 -0
- package/tsconfig.json +9 -0
package/.eslintrc.js
ADDED
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 @@
|
|
|
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 @@
|
|
|
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"]}
|
package/build/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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,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
package/tsconfig.json
ADDED