内购流程
一、填写协议,税务和银行业务
1、登录登录 https://appstoreconnect.apple.com,选择进入App Store Connect。
2、进入“协议、税务和银行业务”
3、内购用的是付费应用程序,先签署《付费应用程序协议》,同意后状态变更为“用户信息待处理”,等待审核。
4、状态更改完毕后,点击“开始设置税务、银行业务和联系信息”。
a.添加银行账户,按照要求填写相关内容即可。
b.选择报税表,并填写。(我是可爱的中国公民,在美国有没有商业活动, 所以我填的是否。)
然后继续填写报税表,按照填写要求填写就行了(要是英文阅读有点困难,那就双击网页,应该会有翻译成中文的功能;没有的话,那就词典。。。你懂得,哈哈哈), 我是个人开发者账户相对公司开发者账户填的会少一点,不过没关系。都是一些基本信息。
c.填写联系信息,一共5个。高级管理、财务、技术、法务、营销(可重复,像我这种人才就是5个职位都是我,开玩笑的,勿当真)。
5、税务表填完了之后,点击“我的APP”,进入到项目APP的信息页,点击功能,在弹出的页面点击App内购买项目后面的+。
创建完成之后 填写内购买项目信息、
信息填写完成了点击右上角的 “存储”,然后点击左边 “App 内购买项目”。出现“元数据丢失”说明里面信息没填写完整,在点进去填写。直到显示“准备提交”。
6、添加沙箱测试人员
7、我们需要在工程里配置好证书,测试证书是必须的因为我们内购需要连接到苹果的App Store的,需要正式的测试证书才能测试,同时把下图工程中的这一配置打开
二、代码部分
#import <StoreKit/StoreKit.h>
@interface LLMIneCoinRechargeController ()<UIAlertViewDelegate,SKProductsRequestDelegate,SKPaymentTransactionObserver>
@property(nonatomic, strong)NSArray<LLMIneCoinRechargeModel *> *coinModelArr;
@property(nonatomic,copy)NSString * bvip;
@property(nonatomic,copy)NSString * coin;
@property(nonatomic, strong)SKProductsRequest *request;
@property(nonatomic,copy)NSString * productID;
@implementation LLMIneCoinRechargeController{
UIAlertView* _alertView;
NSString *coinStr;
}
- (void)viewDidLoad {
[super viewDidLoad];
//一定要 开启内购检测
[[SKPaymentQueue defaultQueue]addTransactionObserver:self];
}
// 在点击事件中去添加代码
- (void)payBtnClick:(UIButton *)sender{
__block LLMIneCoinRechargeModel *model = nil;
[self.coinModelArr enumerateObjectsUsingBlock:^(LLMIneCoinRechargeModel * obj, NSUInteger idx, BOOL * _Nonnull stop) {
if (obj.selected) {
model = obj;
}
}];
if (!model) {
[HudManager showMessage:@"请选择金额"];
return;
}
NSString *proID = [NSString stringWithFormat:@"charge%@",model.coinID];
WS(weakSelf);
if ([SKPaymentQueue canMakePayments]) {
[weakSelf requestProductData:proID];
weakSelf.productID = proID;
}else{
[HudManager showMessage:@"不允许程序内付费"];
}
}
// 收到请求信息
- (void)requestProductData:(NSString *)productID{
NSLog(@"-------------请求对应的产品信息----------------");
[SVProgressHUD showWithStatus:nil maskType:SVProgressHUDMaskTypeBlack];
NSArray *product = [[NSArray alloc] initWithObjects:productID,nil];
NSSet *nsset = [NSSet setWithArray:product];
_request = [[SKProductsRequest alloc]initWithProductIdentifiers:nsset];
_request.delegate = self;
[_request start];
}
// 收到返回信息
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
NSArray *product = response.products;
if (product.count == 0) {
[SVProgressHUD dismiss];
[HudManager showMessage:@"购买失败"];
return;
}
SKProduct *prod = nil;
for (SKProduct *pro in product) {
if ([pro.productIdentifier isEqualToString:self.productID]) {
prod = pro;
}
}
// 发送购买请求
if (prod != nil) {
SKPayment *payment = [SKPayment paymentWithProduct:prod];
[[SKPaymentQueue defaultQueue]addPayment:payment];
}
}
// 失败回调
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error{
[SVProgressHUD dismiss];
[HudManager showMessage:@"购买失败"];
}
// 支付后的反馈信息
- (void)requestDidFinish:(SKRequest *)request{
[SVProgressHUD dismiss];
}
// 监听购买结果
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions{
for (SKPaymentTransaction *tran in transactions) {
switch (tran.transactionState) {
case SKPaymentTransactionStatePurchased:
[self verifyPurchaseWithPaymentTransactionWith:tran];
break;
case SKPaymentTransactionStatePurchasing:
NSLog(@"商品已经添加进列表");
break;
case SKPaymentTransactionStateRestored:
NSLog(@"已经购买过商品");
[[SKPaymentQueue defaultQueue] finishTransaction:tran];
break;
case SKPaymentTransactionStateFailed:
NSLog(@"购买失败");
[[SKPaymentQueue defaultQueue] finishTransaction:tran];
[HudManager showMessage:@"购买失败"];
break;
default:
break;
}
}
}
/**
* 验证购买,避免越狱软件模拟苹果请求达到非法购买问题
*
*/
-(void)verifyPurchaseWithPaymentTransactionWith:(SKPaymentTransaction *)tran{
//从沙盒中获取交易凭证并且拼接成请求体数据
NSURL *receiptUrl=[[NSBundle mainBundle] appStoreReceiptURL];
NSData *receiptData=[NSData dataWithContentsOfURL:receiptUrl];
NSString *receiptString = [receiptData base64EncodedStringWithOptions:0];
if (!receiptString) {
return;
}
// 将base64 编码 发给后台服务器 做验证 以及是否是沙箱环境的参数
NSDictionary *dict = [NSDictionary universalParameteWithDictionary:@{@"receipt":receiptString,
@"sandbox":BOOLSandBox,
}];
[[LFBHTTPSessionManager manager]POSTwithURLString:KApplePay_Docheck parameters:dict success:^(id data) {
[self loadData];
[[SKPaymentQueue defaultQueue] finishTransaction:tran];
} failed:^(NSError *error) {
// [HudManager showMessage:error.description];
}];
}
- (void)dealloc{
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}
三、注意事项
1.接入内购后把支付宝、微信支付的SDK删掉,苹果那边能扫出来(因为这个原因我被拒过)。
2.内购商品是和项目一起提交然后审核过了商品才有效!
3.测试内购一定要用真机测试,商品信息如果无效,一般是 商品还没有审核通过 !
网友评论