ios应用内支付过程(使用苹果原生支付方式

来源:互联网 发布:卡祖笛 知乎 编辑:程序博客网 时间:2024/04/27 19:32

因为ios政策问题,如果开发者需要在ios客户端中加入购买(虚拟货币)项目,需要使用ios应用内付费IAP这种方式,这也是很多苹果APP不和安卓共通的原因。因为苹果需要抽取%30的利益,详细原因就不赘述。

当你需要使用苹果内付费这项功能,首先你要有一个开发者账号,如果是公司开发者则需要申请一个公司的开发者账号而非个人,涉及到邓白氏编码的申请,我会在之后的文章提到。当你有开发这账号时,先不用打开X-code,因为内购项目最复杂的部分不是代码部分而是繁杂项目的申请。首先你要登陆到 iTunescConnect"https://itunesconnect.apple.com",先新建一个测试内购的APP,点击我的APP,进入页面后点击左上角的+号按钮选择新建APP,填写平台IOS,名称和语言等,这里要说的是套装ID和SKU,SKU为你的此应用区别其他应用的标示符,你可以随便填写数字。而套装ID则需要去  https://developer.apple.com里的Member Center里申请,选择Certificates, Identifiers & Profiles,再选择IOS APP里的Certificates,进入页面左边选择APP IDs,点击右上角+号,App ID Description随意填写一个name,在Bundle ID里填写格式如下的名字com.XXX.XX,这里最后一个字段一定要写唯一标识符,如com.pokhara.ipa。然后continue提交之后就OK了。注意这里的Bundle ID必须和你之后工程里的Bundle ID相同。然后回到前面新建APP里将这个Bundle ID填进去,新建好一个APP,至此内购的五大步骤的第一步就实现了。</p><p>第二步就是填写银行账户信息,就是你用来收款的一些信息。回到iTunescConnect,选择协议、税务和银行业务,这里必须填写详细。详细信息咨询你的公司会计吧,毕竟你是程序员。。。如果你的银行信息填写完毕后银行这个页面的表格应该显示的都是set up的样子</p><p>第三步是为你的APP增加内购项目,点击你新建的APP项目。点击导航栏上的功能你会看到APP内购买项目,点击+号。选择消耗性项目(如打怪金币,QQ斗地主欢乐豆,可以重复购买),参考名称可以随意,但是产品ID一定要记住,最好写成com.项目名.coinXX这样,方便你记录。价格等级对应的是你的内购项目的价格。Tier 1对应的就是US$0.99也就是大概6元人民币。选择语言里的显示语言就是你想显示的商品名称,提交一个正确格式的截图,这一步就算搞定了。回到APP内购买项目里回发现这个商品已经被添加了,你会看到一个准备提交的黄色按钮或者绿色按钮或者。。。(作者色盲,不好意思,不过,不重要!),因为这时候我们已经可以用它测试了,还差最后一步就可以打开久违的X-code了。</p><p>第四步,申请沙箱测试员,因为是模拟支付环境所以需要回到iTunescConnect,选择用户和职能,沙箱技术测试员,随意添加一个,记住账号密码就OK了,如果提醒你账号已经和APPstore绑定了就随便编一个邮箱账号就OK了。申请完毕,ios 应用内付费就基本大功告成。</p><p></p><p>第五步,打开Xcode填写上刚申请的Budle ID,然后就是自己写一个购买界面,加入代理点击事件上代码</span></p><pre name="code" class="objc">- (void)viewDidUnload {    [super viewDidUnload];    [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];}-(void)clik:(id)sender{    if ([SKPaymentQueue canMakePayments]) {        // 执行下面提到的第5步:        [self getProductInfo];    } else {        NSLog(@"失败,用户禁止应用内付费购买.");    }}// 下面的ProductId应该是事先在itunesConnect中添加好的,已存在的付费项目。否则查询会失败。- (void)getProductInfo {    NSSet * set = [NSSet setWithArray:@[@"com.shuhai.coin1500"]];    SKProductsRequest * request = [[SKProductsRequest alloc] initWithProductIdentifiers:set];    request.delegate = self;    [request start];}// 以上查询的回调函数- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {    NSArray *myProduct = response.products;    if (myProduct.count == 0) {        NSLog(@"无法获取产品信息,购买失败。");        return;    }    SKPayment * payment = [SKPayment paymentWithProduct:myProduct[0]];    [[SKPaymentQueue defaultQueue] addPayment:payment];}- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)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 {    // Your application should implement these two methods.    NSString * productIdentifier = transaction.payment.productIdentifier;//    NSString * receipt = [transaction.transactionReceipt base64EncodedString];    if ([productIdentifier length] > 0) {        // 向自己的服务器验证购买凭证    }    // Remove the transaction from the payment queue.    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];    }- (void)failedTransaction:(SKPaymentTransaction *)transaction {    if(transaction.error.code != SKErrorPaymentCancelled) {        NSLog(@"购买失败");    } else {        NSLog(@"用户取消交易");    }    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];}- (void)restoreTransaction:(SKPaymentTransaction *)transaction {    // 对于已购商品,处理恢复购买的逻辑    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];}
其中NSSet * set = [NSSet setWithArray:@[@"XXXXXX"]];为你购买项目的ID;注意用真机测试,在手机设置的iTunes Store与App Store,注销掉你之前的账号,登陆你的沙箱测试员账号测试。

至此,结束。有问题欢迎指正交流。541370008@qq.com

viewdidload加一句

 [[SKPaymentQueuedefaultQueue]addTransactionObserver:self];



0 0
原创粉丝点击