苹果手机app内购是从哪儿扣费

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了苹果手机app内购是从哪儿扣费相关的知识,希望对你有一定的参考价值。

参考技术A 每个苹果手机用户需要注册成苹果用户,以用于在苹果软件商城appstone
中下载软件。
而这个用户名是类似于支付宝账户一样的,功能很多。当需要购买APP的时候,你需要将这个账户绑定银行卡卡号,之后才能使用付费功能。也就是现在的苹果pay功能。你可以用这个购买收费的APP,还有APP内购,还有一些电子书,音乐什么的。
苹果手机app内购也是从这里面扣钱的,当然你不绑定银行卡的话,是扣不了你的钱的。
参考技术B 苹果用户在新注册或登录一台设备时会做账户的初始设置,其中就包括设置付款方式,可以添加支付宝或银行卡等方式用于APP
Store的app下载或者购买在线音乐等。
如果不添加付款方式是无法完成账户设置的,即使设置了也无法使用付费功能,当用户在苹果设备上进行购物后自动从绑定的付款方式中扣除相应的数额,当然前提是经你本人确认过付款密码。
可根据如下步骤设置:
1、打开设置,点击最上方的Apple
ID进入账户设置。
2、进入账户设置,点击付款与送货。
3、进入付款与送货,点击付款方式,在跳出的页面中更改付款方式。
扩展资料:
苹果帐户介绍:
苹果帐户(Apple
ID)是苹果公司为其产品(如iWork、iTunes
Store和Apple
Store)所引入的认证系统。Apple
ID作为一个集全功能于一身的帐户,允许用户访问苹果的各种资源。因为一个Apple
ID可以被用于由苹果提供的多个产品和服务,它也可以称为Apple账户、MobileMe账户、Mac账户、iTunes
Store账户和iChat账户。
Apple
ID可用于执行与
Apple
有关的所有操作(包括使用iCloud存储内容、从App
Store下载应用程序以及从
iTunes
Store
购买歌曲、影片和电视节目)的登录信息。
Apple
ID需要一个Email邮箱地址
,配合密码,用户就可以在iPhone上的App
Store轻松下载安装和更新软件。
参考资料:搜狗百科-Apple
ID
参考技术C 苹果公司的App
Store是与Apple
ID进行绑定的。可以使用Apple
ID中的余额,或者绑定的信用卡进行支付。
操作流程如下:
首先在你的ios设备上,打开自带的App
Store这个应用,在精品推荐的页面底部,找到你的Apple
ID,点选后,在弹出的提示框中选择查看Apple
ID,而后需要输入你的Apple
ID的密码。
在成功登陆后,让我们来点击进入付款信息,而后便能看到新的付款方式「银联
UnionPay」,在选择银联后,下方输入你的银联卡号(注意,国内发行的信用卡或储蓄卡均可绑定,系统会自动识别卡片类型),而后在卡号的右上角出现一个小小的银联标志,即代表卡片已被成功识别。在下方需要填写相关的一些个人信息,当然,若你绑定的是信用卡,则需要额外填写诸如卡号、安全码和有效期等信息。
在填写好相关信息后,我们便会收到银行发来的验证短信。注意:银行卡无需开通网上银行,但手机号必须和银行登记的一致。验证成功便代表绑定成功,不会特别出现类似“绑定已成功”的确认页面。如果你希望手动查看绑定是否成功,可再次进入付款信息页面,这时你会看到银行卡号已经变成黑点+卡号后四位的形式,即代表绑定已成功。

iOS: 实现苹果的内购

一、介绍:

在个人开发的app上架到AppStore后,苹果官方允许我们将自己的app在appstore上进行付费使用,也就是所谓的内购。其中,支付方式规定的必须是苹果的支付方式:应用内支付。

 

二、流程:

1、后台设置

(1)配置Developer.apple.com,为应用建立一个不带通配符的App ID

(2)用该应用的App ID生成和安装相应的Provisioning Profile文件

 

2、配置iTunes Connect

(1)用该App ID创建一个新的应用;

(2)在该应用中,创建应用内付费项目,选择付费类型,通常可选的是可重复消费的(Consumenable)和永久有效的(Non-Consumenable)两种,然后设置好价格、Product ID、购买介绍和截图,这里的Product ID是必须记住的,后面开发的时候要用到;

(3)添加一个用于在sandbox付费的测试用户,注意苹果对测试用户的密码要求和正是账号一样,至少8位,并且包包含数字和大小写字母;

(4)填写相关的税务。银行和联系人

 

3、iOS端开发

(1)在工程中引入storeKit.framework和#import <storeKit/storeKit.h>;

(2)获取所有的付费Product ID列表。这个可以用常量存储到本地,也可以由自己的服务器返回;

(3)制作一个界面(如tableView),显示所有的应用内付费项目。这些应用内付费项目的价格和介绍信息可以是自己的服务器返回。但如果是不带服务器的单机游戏应用或者工具类应用,则可以通过向App Store查询所得;

(4)当用户点击一个IAP项目,我们需要先查询用户是否允许应用内付费,如果不允许则不进行接下来的步骤;

(5)先通过该IAP的ProductID向AppStore查询,获取SKPayment实例,然后通过SKPaymentQueue的addPayment方法发起一个购买的操作;

(6)在ViewdidLoad方法中,将购买页面设置成购买额observe;

(7)当用户购买的操作有结果时,就会触发调用回调函数,相应的进行处理;

(8)服务器验证凭证(可选项)。如果购买成功,我们需要将凭证发送到服务器上进行验证。考虑到网路异常情况,iOS端的发送凭证操作应该可以持久化,如果程序退出、崩溃或者网络异常,可以恢复重试。

 

4、服务端开发

(1)接收iOS端发过来的购买凭证;

(2)判断凭证是否已经存在,是否验证过,然后进行存储;

(3)将该凭证发送到苹果的服务器验证,并将结果返回给客户端;

(4)如果需要,修改用户相应的会员权限。

注意:考虑到网络异常的情况,服务器的验证应该是一个可恢复的队列,如果失败了,应该进行重试。

苹果AppStore线上的购买凭证验证地址:htpps://buy.itunes.apple.com/verifyreceipt

测试的验证地址:htpps://sandbox.itunes.apple.com/verifyreceipt

 

三、iOS基本代码如下:

//  ViewController.m
//
//  Created by 夏远全 on 16/11/20.
//  Copyright ? 2016年 广州市东德网络科技有限公司. All rights reserved.
//

#import "ViewController.h"
#import <StoreKit/StoreKit.h>

@interface ViewController ()<SKProductsRequestDelegate,SKPaymentTransactionObserver>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //监听购买结果
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
}

-(void)dealloc{
    
    //移除购买监听
    [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}


//用户点击一个IAP项目时,首先查询用户是否允许应用内付费(tableViewCell点击时,传递内购商品ProductId,ProductID可以提前存储到本地,用到时直接获取即可)
-(void)validateIsCanBought{
    
    if ([SKPaymentQueue canMakePayments]) {
        [self getProductInfo:@[@"ProductIds"]];
    }else{
        NSLog(@"失败,用户禁止应用内付费购买");
    }
}

//通过该IAP的Product ID向App Store查询,获取SKPayment实例,接着通过SKPaymentQueue的addPayment方法发起一个购买的操作
//下面的ProductId应该是事先在itunesConnect中添加好的,已存在的付费项目,否则会查询失败
-(void)getProductInfo:(NSArray *)productIds{
    
    NSSet *set = [NSSet setWithArray:productIds];
    SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:set];
    request.delegate = self;
    [request start];
}

#pragma mark - SKProductsRequestDelegate
//查询的回调函数
-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
    
    //获取到的所有内购商品
    NSArray *myProducts = response.products;
    
    //判断个数
    if (myProducts.count==0) {
        NSLog(@"无法获取产品信息,购买失败。");
        return;
    }
    
    //发起一个购买操作
    SKPayment *payment = [SKPayment paymentWithProduct:myProducts[0]];
    [[SKPaymentQueue defaultQueue] addPayment:payment];
}

#pragma mark - SKPaymentTransactionObserver
//当用户购买的操作有结果时,就会触发下面的回调函数,相应进行处理
-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions{
    
    for (SKPaymentTransaction *transaction in transactions) {
        
        switch (transaction.transactionState) {
            case SKPaymentTransactionStatePurchased:  //交易完成
                NSLog(@"transactionIdentifier = %@",transaction.transactionIdentifier);
                [self completeTransaction:transaction];
                break;
            case SKPaymentTransactionStateFailed:     //交易失败
                [self failedTransaction:transaction];
                break;
            case SKPaymentTransactionStateRestored:  //已经购买过该商品
                [self restoreTransaction:transaction];
                break;
            case SKPaymentTransactionStatePurchasing: //商品添加进列表
                NSLog(@"商品添加进列表");
                break;
            default:
                break;
        }
    }
}

//交易完成后的操作
-(void)completeTransaction:(SKPaymentTransaction *)transaction{
    
    NSString *productIdentifier = transaction.payment.productIdentifier;
    NSData *transactionReceiptData = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]];
    NSString *receipt = [transactionReceiptData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
    
    if ([productIdentifier length]>0) {
        //向自己的服务器验证购买凭证
        NSLog(@"%@",receipt);
    }
    
    //移除transaction购买操作
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}

//交易失败后的操作
-(void)failedTransaction:(SKPaymentTransaction *)transaction{
    
    if (transaction.error.code != SKErrorPaymentCancelled) {
        NSLog(@"购买失败");
    }else{
        NSLog(@"用户取消交易");
    }
    //移除transaction购买操作
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}

//已经购买过该商品
-(void)restoreTransaction:(SKPaymentTransaction *)transaction{
 
    //对于已购买商品,处理恢复购买的逻辑
    //移除transaction购买操作
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}

@end

参考书籍:唐巧《iOS开发进阶》

 

以上是关于苹果手机app内购是从哪儿扣费的主要内容,如果未能解决你的问题,请参考以下文章

如何查看 ios 游戏内购消费订单?

苹果内购是啥意思?

[iOS]苹果审核规则

苹果手机 apple pay 一不小心支付购买了自己不要的服务

apple pay可以用手机买火车票吗

Https安全协议在手机App与后台服务通信上的应用