iOS 内购 分享

 

  • -**************分享功能  http://dev.umeng.com/social/cocos2d-x/integration#social_cocos2dx --- 详细文档
  • *****************************************************************************************
  • -----------------------------------------
关于:excel
1: 第一行 先天2个数; 之后选中; 下拉到指定位置
2: 在 Fx中填写公式:=A1*2+100  之后,按enter。 下拉即可; 会自动算出值
3:   选中将其粘贴与新建的Excel中;   全选右下角一个键 选择值

-------------------------------------内购-------------------------------------------------------------------------
1: 在 AppDelegate 即进入应用时:检查积分墙是否开启; 功能仅仅只给:    变量赋值 -- 之后用
2: 封装个商店类, 在  构造函数中先 注册, 在设置委托, 在  每个商品添加; 本不必;应为从苹果服务器返回的有, 但是美元看不懂;没啥实际意义,所以自己在商店中的把所有的加一遍。  1: 进入应用, 2 检查大脚积分墙是否开启  3 4设置状态  
1:打开商店, 即点击按钮时 2注册列表(构造函数) 3获取列表  4 回调 创建列表  5 判断积分墙是否开启(即bool变量值) 7 添加积分墙按钮


----------------------------------------分享---------------------------------------------------------------------

注: 内购整个过程只于苹果的服务器通信; 不会与公司的通信; 积分墙是与自己公司的server通信

不管:  ”内购   分享  积分墙 “    都要现在AppDelegate中set一下



关于 分享:

1:在友盟注册一个 AppKey .  QQ /weixin/ renren等分别注册   给一个  id key

2: 打开工程的配置 targets---infor --- URL types--  添加进去,  具体的看教程 /导入各种库

3:在AppDelegate 中setAppKey()  --- 必须有的

4  写的分享类; 把 分享的毁掉函数单独写在一个中;  注:报错 把下载umeng的包中Android不需要的删除掉

5: 在需要的地方; 放个按钮 ; 点击时触发 该事件 即可

 


注: 内购整个过程只于苹果的服务器通信; 不会与公司的通信; 积分墙是与自己公司的server通信

【iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!【2012-12-11日更新获取"产品付费数量等于0的问题"】

只要修改者2个函数即可:




内购协议中的几个函数其实就是在.mm文件中的, 购买成功  购买失败   购买结果中回调一下

-----------------------------

iOS应用程序内购/内付费(一) 

分类: IOS开发   11982人阅读  评论(25)  收藏  举报

很久之前就想出一篇IOS内付费的教程,但是一查网上的教程实在太多了,有的写得真的蛮不错的,就心想算了,于是就保存在草稿箱了。至于为什么写完它呢!真是说来话长,最近公司有个项目经理跑来问我有关苹果内付费相关的细节,跟他聊了半天,从项目对接苹果官方支付接口聊到了如何查看App收益,最后终于使他有了一些眉目,但是悲催的是还要我继续去跟他们项目的程序员讲解(真是疯了),所以我就决定给他们项目写一个内购的文档,所以我顺便把这篇博客完成吧!


========================================第一部份===================================

首先进入苹果的ItunesConnection(https://itunesconnect.apple.com)点击左上角的加号新建一个App应用,点击后该网站会弹出一个信息编辑框,大家只要将上面的信息填充完毕点击save即可在苹果的app平台上拥有一个属于自己的App。


在套装ID的上,需要提前为该App申请一个AppID以及BundleID,只要是申请成功了就会在选择列表中显示出来。如果有人有疑问如何申请,请看我之前那一篇推送的博客,里面有详细的步骤。附上链接点击打开链接

这里顺便多说一句这个ItunesConnect是用来干嘛的,它是苹果公司给个人或企业提供管理自己App的一个平台。在这个平台上开发者可以新建,删除和管理自己的App应用,开发者可以根据需求对App应用进行上架与下架,编辑App信息,生成测试app所需的信息,例如账号,邀请码等,还有就是我们今天要讲的内付费功能。当然啦,他的功能可不止我讲的这些,我大致说一下这个平台的作用,如果你经常跟它打交道的话就会慢慢熟悉了。


============================================第二部分=====================================

接下来,我就来为大家演示一下如何添加付费道具,首先打开iTunesConnect,显示如下页面



选择红圈所圈起来的选项,然后将里面的相关信息补充完毕,如果缺少这一步,内购功能是不会成功的。

假如你已经完成了上述相关银行账户的设置,就点击你的App,选择上面标题栏中的"App 内购买项目"


随后点击左上角的 "create new"选项,如下图所示,进入到下一个界面



这个界面是让你选择消费道具的种类,现在改版的网站是有简体中文翻译的,所以不像以前打开一看都不知道选哪一个,甚至都不知道每个代表的什么意思(比如我第一次遇到的时候,在领导面前真是囧)。它的种类分为如下几种:




一般对项目来说大多数都是选择“消耗型项目”这个种类,比如游戏中购买金币,宝石balabala~之类的,选中之后就会到这个界面中来:


在上图所示的编辑框中输入,商品名称,产品ID以及价格等级,在这边说明一下:

1.商品名称根据你的消费道具的实际意义来说明,比如“100颗宝石”,“100金币”等。

2.产品ID是比较重要的,由项目自定义,只要唯一即可,像我一般都是用App的bundleID加一个后缀来表示,这样既跟项目关联又具有唯一性。

3.价格等级的话“查看价格表”中有对应的说明,可以对照着表中每个国家的货币价格与等级来选择。


我们继续,在这个网页的接下来部分如图所示:

选择添加语言选项,弹出一个编辑页面:


点击save保存,则会在界面上显示成如下:


最后一步就是点击“选取文件”提交一张苹果它指定像素(640*920)的商品图片,当他上传完毕后点击“save”按钮,我们这第二部分就大工告成了。提交的商品最后会在内购的页面上显示为如图:


这个图是我在已经发布的app上面截取的,添加了3个商品,已经是通过的的状态了(显示绿色),当您刚提交的时候,因为通过苹果的审查需要一段时间所以会显示黄色的等待状态,所以不必担心是不是商品编辑错了。如图:



=====================================第三部分======================================

这部分,我主要给大家演示一下,如何申请测试账号,利用苹果的沙盒测试环境来模拟AppStore的购买流程。

在ItunesConnect中选择“用户和职能”选项~



随后在左上角的选项中选择沙盒测试者,点击左上角的加号图标增加一位测试者,如图:


编辑好相应的内容,点击保存,就创建了一个测试账号,是不是很简单啊!当然这个账号如果你忘记了密码可以重新生成一个,无关紧要。

顺带多句嘴,千万不要在正式的appstore上面用沙盒测试的账号来登录,不然后果很严重,千万要牢记在心,此账号只用于测试环境下~


=====================================第四部分===========================================

接下来就是代码部分啦~

1.首先在项目工程中加入“storekit.framework”,加入头文件#import <StoreKit/StoreKit.h>

2.在.h文件中加入“SKPaymentTransactionObserver,SKProductsRequestDelegate”监听机制

下面贴上内购的核心代码,就几个函数,我在这边就不在做更多详细的解释了,各位看官可以运行跑一下就一目了然了。

.h文件

[objc]  view plain copy
  1. //  
  2. //  PaymentViewController.h  
  3. //  IAPPayTest  
  4. //  
  5. //  Created by silicon on 14-10-28.  
  6. //  Copyright (c) 2014年 silicon. All rights reserved.  
  7. //  
  8.   
  9. #import <UIKit/UIKit.h>  
  10.   
  11. #import <StoreKit/StoreKit.h>  
  12.   
  13. @interface PaymentViewController : UIViewController<SKPaymentTransactionObserver,SKProductsRequestDelegate>  
  14.   
  15. @property (strongnonatomic) IBOutlet UITextField *productID;  
  16.   
  17. @property (strongnonatomic) IBOutlet UIButton *purchase;  
  18.   
  19. - (IBAction)purchaseFunc:(id)sender;  
  20.   
  21. @end  

.m文件

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //  
  2. //  PaymentViewController.m  
  3. //  IAPPayTest  
  4. //  
  5. //  Created by silicon on 14-10-28.  
  6. //  Copyright (c) 2014年 silicon. All rights reserved.  
  7. //  
  8.   
  9. #import "PaymentViewController.h"  
  10.   
  11. @interface PaymentViewController ()  
  12.   
  13. @end  
  14.   
  15. @implementation PaymentViewController  
  16.   
  17. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil  
  18. {  
  19.     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];  
  20.     if (self) {  
  21.         // Custom initialization  
  22.     }  
  23.     return self;  
  24. }  
  25.   
  26. - (void)viewDidLoad  
  27. {  
  28.     [super viewDidLoad];  
  29.     // Do any additional setup after loading the view from its nib.  
  30.       
  31.     [[SKPaymentQueue defaultQueue] addTransactionObserver:self];  
  32.     self.productID.text = @"com.games.ztyxs.product_point.1";  
  33. }  
  34.   
  35. - (void)didReceiveMemoryWarning  
  36. {  
  37.     [super didReceiveMemoryWarning];  
  38.     // Dispose of any resources that can be recreated.  
  39. }  
  40.   
  41. - (IBAction)purchaseFunc:(id)sender {  
  42.     NSString *product = self.productID.text;  
  43.     if([SKPaymentQueue canMakePayments]){  
  44.         [self requestProductData:product];  
  45.     }else{  
  46.         NSLog(@"不允许程序内付费");  
  47.     }  
  48. }  
  49.   
  50. //请求商品  
  51. - (void)requestProductData:(NSString *)type{  
  52.     NSLog(@"-------------请求对应的产品信息----------------");  
  53.     NSArray *product = [[NSArray alloc] initWithObjects:type, nil nil];  
  54.   
  55.     NSSet *nsset = [NSSet setWithArray:product];  
  56.     SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:nsset];  
  57.     request.delegate = self;  
  58.     [request start];  
  59.       
  60. }  
  61.   
  62. //收到产品返回信息  
  63. - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{  
  64.   
  65.     NSLog(@"--------------收到产品反馈消息---------------------");  
  66.     NSArray *product = response.products;  
  67.     if([product count] == 0){  
  68.         NSLog(@"--------------没有商品------------------");  
  69.         return;  
  70.     }  
  71.       
  72.     NSLog(@"productID:%@", response.invalidProductIdentifiers);  
  73.     NSLog(@"产品付费数量:%d",[product count]);  
  74.       
  75.     SKProduct *p = nil;  
  76.     for (SKProduct *pro in product) {  
  77.         NSLog(@"%@", [pro description]);  
  78.         NSLog(@"%@", [pro localizedTitle]);  
  79.         NSLog(@"%@", [pro localizedDescription]);  
  80.         NSLog(@"%@", [pro price]);  
  81.         NSLog(@"%@", [pro productIdentifier]);  
  82.           
  83.         if([pro.productIdentifier isEqualToString:self.productID.text]){  
  84.             p = pro;  
  85.         }  
  86.     }  
  87.       
  88.     SKPayment *payment = [SKPayment paymentWithProduct:p];  
  89.       
  90.     NSLog(@"发送购买请求");  
  91.     [[SKPaymentQueue defaultQueue] addPayment:payment];  
  92. }  
  93.   
  94. //请求失败  
  95. - (void)request:(SKRequest *)request didFailWithError:(NSError *)error{  
  96.     NSLog(@"------------------错误-----------------:%@", error);  
  97. }  
  98.   
  99. - (void)requestDidFinish:(SKRequest *)request{  
  100.     NSLog(@"------------反馈信息结束-----------------");  
  101. }  
  102.   
  103.   
  104. //监听购买结果  
  105. - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transaction{  
  106.     for(SKPaymentTransaction *tran in transaction){  
  107.           
  108.         switch (tran.transactionState) {  
  109.             case SKPaymentTransactionStatePurchased:  
  110.                 NSLog(@"交易完成");  
  111.                   
  112.                 break;  
  113.             case SKPaymentTransactionStatePurchasing:  
  114.                 NSLog(@"商品添加进列表");  
  115.                   
  116.                 break;  
  117.             case SKPaymentTransactionStateRestored:  
  118.                 NSLog(@"已经购买过商品");  
  119.               
  120.                 break;  
  121.             case SKPaymentTransactionStateFailed:  
  122.                 NSLog(@"交易失败");  
  123.                   
  124.                 break;  
  125.             default:  
  126.                 break;  
  127.         }  
  128.     }  
  129. }  
  130.   
  131. //交易结束  
  132. - (void)completeTransaction:(SKPaymentTransaction *)transaction{  
  133.     NSLog(@"交易结束");  
  134.       
  135.     [[SKPaymentQueue defaultQueue] finishTransaction:transaction];  
  136. }  
  137.   
  138.   
  139. - (void)dealloc{  
  140.     [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];  
  141.     [super dealloc];  
  142. }  
  143.   
  144. @end  

代码就这么多,到这边我们的IOS内购教程就接近尾声了,在测试的时候还有几点因素要注意一下:

1.沙盒环境测试appStore内购流程的时候,请使用没越狱的设备

2.请务必使用真机来测试,一切以真机为准。

3.项目的Bundle identifier需要与您申请AppID时填写的bundleID一致,不然会无法请求到商品信息。

讲了这么多,附上几张测试截屏给大家展示一下:

请求商品时的打印日志


交易成功后:



手机截屏:

要求输入AppStore帐密,使用测试生成的即可



确定购买:

---------


交易完成:



好了,所有的内购流程基本上讲完了,原谅我在图片上的涂抹,因为关系到产品的敏感词汇所以希望大家能够不介意。赶这篇博客的时间比较匆忙,如果有童鞋还有什么疑问或者我写的那个

-----------------------------------------------------Quick 支付

 现在我假定看官们已经开启了iOS工程的iap支持,也在itunesconnect添加了测试商品以及测试账号

本文的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
function MainScene:ctor()
     --初始化商店
     Store.init(handler(self, self.storeCallback)) --function(event) self:storeCallback(event) end)
  
     --载入商品
     Store.loadProducts({ "com.originaljoy.iaptest.222coin" ,
             "com.originaljoy.iaptest.11coin" ,
             "com.originaljoy.iaptest.111coin" ,
             "com.originaljoy.iaptest2.1111coin"
                }, handler(self, self.loadCallback))
  
     --添加一个购买按钮
     self.btn = cc.ui.UIPushButton. new ( "ui_btn_start.png" )
     :onButtonClicked(function(event)
         print( "购买商品" )
         Store.purchase( "com.originaljoy.iaptest2.1111coin" )
     end)
     :pos(display.cx, display.cy)
     :addTo(self)
end
  
---商店的回调
function MainScene:storeCallback(transaction)
     --处理购买中的事件回调,如购买成功
     if  transaction.transaction.state ==  "purchased"  then
     print( "buy success" )
     Store.finishTransaction(transaction.transaction)
     end
end
  
---载入商品的毁掉
function MainScene:loadCallback(products)
     --返回商品列表
     dump(products)
end


5.store的api使用

a)Store.init(listener)

初始化商店,并设置回调函数。回调函数用来处理各种store事件,接受一个参数event

event包含一个字段,transaction! transaction就是事件的完整内容,下图就是一次购买成功后回调的transaction

QQ截图20141222164909.jpg

b)Store.loadProducts(productsId, listener)

载入商品列表,并设置回调

回调函数接受一个参数,就是商品列表,包括可用和不可用的商品,如图

QQ截图20141222165038.jpg

c)Store.purchase(productId)

购买一个商品,传入商品id!购买事件将会在store的回调中接收


d)Store.finishTransaction(transaction)

移除一个事件。如果你购买一个商品成功后,不移除对应的事件,再次购买会有如下提示:

this in-app purchase has already been bought it will be restored for free

以上就是重要的几个函数的使用了!

使用完的感受就是:用Quick,就这么简单!(有任何问题请在原帖与作者联系)



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值