Dodo 付款检查 反演原生 SDK
在系统浏览器标签中 Open Dodo Pays 托管了退出
(单位:千美元)SFSafariViewController 在 iOS 上, Android 上的自定义标签),来自 React Industrial
从一个电话得到一个干净的结果。 土生土长
iOS/Android cores – 没有自己的检出逻辑.
涡轮模块, 仅新建架构,反应原生0.77+. 所需经费: iOS 16+,Android minSdk 24. (英语).
说明: 你的Android应用软件必须用
compileSdk34岁或以上 这是AAR的AndroidX文物元数据中 宣布的地板 本地核心取决于(androidx.activity, (中文(简体) ),androidx.browser, (中文(简体) ),androidx.core) (中文(简体) ). 这个模块是自己的compileSdkVersion默认为35并 跟着你的作品rootProject.ext.compileSdkVersion当设置。 那边 没有 Kotlin Gradle 插件或 AGP 楼层 超出您的反射原生 版本已经强制要求 — RN 0.79的默认值( Kotlin 2. 0.21 / AGP 8. 8. 8.2) 足够了.
安装
npm i @dodopayments/react-native-checkout
- 机器人: 自动链接。 拉动
com.dodopayments.api:checkout-android从马文. - iOS: (英语)
cd ios && pod install。Swift核心被捆绑在软件包中. - 展览 : 开发只建(不是Expo Go)。 将您的回调方案传递给
配置插件, 以预建线条 Android + iOS :
然后运行{ "expo": { "scheme": "myapp", "plugins": [ [ "@dodopayments/react-native-checkout", { "scheme": "myappcheckout" } ] ] } }npx expo prebuild(或重建dev客户端). 计划必须匹配returnUrl(例如:.myappcheckout://return)必须不同于expo.scheme, (中文(简体) ), 它已经在主要活动上注册.
设置
注册回调的 URL 方案, 操作系统将退出返回到
你的应用程序。 打开 博览,上面的配置插件对两个平台都这样做——
您仍然需要iOS Linking (见Use).
打开 赤色反应原生数字 :
-
iOS: (英语) 在 Info.plist 中为您的方案添加一个 URL 类型,并转发到 应用程序的 URL
Linking处理进入DodoCheckout.handleOpenURL(url)—— 说SFSafariViewController没有 用于获取其返回 URL 的处理中方式. -
机器人: 设定您的回调方案为 Gradle 显示占位符 android核心本身的显示 已经宣布了方向 活动的意图过滤器, 所以这个属性是整个设置成本:
android { defaultConfig { manifestPlaceholders["dodoCallbackScheme"] = "myappcheckout" } }
使用
import { Linking } from 'react-native';
import { DodoCheckout } from '@dodopayments/react-native-checkout';
// Required for iOS's return-URL handling.
Linking.addEventListener('url', ({ url }) => DodoCheckout.handleOpenURL(url));
const result = await DodoCheckout.start({
checkoutUrl, // from your backend
returnUrl: 'myappcheckout://return', // scheme must be registered (see Setup)
onEvent: (e) => console.log(e.type), // logging only — never decide outcome from events
});
switch (result.status) {
case 'succeeded': /* UI only — confirm server-side */ break;
case 'failed': break;
case 'cancelled': await reconcileAbandonedSession(); break; // outcome unknown — NOT a failure
case 'pending': await reconcileAbandonedSession(); break; // may be unparsed, not just async
case 'expired': break;
}
结果是一个UI提示,而不是付款证明
这个SDK从不调用多多API,也不持有API密钥. 允许您访问
后端从 webhook (payment.succeeded 编号 : subscription.active) (中文(简体) ).
核实付款情况
确认您后端的每笔付款, 而不是移动结果 :
cancelled 不是失败
cancelled 表示用户在返回任何 URL 到达之前解除了浏览器,
所以SDK从未得知结果. 可能已经付了. A 类
在主机“ 付款成功” 页面计数时, 付费然后点击QQ的用户
减少它的再定向输出 cancelled无法分辨
SDK的一面,来自一个不付费而关闭浏览器的用户.
在这里展示"付账失败" 告诉付费客户他们的钱消失了. 解决它:SDK为这个案子保留会议记录.
放弃的会议
当 SDK 没有看到返回的 URL 时, 会话会保留在记录中
决心取得持久结果——应用程序(或联署材料捆绑)被杀死
中途退赛,而约已失约, start 已解决 cancelled,或者说它
已解决 pending 从无法解析的返回 URL 而不是真正的同步
支付方法。 调和服务器侧面, 无论是在下一个挂载上还是紧接着一个
cancelled 或者说 pending 结果 :
import { DodoCheckout } from '@dodopayments/react-native-checkout';
async function reconcileAbandonedSession() {
const abandoned = await DodoCheckout.getAbandonedSession();
if (!abandoned) return; // nothing in flight
// Ask *your* backend what happened to abandoned.sessionId — it has the
// webhook (`payment.succeeded`) or can call Get Payment Detail with your
// secret key. Show a spinner while you wait; an async method may still be
// settling, so treat "no record yet" as pending, not failed — and only
// clear the record once you have a terminal outcome, or a later retry
// has nothing left to reconcile against if this one comes back.
const outcome = await myBackend.outcomeForSession(abandoned.sessionId);
if (outcome.isTerminal) {
await DodoCheckout.clearAbandonedSession();
}
show(outcome);
}
自定义
退出浏览器的工具栏、按钮和颜色方案可以通过 customization 打开 start(...)见 外观自定义文件 用于所有可用的选项.
错误
start 以 CheckoutError (单位:千美元).code 这是其中之一 INVALID_CHECKOUT_URL, (中文(简体) ),
INVALID_RETURN_URL, (中文(简体) ), ALREADY_IN_PROGRESS, (中文(简体) ), PLATFORM_ERROR仅用于滥用
或平台失效。 取消或拒绝付款是 结果
(单位:千美元)cancelled 编号 : failed绝不拒绝.
地方发展
./scripts/sync-ios-core.sh # vendor ../swift into ios/DodoCore for the pod
npm run typecheck && npm test