Ios InApp采购未完成付款
我已经做了一个IAP的演示,我已经在apple帐户中注册了我的演示应用程序,我还添加了产品信息、说明、应用程序id、标题、priceTier、沙盒帐户,用于测试演示中描述的支付过程。我现在面临两个问题:- a) 就像第一次弹出窗口要求输入苹果id/密码一样,我已经提供了这两个值。它将显示我是否要确认我的付款,并在弹出窗口中显示产品名称和产品价格。点击“确定”后,我什么也没收到,甚至连苹果的一封邮件都没有,所以我如何证明我是否成功付款呢 b) 我还想在购买产品时更改我的登录id。但每次默认情况下,它都会使用我以前的id,并显示密码框,仅用于输入密码。如何重置此设置?就像我尝试重新设置模拟器,并再次在iTunes的my apple a/c中添加新产品一样。因此,如果有人有任何想法,请随时提供帮助。在下面共享我的代码:-Ios InApp采购未完成付款,ios,objective-c,xcode,in-app-purchase,Ios,Objective C,Xcode,In App Purchase,我已经做了一个IAP的演示,我已经在apple帐户中注册了我的演示应用程序,我还添加了产品信息、说明、应用程序id、标题、priceTier、沙盒帐户,用于测试演示中描述的支付过程。我现在面临两个问题:- a) 就像第一次弹出窗口要求输入苹果id/密码一样,我已经提供了这两个值。它将显示我是否要确认我的付款,并在弹出窗口中显示产品名称和产品价格。点击“确定”后,我什么也没收到,甚至连苹果的一封邮件都没有,所以我如何证明我是否成功付款呢 b) 我还想在购买产品时更改我的登录id。但每次默认情况下,
-(void)fetchAvailableProducts{
if ([SKPaymentQueue canMakePayments])
{
SKProductsRequest *request = [[SKProductsRequest alloc]
initWithProductIdentifiers:
[NSSet setWithObject:kTutorialPointProductID]];
request.delegate = self;
[request start];
}
else
NSLog(@"Please enable In App Purchase in Settings") ;
}
-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
NSArray *products = response.products;
if (products.count != 0)
{
_product = products[0];
NSLog(@"procudt info is %@",_product.localizedTitle);
// _buyButton.enabled = YES;
// _productTitle.text = _product.localizedTitle;
// _productDescription.text = _product.localizedDescription;
[self purchaseProducts];
} else {
//_productTitle.text = @"Product not found";
}
products = response.invalidProductIdentifiers;
for (SKProduct *product in products)
{
NSLog(@"Product not found: %@", product);
}
}
-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
for (SKPaymentTransaction *transaction in transactions)
{
switch (transaction.transactionState) {
case SKPaymentTransactionStatePurchased:
[[SKPaymentQueue defaultQueue]
finishTransaction:transaction];
NSLog(@"Transaction complete");
break;
case SKPaymentTransactionStateFailed:
NSLog(@"Transaction Failed");
[[SKPaymentQueue defaultQueue]
finishTransaction:transaction];
break;
default:
break;
}
}
}
首先,我只是使用我的产品id获取我的产品,我在委托方法中得到响应,如果计数>0,则将调用“purchaseProducts”方法。但问题是,我的委托方法没有被调用,在我点击“OK”购买产品后,什么也没有发生。请分享您的想法。您好,请按照给定的步骤进行操作,希望能奏效- 首先检查用户是否可以付款-
-(void)checkForPayement{
//First check if user can make payments
if (![SKPaymentQueue canMakePayments]) {
// Show the error that user can't make payments.
}else{
// Make the product request on App Store
SKProductsRequest *productRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:IAP_PRODUCT_ID]]; // IAP_PRODUCT_ID is the product id which you got when you register the in-app-purchase
productRequest.delegate = self;
[productRequest start];
}
}
如果产品可用,您将通过以下方法得到响应-
-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
if (response.products.count > 0) {
SKProduct *validProduct = [response.products objectAtIndex:0];
[self purchase:validProduct];
} else {
// Product is not available so please cross check about the IAP_PRODUCT_ID
}
}
-(void)request:(SKRequest *)request didFailWithError:(NSError *)error{
// Check here for the error
}
如果请求失败,您将通过以下方法获得回调-
-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
if (response.products.count > 0) {
SKProduct *validProduct = [response.products objectAtIndex:0];
[self purchase:validProduct];
} else {
// Product is not available so please cross check about the IAP_PRODUCT_ID
}
}
-(void)request:(SKRequest *)request didFailWithError:(NSError *)error{
// Check here for the error
}
开始购买
- (void)purchase:(SKProduct *)product{
SKPayment *payment = [SKPayment paymentWithProduct:product];
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
}
您将在给定的方法中得到回调,您可以检查事务的状态-
-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions{
for (SKPaymentTransaction *transaction in transactions) {
switch (transaction.transactionState) {
case SKPaymentTransactionStatePurchasing:
DDLogVerbose(@"Purchasing");
break;
case SKPaymentTransactionStateFailed:
if (transaction.error.code == SKErrorPaymentCancelled) {
// User has cancelled the transaction
}
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
case SKPaymentTransactionStateRestored:
DDLogVerbose(@"Restored");
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
case SKPaymentTransactionStatePurchased:
{
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
// Payment has been done and you should provide the purchased content or you may verify the receipt also
DDLogVerbose(@"Purchased");
}
break;
default:
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
}
}
}
-(void)paymentQueue:(SKPaymentQueue*)队列更新事务:(NSArray*)事务{
用于(SKPaymentTransaction*交易中的交易){
开关(transaction.transactionState){
案例SKPaymentTransactionStatePurchasing:
DDLogVerbose(@“采购”);
打破
案例SKPaymentTransactionState失败:
if(transaction.error.code==SKErrorPaymentCancelled){
//用户已取消交易
}
[[SKPaymentQueue defaultQueue]finishTransaction:transaction];
打破
案例SKPaymentTransactionStateRestored:
DDLogVerbose(@“还原”);
[[SKPaymentQueue defaultQueue]finishTransaction:transaction];
打破
案例SKPaymentTransactionStatesPurchased:
{
[[SKPaymentQueue defaultQueue]finishTransaction:transaction];
//付款已经完成,您应该提供购买的内容,或者您也可以验证收据
DDLogVerbose(@“购买”);
}
打破
违约:
[[SKPaymentQueue defaultQueue]finishTransaction:transaction];
打破
}
}
}
如果你想要更多的安全,那么你也可以
解决您的问题
a。在沙盒环境中测试应用内购买时,您将不会收到任何付款确认邮件,您可以在Storekit updatedTransactions委托方法中检查您的付款状态。在沙盒环境中不会扣除任何余额。在输入沙盒帐户详细信息后,还要检查iTunes帐户是否可以登录?如果没有,您的id可能无法验证,因此请验证您的id
b。在尝试应用内购买之前,只需从设置->iTunes&app Store注销apple id即可。点击apple id并单击注销。当您启动应用内购买时,请输入沙盒帐户凭据,不要在实际生产环境中登录沙盒帐户,因为这可能会使您的沙盒帐户无效。您好,请按照给定的步骤操作,希望它能起作用- 首先检查用户是否可以付款-
-(void)checkForPayement{
//First check if user can make payments
if (![SKPaymentQueue canMakePayments]) {
// Show the error that user can't make payments.
}else{
// Make the product request on App Store
SKProductsRequest *productRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:IAP_PRODUCT_ID]]; // IAP_PRODUCT_ID is the product id which you got when you register the in-app-purchase
productRequest.delegate = self;
[productRequest start];
}
}
如果产品可用,您将通过以下方法得到响应-
-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
if (response.products.count > 0) {
SKProduct *validProduct = [response.products objectAtIndex:0];
[self purchase:validProduct];
} else {
// Product is not available so please cross check about the IAP_PRODUCT_ID
}
}
-(void)request:(SKRequest *)request didFailWithError:(NSError *)error{
// Check here for the error
}
如果请求失败,您将通过以下方法获得回调-
-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
if (response.products.count > 0) {
SKProduct *validProduct = [response.products objectAtIndex:0];
[self purchase:validProduct];
} else {
// Product is not available so please cross check about the IAP_PRODUCT_ID
}
}
-(void)request:(SKRequest *)request didFailWithError:(NSError *)error{
// Check here for the error
}
开始购买
- (void)purchase:(SKProduct *)product{
SKPayment *payment = [SKPayment paymentWithProduct:product];
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
}
您将在给定的方法中得到回调,您可以检查事务的状态-
-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions{
for (SKPaymentTransaction *transaction in transactions) {
switch (transaction.transactionState) {
case SKPaymentTransactionStatePurchasing:
DDLogVerbose(@"Purchasing");
break;
case SKPaymentTransactionStateFailed:
if (transaction.error.code == SKErrorPaymentCancelled) {
// User has cancelled the transaction
}
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
case SKPaymentTransactionStateRestored:
DDLogVerbose(@"Restored");
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
case SKPaymentTransactionStatePurchased:
{
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
// Payment has been done and you should provide the purchased content or you may verify the receipt also
DDLogVerbose(@"Purchased");
}
break;
default:
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
}
}
}
-(void)paymentQueue:(SKPaymentQueue*)队列更新事务:(NSArray*)事务{
用于(SKPaymentTransaction*交易中的交易){
开关(transaction.transactionState){
案例SKPaymentTransactionStatePurchasing:
DDLogVerbose(@“采购”);
打破
案例SKPaymentTransactionState失败:
if(transaction.error.code==SKErrorPaymentCancelled){
//用户已取消交易
}
[[SKPaymentQueue defaultQueue]finishTransaction:transaction];
打破
案例SKPaymentTransactionStateRestored:
DDLogVerbose(@“还原”);
[[SKPaymentQueue defaultQueue]finishTransaction:transaction];
打破
案例SKPaymentTransactionStatesPurchased:
{
[[SKPaymentQueue defaultQueue]finishTransaction:transaction];
//付款已经完成,您应该提供购买的内容,或者您也可以验证收据
DDLogVerbose(@“购买”);
}
打破
违约:
[[SKPaymentQueue defaultQueue]finishTransaction:transaction];
打破
}
}
}
如果你想要更多的安全,那么你也可以
解决您的问题
a。在沙盒环境中测试应用内购买时,您将不会收到任何付款确认邮件,您可以在Storekit updatedTransactions委托方法中检查您的付款状态。在沙盒环境中不会扣除任何余额。在输入沙盒帐户详细信息后,还要检查iTunes帐户是否可以登录?如果没有,您的id可能无法验证,因此请验证您的id。