移动端支付集成回顾

Image by mohamed Hassan from Pixabay

需求

最近接到集成移动支付功能的业务,需要支持支付宝和微信两类主流的移动支付平台。

该业务需要移植到其它项目, 基于组件化的考虑,决定使用 cocoapods 私有库功能 制作一个 SGPaylib,把支付宝支付和微信支付封装在 SGPay 中,在需要使用支付功能的工程中使用 Podfile 引用。

cocoapods私有库教程可参考之前的文章Cocoapods Private Pods

SGPay

初步依赖关系:

  1. 创建 Lib

    在终端执行下面命令

     pod lib create SGPay
    
  2. 添加依赖库

    打开工程,在 SGPay.podspec 中添加支付宝和微信的SDK

     s.dependency 'AlipaySDK-iOS'
     s.dependency 'WechatOpenSDK'
    
  3. 支付功能及接口的代码编写

  4. 推送 podspec 文件

     pod repo push 私有库名称 --sources=私有库URL,master --allow-warnings --verbose
    

上述流程是在理想的情况下进行的,而实际开发中却并不顺利。

支付宝相关问题解决方案

UTDID 冲突

SGPay.podspec 发布完成后,在主工程引用,编译,运行,

由于

主工程依赖了 阿里推送库 AlicloudPush

AlicloudPush 又依赖了 AlicloudUTDID,

AlipaySDK-iOS 又引入了 AlicloudUTDID 源码

最终导致UTDID 重复,编译报错

错误信息如下:

...
/Users/path/Pods/AlipaySDK-iOS/AlipaySDK.framework/AlipaySDK
/Users/path/Pods/AlicloudUTDID/utdid/UTDID.framework/UTDID(UTDIDKeychainItemWrapper.o)
duplicate symbol '_OBJC_CLASS_$_UTDIDPersistentConf' in:
/Users/path/Pods/AlipaySDK-iOS/AlipaySDK.framework/AlipaySDK
/Users/path/Pods/AlicloudUTDID/utdid/UTDID.framework/UTDID(UTDIDPersistentConf.o)
duplicate symbol '_OBJC_METACLASS_$_UTDIDPersistentConf' in:
/Users/path/Pods/AlipaySDK-iOS/AlipaySDK.framework/AlipaySDK
/Users/path/Pods/AlicloudUTDID/utdid/UTDID.framework/UTDID(UTDIDPersistentConf.o)
duplicate symbol '_OBJC_CLASS_$_UTDIDPersistentFile' in:
/Users/path/Pods/AlipaySDK-iOS/AlipaySDK.framework/AlipaySDK
/Users/path/Pods/AlicloudUTDID/utdid/UTDID.framework/UTDID(UTDIDPersistentFile.o)
duplicate symbol '_OBJC_METACLASS_$_UTDIDPersistentFile' in:
/Users/path/Pods/AlipaySDK-iOS/AlipaySDK.framework/AlipaySDK
/Users/path/Pods/AlicloudUTDID/utdid/UTDID.framework/UTDID(UTDIDPersistentFile.o)
...

解决:

使用阿里官方提供的不带有UTDID版本的AlipaySDK-iOS SDK.

App支付客户端DEMO&SDK

AlipaySDK_Dependency_UTDID

阿里官方只提供了不带UTDID版本的SDK, 并没有提供不带有UTDID版本SDKcocoapods

难道要我们放弃支付宝支付SDKcocoapods引入,把 SDK 拖进工程嘛???

不!!!

  1. 新建 AlipaySDK_Dependency_UTDID lib,在该lib中引入 不包含UTDID版本的支付宝支付SDK

  2. AlipaySDK_Dependency_UTDID.podspec 中依赖 AlicloudUTDID

     s.dependency 'AlicloudUTDID'
    
  3. AlipaySDK_Dependency_UTDID.podspec 中依赖 framework

     s.resources = 'AlipaySDK_Dependency_UTDID/Assets/Resources/*.{xml,db,bundle,json,ttf,p12,der,xib}'
      
     s.libraries = 'c++', 'z'
      
     s.frameworks = 'QuartzCore', 'CoreText', 'CoreGraphics', 'CoreTelephony', 'SystemConfiguration', 'UIKit', 'Foundation', 'CFNetwork', 'CoreMotion', 'WebKit'
    
     s.vendored_frameworks = 'AlipaySDK_Dependency_UTDID/Assets/Frameworks/*.framework'
    
  4. 在 SGPay.podspec 中把依赖的 AlipaySDK-iOS 更换为 AlipaySDK_Dependency_UTDID

    ``` s.dependency ‘AlipaySDK_Dependency_UTDID’ ``

  5. 在主工程中引入 SGPay

     pod 'SGPay'
    

更改后的依赖关系:

在 GitHub上 发布 AlipaySDK_Dependency_UTDID

上述的lib均在私有库,如果有小伙伴遇到和我一样的问题,岂不是要再填一遍坑,何不把 AlipaySDK_Dependency_UTDID 发布到 GitHub

  1. 使用命令

     pod trunk push --allow-warnings --verbose
    

    由于 AlipaySDK_Dependency_UTDID 依赖了 AlicloudUTDID,

    AlicloudUTDID 是阿里发布在自己的Specs仓库的, aliyun-specs

    导致无法直接发布在 cocoapods 公共仓库,

    发布时报错信息如下:

     AlipaySDK_Dependency_UTDID (0.0.1)
     - WARN  | description: The description is equal to the summary.
     - ERROR | [iOS] unknown: Encountered an unknown error (Unable to find a specification for `AlicloudUTDID` depended upon by `AlipaySDK_Dependency_UTDID`
    

    难道就不难为其他小伙伴排忧解难了嘛???

    不!!!

  2. GitHub 新建公开的 specs 仓库,用于存储 AlipaySDK_Dependency_UTDIDspec 文件

    仓库地址:yq-aliyun-specs

    AlipaySDK_Dependency_UTDIDspec 文件 推送到这个仓库

     pod repo push yq-aliyun-specs --sources=https://github.com/YQqiang/yq-aliyun-specs.git,master --allow-warnings --verbose
    
  3. 使用

    • 在Podfile中增加source

        # CocoaPods 仓库
        source 'https://github.com/CocoaPods/Specs.git'
              
        # 阿里云 spec 仓库
        source 'https://github.com/aliyun/aliyun-specs.git'
              
        # AlipaySDK_Dependency_UTDID 的 spec 仓库
        source 'https://github.com/YQqiang/yq-aliyun-specs.git'
      
    • 在Podfile中添加依赖库

        pod 'AlipaySDK_Dependency_UTDID'
      

微信相关问题解决方案

静态库

因为微信SDK使用了静态库(libWeChatSDK.a), 在推送 podspec 时会出现错误

错误信息如下:

ERROR | [iOS] unknown: Encountered an unknown error (The 'Pods-App' target has transitive dependencies that include statically linked binaries: (/private/var/folders/yd/m1j1pblx2kj64rpyd701tt3c0000gn/T/CocoaPods-Lint-20191120-68548-jjtzwd-SGPay/Pods/WechatOpenSDK/WeChatSDK1.8.6.1/libWeChatSDK.a)

解决:

在 SGPay.podspec 文件中 设置使用静态库

s.static_framework = true
  1. 需要有一个支持https的域名

  2. 新建文件 apple-app-site-association

    文件格式如下:

     {
         "applinks": {
             "apps": [],
             "details": [
                 {
                     "appID": "9JA89QQLNQ.com.apple.wwdc",
                     "paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"]
                 },
                 {
                     "appID": "ABCD1234.com.apple.wwdc",
                     "paths": [ "*" ]
                 }
             ]
         }
     }
    
    • appId: team identifier.bundle identifier

    • paths: 支持的url路径

  3. apple-app-site-association 上传到域名对应的服务器根目录中 或 .well-known 子目录中

  4. 在工程中添加域名 以applinks:为前缀

    Support Universal Links

    Allowing Apps and Websites to Link to Your Content

Loading Disqus comments...
Table of Contents