本文详细指导如何在App Store Connect中填写公司信息、创建沙盒测试员,配置内购商品并上传审核。涉及步骤包括协议填写、银行信息设置、报税表填写、联系人管理、沙盒ID创建、商品新建及代码实现(WSPay.swift)。
摘要生成于
,由 DeepSeek-R1 满血版支持,
app store connect 协议
填写其中的付费 App,填写点公司名称、公司简介、公司帐号、公司之类的。
由于已经填写过了无法截图,可以去搜搜其他人的分享。
银行账户:
填的的时候注意银行帐号选择中国之后就是国内银行的代码了,选择每个地区下边的银行代码都是会变的。另外银行的受益人需要填写
英文
这个比较坑,名在前姓在后。
报税表:
参照别人的截图勾选一下就行,就是本着能不填就不填的原则,稍微写了点。另外那个报税表不需要下载填写就行。
联系信息:
这个联系人都是新建就可以了,同现有系统中的用户没有半点关系。
app store connect 用户和访问
在沙盒里边的测试员中新建沙盒ID,这个ID比较坑的是添加成功了如果删除,再添加同样的帐号就过不去了。。。还是记好了密码比较好。
app store connect
进入到需要增加内购的app中,在App内购买项目里边的管理中新建商品,根据需求把商品的详情都填好,如果报元数据缺失就是还没填全,最后的审核图片必须要上传一个,按照要求随便上传一个,然后状态变成准备提交就搞定了。记下其中的商品ID
其中需要特别关注的是,开发使用的bundleID必须同app store connect中应用的bundleID一致,不然无法获取到商品。
import
Foundation
import
UIKit
import
StoreKit
import
SnapKit
class
WSPayManager
:
NSObject
,
SKPaymentTransactionObserver
,
SKProductsRequestDelegate
{
static
var
`
default
`
:
WSPayManager
=
WSPayManager
(
)
private
var
proId
:
String
!
let
url_receipt_sandbox
=
"https://sandbox.itunes.apple.com/verifyReceipt"
let
url_receipt_itunes
=
"https://buy.itunes.apple.com/verifyReceipt"
var
state
=
21008
var
resultBlock
:
(
_
result
:
String
)
-
>
Void
=
{
(
_
result
:
String
)
-
>
Void
in
print
(
"交易结果:"
,
result
)
func
doPay
(
)
{
if
SKPaymentQueue
.
canMakePayments
(
)
==
false
{
return
SKPaymentQueue
.
default
(
)
.
add
(
self
)
self
.
proId
=
"xiaogangzhu"
let
set
=
Set
<
String
>
.
init
(
[
self
.
proId
]
)
let
request
=
SKProductsRequest
.
init
(
productIdentifiers
:
set
)
request
.
delegate
=
self
request
.
start
(
)
func
completePay
(
transaction
:
SKPaymentTransaction
)
{
print
(
transaction
)
let
recepitUrl
=
Bundle
.
main
.
appStoreReceiptURL
let
data
=
try
!
Data
.
init
(
contentsOf
:
recepitUrl
!
)
if
recepitUrl
==
nil
{
self
.
resultBlock
(
"交易凭证为空"
)
print
(
"交易凭证为空"
)
return
verify
(
data
:
data
,
transaction
:
transaction
)
SKPaymentQueue
.
default
(
)
.
finishTransaction
(
transaction
)
func
productsRequest
(
_
request
:
SKProductsRequest
,
didReceive response
:
SKProductsResponse
)
{
let
productArray
=
response
.
products
if
productArray
.
count
==
0
{
print
(
"此商品id没有对应的商品"
)
return
var
product
:
SKProduct
!
for
pro
in
productArray
{
if
pro
.
productIdentifier
==
proId
{
product
=
pro
break
print
(
product
.
description
)
print
(
product
.
localizedTitle
)
print
(
product
.
localizedDescription
)
print
(
product
.
price
)
print
(
product
.
productIdentifier
)
let
payment
=
SKMutablePayment
.
init
(
product
:
product
)
payment
.
quantity
=
1
SKPaymentQueue
.
default
(
)
.
add
(
payment
)
func
verify
(
data
:
Data
,
transaction
:
SKPaymentTransaction
)
{
let
base64Str
=
data
.
base64EncodedString
(
options
:
.
endLineWithLineFeed
)
let
params
=
NSMutableDictionary
(
)
params
[
"receipt-data"
]
=
base64Str
let
body
=
try
!
JSONSerialization
.
data
(
withJSONObject
:
params
,
options
:
.
prettyPrinted
)
var
request
=
URLRequest
.
init
(
url
:
URL
.
init
(
string
:
state
==
21008
?
url_receipt_itunes
:
url_receipt_sandbox
)
!
,
cachePolicy
:
.
useProtocolCachePolicy
,
timeoutInterval
:
20
)
request
.
httpMethod
=
"POST"
request
.
httpBody
=
body
let
session
=
URLSession
.
shared
let
task
=
session
.
dataTask
(
with
:
request
)
{
(
data
,
response
,
error
)
in
let
dict
=
try
!
JSONSerialization
.
jsonObject
(
with
:
data
!
,
options
:
.
mutableContainers
)
as
!
NSDictionary
print
(
dict
)
SKPaymentQueue
.
default
(
)
.
finishTransaction
(
transaction
)
let
status
=
dict
[
"status"
]
as
!
Int
switch
(
status
)
{
case
0
:
self
.
resultBlock
(
"购买成功"
)
break
case
21007
:
self
.
state
=
21007
self
.
verify
(
data
:
data
!
,
transaction
:
transaction
)
break
default
:
self
.
resultBlock
(
"验证失败"
)
break
SKPaymentQueue
.
default
(
)
.
remove
(
self
)
task
.
resume
(
)
func
paymentQueue
(
_
queue
:
SKPaymentQueue
,
updatedTransactions transactions
:
[
SKPaymentTransaction
]
)
{
for
tran
in
transactions
{
switch
tran
.
transactionState
{
case
.
purchased
:
/
/
购买完成
SKPaymentQueue
.
default
(
)
.
finishTransaction
(
tran
)
completePay
(
transaction
:
tran
)
break
case
.
purchasing
:
/
/
商品添加进列表
break
case
.
restored
:
/
/
已经购买过该商品
SKPaymentQueue
.
default
(
)
.
finishTransaction
(
tran
)
break
case
.
failed
:
/
/
购买失败
SKPaymentQueue
.
default
(
)
.
finishTransaction
(
tran
)
break
default
:
break
let
WSPayManagerInstance
=
WSPayManager
.
default
参考:
https://blog.csdn.net/weixin_39339407/article/details/112647323
https://www.jianshu.com/p/b58525b71798
let
pay
Manager = App
Pay
Manager()
class var shareInstance : App
Pay
Manager {
return
pay
Manager
二.发起
购
买请求
1.发起
购
欢迎来到《技术探索》,这是一个专注于游戏开发技术的博客。在这里,我们将深入探讨游戏引擎、图形渲染、人工智能、物理模拟等领域的最新技术和最佳实践。无论您是初学者还是经验丰富的开发者,我们都希望为您提供有价值的见解和实用的技巧。
12-24
内
购
项目-代码篇一、分步骤说明1、获取商品列表2、苹果服务器返回的可
购
买商品3、下单
购
买商品4、
购
买队列状态变化,判断
购
买状态是否成功
5
、交易验证6、拿到的收据信息是,此App所有
购
买的记录7、恢复商品二、详细代码三、内
购
项目-App Store Connect 详解篇祝您好运~
一、分步骤说明
1、获取商品列表
由于苹果服务器返回很慢,并且一般我们都会有一个自己的商店界面,就不必向苹果服务器去请求商品列表了。
购
买时传要
购
买商品的ID(在App Store Connect 创建的产品ID)就可以了。
一、介绍:
在个人开发的app上架到AppStore后,苹果官方允许我们将自己的app在appstore上进行付费使用,也就是所谓的内
购
。其中,支付方式规定的必须是苹果的支付方式:应用内支付。
二、流程:
1、后台设置
(1)配置Developer.apple.com,为应用建立一个不带通配符的App ID
(2)用该应用的App ID生成和安装相应的Provisioni...
内
购
In-App Purchase
https://developer.apple.com/in-app-purchase/In-App-Purchase-Guidelines.pdf
允许范围:
电子书或者电子相册
额外游戏关数
四种种类:
五种类别:
免费订阅?
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.okgene.vip.Fire.bean.UserInfoWX;
import org.okgene.vip.OKXSS;
import org.okgene.vip.fireFly.service.
pay
.Apple
Pay
Service;
import org.okgene.vip.pojo.ExtR
刚刚做了内
购
, 记录一下
这里直接上代码, 至于写代码之前的一些设置工作参考以下文章:http://www.jianshu.com/p/690a7c68664ehttp://www.jianshu.com/p/86ac7d3b
5
93a
需要注意的是:
只要工程配置了对应的证书, 就能请求商品信息, 不...
内
购
是移动端一值在讨论的话题,每次上架内
购
功能要做好被拒的准备,小萌在2年前也做过内
购
,是OC版本,回想那段往事一把血泪呀,被拒了无数次才把内
购
功能送上AppStore
小萌之前的OC内
购
,中间也经历了不少的困难,详情请看苹果内
购
审核那些被拒的原因,不过之前是用OC封装的,现在小萌的主要语言是
Swift
,闲暇之余做了
Swift
5
.X内
购
StoreKit原生的封装,特别齐全,可以直接使用哦
Swift
版StoreKit的内
购
Demo
语言:
Swift
5
Xcode: 11.4.1
环境: Mac CataL
m0_64074594:
ijkplayer iOS编译问题之[-Wincompatible-function-pointer-types]
xyccstudio:
ijkplayer iOS编译问题之[-Wincompatible-function-pointer-types]
weixin_38910991:
苹果三方登录,校验identityToken方式,golang服务端处理
darkersky: