You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

类Electron程序接入Apple Pay API及上架Apple Store相关技术咨询

类Electron应用接入Apple Pay上架App Store全流程方案

1. 技术栈适配核心思路

你当前的技术栈不需要做大规模重构,核心逻辑是给应用套一层极薄的原生macOS壳做Apple Pay能力桥接,现有前端、本地Flask后端代码只需做少量适配即可:

  • 你的类Electron应用本质是跑在WKWebView内核上的网页应用,可直接在原生壳层注册JS桥接方法,让前端JS可以调用原生暴露的Apple Pay触发接口
  • 支付结果、凭证由原生层获取后,通过JS桥接回传给前端,前端再通过AJAX把支付凭证传给本地Flask后端做验签和权限开通逻辑

2. 接入操作步骤

2.1 原生桥接层开发

仅需写少量Swift代码完成桥接和Apple Pay调用逻辑:

  • 用Xcode新建macOS项目,配置和App Store Connect一致的Bundle ID,在Signing & Capabilities中添加Apple Pay能力,绑定你在开发者中心申请的商户ID
  • 给项目内的WKWebView配置WKScriptMessageHandler,注册名为triggerApplePay的监听方法,前端JS调用window.webkit.messageHandlers.triggerApplePay.postMessage(支付参数)即可触发原生Apple Pay流程
  • 原生层按照苹果官方要求构造PKPaymentRequest对象,设置商户ID、金额、币种、支持的卡组织等参数,调用PKPaymentAuthorizationViewController拉起支付页

2.2 支付有效性校验逻辑

可直接对接你现有的Flask后端完成验签:

  • 原生层拿到Apple Pay返回的支付凭证PKPaymentToken后,把token完整数据(包含paymentData、signature等字段)通过桥接传给前端,前端再发送给本地运行的Flask后端
  • Flask后端用你在Apple开发者中心下载的商户证书对token的签名做验签即可,验签通过即代表支付有效,可直接给用户开通对应付费权限
  • 验签核心逻辑是验证Apple根证书、中级证书的签名链,再解密paymentData拿到实际交易信息,比对金额、商户ID和请求参数是否匹配

2.3 打包上架注意事项

  • 把本地Flask后端的Python运行环境和代码一起打包进原生应用的资源目录,应用启动时自动拉起Flask进程监听本地端口,WKWebView直接加载本地服务地址即可
  • 上架前需要在App Store Connect的付费协议板块完成税务、银行卡信息配置,否则Apple Pay能力无法正常生效
  • 应用内不要出现任何第三方支付入口,仅保留Apple Pay选项,避免审核被驳回

3. 关键代码示例

3.1 Swift桥接注册代码

// 注册JS监听
webView.configuration.userContentController.add(self, name: "triggerApplePay")

// 接收JS传来的支付参数
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    if message.name == "triggerApplePay", let payParams = message.body as? [String: Any] {
        // 构造PKPaymentRequest拉起支付
        let request = PKPaymentRequest()
        request.merchantIdentifier = "你申请的商户ID"
        request.supportedNetworks = [.visa, .masterCard, .unionPay]
        request.merchantCapabilities = .capability3DS
        request.countryCode = "CN"
        request.currencyCode = "CNY"
        request.paymentSummaryItems = [
            PKPaymentSummaryItem(label: "付费功能解锁", amount: NSDecimalNumber(string: payParams["amount"] as! String))
        ]
        let paymentVC = PKPaymentAuthorizationViewController(paymentRequest: request)
        paymentVC?.delegate = self
        present(paymentVC!, animated: true)
    }
}

3.2 Python Flask验签核心逻辑

from OpenSSL import crypto
import json

def verify_apple_pay_token(payment_token, request_amount):
    # 加载本地存储的Apple根证书、中级证书和商户证书
    root_cert = crypto.load_certificate(crypto.FILETYPE_PEM, open("AppleRootCA-G3.pem").read())
    intermediate_cert = crypto.load_certificate(crypto.FILETYPE_PEM, open("AppleWWDRCAG3.pem").read())
    merchant_cert = crypto.load_certificate(crypto.FILETYPE_PEM, open("your_merchant_cert.pem").read())
    
    # 验证证书签名链
    store = crypto.X509Store()
    store.add_cert(root_cert)
    store.add_cert(intermediate_cert)
    store_ctx = crypto.X509StoreContext(store, merchant_cert)
    try:
        store_ctx.verify_certificate()
        # 验证通过后解析paymentData核对交易信息
        payment_data = json.loads(payment_token["paymentData"])
        if payment_data["merchantIdentifier"] == "你的商户ID" and str(payment_data["amount"]) == str(request_amount):
            return True
    except Exception as e:
        return False
    return False

内容的提问来源于stack exchange,提问作者Dsibe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 15:54:07