原文地址:https://www.jianshu.com/p/f7bff61e0b31
项目中使用到了中间货币(金币)的形式来进行功能使用,模式是使用RMB换成-金币比如:(1RMB = 10金币),所以会集成第三方的支付平台,使用了微信和支付宝的第三方平台过后,发现审核失败,被苹果拒绝,查了一查原因,才是因为苹果对app内的中间币的购买必须走苹果内购(比如冲点券,比如买钻石....)。所以无奈只有使用苹果内购,由于苹果内购的步骤很多,设置的东西太多,所以将这步骤记录下来。
首先设置协议
1.打开itunes Connect,选择协议,税务和银行业务
image.png
2.点击Request Contracts(申请合同)下面的,request,点了几个确定和下一步后回到主界面。
image.png
Contact info:联系人信息
Bank info:银行信息
Tax info:税务信息
image.png
3.首先设置联系人信息,点击Contact info下面的 Set up(设置),点击Add New Contract(增加先的联系方式)
image.png
4.填写详情
填写完成后点击save(保存)
image.png
5.在下面的所有项目中都选择刚刚填写的信息,选择后点击右下角的done(完成),你可以创建很多联系人,在不同的职务选择不同的联系人。因为我是独立开发,所以我全部填写的我自己。
Senior Management:高管
Financial:财务
Technical:技术支持
Legal:法务
Marketing:市场推广
image.png
6.设置银行信息,点击Back info下面的Set up,弹出页面
点击Add Bank Account(添加银行账号)
image.png
选择china,后点击next。
image.png
填写了CNAPS Code后点击Next
image.png
会弹出你的银行卡开户地的信息,确认一下点击next
image.png
填写银行卡信息,注意:户主名只能写拼音,比如:李三(Li San)。填完后点击Next
image.png
弹出确定信息页面,在下面打钩后点击Save
image.png
点击了save后就可以在弹出的页面中选择刚刚填写的卡了。选择后点击Save
image.png
7.设置税务信息,点击Tax info下面的Set up,此时联系人信息已经变成可以编辑状态,银行信息为浏览状态。
image.png
弹出的界面中,税务分为三种
U.S Tax Forms: 美国税务
Australia Tax Forms:澳大利亚税务
Canada Tax Forms: 加拿大税务
这里我选择的美国税务,就是第一个
image.png
弹出第一个选择,点击submit(提交)后,弹出第二个选择
image.png
弹出第二个选择,选择后点击submit
image.png
弹出第三个页面,填写的资料后点击提交,记得勾选页面上的几个复选框
image.png
在提交成功后,状态就变成processing成功
image.png
到这里设置的协议就已经设置完了。
创建项目的内购
1.进入到项目的APP信息页面,点击功能,在弹出的页面点击App内购买项目后面的➕。
image.png
2.在弹出的新对话框中选择你需要哪一种服务,由于我的项目需要兑换成消耗的金币,所以我选择第一个。选择后点击创建。
image.png
3.开始填写内购项目信息。填完后点击右上角的存储(所有信息必须填写完整)。
image.png
4.点击存储后,内购列表就会有刚刚创建的内购条目。
image.png
你app有几个内购级别就需要依次创建几个条目。
添加测试账号,用来测试支付功能
1.点击图中用户和职能
image.png
2.点击沙盒测试员,然后点击左边的➕按钮。
image.png
3.设置好信息点击右上角存储就可以,记住里面的邮箱和密码用于支付的时候登陆Apple id
image.png
代码集成
打开自己的项目,创建一个测试类。代码都有注释和步骤,直接上代码。
注意:
1.必须用真机测试。
2.测试的时候必须退出自己的apple ID。弹出页面后登陆沙盒的测试apple id。
#import"TestPayController.h"// 1.首先导入支付包#import
20 BASE64 常用的编码方案,通常用于数据传输,以及加密算法的基础算法,传输过程中能够保证数据传输的稳定性
21 BASE64是可以编码和解码的
22 */NSString*encodeStr = [receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];NSString*sendString = [NSStringstringWithFormat:@"{\"receipt-data\" : \"%@\"}", encodeStr];NSLog(@"_____%@",sendString);NSURL*StoreURL=nil;if([environment isEqualToString:@"environment=Sandbox"]) { StoreURL= [[NSURLalloc] initWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"]; }else{ StoreURL= [[NSURLalloc] initWithString:@"https://buy.itunes.apple.com/verifyReceipt"]; }//这个二进制数据由服务器进行验证;zlNSData*postData = [NSDatadataWithBytes:[sendString UTF8String] length:[sendString length]];NSLog(@"++++++%@",postData);NSMutableURLRequest*connectionRequest = [NSMutableURLRequestrequestWithURL:StoreURL]; [connectionRequest setHTTPMethod:@"POST"]; [connectionRequest setTimeoutInterval:50.0];//120.0---50.0zl[connectionRequest setCachePolicy:NSURLRequestUseProtocolCachePolicy]; [connectionRequest setHTTPBody:postData];//开始请求NSError*error=nil;NSData*responseData=[NSURLConnectionsendSynchronousRequest:connectionRequest returningResponse:nilerror:&error];if(error) {NSLog(@"验证购买过程中发生错误,错误信息:%@",error.localizedDescription);return; }NSDictionary*dic=[NSJSONSerializationJSONObjectWithData:responseData options:NSJSONReadingAllowFragmentserror:nil];NSLog(@"请求成功后的数据:%@",dic);//这里可以等待上面请求的数据完成后并且state = 0 验证凭据成功来判断后进入自己服务器逻辑的判断,也可以直接进行服务器逻辑的判断,验证凭据也就是一个安全的问题。楼主这里没有用state = 0 来判断。// [[SKPaymentQueue defaultQueue] finishTransaction: transaction];NSString*product = transaction.payment.productIdentifier;NSLog(@"transaction.payment.productIdentifier++++%@",product);if([product length] >0) {NSArray*tt = [product componentsSeparatedByString:@"."];NSString*bookid = [tt lastObject];if([bookid length] >0) {NSLog(@"打印bookid%@",bookid);//这里可以做操作吧用户对应的虚拟物品通过自己服务器进行下发操作,或者在这里通过判断得到用户将会得到多少虚拟物品,在后面([self getApplePayDataToServerRequsetWith:transaction];的地方)上传上面自己的服务器。} }//此方法为将这一次操作上传给我本地服务器,记得在上传成功过后一定要记得销毁本次操作。调用[[SKPaymentQueue defaultQueue] finishTransaction: transaction];[selfgetApplePayDataToServerRequsetWith:transaction];}//结束后一定要销毁- (void)dealloc{ [[SKPaymentQueuedefaultQueue] removeTransactionObserver:self];}- (void)didReceiveMemoryWarning { [superdidReceiveMemoryWarning];}-(NSString* )environmentForReceipt:(NSString* )str{ str= [str stringByReplacingOccurrencesOfString:@"\r\n"withString:@""]; str = [str stringByReplacingOccurrencesOfString:@"\n"withString:@""]; str = [str stringByReplacingOccurrencesOfString:@"\t"withString:@""]; str=[str stringByReplacingOccurrencesOfString:@" "withString:@""]; str=[str stringByReplacingOccurrencesOfString:@"\""withString:@""];NSArray* arr=[str componentsSeparatedByString:@";"];//存储收据环境的变量NSString* environment=arr[2];returnenvironment;}@end
注意:在需要修改已经上线的内购的时候需要重新创建新的内购条目,然后重新提交。
作者:Chaman_Elephant
链接:https://www.jianshu.com/p/f7bff61e0b31
來源:
著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。