現(xiàn)在先了解哈內(nèi)購的流程
好的思路我們都了解了 現(xiàn)在我們開始動工
我寫的比較簡單沒有封裝就是在那個地方用到了然后就直接調(diào)支付的方法
這個就是在我們要用的時候調(diào)后臺的接口然后后臺給我們返回訂單號
-(void)buttonActionTequan{
? ? [SVProgressHUD showWithStatus:@"正在支付"];
? ? NSMutableDictionary *dictParameters = [[NSMutableDictionary alloc]init];
? ? [dictParameterssetObject:@""forKey:@""];
? ? NSString*payType =@"";
? ? if ([currentPayType isEqualToString:@"產(chǎn)品id"]) {
? ? ? ? payType =@"";
? ? }
? ? [dictParameterssetObject:payTypeforKey:@"type"];
?? ?[HttpManagerpostWithAction:@""andParams:dictParameterssuccess:^(NSDictionary*dict,BOOLsuccess) {
? ? ? ? intcode = [[dictobjectForKey:@"code"]intValue];
? ? ? ? NSString *message = [NSString stringWithFormat:@"%@",[dict objectForKey:@"msg"]];
? ? ? ? if(code ==1) {
? ? ? ? ? ? NSDictionary*dictData = [dictobjectForKey:@"data"];
? ? ? ? ? ? currentOrderNo = [NSString stringWithFormat:@"%@",[dictData objectForKey:@"order_num"]];
? ? ? ? ? ? [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
?? ? ? ? ? ? ? ? ? ? ? if([SKPaymentQueuecanMakePayments]){
? ? ? ? ? ? ? ? ? ? ? ? ? ? // 這里發(fā)起支付
?? ? ? ? ? ? ? ? ? ? ? ? ? [selfrequestProductData:currentPayType];
?? ? ? ? ? ? ? ? ? ? ? }else{
?? ? ? ? ? ? ? ? ? ? ? ? ? NSLog(@"不允許程序內(nèi)付費");
?? ? ? ? ? ? ? ? ? ? ? }
?? ? ? ?}else{
? ? ? ? ? ? [SVProgressHUD dismissWithError:message];
?}
? ? }fail:^(NSError*error) {
? ? ? ? [SVProgressHUD dismissWithError:@"請求失敗巍膘,請檢查網(wǎng)絡"];
? ? }];}
//收到產(chǎn)品返回信息
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
? ? NSLog(@"--------------收到產(chǎn)品反饋消息---------------------");
? ? NSArray*product = response.products;
? ? NSLog(@"productID:%@", response.invalidProductIdentifiers);
? ? if(product.count==0){
? ? ? ? [SVProgressHUD dismissWithError:@"查詢不到對應消息"];
? ? ? ? return;
? ? }
? ? [SVProgressHUD showWithStatus:@"支付中"];
? ? SKProduct*p =nil;
? ? for(SKProduct*proinproduct) {
? ? ? ? if([pro.productIdentifier isEqualToString: currentPayType]){
? ? ? ? ? ? p = pro;
? ? ? ? }
? ? }
? ? SKPayment *payment = [SKPayment paymentWithProduct:p];
? ? NSLog(@"發(fā)送購買請求");
? ? [[SKPaymentQueue defaultQueue] addPayment:payment];
}
//請求失敗
- (void)request:(SKRequest*)requestdidFailWithError:(NSError*)error{
? ? [SVProgressHUD dismissWithError:@"支付失敗"];
}
- (void)requestDidFinish:(SKRequest*)request{
? ? //[SVProgressHUD dismiss];
}
//監(jiān)聽購買結果
- (void)paymentQueue:(SKPaymentQueue*)queueupdatedTransactions:(NSArray*)transaction{
? ? for(SKPaymentTransaction*tranintransaction){
? ? ? ? switch(tran.transactionState) {
? ? ? ? ? ? case SKPaymentTransactionStatePurchased:{
? ? ? ? ? ? //購買完成向自己的服務器驗證
? ? ? ? ? ? ? ? [self verifyPurchaseWithPaymentTransaction:[NSNumber numberWithInt:tran.transactionState]];
? ? ? ? ? ? ? ? [[SKPaymentQueue defaultQueue] finishTransaction:tran];
? ? ? ? ? ? }
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case SKPaymentTransactionStatePurchasing:
? ? ? ? ? ? ? ? [SVProgressHUD showWithStatus:@"支付中"];
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case SKPaymentTransactionStateRestored:{
? ? ? ? ? ? ? ? [[SKPaymentQueue defaultQueue] finishTransaction:tran];
? ? ? ? ? ? }
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case SKPaymentTransactionStateFailed:{
? ? ? ? ? ? ? ? [[SKPaymentQueue defaultQueue] finishTransaction:tran];
? ? ? ? ? ? ? ? [SVProgressHUD dismissWithError:@"購買失敗"];
? ? ? ? ? ? }
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? default:
? ? ? ? ? ? ? ? break;
? ? ? ? }
? ? }
}
//交易結束
- (void)completeTransaction:(SKPaymentTransaction*)transaction{
? ? NSLog(@"交易結束");
? ? [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
-(void)verifyPurchaseWithPaymentTransaction:(NSNumber*)resultState{
? ? //從沙盒中獲取交易憑證并且拼接成請求體數(shù)據(jù)
? ? NSURL *receiptUrl=[[NSBundle mainBundle] appStoreReceiptURL];
? ? NSData*receiptData=[NSDatadataWithContentsOfURL:receiptUrl];
? ? NSString * base64String = [receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
? ? NSLog(@"receiptData = %@",base64String); ? ?NSMutableDictionary *dictParameters = [[NSMutableDictionary alloc]init];
? ? [dictParameterssetObject:currentOrderNoforKey:@"order_no"];
? ? [dictParameterssetObject:base64StringforKey:@"trade_no"];
}