从0到1搞定iOS支付接入:微信、支付宝、订阅一文通关 ...

打印 上一主题 下一主题

主题 1582|帖子 1582|积分 4746

随着“钱包”变得越来越轻,手机支付早已成为我们日常生活的一部分,尤其是在微信和支付宝的“陪伴”下,几乎每个iOS应用都能享受这种便捷的支付方式。但对于开辟者来说,接入微信支付、支付宝支付以及自动续费功能,通常像在玩“闯关游戏”——时不时遇到一些让你头疼的小坑,偶然你明明觉得自己已经做得天衣无缝,效果支付效果还是迟迟不来,或者署名验证变成了无解困难。
不用怕!本文将带你一起跳过这些坑,像大厨一样轻松“烹调”出微信支付、支付宝支付与自动续费功能的完善接入方案。联合项目代码,解锁开辟过程中的常见问题和解决技巧,让你能顺利接入支付功能,告别支付失败的烦恼,欢迎用户钱包里的满满“钞票”。
iOS接入微信支付、支付宝支付和自动续费步骤:

  • 微信支付:在微信开放平台下载SDK,配置Info.plist中URL Schemes,实现AppDelegate中的回调逻辑。通事后台获取支付参数,使用WXApi发起支付哀求并监听支付效果。
  • 支付宝支付:从支付宝开放平台下载SDK,配置Info.plist中URL Schemes,并在AppDelegate中处置惩罚AlipaySDK的支付回调。调用支付宝SDK接口发起支付,监听支付效果。
  • 自动续费:在App Store Connect创建订阅商品,使用StoreKit哀求商品信息并发起购买。通过SKPaymentQueue监听交易状态,完成购买和验证。
  • 联合逻辑:根据用户选择调用对应支付方法,支付效果由服务端或苹果验证处置惩罚,实现自动续费或一次性支付功能。
在 iOS 中接入微信支付、支付宝支付,并支持自动续费,通常需要联合官方 SDK 和 Apple 的订阅机制。以下是实现方案和示例代码。


一、微信支付接入

步骤 1:获取微信支付 SDK



  • 到 微信开放平台 下载 iOS SDK,集成到项目中。
步骤 2:配置项目


  • 在 Info.plist 中添加 URL Scheme:
    1. <key>LSApplicationQueriesSchemes</key>
    2. <array>
    3.     <string>weixin</string>
    4. </array>
    5. <key>CFBundleURLTypes</key>
    6. <array>
    7.     <dict>
    8.         <key>CFBundleURLSchemes</key>
    9.         <array>
    10.             <string>wx1234567890abcdef</string> <!-- 替换为你的微信 AppID -->
    11.         </array>
    12.     </dict>
    13. </array>
    复制代码
  • 在 AppDelegate.swift 中实现回调:
    1. import UIKit
    2. import WXApi
    3. @UIApplicationMain
    4. class AppDelegate: UIResponder, UIApplicationDelegate, WXApiDelegate {
    5.     func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    6.         return WXApi.handleOpen(url, delegate: self)
    7.     }
    8.     func onResp(_ resp: BaseResp) {
    9.         if let payResp = resp as? PayResp {
    10.             switch payResp.errCode {
    11.             case WXSuccess.rawValue:
    12.                 print("支付成功")
    13.             default:
    14.                 print("支付失败,错误码:\(payResp.errCode)")
    15.             }
    16.         }
    17.     }
    18. }
    复制代码
步骤 3:调用支付接口



  • 在你的支付界面,获取后台返回的支付参数并发起支付。
    1. import WXApi
    2. func startWeChatPay(orderInfo: [String: Any]) {
    3.     let req = PayReq()
    4.     req.partnerId = orderInfo["partnerId"] as? String
    5.     req.prepayId = orderInfo["prepayId"] as? String
    6.     req.package = orderInfo["package"] as? String
    7.     req.nonceStr = orderInfo["nonceStr"] as? String
    8.     req.timeStamp = UInt32(orderInfo["timeStamp"] as? String ?? "0") ?? 0
    9.     req.sign = orderInfo["sign"] as? String
    10.    
    11.     WXApi.send(req) { success in
    12.         print(success ? "支付请求已发起" : "支付请求失败")
    13.     }
    14. }
    复制代码

二、支付宝支付接入

步骤 1:获取支付宝 SDK



  • 到 支付宝开放平台 下载 iOS SDK。
步骤 2:配置项目


  • 在 Info.plist 中添加 URL Scheme:
    1. <key>CFBundleURLTypes</key>
    2. <array>
    3.     <dict>
    4.         <key>CFBundleURLSchemes</key>
    5.         <array>
    6.             <string>alipay123456</string> <!-- 替换为你的支付宝 Scheme -->
    7.         </array>
    8.     </dict>
    9. </array>
    复制代码
  • 在 AppDelegate.swift 中实现回调:
    1. import UIKit
    2. @UIApplicationMain
    3. class AppDelegate: UIResponder, UIApplicationDelegate {
    4.     func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    5.         if url.host == "safepay" {
    6.             AlipaySDK.defaultService()?.processOrder(withPaymentResult: url, standbyCallback: { result in
    7.                 print("支付结果:\(result ?? [:])")
    8.             })
    9.         }
    10.         return true
    11.     }
    12. }
    复制代码
步骤 3:调用支付接口



  • 从后台获取订单信息后,调用以下代码:
    1. import AlipaySDK
    2. func startAlipay(orderInfo: String) {
    3.     AlipaySDK.defaultService()?.payOrder(orderInfo, fromScheme: "alipay123456") { result in
    4.         print("支付结果:\(result ?? [:])")
    5.     }
    6. }
    复制代码

三、自动续费(Apple 内购)

步骤 1:配置 Apple 内购商品


  • 在 App Store Connect 创建订阅商品。
  • 设置订阅周期、代价等信息。
步骤 2:实现内购逻辑



  • 使用 StoreKit 框架。

  • 哀求商品信息:
    1. import StoreKit
    2. class IAPManager: NSObject, SKProductsRequestDelegate {
    3.     static let shared = IAPManager()
    4.     private var products: [SKProduct] = []
    5.     func fetchProducts(productIDs: [String]) {
    6.         let request = SKProductsRequest(productIdentifiers: Set(productIDs))
    7.         request.delegate = self
    8.         request.start()
    9.     }
    10.     func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
    11.         self.products = response.products
    12.         for product in response.products {
    13.             print("商品名称: \(product.localizedTitle), 价格: \(product.price)")
    14.         }
    15.     }
    16. }
    复制代码
  • 发起购买:
    1. extension IAPManager: SKPaymentTransactionObserver {
    2.     func purchase(productID: String) {
    3.         guard let product = products.first(where: { $0.productIdentifier == productID }) else { return }
    4.         let payment = SKPayment(product: product)
    5.         SKPaymentQueue.default().add(self)
    6.         SKPaymentQueue.default().add(payment)
    7.     }
    8.     func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
    9.         for transaction in transactions {
    10.             switch transaction.transactionState {
    11.             case .purchased:
    12.                 print("购买成功")
    13.                 SKPaymentQueue.default().finishTransaction(transaction)
    14.             case .failed:
    15.                 print("购买失败")
    16.                 SKPaymentQueue.default().finishTransaction(transaction)
    17.             default:
    18.                 break
    19.             }
    20.         }
    21.     }
    22. }
    复制代码

四、支付与自动续费联合逻辑


  • 在 App 内提供切换选项:

    • 用户选择微信支付或支付宝支付,用于一次性付费。
    • 用户选择订阅方案,跳转到 Apple 内购。

  • 通过服务端验证支付或订阅状态:

    • 微信/支付宝:通过支付订单状态接口查询支付效果。
    • Apple 订阅:通过 Apple 的验证服务端 API 检查用户的订阅状态。


完整示例代码逻辑

根据项目需求,将微信、支付宝与内购逻辑集成到同一的支付管理类,动态调用对应方法。具体代码可进一步细化,视项目功能而定。
接入微信支付、支付宝支付和自动续费的过程中,有几个常见的坑需要注意。以下联合代码分析这些问题,并提供解决方案。

1. 微信支付

坑点 1:署名错误导致支付失败



  • 问题:后台生成的署名必须与微信支付文档中的规则完全一致。
  • 解决

    • 确保署名字段严格按照微信官方文档的次序拼接。
    • 使用后台生成的署名进行验证。
    • 示例:
      1. func validateSignature(orderInfo: [String: Any]) -> Bool {
      2.     // 示例:后台生成的签名,确保和前端匹配
      3.     let serverSign = orderInfo["sign"] as? String ?? ""
      4.     // 本地签名计算,确保一致
      5.     let localSign = calculateSignature(params: orderInfo)
      6.     return serverSign == localSign
      7. }
      8. func calculateSignature(params: [String: Any]) -> String {
      9.     // 根据微信规则拼接字段
      10.     // 示例实现需根据具体项目补充
      11.     return "calculated_sign"
      12. }
      复制代码

坑点 2:无法正确处置惩罚支付回调



  • 问题:回调未正确实现,导致支付状态无法转达到前端。
  • 解决:确保在AppDelegate中实现微信回调:
    1. func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
    2.     return WXApi.handleOpen(url, delegate: self)
    3. }
    4. func onResp(_ resp: BaseResp) {
    5.     if let payResp = resp as? PayResp {
    6.         // 处理支付结果
    7.         switch payResp.errCode {
    8.         case WXSuccess.rawValue:
    9.             print("支付成功")
    10.             // 通知前端或更新UI
    11.         default:
    12.             print("支付失败,错误码:\(payResp.errCode)")
    13.         }
    14.     }
    15. }
    复制代码

2. 支付宝支付

坑点 1:无法获取支付效果回调



  • 问题:假如未正确配置Info.plist中的URL Schemes,支付回调无法触发。
  • 解决:确保支付宝URL Schemes配置正确,并在回调中处置惩罚效果:
    1. func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
    2.     if url.host == "safepay" {
    3.         AlipaySDK.defaultService()?.processOrder(withPaymentResult: url, standbyCallback: { result in
    4.             print("支付结果:\(result ?? [:])")
    5.         })
    6.         return true
    7.     }
    8.     return false
    9. }
    复制代码
坑点 2:署名格式不匹配



  • 问题:支付宝署名校验失败常因私钥或拼接方式错误。
  • 解决

    • 使用正确的RSA私钥加密生成署名。
    • 确保与支付宝官方工具校验一致。


3. 自动续费(内购)

坑点 1:用户订阅状态同步不及时



  • 问题:用户支付完成,但服务端未及时验证订阅状态,导致功能无法解锁。
  • 解决

    • 使用服务器端验证收据,确保订阅状态及时更新:
      1. func validateReceipt(receiptData: Data) {
      2.     // 将收据发送到服务器进行验证
      3.     let receiptString = receiptData.base64EncodedString()
      4.     // 示例:发送到服务器的请求代码
      5.     let url = URL(string: "https://yourserver.com/validateReceipt")!
      6.     var request = URLRequest(url: url)
      7.     request.httpMethod = "POST"
      8.     request.httpBody = try? JSONSerialization.data(withJSONObject: ["receipt": receiptString], options: [])
      9.    
      10.     URLSession.shared.dataTask(with: request) { data, response, error in
      11.         // 处理服务器返回结果
      12.     }.resume()
      13. }
      复制代码

坑点 2:商品 ID 不匹配



  • 问题:哀求的商品 ID 与 App Store 配置不一致。
  • 解决:确保代码中的商品 ID 和 App Store 的设置完全一致:
    1. let productIDs = ["com.yourapp.subscription.monthly"]
    2. IAPManager.shared.fetchProducts(productIDs: productIDs)
    复制代码
坑点 3:交易未正确完成



  • 问题:忘记调用finishTransaction,导致交易无法竣事,用户无法继续购买。
  • 解决
    1. func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
    2.     for transaction in transactions {
    3.         switch transaction.transactionState {
    4.         case .purchased:
    5.             print("购买成功")
    6.             SKPaymentQueue.default().finishTransaction(transaction)
    7.         case .failed:
    8.             print("购买失败")
    9.             SKPaymentQueue.default().finishTransaction(transaction)
    10.         default:
    11.             break
    12.         }
    13.     }
    14. }
    复制代码

4. 服务端与客户端逻辑联合

坑点 1:未验证支付效果



  • 问题:支付效果仅通过客户端判定,存在安全风险。
  • 解决:将支付效果发送至服务端,同一验证微信、支付宝、Apple 内购的状态。
坑点 2:网络超时处置惩罚不妥



  • 问题:支付完成后,网络耽误导致状态无法及时同步。
  • 解决:提供重试机制,确保支付或订阅效果能正确处置惩罚。

总结


  • 署名问题:严格遵循微信/支付宝的署名规则,确保服务端与客户端一致。
  • 回调处置惩罚:微信、支付宝回调配置必须正确,且前后端逻辑要同步。
  • 内购验证:Apple 自动续费必须通过服务端验证收据,避免当地校验被绕过。
  • 网络耽误与重试机制:支付效果同步到服务端时需增加重试机制,避免因网络问题导致订单状态异常。
以上方案和代码示例,可有用规避常见坑点,确保支付功能稳定可靠。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用户云卷云舒

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表