内购的逻辑

This commit is contained in:
fengshuo
2021-09-26 20:42:33 +08:00
parent d3e26de656
commit c9dd6001b4
32 changed files with 879 additions and 38 deletions

View File

@@ -24,6 +24,11 @@ target 'xplan-ios' do
pod 'SDCycleScrollView'
#上传图片
pod 'Qiniu'
#内购
pod 'IAPHelper'
#持久化存储
pod 'SSKeychain'
pod 'Base64'
#登录的
pod 'mob_sharesdk'
pod 'mob_sharesdk/ShareSDKPlatforms/QQ'

View File

@@ -14,8 +14,10 @@ PODS:
- AFNetworking/Serialization (4.0.1)
- AFNetworking/UIKit (4.0.1):
- AFNetworking/NSURLSession
- Base64 (1.1.2)
- FFPopup (1.1.5)
- HappyDNS (0.3.17)
- IAPHelper (1.1)
- Masonry (1.1.0)
- MBProgressHUD (1.2.0)
- MJExtension (3.3.0)
@@ -43,12 +45,15 @@ PODS:
- SDWebImage (5.11.1):
- SDWebImage/Core (= 5.11.1)
- SDWebImage/Core (5.11.1)
- SSKeychain (1.4.1)
- SZTextView (1.3.0)
- YYText (1.0.7)
DEPENDENCIES:
- AFNetworking
- Base64
- FFPopup
- IAPHelper
- Masonry
- MBProgressHUD
- MJExtension
@@ -61,14 +66,17 @@ DEPENDENCIES:
- ReactiveObjC
- SDCycleScrollView
- SDWebImage
- SSKeychain
- SZTextView
- YYText
SPEC REPOS:
trunk:
- AFNetworking
- Base64
- FFPopup
- HappyDNS
- IAPHelper
- Masonry
- MBProgressHUD
- MJExtension
@@ -79,13 +87,16 @@ SPEC REPOS:
- ReactiveObjC
- SDCycleScrollView
- SDWebImage
- SSKeychain
- SZTextView
- YYText
SPEC CHECKSUMS:
AFNetworking: 7864c38297c79aaca1500c33288e429c3451fdce
Base64: cecfb41a004124895a7bcee567a89bae5a89d49b
FFPopup: a208dcee8db3e54ec4a88fcd6481f6f5d85b7a83
HappyDNS: 848ef73e24f2b0e2752064223ce2dc0dd88900ea
IAPHelper: fd74f53b0ac142eed085777b88b86a11746a2dd4
Masonry: 678fab65091a9290e40e2832a55e7ab731aad201
MBProgressHUD: 3ee5efcc380f6a79a7cc9b363dd669c5e1ae7406
MJExtension: 01704cca2b60a214c10761b6491eab74069d68a9
@@ -96,9 +107,10 @@ SPEC CHECKSUMS:
ReactiveObjC: 011caa393aa0383245f2dcf9bf02e86b80b36040
SDCycleScrollView: a0d74c3384caa72bdfc81470bdbc8c14b3e1fbcf
SDWebImage: a7f831e1a65eb5e285e3fb046a23fcfbf08e696d
SSKeychain: 55cc80f66f5c73da827e3077f02e43528897db41
SZTextView: 094dc6acc9beec537685c545d6e3e0d4975174e1
YYText: 5c461d709e24d55a182d1441c41dc639a18a4849
PODFILE CHECKSUM: ad9235b352788673e6e5cf8b0d1b7c840428a840
PODFILE CHECKSUM: e15982fef9e57d97997b5e561f9e5bd64d3950fc
COCOAPODS: 1.10.1

View File

@@ -135,6 +135,11 @@
E88B5CBD26FB3BDF00DA9178 /* XPTeenagerAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = E88B5CBC26FB3BDF00DA9178 /* XPTeenagerAlertView.m */; };
E88B5CC126FB407B00DA9178 /* XPMineUserInfoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E88B5CC026FB407B00DA9178 /* XPMineUserInfoViewController.m */; };
E88B5CC526FB42B000DA9178 /* XPMineUserInfoHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = E88B5CC426FB42B000DA9178 /* XPMineUserInfoHeaderView.m */; };
E89DA66427005932008483C1 /* XPIAPHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = E89DA66327005932008483C1 /* XPIAPHelper.m */; };
E89DA66727006443008483C1 /* RechargeStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = E89DA66627006443008483C1 /* RechargeStorage.m */; };
E89DA67227008D59008483C1 /* WalletInfoModel.m in Sources */ = {isa = PBXBuildFile; fileRef = E89DA67127008D59008483C1 /* WalletInfoModel.m */; };
E89DA67527009ACD008483C1 /* XPMineRechargeNavView.m in Sources */ = {isa = PBXBuildFile; fileRef = E89DA67427009ACD008483C1 /* XPMineRechargeNavView.m */; };
E89DA67827009F16008483C1 /* NSObject+JSONString.m in Sources */ = {isa = PBXBuildFile; fileRef = E89DA67727009F16008483C1 /* NSObject+JSONString.m */; };
E8AC720D26F435F5007D6E91 /* UIImageView+LoadImage.m in Sources */ = {isa = PBXBuildFile; fileRef = E8AC720C26F435F5007D6E91 /* UIImageView+LoadImage.m */; };
E8AC721026F43955007D6E91 /* UIImageConstant.m in Sources */ = {isa = PBXBuildFile; fileRef = E8AC720F26F43955007D6E91 /* UIImageConstant.m */; };
E8AC721326F46ADD007D6E91 /* XPMineSettingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E8AC721226F46ADD007D6E91 /* XPMineSettingViewController.m */; };
@@ -442,6 +447,16 @@
E88B5CC026FB407B00DA9178 /* XPMineUserInfoViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPMineUserInfoViewController.m; sourceTree = "<group>"; };
E88B5CC326FB42B000DA9178 /* XPMineUserInfoHeaderView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoHeaderView.h; sourceTree = "<group>"; };
E88B5CC426FB42B000DA9178 /* XPMineUserInfoHeaderView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPMineUserInfoHeaderView.m; sourceTree = "<group>"; };
E89DA66227005931008483C1 /* XPIAPHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPIAPHelper.h; sourceTree = "<group>"; };
E89DA66327005932008483C1 /* XPIAPHelper.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPIAPHelper.m; sourceTree = "<group>"; };
E89DA66527006443008483C1 /* RechargeStorage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RechargeStorage.h; sourceTree = "<group>"; };
E89DA66627006443008483C1 /* RechargeStorage.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RechargeStorage.m; sourceTree = "<group>"; };
E89DA67027008D59008483C1 /* WalletInfoModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WalletInfoModel.h; sourceTree = "<group>"; };
E89DA67127008D59008483C1 /* WalletInfoModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WalletInfoModel.m; sourceTree = "<group>"; };
E89DA67327009ACD008483C1 /* XPMineRechargeNavView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPMineRechargeNavView.h; sourceTree = "<group>"; };
E89DA67427009ACD008483C1 /* XPMineRechargeNavView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPMineRechargeNavView.m; sourceTree = "<group>"; };
E89DA67627009F16008483C1 /* NSObject+JSONString.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSObject+JSONString.h"; sourceTree = "<group>"; };
E89DA67727009F16008483C1 /* NSObject+JSONString.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSObject+JSONString.m"; sourceTree = "<group>"; };
E8AC720B26F435F5007D6E91 /* UIImageView+LoadImage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIImageView+LoadImage.h"; sourceTree = "<group>"; };
E8AC720C26F435F5007D6E91 /* UIImageView+LoadImage.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIImageView+LoadImage.m"; sourceTree = "<group>"; };
E8AC720E26F43955007D6E91 /* UIImageConstant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UIImageConstant.h; sourceTree = "<group>"; };
@@ -941,6 +956,8 @@
189DD5A726DFA09700AB55B1 /* Tool */ = {
isa = PBXGroup;
children = (
E89DA66C2700873B008483C1 /* NSObject */,
E89DA6612700590A008483C1 /* IAPHelper */,
E8B846B926FD7BE600A777FE /* UploadImage */,
E8EEB8EA26FC2050007C6EBA /* SDPhotoBrowser */,
E81366E426F0A4820076364C /* NSString */,
@@ -1214,6 +1231,26 @@
path = MineInfo;
sourceTree = "<group>";
};
E89DA6612700590A008483C1 /* IAPHelper */ = {
isa = PBXGroup;
children = (
E89DA66227005931008483C1 /* XPIAPHelper.h */,
E89DA66327005932008483C1 /* XPIAPHelper.m */,
E89DA66527006443008483C1 /* RechargeStorage.h */,
E89DA66627006443008483C1 /* RechargeStorage.m */,
);
path = IAPHelper;
sourceTree = "<group>";
};
E89DA66C2700873B008483C1 /* NSObject */ = {
isa = PBXGroup;
children = (
E89DA67627009F16008483C1 /* NSObject+JSONString.h */,
E89DA67727009F16008483C1 /* NSObject+JSONString.m */,
);
path = NSObject;
sourceTree = "<group>";
};
E8AC720A26F435AF007D6E91 /* UIImageView */ = {
isa = PBXGroup;
children = (
@@ -1257,6 +1294,8 @@
children = (
E8B846CD26FDD96100A777FE /* XPMineRechageHeadView.h */,
E8B846CE26FDD96100A777FE /* XPMineRechageHeadView.m */,
E89DA67327009ACD008483C1 /* XPMineRechargeNavView.h */,
E89DA67427009ACD008483C1 /* XPMineRechargeNavView.m */,
);
path = Recharge;
sourceTree = "<group>";
@@ -1275,6 +1314,8 @@
children = (
E8B846DA26FDE24300A777FE /* RechargeListModel.h */,
E8B846DB26FDE24300A777FE /* RechargeListModel.m */,
E89DA67027008D59008483C1 /* WalletInfoModel.h */,
E89DA67127008D59008483C1 /* WalletInfoModel.m */,
);
path = Recharge;
sourceTree = "<group>";
@@ -1612,6 +1653,7 @@
E88B5CBA26FB329C00DA9178 /* XPMineTeenagerPwdProtocol.h in Sources */,
E88B5CB226FB1CFF00DA9178 /* XPMineTeenagerProtocol.h in Sources */,
E824546626F5FF6000BE8163 /* XPMineResetPayPasswordProtocol.h in Sources */,
E89DA66427005932008483C1 /* XPIAPHelper.m in Sources */,
E824545E26F5EF2200BE8163 /* XPMineVerifIdentityProtocol.h in Sources */,
E824545326F5CEAD00BE8163 /* XPMineModifPayProtocol.h in Sources */,
E824544826F5945300BE8163 /* XPMinePayPwdProtocol.h in Sources */,
@@ -1651,6 +1693,7 @@
E8AC722F26F49610007D6E91 /* XPMineNotificationItemModel.m in Sources */,
E8E70D7A26F2F16600F03460 /* XPMinePresent.m in Sources */,
E8EEB8F226FC2050007C6EBA /* SDPhotoBrowser.m in Sources */,
E89DA67827009F16008483C1 /* NSObject+JSONString.m in Sources */,
E81C27AB26EF2D920031E639 /* ThirdUserInfo.m in Sources */,
E81C279D26EEEC620031E639 /* XPConstant.m in Sources */,
187EEEFE26E8A82C002833B2 /* NSObject+AutoCoding.m in Sources */,
@@ -1729,6 +1772,7 @@
E88B5CA526FB088600DA9178 /* XPMineTeenagerViewController.m in Sources */,
E8EEB90926FC579A007C6EBA /* XPMineUserInfoEditTableViewCell.m in Sources */,
18C17A5D26F338F300C48E11 /* XplanFBFlutterViewContainer.m in Sources */,
E89DA67527009ACD008483C1 /* XPMineRechargeNavView.m in Sources */,
186A536926FC6F2E00D67B2C /* XCShareView.m in Sources */,
186A534C26FC6ED900D67B2C /* TTAlertView.m in Sources */,
E8B825BF26E9E57D009E8E9F /* LoginTicketInfo.m in Sources */,
@@ -1762,9 +1806,11 @@
E8B846DC26FDE24300A777FE /* RechargeListModel.m in Sources */,
189DD75926E6003C00AB55B1 /* Api.m in Sources */,
E88B5CB826FB325200DA9178 /* XPMineTeenagerPwdPresenter.m in Sources */,
E89DA66727006443008483C1 /* RechargeStorage.m in Sources */,
189DD53F26DE255600AB55B1 /* main.m in Sources */,
E872308D26E89DAA00B90D4F /* LoginInputView.m in Sources */,
189DD58F26DF97E700AB55B1 /* LoginPresenter.m in Sources */,
E89DA67227008D59008483C1 /* WalletInfoModel.m in Sources */,
189DD55026DE37F900AB55B1 /* MvpViewController.m in Sources */,
E81366F326F0B7C80076364C /* LoginFullInfoViewController.m in Sources */,
);

View File

@@ -45,6 +45,18 @@ NS_ASSUME_NONNULL_BEGIN
/// @param userInfo 需要更新的用户信息
+ (void)complementInfoWithComplection:(HttpRequestHelperCompletion)complection
userInfo:(NSDictionary *)userInfo;
/// 获取用户钱包余额信息
/// @param complection 完成
/// @param uid 用户uid
/// @param ticket ticketg
+ (void)getUserWalletInfoWithComplection:(HttpRequestHelperCompletion)complection
uid:(NSString *)uid
ticket:(NSString *)ticket;
/// 批量验证
/// @param complection 完成
/// @param transcationIdStr 需要验证的数据
+ (void)requestCheckTranscationIdsWithComplection:(HttpRequestHelperCompletion)complection
transcationIdStr:(NSString *)transcationIdStr;
@end
NS_ASSUME_NONNULL_END

View File

@@ -70,4 +70,20 @@
[HttpRequestHelper request:@"user/v2/update" method:HttpRequestHelperMethodPOST params:userInfo completion:complection];
}
///
/// @param complection
/// @param uid uid
/// @param ticket ticketg
+ (void)getUserWalletInfoWithComplection:(HttpRequestHelperCompletion)complection uid:(NSString *)uid ticket:(NSString *)ticket {
[self makeRequest:@"purse/query" method:HttpRequestHelperMethodGET completion:complection, __FUNCTION__, uid, ticket,nil];
}
///
/// @param complection
/// @param transcationIdStr
+ (void)requestCheckTranscationIdsWithComplection:(HttpRequestHelperCompletion)complection
transcationIdStr:(NSString *)transcationIdStr {
[self makeRequest:@"verify/checkIOSChargeRecord" method:HttpRequestHelperMethodPOST completion:complection, __FUNCTION__,transcationIdStr, nil];
}
@end

View File

@@ -0,0 +1,30 @@
//
// RechargeStorage.h
// xplan-ios
//
// Created by 冯硕 on 2021/9/26.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface RechargeStorage : NSObject
/// 根据商品id保存凭证
+ (BOOL)saveTranscationId:(NSString *)transcationId
recipt:(NSString *)recipt
uid:(NSString *)uid;
/// 获取所有凭证
+ (NSArray *)getAllReciptsWithUid:(NSString *)uid;
/// 根据订单删除凭证
+ (BOOL)delegateTranscationId:(NSString *)transcationId
uid:(NSString *)uid;
/// 删除所有凭证
+ (void)delegateAllTranscationIdsWithUid:(NSString *)uid;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,61 @@
//
// RechargeStorage.m
// xplan-ios
//
// Created by on 2021/9/26.
//
#import "RechargeStorage.h"
#import <SSKeychain/SSKeychain.h>
#define kappStoreKey @"kappStoreKey"
@implementation RechargeStorage
/// id
+ (BOOL)saveTranscationId:(NSString *)transcationId
recipt:(NSString *)recipt
uid:(NSString *)uid {
NSString * key = [NSString stringWithFormat:@"%@_%@", kappStoreKey, uid];
return [SSKeychain setPassword:recipt forService:key account:transcationId error:nil];
}
///
+ (NSArray *)getAllReciptsWithUid:(NSString *)uid {
NSArray *transcationIds = [SSKeychain allAccounts];
NSMutableArray *temArr = [NSMutableArray array];
[transcationIds enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj[@"svce"] isKindOfClass:[NSString class]]) {
NSString * key = [NSString stringWithFormat:@"%@_%@", kappStoreKey, uid];
if ([obj[@"svce"] isEqualToString:key]) {
NSString *recipt = [SSKeychain passwordForService:key account:obj[@"acct"] error:nil];
NSData *data = [recipt dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
[temArr addObject:json];
}
}
}];
return temArr;
}
///
+ (BOOL)delegateTranscationId:(NSString *)transcationId uid:(NSString *)uid {
NSString * key = [NSString stringWithFormat:@"%@_%@", kappStoreKey, uid];
return [SSKeychain deletePasswordForService:key account:transcationId error:nil];
}
///
+ (void)delegateAllTranscationIdsWithUid:(NSString *)uid {
NSArray *transcationIds = [SSKeychain allAccounts];
[transcationIds enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj[@"svce"] isKindOfClass:[NSString class]]) {
NSString * key = [NSString stringWithFormat:@"%@_%@", kappStoreKey, uid];
if ([obj[@"svce"] isEqualToString:key]) {
[SSKeychain deletePasswordForService:key account:obj[@"acct"]];
}
}
}];
}
@end

View File

@@ -0,0 +1,36 @@
//
// XPIAPHelper.h
// xplan-ios
//
// Created by 冯硕 on 2021/9/26.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
typedef NS_ENUM(NSInteger ,PaymentStatus) {
PaymentStatus_Purchasing = 1,//付款中
PaymentStatus_Purchased, //付款操作已经完成
PaymentStatus_Failed, //付款操作失败
PaymentStatus_Deferred, //未知状态
};
@protocol XPIAPHelperDelegate <NSObject>
///当前充值的状态
- (void)rechargeProcessStatus:(PaymentStatus)status;
///充值成功回调id
- (void)rechargeSuccess:(NSString *)transactionIdentifier;
@end
@interface XPIAPHelper : NSObject
+ (instancetype)shareHelper;
///代理
@property (nonatomic,weak) id<XPIAPHelperDelegate> delegate;
///购买商品
- (void)buyAppProductWithAppProductId:(NSString *)appProductId;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,88 @@
//
// XPIAPHelper.m
// xplan-ios
//
// Created by on 2021/9/26.
//
#import "XPIAPHelper.h"
#import <IAPHelper/IAPHelper.h>
#import <IAPShare.h>
@implementation XPIAPHelper
+ (instancetype)shareHelper {
static dispatch_once_t onceToken;
static XPIAPHelper * helper;
dispatch_once(&onceToken, ^{
helper = [[XPIAPHelper alloc] init];
});
return helper;
}
- (void)buyAppProductWithAppProductId:(NSString *)appProductId {
NSSet* dataSet = [[NSSet alloc] initWithObjects:appProductId, nil];
[IAPShare sharedHelper].iap = [[IAPHelper alloc] initWithProductIdentifiers:dataSet];
[[IAPShare sharedHelper].iap requestProductsWithCompletion:^(SKProductsRequest *request, SKProductsResponse *response) {
if (response != nil && response.products.count) {
///
} else if (!response.products.count) {
///
#warning to do
return;
} else if (!response) {
#warning to do
///
return;
} else {
#warning to do
///
return;
}
if (response.products.firstObject) {
[[IAPShare sharedHelper].iap buyProduct:response.products.firstObject onCompletion:^(SKPaymentTransaction *transcation) {
NSLog(@"%@",transcation.error.description);
switch(transcation.transactionState) {
case SKPaymentTransactionStatePurchased: {
NSLog(@"付款完成状态, 要做出相关的处理");
[[SKPaymentQueue defaultQueue] finishTransaction:transcation];
if (self.delegate && [self.delegate respondsToSelector:@selector(rechargeProcessStatus:)]) {
[self.delegate rechargeProcessStatus:PaymentStatus_Purchased];
}
if (self.delegate && [self.delegate respondsToSelector:@selector(rechargeSuccess:)]) {
[self.delegate rechargeSuccess:transcation.transactionIdentifier];
}
//
}
break;
case SKPaymentTransactionStateFailed: {
[[SKPaymentQueue defaultQueue] finishTransaction:transcation];
if (self.delegate && [self.delegate respondsToSelector:@selector(rechargeProcessStatus:)]) {
[self.delegate rechargeProcessStatus:PaymentStatus_Failed];
}
}
break;
case SKPaymentTransactionStatePurchasing: {
NSLog(@"正在购买中");
if (self.delegate && [self.delegate respondsToSelector:@selector(rechargeProcessStatus:)]) {
[self.delegate rechargeProcessStatus:PaymentStatus_Purchasing];
}
}
break;
default: {
[[SKPaymentQueue defaultQueue] finishTransaction:transcation];
if (self.delegate && [self.delegate respondsToSelector:@selector(rechargeProcessStatus:)]) {
[self.delegate rechargeProcessStatus:PaymentStatus_Deferred];
}
NSLog(@"其它");
}
}
}];
}
}];
}
@end

View File

@@ -0,0 +1,16 @@
//
// NSObject+JSONString.h
// xplan-ios
//
// Created by 冯硕 on 2021/9/26.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface NSObject (JSONString)
- (NSString *)objectToJSONString;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,16 @@
//
// NSObject+JSONString.m
// xplan-ios
//
// Created by on 2021/9/26.
//
#import "NSObject+JSONString.h"
#import <MJExtension/MJExtension.h>
@implementation NSObject (JSONString)
- (NSString *)objectToJSONString {
return [self mj_JSONString];
}
@end

View File

@@ -19,6 +19,7 @@ typedef NS_ENUM(NSUInteger, URLType) {
kIdentityURL,///实名认证
kGameBindAccountURL,
kNurseryURL,///护苗计划
kRechargePrivacyURL////充值协议
};
NSString * const URLWithType(URLType type);

View File

@@ -19,6 +19,7 @@ NSString * const URLWithType(URLType type) {
@(kIdentityURL):@"modules/identity/new.html",//
@(kGameBindAccountURL):@"modules/game/bindAccount.html",///
@(kNurseryURL):@"activity/cleanNet/index.html",
@(kRechargePrivacyURL) : @"modules/rule/rechargeAgreement.html",//
};
NSString * url = [dic objectForKey:@(type)];

View File

@@ -99,6 +99,38 @@ NS_ASSUME_NONNULL_BEGIN
/// @param channelType channel
+ (void)getRechargeListWithComplection:(HttpRequestHelperCompletion)complection
channelType:(NSString *)channelType;
/// 苹果下单
/// @param complection 完成
/// @param chargeProdId 充值id
/// @param uid 用户的uid
/// @param ticket ticket
/// @param deviceInfo uuid
/// @param clientIp ip地址
+ (void)requestIAPRechargeWithComplection:(HttpRequestHelperCompletion)complection
chargeProdId:(NSString *)chargeProdId
uid:(NSString *)uid
ticket:(NSString *)ticket
deviceInfo:(NSString *)deviceInfo
clientIp:(NSString *)clientIp;
/// 验证凭据
/// @param complection 完成
/// @param receipt base 64 recepit
/// @param chooseEnv @"true"
/// @param chargeRecordId 服务端生成的订单编号
/// @param transcationId 内购的唯一标识符
/// @param uid 用户uid
/// @param ticket ticket
+ (void)checkReceiptWithComplection:(HttpRequestHelperCompletion)complection
receipt:(NSString *)receipt
chooseEnv:(NSString *)chooseEnv
chargeRecordId:(NSString *)chargeRecordId
transcationId:(NSString *)transcationId
uid:(NSString *)uid
ticket:(NSString *)ticket;
@end
NS_ASSUME_NONNULL_END

View File

@@ -105,4 +105,30 @@
+ (void)getRechargeListWithComplection:(HttpRequestHelperCompletion)complection channelType:(NSString *)channelType {
[self makeRequest:@"chargeprod/list" method:HttpRequestHelperMethodGET completion:complection, __FUNCTION__,channelType, nil];
}
///
/// @param complection
/// @param chargeProdId id
/// @param uid uid
/// @param ticket ticket
/// @param deviceInfo uuid
/// @param clientIp ip
+ (void)requestIAPRechargeWithComplection:(HttpRequestHelperCompletion)complection chargeProdId:(NSString *)chargeProdId uid:(NSString *)uid ticket:(NSString *)ticket deviceInfo:(NSString *)deviceInfo clientIp:(NSString *)clientIp {
[self makeRequest:@"order/placeV2" method:HttpRequestHelperMethodPOST completion:complection, __FUNCTION__,chargeProdId, uid, ticket, deviceInfo, clientIp, nil];
}
///
/// @param complection
/// @param receipt base 64 recepit
/// @param chooseEnv @"true"
/// @param chargeRecordId
/// @param transcationId
/// @param uid uid
/// @param ticket ticket
+ (void)checkReceiptWithComplection:(HttpRequestHelperCompletion)complection receipt:(NSString *)receipt chooseEnv:(NSString *)chooseEnv chargeRecordId:(NSString *)chargeRecordId transcationId:(NSString *)transcationId uid:(NSString *)uid ticket:(NSString *)ticket {
[self makeRequest:@"order/placeV2" method:HttpRequestHelperMethodPOST completion:complection, __FUNCTION__,receipt, chooseEnv, chargeRecordId, transcationId, uid, ticket, nil];
}
@end

View File

@@ -0,0 +1,31 @@
//
// WalletBalanceInfoModel.h
// xplan-ios
//
// Created by 冯硕 on 2021/9/26.
//
#import "BaseObject.h"
NS_ASSUME_NONNULL_BEGIN
@interface WalletInfoModel : BaseObject
/// 用户 uid
@property(nonatomic, assign) NSInteger uid;
/// 钻石数量
@property(nonatomic, copy)NSString *goldNum;
//钻石数量(音游)
@property(nonatomic, copy)NSString *diamonds;
@property(nonatomic, copy)NSString *chargeGoldNum;
@property(nonatomic, assign)NSInteger amount;
/// 钻石数量
@property(nonatomic, assign) double diamondNum;
@property(nonatomic, copy)NSString *depositNum;
/// 是否有钻石转增功能
@property (nonatomic, assign) BOOL sendGold;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,12 @@
//
// WalletBalanceInfoModel.m
// xplan-ios
//
// Created by on 2021/9/26.
//
#import "WalletInfoModel.h"
@implementation WalletInfoModel
@end

View File

@@ -10,9 +10,26 @@
NS_ASSUME_NONNULL_BEGIN
@interface XPMineRechargePresenter : BaseMvpPresenter
/// 获取钱包信息
- (void)getUserWalletInfo;
/// 请求内购列表
/// @param channel 目前是8
- (void)requestRechargeListWithChannel:(NSString *)channel;
/// 获取充值的订单编号
/// @param chargeProdId 苹果服务器的充值 的id
- (void)requestIAPRechargeOrderWithChargeProdId:(NSString *)chargeProdId;
/// 充值成功二次验证
/// @param receipt 凭据
/// @param orderId 订单编号
/// @param transcationId 商品id
- (void)checkReceiptWithData:(NSString *)receipt orderId:(NSString *)orderId transcationId:(NSString *)transcationId;
/// 批量验证内购掉单
/// @param transcations 凭据的数组
- (void)checkTranscationIds:(NSArray *)transcations;
@end
NS_ASSUME_NONNULL_END

View File

@@ -8,14 +8,30 @@
#import "XPMineRechargePresenter.h"
///Api
#import "Api+Mine.h"
///Tool
#import "AccountInfoStorage.h"
#import "YYUtility.h"
#import "NSObject+JSONString.h"
///P
#import "XPMineRechargeProtocol.h"
///Model
#import "RechargeListModel.h"
#import "WalletInfoModel.h"
@implementation XPMineRechargePresenter
///
- (void)getUserWalletInfo {
NSString * uid = [AccountInfoStorage instance].getUid;
NSString * ticket = [AccountInfoStorage instance].getTicket;
[Api getUserWalletInfoWithComplection:[self createHttpCompletion:^(BaseModel * _Nonnull data) {
WalletInfoModel * model = [WalletInfoModel modelWithDictionary:data.data];
[[self getView] getUserWalletInfo:model];
}] uid:uid ticket:ticket];
}
///
/// @param channel 8
- (void)requestRechargeListWithChannel:(NSString *)channel {
@@ -25,4 +41,40 @@
}] channelType:channel];
}
///
/// @param chargeProdId id
- (void)requestIAPRechargeOrderWithChargeProdId:(NSString *)chargeProdId {
NSString * uid = [AccountInfoStorage instance].getUid;
NSString * ticket = [AccountInfoStorage instance].getTicket;
NSString * deviceInfo = [YYUtility deviceID];
NSString * clientIp= [YYUtility ipAddress];
[Api requestIAPRechargeWithComplection:[self createHttpCompletion:^(BaseModel * _Nonnull data) {
NSString *orderId = (NSString *)data.data[@"recordId"];
[[self getView] requestIAPRechargeOrderSuccess:orderId chargeProdId:chargeProdId];
} showLoading:YES] chargeProdId:chargeProdId uid:uid ticket:ticket deviceInfo:deviceInfo clientIp:clientIp];
}
///
/// @param receipt
/// @param orderId
/// @param transcationId id
- (void)checkReceiptWithData:(NSString *)receipt orderId:(NSString *)orderId transcationId:(NSString *)transcationId {
NSString * uid = [AccountInfoStorage instance].getUid;
NSString * ticket = [AccountInfoStorage instance].getTicket;
[Api checkReceiptWithComplection:[self createHttpCompletion:^(BaseModel * _Nonnull data) {
[[self getView] checkReceiptSuccess:transcationId];
} showLoading:YES] receipt:receipt chooseEnv:@"true" chargeRecordId:orderId transcationId:transcationId uid:uid ticket:ticket];
}
///
/// @param transcations
- (void)checkTranscationIds:(NSArray *)transcations {
NSString * transcationIdStr = [transcations objectToJSONString];
[Api requestCheckTranscationIdsWithComplection:[self createHttpCompletion:^(BaseModel * _Nonnull data) {
[[self getView] checkTranscationIdsSuccess];
}] transcationIdStr:transcationIdStr];
}
@end

View File

@@ -8,12 +8,18 @@
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@class WalletInfoModel;
@protocol XPMineRechargeProtocol <NSObject>
///请求钱包余额信息
- (void)getUserWalletInfo:(WalletInfoModel *)balanceInfo;
///请求充值列表成功
- (void)requestRechargeListSucccess:(NSArray *)list;
///请求充值id的状态成功
- (void)requestIAPRechargeOrderSuccess:(NSString *)orderId chargeProdId:(NSString *)chargeProdId;
///二次校验成功
- (void)checkReceiptSuccess:(NSString *)transcationId;
///批量验证凭据成功
- (void)checkTranscationIdsSuccess;
@end
NS_ASSUME_NONNULL_END

View File

@@ -8,10 +8,20 @@
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@class RechargeListModel;
@class RechargeListModel,XPMineRechargeTableViewCell;
@protocol XPMineRechargeTableViewCellDelegate <NSObject>
///点击了某个item
- (void)xPMineRechargeTableViewCell:(XPMineRechargeTableViewCell *)cell didSelectItem:(RechargeListModel *)listModel;
@end
@interface XPMineRechargeTableViewCell : UITableViewCell
///
///数据源
@property (nonatomic,strong) RechargeListModel *listModel;
///代理
@property (nonatomic,weak) id<XPMineRechargeTableViewCellDelegate> delegate;
@end
NS_ASSUME_NONNULL_END

View File

@@ -36,7 +36,9 @@
}
#pragma mark - Response
- (void)rechargeButtonAction:(UIButton *)sender {
if (self.delegate && [self.delegate respondsToSelector:@selector(xPMineRechargeTableViewCell:didSelectItem:)]) {
[self.delegate xPMineRechargeTableViewCell:self didSelectItem:self.listModel];
}
}
#pragma mark - Private Method

View File

@@ -8,48 +8,84 @@
#import "XPMineRechargeViewController.h"
///Third
#import <Masonry/Masonry.h>
#import <YYText/YYLabel.h>
#import <Base64/MF_Base64Additions.h>
///Tool
#import "ThemeColor.h"
#import "XPMacro.h"
#import "XPHtmlUrl.h"
#import "XPIAPHelper.h"
#import "RechargeStorage.h"
#import "AccountInfoStorage.h"
#import "NSObject+JSONString.h"
///Model
#import "RechargeListModel.h"
///View
#import "XPMineRechageHeadView.h"
#import "XPMineRechargeTableViewCell.h"
#import "XPMineRechargeNavView.h"
///P
#import "XPMineRechargePresenter.h"
#import "XPMineRechargeProtocol.h"
///VC
#import "XPWebViewController.h"
@interface XPMineRechargeViewController ()<XPMineRechargeProtocol, UITableViewDelegate, UITableViewDataSource>
@interface XPMineRechargeViewController ()<XPMineRechargeProtocol, UITableViewDelegate, UITableViewDataSource, XPMineRechargeTableViewCellDelegate, XPIAPHelperDelegate, XPMineRechargeNavViewDelegate>
///
@property (nonatomic,strong) NSArray *datasource;
///
@property (nonatomic,strong) UITableView *tableView;
///
@property (nonatomic,strong) XPMineRechageHeadView *headeView;
///
@property (nonatomic,copy) NSString *orderId;
///
@property (nonatomic,strong) XPMineRechargeNavView *navView;
///
@property (nonatomic,strong) UIStackView *stackView;
///
@property (nonatomic,strong) UILabel *agreeLabel;
///
@property (nonatomic,strong) YYLabel *rechargeProtocolLabel;
@property (nonatomic,strong) UIButton *protcoloButton;
@end
@implementation XPMineRechargeViewController
- (void)dealloc {
[XPIAPHelper shareHelper].delegate = nil;
}
- (BOOL)isHiddenNavBar {
return YES;
}
- (XPMineRechargePresenter *)createPresenter {
return [[XPMineRechargePresenter alloc] init];
}
- (void)viewDidLoad {
[super viewDidLoad];
[self getRechargeList];
[super viewDidLoad];
[self initHttpData];
[self initSubViews];
[self initSubViewConstraints];
}
#pragma mark - Response
- (void)protcoloButtonAction:(UIButton *)sender {
XPWebViewController * webVC= [[XPWebViewController alloc] init];
webVC.url = URLWithType(kRechargePrivacyURL);
[self.navigationController pushViewController:webVC animated:YES];
}
#pragma mark - Private Method
- (void)initSubViews {
[self.view addSubview:self.tableView];
[self.view addSubview:self.rechargeProtocolLabel];
[self.view addSubview:self.navView];
[self.view addSubview:self.stackView];
[self.stackView addArrangedSubview:self.agreeLabel];
[self.stackView addArrangedSubview:self.protcoloButton];
self.tableView.tableHeaderView = self.headeView;
[XPIAPHelper shareHelper].delegate = self;
self.automaticallyAdjustsScrollViewInsets = NO;
}
- (void)initSubViewConstraints {
@@ -57,16 +93,65 @@
make.edges.mas_equalTo(self.view);
}];
[self.rechargeProtocolLabel mas_makeConstraints:^(MASConstraintMaker *make) {
[self.stackView mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.mas_equalTo(self.view);
make.bottom.mas_equalTo(self.view).offset(-20 - kSafeAreaBottomHeight);
}];
[self.navView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.top.mas_equalTo(self.view);
make.height.mas_equalTo(kNavigationHeight);
}];
}
- (void)initHttpData {
[self getRechargeList];
[self getUserWalletBalanceInfo];
[self checkTranscationIds];
}
- (void)getRechargeList {
[self.presenter requestRechargeListWithChannel:@"8"];
}
- (void)getUserWalletBalanceInfo {
[self.presenter getUserWalletInfo];
}
///
- (void)checkTranscationIds {
NSString * uid = [AccountInfoStorage instance].getUid;
NSArray * array = [RechargeStorage getAllReciptsWithUid:uid];
if (array.count > 0) {
[self.presenter checkTranscationIds:array];
}
}
///
- (void)saveRechageReciptWithTransactionIdentifier:(NSString *)transactionIdentifier {
NSData *receipt = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]];
NSString *encodeStr = [receipt base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
[dictionary setObject:transactionIdentifier forKey:@"transcationId"];
[dictionary setObject:encodeStr forKey:@"recipt"];
[dictionary setObject:self.orderId forKey:@"orderId"];
NSString *reciptJson = [dictionary objectToJSONString];
NSString * uid = [AccountInfoStorage instance].getUid;
BOOL saveSuccess = [RechargeStorage saveTranscationId:transactionIdentifier recipt:reciptJson uid:uid];
if (!saveSuccess) {
#warning to do
}
}
///
- (void)deleteRechageReciptWithTransactionIdentifier:(NSString *)transactionIdentifier {
NSString * uid = [AccountInfoStorage instance].getUid;
BOOL deleteSuccess = [RechargeStorage delegateTranscationId:transactionIdentifier uid:uid];
if (deleteSuccess) {
#warning to do
}
}
#pragma mark - UITableViewDelegate And UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.datasource.count;
@@ -75,6 +160,7 @@
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
XPMineRechargeTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([XPMineRechargeTableViewCell class]) forIndexPath:indexPath];
cell.listModel = self.datasource[indexPath.row];
cell.delegate = self;
return cell;
}
@@ -85,12 +171,74 @@
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
[tableView deselectRowAtIndexPath:indexPath animated:true];
}
#pragma mark - XPMineRechargeTableViewCellDelegate
- (void)xPMineRechargeTableViewCell:(XPMineRechargeTableViewCell *)cell didSelectItem:(RechargeListModel *)listModel {
if (listModel.chargeProdId) {
[self.presenter requestIAPRechargeOrderWithChargeProdId:listModel.chargeProdId];
}
}
#pragma mark - XPMineRechargeNavViewDelegate
- (void)xPMineRechargeNavView:(XPMineRechargeNavView *)view didClickBackButton:(UIButton *)sender {
[self.navigationController popViewControllerAnimated:YES];
}
#pragma mark - XPIAPHelperDelegate
///
- (void)rechargeProcessStatus:(PaymentStatus)status {
[self hideHUD];
if (status == PaymentStatus_Purchased) {
[self showLoading];
} else if (status == PaymentStatus_Purchasing) {
[self showLoading];
} else if (status == PaymentStatus_Failed) {
[self showErrorToast:@"购买失败"];
} else if (status == PaymentStatus_Deferred) {
[self showErrorToast:@"出现未知错误,请重新尝试"];
}
}
///id
- (void)rechargeSuccess:(NSString *)transactionIdentifier {
///
[self saveRechageReciptWithTransactionIdentifier:transactionIdentifier];
NSData *receiptData = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]];
NSString * receipt = [MF_Base64Codec base64StringFromData:receiptData];
///
[self.presenter checkReceiptWithData:receipt orderId:self.orderId transcationId:transactionIdentifier];
}
#pragma mark - XPMineRechargeProtocol
- (void)requestRechargeListSucccess:(NSArray *)list {
self.datasource = list;
[self.tableView reloadData];
}
- (void)requestIAPRechargeOrderSuccess:(NSString *)orderId chargeProdId:(NSString *)chargeProdId {
if (orderId.length > 0) {
self.orderId = orderId;
[[XPIAPHelper shareHelper] buyAppProductWithAppProductId:chargeProdId];
}
}
///
- (void)checkReceiptSuccess:(NSString *)transcationId {
[self deleteRechageReciptWithTransactionIdentifier:transcationId];
///💎
[self getUserWalletBalanceInfo];
self.orderId = nil;
}
- (void)getUserWalletInfo:(WalletInfoModel *)balanceInfo {
self.headeView.walletInfo = balanceInfo;
}
- (void)checkTranscationIdsSuccess {
NSString * uid = [AccountInfoStorage instance].getUid;
[RechargeStorage delegateAllTranscationIdsWithUid:uid];
}
#pragma mark - Getters And Setters
- (UITableView *)tableView {
if (!_tableView) {
_tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];
@@ -114,21 +262,44 @@
return _headeView;
}
- (YYLabel *)rechargeProtocolLabel {
if (!_rechargeProtocolLabel) {
_rechargeProtocolLabel = [[YYLabel alloc] init];
_rechargeProtocolLabel.font = [UIFont systemFontOfSize:12];
NSString * name = [NSString stringWithFormat:@"《用户充值协议》"];
NSString *str = [NSString stringWithFormat:@"%@%@", @"已阅读并同意", name];
NSRange range1 = [str rangeOfString:@"已阅读并同意"];
NSRange range = [str rangeOfString:name];
NSMutableAttributedString *attStr = [[NSMutableAttributedString alloc] initWithString:str];
[attStr addAttribute:NSForegroundColorAttributeName value:[ThemeColor appMainColor] range:range];
[attStr addAttribute:NSForegroundColorAttributeName value:[ThemeColor textThirdColor] range:range1];
_rechargeProtocolLabel.attributedText = attStr;
_rechargeProtocolLabel.textAlignment = NSTextAlignmentCenter;
- (UIStackView *)stackView {
if (!_stackView) {
_stackView = [[UIStackView alloc] init];
_stackView.axis = UILayoutConstraintAxisHorizontal;
_stackView.distribution = UIStackViewDistributionFill;
_stackView.alignment = UIStackViewAlignmentFill;
_stackView.spacing = 2;
}
return _rechargeProtocolLabel;
return _stackView;
}
- (UIButton *)protcoloButton {
if (!_protcoloButton) {
_protcoloButton = [UIButton buttonWithType:UIButtonTypeCustom];
[_protcoloButton setTitle:@"《用户充值协议》" forState:UIControlStateNormal];
[_protcoloButton setTitleColor:[ThemeColor appMainColor] forState:UIControlStateNormal];
_protcoloButton.titleLabel.font = [UIFont systemFontOfSize:12];
[_protcoloButton addTarget:self action:@selector(protcoloButtonAction:) forControlEvents:UIControlEventTouchUpInside];
}
return _protcoloButton;
}
- (UILabel *)agreeLabel {
if (!_agreeLabel) {
_agreeLabel = [[UILabel alloc] init];
_agreeLabel.text = @"已阅读并同意";
_agreeLabel.font = [UIFont systemFontOfSize:12];
_agreeLabel.textColor = [ThemeColor textThirdColor];
}
return _agreeLabel;
}
- (XPMineRechargeNavView *)navView {
if (!_navView) {
_navView = [[XPMineRechargeNavView alloc] init];
_navView.delegate = self;
}
return _navView;
}
@end

View File

@@ -8,9 +8,10 @@
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@class WalletInfoModel;
@interface XPMineRechageHeadView : UIView
///钱包信息
@property (nonatomic,strong) WalletInfoModel *walletInfo;
@end
NS_ASSUME_NONNULL_END

View File

@@ -11,6 +11,8 @@
///Tool
#import "ThemeColor.h"
#import "XPMacro.h"
///Model
#import "WalletInfoModel.h"
@interface XPMineRechageHeadView ()
///
@@ -47,11 +49,7 @@
}
- (void)initContrations {
[self mas_makeConstraints:^(MASConstraintMaker *make) {
make.width.mas_equalTo(KScreenWidth);
make.height.mas_equalTo(kSafeAreaTopHeight + 190);
}];
self.frame = CGRectMake(0, 0, KScreenWidth, 190 + kSafeAreaTopHeight);
[self.backImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(self);
}];
@@ -79,12 +77,19 @@
}
#pragma mark - Getters And Setters
- (void)setWalletInfo:(WalletInfoModel *)walletInfo {
_walletInfo = walletInfo;
if (_walletInfo) {
self.amountLabel.text = walletInfo.diamonds;
}
}
- (UIImageView *)backImageView {
if (!_backImageView) {
_backImageView = [[UIImageView alloc] init];
_backImageView.userInteractionEnabled = YES;
_backImageView.image = [UIImage imageNamed:@"mine_recharge_header_bg"];
_backImageView.layer.masksToBounds = YES;
_backImageView.contentMode = UIViewContentModeScaleAspectFill;
}
return _backImageView;

View File

@@ -0,0 +1,21 @@
//
// XPMineRechargeNavView.h
// xplan-ios
//
// Created by 冯硕 on 2021/9/26.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@class XPMineRechargeNavView;
@protocol XPMineRechargeNavViewDelegate <NSObject>
///点击了返回按钮
- (void)xPMineRechargeNavView:(XPMineRechargeNavView *)view didClickBackButton:(UIButton *)sender;
@end
@interface XPMineRechargeNavView : UIView
///代理
@property (nonatomic,weak) id<XPMineRechargeNavViewDelegate> delegate;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,82 @@
//
// XPMineRechargeNavView.m
// xplan-ios
//
// Created by on 2021/9/26.
//
#import "XPMineRechargeNavView.h"
///Third
#import <Masonry/Masonry.h>
///Tool
#import "ThemeColor.h"
#import "UIButton+EnlargeTouchArea.h"
@interface XPMineRechargeNavView ()
///
@property (nonatomic,strong) UIButton *backButton;
///
@property (nonatomic,strong) UILabel *titleLabel;
@end
@implementation XPMineRechargeNavView
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[self initSubViews];
[self initSubViewConstraints];
}
return self;
}
#pragma mark - Response
- (void)backButtonAction:(UIButton *)sender {
if (self.delegate && [self.delegate respondsToSelector:@selector(xPMineRechargeNavView:didClickBackButton:)]) {
[self.delegate xPMineRechargeNavView:self didClickBackButton:sender];
}
}
#pragma mark - Private Method
- (void)initSubViews {
self.backgroundColor = [UIColor clearColor];
[self addSubview:self.backButton];
[self addSubview:self.titleLabel];
}
- (void)initSubViewConstraints {
[self.backButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(15);
make.centerY.equalTo(self.mas_bottom).mas_offset(-22);
}];
[self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.mas_equalTo(self);
make.centerY.equalTo(self.mas_bottom).mas_offset(-22);
}];
}
#pragma mark - Getters And Setters
- (UIButton *)backButton {
if (!_backButton) {
_backButton = [UIButton buttonWithType:UIButtonTypeCustom];
[_backButton setImage:[UIImage imageNamed:@"common_nav_back"] forState:UIControlStateNormal];
_backButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
[_backButton addTarget:self action:@selector(backButtonAction:) forControlEvents:UIControlEventTouchUpInside];
[_backButton setEnlargeEdgeWithTop:10 right:10 bottom:10 left:10];
}
return _backButton;
}
- (UILabel *)titleLabel {
if (!_titleLabel) {
_titleLabel = [[UILabel alloc] init];
_titleLabel.textAlignment = NSTextAlignmentCenter;
_titleLabel.font = [UIFont systemFontOfSize:15];
_titleLabel.text = @"账户";
_titleLabel.textColor = [ThemeColor mainTextColor];
}
return _titleLabel;
}
@end

View File

@@ -12,4 +12,6 @@
+ (void)requestTicket:(HttpRequestHelperCompletion)completion access_token:(NSString *)accessToken issue_type:(NSString *)issueType {
[self makeRequest:@"oauth/ticket" method:HttpRequestHelperMethodPOST completion:completion, __FUNCTION__, accessToken, issueType, nil];
}
@end

View File

@@ -13,7 +13,9 @@ NS_ASSUME_NONNULL_BEGIN
- (void)autoLogin;
- (void)getUserInfo;
/// 批量验证内购掉单
/// @param transcations 凭据的数组
- (void)checkTranscationIds:(NSArray *)transcations;
@end
NS_ASSUME_NONNULL_END

View File

@@ -10,6 +10,7 @@
#import "AccountModel.h"
#import "Api+Main.h"
#import "MainProtocol.h"
#import "NSObject+JSONString.h"
@implementation MainPresenter
@@ -36,4 +37,13 @@
}] uid:[[AccountInfoStorage instance] getUid]];
}
///
/// @param transcations
- (void)checkTranscationIds:(NSArray *)transcations {
NSString * transcationIdStr = [transcations objectToJSONString];
[Api requestCheckTranscationIdsWithComplection:[self createHttpCompletion:^(BaseModel * _Nonnull data) {
[[self getView] checkTranscationIdsSuccess];
}] transcationIdStr:transcationIdStr];
}
@end

View File

@@ -14,7 +14,8 @@ NS_ASSUME_NONNULL_BEGIN
- (void)autoLoginSuccess;
- (void)getUserInfoSuccess:(UserInfoModel *)userInfo;
///批量验证凭据成功
- (void)checkTranscationIdsSuccess;
@end
NS_ASSUME_NONNULL_END

View File

@@ -12,6 +12,8 @@
#import "ThemeColor.h"
#import "UIImage+Utils.h"
#import "XCHUDTool.h"
#import "RechargeStorage.h"
#import "AccountInfoStorage.h"
///VC
#import "TabbarViewController.h"
#import "BaseViewController.h"
@@ -45,6 +47,7 @@
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:YES animated:YES];
[self.presenter autoLogin];
[self checkTranscationIds];
}
- (MainPresenter *)presenter {
@@ -91,6 +94,21 @@
[self.navigationController presentViewController:nav animated:YES completion:nil];
}
///
- (void)checkTranscationIdsSuccess {
NSString * uid = [AccountInfoStorage instance].getUid;
[RechargeStorage delegateAllTranscationIdsWithUid:uid];
}
#pragma mark -
- (void)checkTranscationIds {
NSString * uid = [AccountInfoStorage instance].getUid;
NSArray * array = [RechargeStorage getAllReciptsWithUid:uid];
if (array.count > 0) {
[self.presenter checkTranscationIds:array];
}
}
#pragma mark -
- (void)bindPhone {
LoginBindPhoneViewController * bindPhoneVC = [[LoginBindPhoneViewController alloc] init];