# SDK接口文档

## PayKKa

SDK 的主入口类，用于配置环境、初始化 SDK 流程等。

### useEnv() / useConf()

切换 SDK 当前使用的环境配置和商户配置。

- **类型**

```objectivec
+ (void)useEnv:(PayKKaEnv *)env;
+ (void)useConf:(PayKKaConf *)conf;
```

```swift
PayKKa.useEnv(_ env: PayKKaEnv)
PayKKa.useConf(_ conf: PayKKaConf)
```
- **详细信息**
  - `useEnv`：切换 SDK 当前使用的运行环境。
  - `useConf`：切换 SDK 当前使用的商户配置。
  - 这两个方法只会更新当前全局配置，不会自动执行完整初始化流程。
  - SDK 默认环境为 `PayKKaEnv.SANDBOX`。
  - 通常建议在应用启动阶段统一完成 SDK 初始化，而不是在每次发起支付时重复切换配置。
- **示例**

```objectivec
#import <PayKKaCheckoutPayments/PayKKa.h>

[PayKKa useEnv:PayKKaEnv.SANDBOX];
[PayKKa useConf:appConf];
```

```swift
PayKKa.useEnv(.SANDBOX)
PayKKa.useConf(appConf)
```
- **参考**
  - [PayKKaEnv](#paykkaenv)
  - [PayKKaConf](#paykkaconf)


### init() / Init()

初始化 SDK，并使环境配置与商户配置生效。

- **类型**

```objectivec
+ (void)init:(PayKKaConf *)configuration environment:(nullable PayKKaEnv *)environment;
+ (void)init:(PayKKaConf *)configuration;
```

```swift
PayKKa.Init(_ configuration: PayKKaConf, _ environment: PayKKaEnv?)
PayKKa.Init(_ configuration: PayKKaConf)
```
- **详细信息**
  - `configuration`：商户配置对象，至少应包含网关商户号和客户端密钥。
  - `environment`：可选的运行环境；为空时默认使用 `PayKKaEnv.SANDBOX`。
  - `init` 内部会调用 `useEnv(...)` 和 `useConf(...)`，并完成 SDK 初始化。
  - 在创建 `PKPaymentBottomSheet` 或任何 `PKPaymentBase` 子类，以及调用 `goPay(...)` 前，必须先完成初始化；否则 SDK 会抛出 `NSInternalInconsistencyException`。
  - Swift 暴露名为 `PayKKa.Init(...)`，使用大写 `I`。
- **示例**

```objectivec
[PayKKa init:appConf environment:PayKKaEnv.SANDBOX];
// 或使用默认的 SANDBOX 环境
[PayKKa init:appConf];
```

```swift
PayKKa.Init(appConf, .SANDBOX)
// 或使用默认的 SANDBOX 环境
PayKKa.Init(appConf)
```


### goPay()

注意
此方法为旧版 WebView 收银台接入方式。新接入请优先使用 Drop-In（`PKPaymentBottomSheet`）或对应支付方式的 Component。当前公开头文件尚未将此方法标记为 `deprecated`。

details
summary
展示 WebView 形式的收银台。
- **类型**

```objectivec
+ (void)goPay:(NSString *)sessionId
onPaymentCallback:(void (^)(PKPaymentResult *paymentResult))onPaymentCallback;

+ (void)goPay:(NSString *)sessionId
onPaymentCallback:(void (^)(PKPaymentResult *paymentResult))onPaymentCallback
onCloseTappedCallback:(void (^)(PKJSEvent *jsEvent))onCloseTappedCallback;
```

```swift
PayKKa.goPay(
    _ sessionId: String,
    onPaymentCallback: @escaping (PKPaymentResult) -> Void
)

PayKKa.goPay(
    _ sessionId: String,
    onPaymentCallback: @escaping (PKPaymentResult) -> Void,
    onCloseTappedCallback: @escaping (PKJSEvent) -> Void
)
```
- **详细信息**
  - `sessionId`：服务端创建的 Checkout Session ID。
  - `onPaymentCallback`：支付完成后的回调，返回 `PKPaymentResult` 对象。
  - `onCloseTappedCallback`：用户点击收银台关闭按钮时触发，返回 `PKJSEvent` 对象。
  - SDK 会创建全屏 WebView 收银台，并自动查找当前适合用于模态展示的顶部页面(UIViewController)。
- **示例**

```objectivec
[PayKKa goPay:@"your_session_id"
    onPaymentCallback:^(PKPaymentResult *result) {
        if (result.status == PKPaymentStatusSuccess) {
            NSLog(@"支付成功");
        } else {
            NSLog(@"支付结果: %@", result.message);
        }
    }];
```

```swift
PayKKa.goPay("your_session_id") { result in
    if result.status == .success {
        print("支付成功")
    } else {
        print("支付结果: \(result.message ?? "")")
    }
} onCloseTappedCallback: { _ in
    print("收银台已关闭")
}
```


# 环境配置 API

## PayKKaEnv

`PayKKaEnvironment` 的内置实现，用于定义 SDK 连接的后端环境。

- **类型**

```objectivec
@interface PayKKaEnv : PayKKaEnvironment
```
- **预置环境**
  - `PayKKaEnv.SANDBOX`：沙箱测试环境。
  - `PayKKaEnv.PROD_EU`：欧洲生产环境。
  - `PayKKaEnv.PROD_HK`：香港生产环境。
- **详细信息**
  - 预置环境通过类属性提供，不是 Objective-C 枚举。
  - 可通过 `environmentCode` 获取当前环境代码。


## PayKKaConf

用于定义 SDK 使用的商户和支付方式配置。

- **类型**

```objectivec
@interface PayKKaConf : NSObject
```
- **属性**
  - `configuration` (`NSDictionary *`)：当前配置对象的原始字典。
- **配置选项**
  - `KEY_GATEWAY_MERCHANT_ID`：网关商户 ID。
  - `KEY_CLIENT_KEY`：Checkout Client Key。
  - `KEY_LOCALE`：SDK 使用的语言和地区。
  - `KEY_APPLE_PAY_MERCHANT_ID`：Apple Pay Merchant ID。
  - `KEY_ALIPAY_PLUS_ACQUIRER_ID`：Alipay+ Acquirer ID。
  - `KEY_WECHAT_PAY_APP_ID`：微信开放平台 App ID。
  - `KEY_WECHAT_PAY_APP_UNIVERSAL_LINK`：你的 App 的 Universal Link，用于在支付完成后，用户点击回跳到App。


### initWithDict()

使用字典初始化商户配置对象。

- **类型**

```objectivec
- (instancetype)initWithDict:(NSDictionary *)dict;
```

```swift
PayKKaConf(dict: [AnyHashable: Any])
```
- **详细信息**
  - 至少应传入 `KEY_GATEWAY_MERCHANT_ID` 和 `KEY_CLIENT_KEY`。
  - 接入 Apple Pay、Alipay+ 或 WeChat Pay 时，应同时提供对应支付方式的配置项。
- **示例**

```objectivec
PayKKaConf *appConf = [[PayKKaConf alloc] initWithDict:@{
    KEY_GATEWAY_MERCHANT_ID: @"your_gateway_merchant_id",
    KEY_CLIENT_KEY: @"your_client_key",
    KEY_APPLE_PAY_MERCHANT_ID: @"merchant.com.example",
    KEY_ALIPAY_PLUS_ACQUIRER_ID: @"your_acquirer_id",
    KEY_WECHAT_PAY_APP_ID: @"your_wechat_app_id",
    KEY_WECHAT_PAY_APP_UNIVERSAL_LINK: @"https://example.com/wechat/"
}];
```

```swift
let appConf = PayKKaConf(dict: [
    KEY_GATEWAY_MERCHANT_ID: "your_gateway_merchant_id",
    KEY_CLIENT_KEY: "your_client_key",
    KEY_APPLE_PAY_MERCHANT_ID: "merchant.com.example",
    KEY_ALIPAY_PLUS_ACQUIRER_ID: "your_acquirer_id",
    KEY_WECHAT_PAY_APP_ID: "your_wechat_app_id",
    KEY_WECHAT_PAY_APP_UNIVERSAL_LINK: "https://example.com/wechat/"
])
```


# 支付基础 API

## PKPaymentBase

各支付方式的基础类，负责保存 Checkout Session、支付结果回调和支付请求拦截器。

- **类型**

```objectivec
@interface PKPaymentBase : NSObject
```
- **属性**
  - `paymentResultCallback` (`id<PKPaymentResultCallback>`，可为空)：支付结果回调。
  - `interceptor` (`id<PKPaymentInterceptor>`，可为空)：支付请求展示前的拦截器。
- **方法**
  - `initWithCheckoutSessionId:`：使用 Checkout Session ID 创建支付对象。
  - `setError:`：更新或清除关联支付表单展示的错误。
  - `notifyResult:`：向结果回调发送支付终态。
  - `notifyError:`：向结果回调发送支付错误。
  - `notifyUserCanceled:extraData:`：向结果回调发送用户取消事件。
- **详细信息**
  - 默认初始化方法不可用。请使用具体支付类提供的指定初始化方法。
  - 创建支付对象前必须先完成 `PayKKa` 初始化。
  - 发起支付前必须设置 `paymentResultCallback`。
  - `paymentResultCallback` 和 `interceptor` 均为强引用。页面销毁或不再使用支付对象时，应主动将其设为 `nil`，避免形成循环引用。


## PKPaymentResultCallback

接收支付结果、错误和用户取消事件的统一回调协议。

- **类型**

```objectivec
@protocol PKPaymentResultCallback <NSObject>
```
- **方法**

```objectivec
- (void)onResult:(PKPaymentResult *)paymentResult;
- (void)onError:(id)throwable;
- (void)onUserCanceled:(nullable PKPaymentBase *)paymentSource
             extraData:(nullable NSDictionary *)extraData;
```

```swift
func onResult(_ paymentResult: PKPaymentResult)
func onError(_ throwable: Any)
func onUserCanceled(
    _ paymentSource: PKPaymentBase?,
    extraData: [AnyHashable: Any]?
)
```
- **详细信息**
  - `onResult:`：必选方法，接收归一化后的支付终态结果。
  - `onError:`：可选方法，接收支付错误。参数类型为 `id`，可能是 `NSError` 或其他错误对象。
  - `onUserCanceled:extraData:`：可选方法，在用户取消支付时调用。
  - 错误或取消发生后，商户 App 通常应停止加载状态并允许用户重新支付。


## PKPaymentInterceptor

支付请求展示前的可选拦截器协议。

- **类型**

```objectivec
@protocol PKPaymentInterceptor <NSObject>
```
- **方法**

```objectivec
- (void)beforeRequestPayment:(id)paymentSource;
```

```swift
func beforeRequestPayment(_ paymentSource: Any)
```
- **详细信息**
  - 当前主要由 Apple Pay 在展示系统支付面板前调用。
  - 可在此方法中读取 `PKApplePayment.paymentRequest` 并调整付款摘要等请求内容。


# Drop-In API

## PKPaymentBottomSheet

用于展示包含多种支付方式的 Drop-In 原生收银台底部弹窗。

- **类型**

```objectivec
@interface PKPaymentBottomSheet : NSObject
```
- **属性**
  - `onPayCallback` (`id<PKPaymentResultCallback>`)：支付结果回调，展示前必须设置。
  - `isUiInitCompleted` (`BOOL`)：收银台界面是否已初始化完成。
  - `isProcessing` (`BOOL`)：收银台当前是否正在处理支付。


### initWithCheckoutSessionId()

使用 Checkout Session ID 创建 Drop-In 收银台。

- **类型**

```objectivec
- (instancetype)initWithCheckoutSessionId:(nullable NSString *)checkoutSessionId;

- (instancetype)initWithCheckoutSessionId:(nullable NSString *)checkoutSessionId
                      onSheetCloseCallback:(void (^ _Nullable)(PKPaymentBottomSheet *sheet))onSheetCloseCallback;
```

```swift
PKPaymentBottomSheet(checkoutSessionId: String?)
PKPaymentBottomSheet(
    checkoutSessionId: String?,
    onSheetCloseCallback: ((PKPaymentBottomSheet) -> Void)?
)
```
- **详细信息**
  - `checkoutSessionId`：服务端创建的有效 Checkout Session ID。
  - `onSheetCloseCallback`：Sheet 关闭动画完成后在主线程调用。
  - 默认初始化方法不可用。


### showMerchantName() / show()

配置并展示 Drop-In 收银台。

- **类型**

```objectivec
- (void)showMerchantName;
- (void)showFromPresenter:(nullable UIViewController *)presenter
               completion:(void (^ _Nullable)(void))completion;
```

```swift
sheet.showMerchantName()
sheet.show(fromPresenter: UIViewController?, completion: (() -> Void)?)
```
- **详细信息**
  - `showMerchantName`：显示默认隐藏的商户名称区域。
  - `presenter`：用于模态展示的视图控制器。传 `nil` 时，SDK 会自动查找当前可展示页面。
  - `completion`：展示动画完成后的回调。


### hide()

关闭 Drop-In 收银台。

- **类型**

```objectivec
- (void)hideWithCompletion:(void (^ _Nullable)(void))completion;
- (void)hide;
```
- **详细信息**
  - 页面退出或不再使用 Sheet 时，应调用 `hide` 并释放实例。
  - 可通过 `setShouldDismissOnBackgroundTap:` 和 `setShouldDismissOnDraggingDownSheet:` 控制用户关闭行为。
- **示例**

```objectivec
PKPaymentBottomSheet *sheet =
    [[PKPaymentBottomSheet alloc]
        initWithCheckoutSessionId:@"your_session_id"
        onSheetCloseCallback:^(PKPaymentBottomSheet *sheet) {
            NSLog(@"收银台已关闭");
        }];
sheet.onPayCallback = self;
[sheet showMerchantName];
[sheet showFromPresenter:self completion:nil];
```

```swift
let sheet = PKPaymentBottomSheet(checkoutSessionId: "your_session_id") { _ in
    print("收银台已关闭")
}
sheet.onPayCallback = callback
sheet.showMerchantName()
sheet.show(fromPresenter: nil, completion: nil)
```


# Apple Pay API

## PKApplePayment

用于构建 Apple Pay 请求、展示系统支付面板并提交支付凭据。

- **类型**

```objectivec
@interface PKApplePayment : PKPaymentBase
```
- **属性**
  - `form` (`PKApplePaymentForm *`，可为空)：关联的 Apple Pay 表单。
  - `paymentRequest` (`PKPaymentRequest *`，可为空)：当前支付流程生成的 Apple Pay 请求。
  - `paymentResultCallback`：继承自 `PKPaymentBase` 的支付结果回调。
  - `interceptor`：继承自 `PKPaymentBase` 的支付请求拦截器。


### requestPayment()

发起 Apple Pay 支付。

- **类型**

```objectivec
- (void)requestPaymentWithCheckoutSessionId:(nullable NSString *)checkoutSessionId;
- (void)requestPayment;
+ (BOOL)canMakePayments;
```

```swift
payment.request()
PKApplePayment.canMakePayments()
```
- **详细信息**
  - `requestPaymentWithCheckoutSessionId:`：使用传入的 Checkout Session ID 发起支付。
  - `requestPayment`：使用初始化时保存的 Checkout Session ID 发起支付。
  - `canMakePayments`：检查设备是否具备基础 Apple Pay 支付能力，不验证本次 Checkout 的商户、卡组织或货币配置。
  - 调用前必须设置 `paymentResultCallback`。
  - 可通过 `setError:nil` 清除关联表单中的旧错误。
- **示例**

```objectivec
PKApplePayment *payment =
    [[PKApplePayment alloc] initWithCheckoutSessionId:@"your_session_id"];
payment.form = form;
payment.paymentResultCallback = self;
payment.interceptor = self;
[payment setError:nil];
[payment requestPayment];
```

```swift
let payment = PKApplePayment(checkoutSessionId: "your_session_id")
payment.form = form
payment.paymentResultCallback = callback
payment.interceptor = interceptor
payment.setError(nil)
payment.request()
```


## PKApplePaymentForm

Apple Pay 表单组件，包含 Apple Pay 按钮、加载状态和错误提示区域。

- **类型**

```objectivec
@interface PKApplePaymentForm : UIControl
```
- **属性**
  - `pkApplePaymentButton` (`PKApplePaymentButton *`)：Apple Pay 支付按钮。
- **方法**
  - `setError:`：更新或清除支付错误。
  - `setLoading:animated:`：更新表单加载状态。


## PKApplePaymentButton

Apple Pay 支付按钮组件。

- **类型**

```objectivec
@interface PKApplePaymentButton : UIControl
```
- **属性**
  - `applePaymentButton` (`PKPaymentButton *`)：内部 PassKit 按钮。
  - `onTap`：按钮点击回调。
  - `loading` (`BOOL`)：当前是否处于加载状态。
- **方法**
  - `setEnabled:animated:`：更新按钮启用状态。
  - `setLoading:`：更新加载状态。
  - `setLoading:animated:`：通过动画更新加载状态。
- **详细信息**
  - 业务点击事件应绑定到外层 `PKApplePaymentButton`，不要直接绑定内部 `PKPaymentButton`。
  - 同时设置 `onTap` 和 Target/Action 时，SDK 会先执行 `onTap`，再发送 `UIControlEventTouchUpInside`。


# 银行卡支付 API

## PKBankCardPayment

用于初始化银行卡表单配置、验证表单并提交银行卡支付。

- **类型**

```objectivec
@interface PKBankCardPayment : PKPaymentBase
```
- **属性**
  - `form` (`PKCardPaymentForm *`)：当前支付对象绑定的银行卡表单。


### initWithPKCardPaymentForm()

使用银行卡表单和 Checkout Session ID 创建支付对象。

- **类型**

```objectivec
- (instancetype)initWithPKCardPaymentForm:(nullable PKCardPaymentForm *)form
                        checkoutSessionId:(nullable NSString *)checkoutSessionId;

- (instancetype)initWithPKCardPaymentForm:(nullable PKCardPaymentForm *)form
                        checkoutSessionId:(nullable NSString *)checkoutSessionId
                                 complete:(void (^ _Nullable)(NSError * _Nullable error,
                                                              NSDictionary * _Nullable sessionInfo))complete;
```

```swift
PKBankCardPayment(
    pkCardPaymentForm: PKCardPaymentForm?,
    checkoutSessionId: String?,
    complete: ((Error?, [AnyHashable: Any]?) -> Void)?
)
```
- **详细信息**
  - `form`：用于收集银行卡和账单地址信息的表单。实际发起支付时必须存在。
  - `checkoutSessionId`：服务端创建的 Checkout Session ID。
  - `complete`：异步字段配置请求完成后的回调，成功时返回 Session 信息，失败时返回错误。
  - `complete` 只在需要异步加载表单字段配置时调用；表单为空或字段配置已经完成时不会调用。
  - 基类的 `initWithCheckoutSessionId:` 对 `PKBankCardPayment` 不可用。


### requestPayment()

验证表单并发起银行卡支付。

- **类型**

```objectivec
- (void)requestPaymentWithCheckoutSessionId:(nullable NSString *)checkoutSessionId;
```
- **详细信息**
  - 发起支付前必须设置 `paymentResultCallback`，并确保表单初始化完成且输入有效。
  - 表单初始化完成前，应禁用表单和支付按钮。
  - 可通过 `setError:nil` 清除表单中的旧支付错误。
- **示例**

```objectivec
PKCardPaymentForm *form = [[PKCardPaymentForm alloc] init];
PKBankCardPayment *payment =
    [[PKBankCardPayment alloc]
        initWithPKCardPaymentForm:form
        checkoutSessionId:@"your_session_id"
        complete:^(NSError *error, NSDictionary *sessionInfo) {
            if (error) {
                [form setError:error];
            }
        }];
payment.paymentResultCallback = self;
[payment requestPaymentWithCheckoutSessionId:@"your_session_id"];
```


## PKCardPaymentForm

用于收集并校验银行卡、持卡人和账单地址信息的表单组件。

- **类型**

```objectivec
@interface PKCardPaymentForm : UIControl
```
- **方法**

```objectivec
- (void)validateWithCallback:(void (^)(NSArray<NSNumber *> *resultArray))onValidateCallback
             onErrorCallback:(void (^)(NSError *error))onErrorCallback;

- (void)setEditingChangedCallback:(void (^)(void))onAllFieldsValidCallback
      onFieldInputInvalidCallback:(void (^)(NSError *error))onFieldInputInvalidCallback;

- (void)setError:(nullable id)throwable;
```
- **详细信息**
  - `validateWithCallback:onErrorCallback:`：校验全部支付字段，并同步更新字段错误样式。
  - `setEditingChangedCallback:onFieldInputInvalidCallback:`：监听表单实时校验状态，可用于控制支付按钮是否启用。
  - `setError:`：更新或清除表单底部的支付错误，不会改变单个输入字段的校验状态。
  - 建议只设置一次编辑回调；重复调用可能为输入框追加监听。


# Alipay+ API

## PKAlipayPlusPayment

用于创建 Alipay+ 支付订单、展示支付面板并处理支付结果。

- **类型**

```objectivec
@interface PKAlipayPlusPayment : PKPaymentBase
```
- **属性**
  - `form` (`PKAlipayPlusPaymentForm *`，可为空)：用于展示支付错误的 Alipay+ 表单。


### requestPayment()

发起 Alipay+ 支付。

- **类型**

```objectivec
- (void)requestPaymentWithCheckoutSessionId:(nullable NSString *)checkoutSessionId;
- (void)requestPayment;
```

```swift
payment.request()
```
- **详细信息**
  - 调用前必须设置 `paymentResultCallback`。
  - `requestPayment` 使用初始化时保存的 Checkout Session ID。
  - 依赖商户配置中的 `KEY_ALIPAY_PLUS_ACQUIRER_ID`。
  - 从外部钱包或页面返回 App 后，SDK 可能继续查询订单最终状态并完成结果回调。
- **示例**

```swift
let form = PKAlipayPlusPaymentForm()
let payment = PKAlipayPlusPayment(checkoutSessionId: "your_session_id")
payment.form = form
payment.paymentResultCallback = callback
payment.setError(nil)
payment.request()
```


## PKAlipayPlusPaymentForm

用于展示 Alipay+ 支付错误的表单组件。

- **类型**

```objectivec
@interface PKAlipayPlusPaymentForm : UIControl
```
- **方法**
  - `setError:`：更新或清除支付错误。
- **详细信息**
  - 当前没有额外输入项，主要用于承载错误态展示。
  - 支付按钮由商户 App 单独提供。


# WeChat Pay API

## PKWeChatPayment

用于创建微信支付订单、拉起微信 App 并处理支付结果。

- **类型**

```objectivec
@interface PKWeChatPayment : PKPaymentBase
```
- **属性**
  - `form` (`PKWeChatPaymentForm *`，可为空)：用于展示支付错误的微信支付表单。


### requestPayment()

发起微信支付。

- **类型**

```objectivec
- (void)requestPaymentWithCheckoutSessionId:(nullable NSString *)checkoutSessionId;
- (void)requestPayment;
```

```swift
payment.request()
```
- **详细信息**
  - 调用前必须设置 `paymentResultCallback`。
  - `requestPayment` 使用初始化时保存的 Checkout Session ID。
  - 依赖商户配置中的 `KEY_WECHAT_PAY_APP_ID` 和 `KEY_WECHAT_PAY_APP_UNIVERSAL_LINK`。
  - 用户从微信返回 App 后，SDK 可能继续查询订单最终状态并完成结果回调。
- **示例**

```objectivec
PKWeChatPaymentForm *form = [[PKWeChatPaymentForm alloc] init];
PKWeChatPayment *payment =
    [[PKWeChatPayment alloc] initWithCheckoutSessionId:@"your_session_id"];
payment.form = form;
payment.paymentResultCallback = self;
[payment setError:nil];
[payment requestPayment];
```


## PKWeChatPaymentForm

用于展示微信支付错误的表单组件。

- **类型**

```objectivec
@interface PKWeChatPaymentForm : UIControl
```
- **方法**
  - `setError:`：更新或清除支付错误。
- **详细信息**
  - 当前没有额外输入项，主要用于承载错误态展示。
  - 支付按钮由商户 App 单独提供。


## WeChatPayKKaHandler

将商户 App 收到的 URL Scheme 和 Universal Link 回跳转交给 WeChatOpenSDK 和当前微信支付对象。

- **类型**

```objectivec
@interface WeChatPayKKaHandler : NSObject
```
- **方法**

```objectivec
+ (instancetype)shared;
+ (BOOL)handleOpenURL:(NSURL *)url;
+ (BOOL)handleUniversalLink:(NSUserActivity *)userActivity;
```

```swift
WeChatPayKKaHandler.shared()
WeChatPayKKaHandler.handleOpen(_ url: URL) -> Bool
WeChatPayKKaHandler.handleUniversalLink(_ userActivity: NSUserActivity) -> Bool
```
- **详细信息**
  - `handleOpenURL:`：处理 URL Scheme 回跳。
  - `handleUniversalLink:`：处理 Universal Link 回跳。
  - WeChatOpenSDK 接受回跳时返回 `YES`；依赖缺失或运行时调用异常时返回 `NO`。
  - 商户 App 应调用上述公开转发方法，不要直接将 `WeChatPayKKaHandler.shared` 传给 `WXApi`。
- **示例**

```objectivec
- (void)scene:(UIScene *)scene
    openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts {
    NSURL *url = URLContexts.anyObject.URL;
    if (url) {
        [WeChatPayKKaHandler handleOpenURL:url];
    }
}

- (void)scene:(UIScene *)scene
    continueUserActivity:(NSUserActivity *)userActivity {
    [WeChatPayKKaHandler handleUniversalLink:userActivity];
}
```

```swift
.onOpenURL { url in
    _ = WeChatPayKKaHandler.handleOpen(url)
}
.onContinueUserActivity(NSUserActivityTypeBrowsingWeb) { activity in
    _ = WeChatPayKKaHandler.handleUniversalLink(activity)
}
```


# 数据模型

## PKPaymentResult

包含归一化支付结果和原始支付数据的对象。

- **类型**

```objectivec
@interface PKPaymentResult : NSObject
```
- **属性**
  - `status` (`PKPaymentStatus`)：支付状态。
  - `message` (`NSString *`，可为空)：结果提示或错误信息。
  - `result` (`NSDictionary *`，可为空)：原始支付结果数据。
  - `paymentResultObj` (`NSDictionary *`)：支付结果的完整字典表示。


### initWithStatus()

使用支付状态、原始结果和提示信息创建支付结果对象。

- **类型**

```objectivec
- (instancetype)initWithStatus:(PKPaymentStatus)status
                        result:(nullable NSDictionary *)result
                       message:(nullable NSString *)message;
```

```swift
PKPaymentResult(
    status: PKPaymentStatus,
    result: [AnyHashable: Any]?,
    message: String?
)
```


### PKPaymentStatus

支付状态枚举：

- `PKPaymentStatusUnknown` / `.unknown`：未知状态。
- `PKPaymentStatusSuccess` / `.success`：支付成功。
- `PKPaymentStatusExpired` / `.expired`：支付或 Checkout Session 已过期。
- `PKPaymentStatusError` / `.error`：支付过程中发生错误。


### fromString() / toString()

在支付结果对象和 JSON 字符串之间转换。

- **类型**

```objectivec
+ (instancetype)fromString:(NSString *)jsonString;
- (NSString *)toString;
```


## PKJSEvent

注意
此类型用于旧版 WebView 收银台的 JavaScript 事件。新接入请优先使用 Drop-In 或 Component 模式。

details
summary
来自 WebView 收银台的 JavaScript 事件。
- **属性**
  - `type` (`PKJSEventType`)：事件类型。
  - `data` (`NSDictionary *`，可为空)：事件携带的数据。
  - `jsEventObj` (`NSDictionary *`)：事件的完整字典表示。
- **PKJSEventType 枚举**
  - `EventTypeUnknown`：未知事件。
  - `EventTypeClose`：用户点击收银台关闭按钮。
- **方法**
  - `fromString:`：从 JSON 字符串创建事件对象。
  - `toString`：将事件对象序列化为 JSON 字符串。