添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
本文详细指导如何在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一致,不然无法获取到商品。

// WSPay.swift // WiseTV-HD // Created by wangyu on 7/5/21. 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" //21008表示生产换使用 21007表示测试环境使用 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 ( ) //MARK:购买成功验证凭证 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 ) // SKProductsRequestDelegate 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 ) //MARK:客户端验证 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 ( ) // MARK: SKPaymentTransactionObserver 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: Invoke-WebRequest : 从传输流收到意外的 EOF 或 0 个字节。 所在位置 D:\util\flutter\bin\internal\update_dart_sdk.ps1:97 字符: 5 + Invoke-WebRequest -Uri $dartSdkUrl -OutFile $dartSdkZip + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Invoke-WebRequest], IOException + FullyQualifiedErrorId : System.IO.IOException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand Error: Unable to update Dart SDK. Retrying... ijkplayer iOS编译问题之[-Wincompatible-function-pointer-types] xyccstudio: 仔细看一下文件名。。。 ijkplayer iOS编译问题之[-Wincompatible-function-pointer-types] weixin_38910991: 你好,我在compile-ffmpeg.sh这个文件中没有看到修改方法中的几个配置,是需要自己添加进去吗,我添加进去还是会报这个错误 苹果三方登录,校验identityToken方式,golang服务端处理 darkersky: 码零13年, 试问一个问题, GetRSAPublicKey 该函数如果再apple转化成publickey(过期的token拿来测试下)的时候 最终导致程序奔溃panic