一、证书配置(在此暂时不赘述了)
developer.apple.com/account/ios/identifier/bundle
二、苹果内支付需要的产品ID
创建内支付ID
1、创建一个新的APP(此APP的) -> 看下图
选择新建APP<根据自己所需,此处已APP为例>
到此一个APP创建好了,当然如果需要上线的话,就需要详细填写内容,再次不多说了。此处仅作为内支付测试所以不需要填写,直接下一步>>>>>>>>>>>
到此,一个产品ID创建完成,下面走一趟项目配置
三、项目配置
1、不废话,图片走起
到这里就差不多了,下面就是最想看到也是最简单的代码部分了。代码很简单、只是前期工作有点繁琐
四、代码
1、头文件不会忘了吧
#import
2、协议还记得吧
3、复制代码的地方
#pragma mark ---- 苹果Pay支付
/** 苹果Pay支付 */
- (void)doApplePayWithData:(NSDictionary *)orderDic {
// 设置代理
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
//判断是否可进行支付
if ([SKPaymentQueue canMakePayments])
{
NSLog(@"许程序内付费购买");
//根据商品ID查找商品信息
NSArray *product = [[NSArray alloc] initWithObjects:@"申请到的产品ID", nil];
NSSet *nsset = [NSSet setWithArray:product];
//创建SKProductsRequest对象,用想要出售的商品的标识来初始化, 然后附加上对应的委托对象。
//该请求的响应包含了可用商品的本地化信息。
SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:nsset];
request.delegate = self;
[request start];
}
else
{
[SVProgressHUD showErrorWithStatus:@"不允许程序内付费"];
}
}
#pragma mark ---- SKProductsRequestDelegate
// 以上查询的回调函数
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
NSLog(@"----%lu---",(unsigned long)response.invalidProductIdentifiers.count);
NSLog(@"goods info back");
NSArray *myProduct = response.products;
if(myProduct.count == 0){
NSLog(@"无法获取产品信息,购买失败。");
return;
}
for(SKProduct *pro in myProduct){
NSLog(@"%@", [pro description]);
NSLog(@"%@", [pro localizedTitle]);
NSLog(@"%@", [pro localizedDescription]);
NSLog(@"%@", [pro price]);
NSLog(@"%@", [pro productIdentifier]);
NSLog(@"%@", [pro.priceLocale objectForKey:NSLocaleCurrencySymbol]);
NSLog(@"%@", [pro.priceLocale objectForKey:NSLocaleCurrencyCode]);
if([pro.productIdentifier isEqualToString:@"申请到的产品ID"]){
// 下面代码看需要
_currentProduct = pro;
_appPayGoodsPrice = [NSString stringWithFormat:@"%@", [pro price]];
_appPayGoodsCurrency = [NSString stringWithFormat:@"%@",[pro.priceLocale objectForKey:NSLocaleCurrencyCode]];
break;
}
}
NSLog(@"start pay");
//创建一个支付对象,并放到队列中
SKPayment *payment = [SKPayment paymentWithProduct:_currentProduct];
NSLog(@"---------发送购买请求------------");
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error {
NSLog(@"请求商品失败%@",error);
}
- (void)requestDidFinish:(SKRequest *)request {
[SVProgressHUD dismiss];
NSLog(@"反馈信息结束调用");
}
#pragma mark ---- SKPaymentTransactionObserver
// 监听购买结果
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions{
NSLog(@"pay result");
for(SKPaymentTransaction *transaction in transactions){
switch (transaction.transactionState)
{
case SKPaymentTransactionStatePurchased:
{
//交易完成
NSLog(@"transactionIdentifier = %@", transaction.transactionIdentifier);
NSLog(@"---苹果Pay支付-交易完成---");
kSucPrompt(@"---苹果Pay支付-交易完成---");
}
break;
case SKPaymentTransactionStateFailed:
{
//交易失败
NSLog(@"---苹果Pay支付-交易失败---");
kFailPrompt(@"---苹果Pay支付-交易失败---");
}
break;
case SKPaymentTransactionStateRestored:
{
//已经购买过该商品
NSLog(@"---苹果Pay支付-已经购买过该商品---");
kFailPrompt(@"---苹果Pay支付-已经购买过该商品---");
}
break;
case SKPaymentTransactionStatePurchasing:
{
//商品添加进列表
NSLog(@"---苹果Pay支付-商品添加进列表---");
kSucPrompt(@"---苹果Pay支付-商品添加进列表---");
}
break;
default:
break;
}
}
}
//交易结束
- (void)completeTransaction:(SKPaymentTransaction *)transaction {
NSLog(@"交易结束");
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
//- (void)dealloc{
// [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
// [[NSNotificationCenter defaultCenter] removeObserver:self];
//}
五、补充
1、支付测试前需要把测试机上面已登录的苹果账号注销掉;
2、沙箱测试员的邮箱需是未注册过苹果账号的邮箱;
ps:粗略整理,不完善之处望见谅~