基于Authorize.net iOS SDK,如何使用已生成的Token向用户扣费?
我之前做过几次Authorize.net的iOS集成,确实官方文档有些零散,刚好帮你梳理下用已生成的支付令牌完成扣费的核心流程:
首先得确认你拿到的是支付令牌(Payment Token)——就是从Accept.js或者Authorize.net其他前端工具生成的、代表用户支付信息的token,不是API密钥那种token。接下来咱们一步步来:
1. 初始化SDK(若未完成)
先确保项目已集成Authorize.net iOS SDK,然后在需要支付的场景初始化客户端,注意区分沙盒和生产环境:
import AuthorizeNet // 沙盒环境用这个配置,上线前替换为生产环境 let environment = ANEnvironment.sandbox() // 传入你的API Login ID和Transaction Key let paymentClient = ANAPIClient(apiLoginID: "YOUR_API_LOGIN_ID", transactionKey: "YOUR_TRANSACTION_KEY", environment: environment)
2. 构建扣费交易请求
用你已有的支付令牌创建交易请求,这里以最常用的「授权并立即扣费(Auth & Capture)」为例:
// 传入生成好的支付令牌 let paymentSource = ANPaymentDataSource(token: "YOUR_GENERATED_PAYMENT_TOKEN") // 设置交易金额,注意用Decimal类型,比如19.99美元 let transactionAmount = NSDecimalNumber(string: "19.99") // 创建Auth & Capture请求 let chargeRequest = ANAuthCaptureTransactionRequest(amount: transactionAmount, payment: paymentSource) // 可选:添加订单信息,方便后台对账 chargeRequest.order = ANOrder() chargeRequest.order?.invoiceNumber = "ORDER_00123" chargeRequest.order?.description = "Premium Subscription Monthly Fee"
3. 发起交易并处理结果
调用客户端方法发起请求,在回调里处理成功/失败场景:
paymentClient.send(chargeRequest) { response, error in // 切回主线程更新UI DispatchQueue.main.async { if let requestError = error { // 处理错误:网络问题、交易被拒等 print("交易失败:\(requestError.localizedDescription)") // 若为API返回的错误,可查看详细代码和信息 if let apiError = requestError as? ANAPIError { print("错误代码:\(apiError.code),详情:\(apiError.message)") } return } guard let chargeResponse = response as? ANAuthCaptureTransactionResponse else { print("无效的响应格式") return } if chargeResponse.isApproved { // 交易成功!获取交易ID等信息 print("交易成功,交易ID:\(chargeResponse.transactionID ?? "未知")") // 这里可以跳转到成功页面,或同步交易信息到你的服务器 } else { // 交易被拒绝,查看具体原因 print("交易被拒:\(chargeResponse.responseText ?? "未知原因")") print("响应代码:\(chargeResponse.responseCode)") } } }
关键注意事项
- 环境切换:上线前务必把沙盒环境替换为生产环境,同时更新对应的API Login ID和Transaction Key。
- Token复用:支付令牌一般是一次性的,如果需要给用户重复扣费,建议创建Customer Profile存储用户支付信息,生成
Customer Payment Profile ID,后续直接用这个ID发起交易即可。 - 合规要求:使用Token的核心优势是避免在App内处理原始信用卡信息,确保符合PCI合规,绝对不要在客户端存储信用卡相关数据!
- 错误覆盖:务必处理所有错误场景,比如网络超时、卡过期、余额不足、API权限问题等,给用户清晰的提示信息。
如果需要实现其他交易类型(比如先授权后扣费、退款等),只需替换对应的请求类即可,比如ANAuthOnlyTransactionRequest(仅授权)、ANCaptureTransactionRequest(捕获已授权交易)。
内容的提问来源于stack exchange,提问作者Mandeep Sangwan




