iOS开发:苹果支付测试

WWDC 2020苹果的Xcode12开始可以支持StoreKit支付的模拟测试,大概是试图减少开发者在测试调试上面的困扰。StoreKit一直遭人遭人诟病,毕竟将责任交由环境复杂的终端,是苹果支付问题的起点。

环境要求

对于iOS应用:macOS 10.15+,Xcode 12+
对于macOS应用:macOS 11+,Xcode 12+

配置及流程

  1. 创建配置文件(StoreKit configuration file),.storekit后缀
  2. 商品配置,最基本的需要ProductId与价格,与AppStore Connect上是一致的

    目前只支持消耗性商品、非消耗性商品及自动续费商品的配置。

  3. 开启测试,编辑scheme,指定是否使用配置文件

  4. 凭据校验,需要导出证书(选中.storekit文件可以导出)
  5. 管理交易,在Xcode的调试面板上,有Transactions Manager的入口,可以管理过往的交易

具体配置及测试流程并不复杂,可以参阅官方文档,有非常详细的说明。

一切配置妥当开始测试之后,我们可以看到Xcode是启动了一个本地服务来模拟StoreKit的后台服务,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
curl -H 'Host: localhost:60282' -H 'Content-Type: application/x-apple-plist' -H 'User-Agent: com.apple.appstored/1.0 iOS/14.1 AMS/1' -H 'Accept: */*' -H 'X-Apple-Client-Application: com.apple.appstored' -H 'Accept-Language: en' -H 'X-Apple-Tz: 28800' --data-binary '<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>appDsid</key>
<string>96ec/wQAAAA=</string>
<key>bid</key>
<string>com.ks.storekit.example</string>
<key>bvrs</key>
<string>1.0.0</string>
<key>guid</key>
<string>000001597ba0</string>
<key>vid</key>
<string>2ED8F64D-BCD9-430B-9D1F-C7B1AF745E3E</string>
</dict>
</plist>
' --compressed 'http://localhost:60282/WebObjects/MZFinance.woa/wa/inAppPendingTransactions'

响应数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>app-list</key>
<array>
<dict>
<key>bid</key>
<string>com.ks.storekit.example</string>
<key>item-id</key>
<integer>0</integer>
<key>offer-name</key>
<string>com.moment.vip1</string>
<key>original-purchase-date</key>
<date>2020-11-12T06:41:07Z</date>
<key>original-transaction-id</key>
<string>15</string>
<key>purchase-date</key>
<date>2020-11-12T09:11:07Z</date>
<key>quantity</key>
<integer>1</integer>
<key>transaction-id</key>
<string>22</string>
<key>version-external-identifier</key>
<integer>0</integer>
</dict>
</array>
<key>download-queue-item-count</key>
<integer>2</integer>
<key>jingleAction</key>
<string>inAppPendingTransactions</string>
<key>jingleDocType</key>
<string>inAppSuccess</string>
<key>pings</key>
<array />
<key>receipt-data</key>
<data> MIAGCSqGSI*****
AA== </data>
</dict>
</plist>

测试注意点

  1. target必须选择iOS14.0以上,如果项目的target原本是iOS8-13的,可能会遇到如下提示

    <SKPaymentQueue: 0x7faf9c0ccff0>: Error in remote proxy while processing transaction: Error Domain=NSCocoaErrorDomain Code=4097 “connection to service on pid 23668 named com.apple.storekitservice” UserInfo={NSDebugDescription=connection to service on pid 23668 named com.apple.storekitservice}

  2. applicationUsername最好置空,不要用json,否则提示4097找不到服务错误
  3. 交易凭据是本地测试数据。客户端可以本地校验凭据。但如果要走业务流程,需要后端支持验证这些凭据。

Comments