iOS开发-跳转第三方支付遇到的小问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS开发-跳转第三方支付遇到的小问题相关的知识,希望对你有一定的参考价值。
参考技术A 1.首先是最常见的微信订单号重复的问题,这里做的操作就是在拿到服务器的订单号之后,APP端随机在后边追加两个字符串,这样就可以避免这个问题.2.如果服务器生成的订单号过长的话也会调起失败,返回:订单号长度错误.
3.第三个问题相对于前两个来说比较隐蔽,刚跳转到第三方支付之后,不在第三方如:微信,支付宝做任何操作,然后通过双击home键或者点击左上角的方式返回自己的应用,这时候是收不到任何的回调,这样造成的结果就是程序界面仍然停留在收银台页面,这样用户继续点击就会造成重复下单的BUG,是一个比较麻烦的问题.初步想到的解决办法即时性的都不能解决.最后想到了一个稍微讨巧的办法,首先如果这个程序是通过支付跳转到第三方的,就加一个布尔值apinPayGO,当程序从后台进入前台时就发出通知,.经过实际测试,支付的回调实在系统的运行方法之后的,收银台页面在接收到该通知之后,延迟一秒执行方法,判断系统这次从后台进入前台是否经过了支付第三方的回调方法,如果经过了支付第三方的回调方法就不做任务操作,如果没经过第三方的回调方法,证明用户在跳转到第三方时没做任务操作,直接通过ios系统返回到自己的应用了,这里就把页面跳转到待支付页面,然后开始倒计时!
- (void)applicationWillEnterForeground:(UIApplication*)application
NSLog(@"EnterForeground");
if(self.apinPayGO)
NSNotificationCenter*center = [NSNotificationCenterdefaultCenter];
[centerpostNotificationName:@"payReturn"object:nil];
4.创建订单,支付中间的时间控制问题.
用户点击创建订单,服务器设置一个超时时间十分钟,需要用户在十分钟内完成支付,直接去操作是没什么问题.但是如果不直接操作,第三方的支付超时时间跟服务器订单储存的超时时间不同步,可能出现的情况就是:服务器这边订单已经失效了,但是第三方支付仍可以支付,出现bug.有个预想的处理方法是:支付前进行查询订单操作,服务器返回一个超时时间,然后进行第三方支付时把这个超时时间设置过去.但是在做的过程中又遇到了新的问题:第三方支付的超时时间有限制,支付宝是1min~15d,微信是要大于五分钟.
解决方案: 创建订单 跟调第三方支付创建订单 同时进行,然后第一次支付的时候设置超时时间.
iOS开发中遇到的小问题-----总结
参考技术A 1、统一收键盘的方法[[[UIApplication sharedApplication] keyWindow] endEditing:YES];
2、提示框
BBAlertView *alert = [[BBAlertView alloc] initWithStyle:BBAlertViewStyleDefault
Title:@"删除订单"
message:@"是否删除订单,"
customView:nil
delegate:self
cancelButtonTitle:L(@"取消")
otherButtonTitles:L(@"确认")];
[alert setCancelBlock:^
];
[alert setConfirmBlock:^
[self orderDidRemovePressDown:tempDic Index:index.section];
];
[alert show];
3、图片的自适应功能
self.brandImage.contentMode = UIViewContentModeScaleAspectFit;
4、cocoaPods清除缓存问题
$ sudo rm -fr ~/.cocoapods/repos/master
$ pod setup
5、设置显示键盘的样式
textView.keyboardType =UIKeyboardTypeDefault;
//设置键盘右下角为完成(中文输入法下)
textView.returnKeyType=UIReturnKeyDone;
6、输出当前时间
NSDateFormatter * dateFormatter=[[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSS"];
NSLog(@"当前毫秒时间1==%@",[dateFormatter stringFromDate:[NSDate date]]);
7、显示两秒然后消失
UILabel * lab=[[UILabel alloc]initWithFrame:CGRectMake(60,Main_Screen_Height-64-49-60, Main_Screen_Width-120, 50)];
lab.backgroundColor=[UIColor grayColor];
ViewRadius(lab, 20);
lab.textAlignment=NSTextAlignmentCenter;
lab.text=@"请先进行实名制验证";
[self.view addSubview:lab];
[UILabel animateWithDuration:2 animations:^
lab.alpha=0;
completion:^(BOOL finished)
[lab removeFromSuperview];
];
8、设置placeholder属性的大小和颜色
[_phoneFie setValue:[UIColor grayColor] forKeyPath:@"_placeholderLabel.textColor"];
[_phoneFie setValue:[UIFont boldSystemFontOfSize:15] forKeyPath:@"_placeholderLabel.font"];
_phoneFie.returnKeyType=UIReturnKeyDone;
9、设置cell的交互完全不可以使用
//[cellTwo setUserInteractionEnabled:NO];
//设置cell不可以点击,但是上面的子控件可以交互
cellTwo.selectionStyle=UITableViewCellSelectionStyleNone;
10、将textField的placeholder 属性的字体向右边移动5
_field.leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10*Width_375, _field.frame.size.height)];
_field.leftViewMode = UITextFieldViewModeAlways;
11、开新线程使按钮上的时间变化
-(void)startTime
__block int timeout=60; //倒计时时间
UIButton * btn=(UIButton *)[self.view viewWithTag:1000];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒执行
dispatch_source_set_event_handler(_timer, ^
if(timeout<=0)
dispatch_source_cancel(_timer);
dispatch_async(dispatch_get_main_queue(), ^
[btn setTitle:@"发送验证码" forState:UIControlStateNormal];
btn.enabled = YES;
);
else
// int minutes = timeout / 60;
int miao = timeout % 60;
if (miao==0)
miao = 60;
NSString *strTime = [NSString stringWithFormat:@"%.2d", miao];
dispatch_async(dispatch_get_main_queue(), ^
[btn setTitle:[NSString stringWithFormat:@"剩余%@秒",strTime] forState:UIControlStateNormal];
btn.enabled = NO;
);
timeout--;
);
dispatch_resume(_timer);
12、隐藏TableView 中多余的行
UIView * view=[[UIView alloc]initWithFrame:CGRectZero];
[_tabelView setTableFooterView:view];
13、UIView添加背景图片
UIImage * image=[UIImage imageNamed:@"friend750"];
headSeV.layer.contents=(id)image.CGImage;
14、UITableView取消选中状态
[tableView deselectRowAtIndexPath:indexPath animated:YES];// 取消选中
15、带属性的字符串
NSFontAttributeName 字体
NSParagraphStyleAttributeName 段落格式
NSForegroundColorAttributeName 字体颜色
NSBackgroundColorAttributeName 背景颜色
NSStrikethroughStyleAttributeName 删除线格式
NSUnderlineStyleAttributeName 下划线格式
NSStrokeColorAttributeName 删除线颜色
NSStrokeWidthAttributeName 删除线宽度
NSShadowAttributeName 阴影
1. 使用实例
UILabel *testLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 100, 320, 30)];
testLabel.backgroundColor = [UIColor lightGrayColor];
testLabel.textAlignment = NSTextAlignmentCenter;
NSMutableAttributedString *AttributedStr = [[NSMutableAttributedString alloc]initWithString:@"今天天气不错呀"];
[AttributedStr addAttribute:NSFontAttributeName
value:[UIFont systemFontOfSize:16.0]
range:NSMakeRange(2, 2)];
[AttributedStr addAttribute:NSForegroundColorAttributeName
value:[UIColor redColor]
range:NSMakeRange(2, 2)];
testLabel.attributedText = AttributedStr;
[self.view addSubview:testLabel];
16、加大按钮的点击范围
把UIButton的frame 设置的大一些,然后给UIButton设置一个小些的图片
[tmpBtn setImageEdgeInsets:UIEdgeInsetsMake(5, 5, 5, 5)];
// 注意这里不能用setBackgroundImage
[tmpBtn setImage:[UIImage imageNamed:@"testBtnImage"] forState:UIControlStateNormal];
17、//避免self的强引用
__weak ViewController *weakSelf = self;
18、//类别的创建
command +n ——>Objective-C File———>(File Type 选择是类别还是扩展)———>(Class 选择为哪个控件写类别)
19、修改UITableview 滚动条颜色的方法
self.tableView.indicatorStyle=UIScrollViewIndicatorStyleWhite;
20、利用UIWebView显示pdf文件
webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
[webView setDelegate:self];
[webView setScalesPageToFit:YES];
[webViewsetAutoresizingMask:UIViewAutoresizingFlexibleWidth |UIViewAutoresizingFlexibleHeight];
[webView setAllowsInlineMediaPlayback:YES];
[self.view addSubview:webView];
NSString *pdfPath = [[NSBundle mainBundle]pathForResource:@"ojc" ofType:@"pdf"];
NSURL *url = [NSURLfileURLWithPath:pdfPath];
NSURLRequest *request = [NSURLRequestrequestWithURL:url
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:5];
[webView loadRequest:request];
21、将plist文件中的数据赋给数组
NSString *thePath = [[NSBundle mainBundle]pathForResource:@"States" ofType:@"plist"];
NSArray *array = [NSArrayarrayWithContentsOfFile:thePath];
22、隐藏状态栏
[[UIApplication shareApplication]setStatusBarHidden: YES animated:NO];
23、给navigation Bar 设置title颜色
UIColor *whiteColor = [UIColor whiteColor];
NSDictionary *dic = [NSDictionary dictionaryWithObject:whiteColor forKey:NSForegroundColorAttributeName];
[self.navigationController.navigationBar setTitleTextAttributes:dic];
24、使用AirDrop 进行分享
NSArray *array = @[@"test1", @"test2"];
UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:array applicationActivities:nil];
[self presentViewController:activityVC animated:YES
completion:^
NSLog(@"Air");
];
25、把tableview里面Cell的小对勾的颜色改成别的颜色
_mTableView.tintColor = [UIColor redColor];
26、UITableView去掉分割线
_tableView.separatorStyle = NO;
27、正则判断手机号码地址格式
- (BOOL)isMobileNumber:(NSString *)mobileNum
// 电信号段:133/153/180/181/189/177
// 联通号段:130/131/132/155/156/185/186/145/176
// 移动号段:134/135/136/137/138/139/150/151/152/157/158/159/182/183/184/187/188/147/178
// 虚拟运营商:170
NSString *MOBILE = @"^1(3[0-9]|4[57]|5[0-35-9]|8[0-9]|7[06-8])\\d8$";
NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];
return [regextestmobile evaluateWithObject:mobileNum];
28、控制交易密码位数
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
if (textField.text.length >=6)
[MBProgressHUD showMessage:@"密码为6位" afterDelay:1.8];
return NO;
return YES;
29、判断是不是空
if ([real_name isKindOfClass:[NSNull class]] )
return NO;
30、点击号码拨打电话
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://400966220"]];
31、控制UITabbar的选择哪一个
[self.tabBarController setSelectedIndex:1];
32、获取当前App的版本号
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
CFShow(infoDictionary);
// app名称
NSString *app_Name = [infoDictionary objectForKey:@"CFBundleDisplayName"];
// app版本
NSString *app_Version = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
// app build版本
NSString *app_build = [infoDictionary objectForKey:@"CFBundleVersion"];
33、苹果app权限NSPhotoLibraryUsageDescriptionApp需要您的同意,才能访问相册NSCameraUsageDescriptionApp需要您的同意,才能访问相机NSMicrophoneUsageDescriptionApp需要您的同意,才能访问麦克风NSLocationUsageDescriptionApp需要您的同意,才能访问位置NSLocationWhenInUseUsageDescriptionApp需要您的同意,才能在使用期间访问位置NSLocationAlwaysUsageDescriptionApp需要您的同意,才能始终访问位置NSCalendarsUsageDescriptionApp需要您的同意,才能访问日历NSRemindersUsageDescriptionApp需要您的同意,才能访问提醒事项NSMotionUsageDescriptionApp需要您的同意,才能访问运动与健身NSHealthUpdateUsageDescriptionApp需要您的同意,才能访问健康更新NSHealthShareUsageDescriptionApp需要您的同意,才能访问健康分享NSBluetoothPeripheralUsageDescriptionApp需要您的同意,才能访问蓝牙NSAppleMusicUsageDescriptionApp需要您的同意,才能访问媒体资料库
34、控件设置边框
_describText.layer.borderColor = [[UIColor colorWithRed:215.0 / 255.0 green:215.0 / 255.0 blue:215.0 / 255.0 alpha:1] CGColor];
_describText.layer.borderWidth = 1.0;
_describText.layer.cornerRadius = 4.0;
_describText.clipsToBounds = YES;
35、//隐藏电池条的方法
-(BOOL)prefersStatusBarHidden
return YES;
36、延时操作
[NSThread sleepForTimeInterval:2];
方法二:
[self performSelector:@selector(delayMethod) withObject:nil afterDelay:1.5];
37、系统风火轮:
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO; //隐藏
38、//didSelectRowAtIndexPath:方法里面找到当前的Cell
AssessMentCell * cell = [tableView cellForRowAtIndexPath:indexPath];
39、navigation上返回按钮的颜色以及返回按钮后面文字去掉
//返回按钮后边文字去掉
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60)
forBarMetrics:UIBarMetricsDefault];
//设置左上角返回按钮的颜色
self.navigationController.navigationBar.tintColor = UIColorFromRGB(0x666666);
40、lineBreakMode //设置文字过长时的显示格式
label.lineBreakMode = NSLineBreakByCharWrapping;以字符为显示单位显
示,后面部分省略不显示。
label.lineBreakMode = NSLineBreakByClipping;剪切与文本宽度相同的内
容长度,后半部分被删除。
label.lineBreakMode = NSLineBreakByTruncatingHead;前面部分文字
以……方式省略,显示尾部文字内容。
label.lineBreakMode = NSLineBreakByTruncatingMiddle;中间的内容
以……方式省略,显示头尾的文字内容。
label.lineBreakMode = NSLineBreakByTruncatingTail;结尾部分的内容
以……方式省略,显示头的文字内容。
label.lineBreakMode = NSLineBreakByWordWrapping;以单词为显示单位显
示,后面部分省略不显示。
以上是关于iOS开发-跳转第三方支付遇到的小问题的主要内容,如果未能解决你的问题,请参考以下文章
常用第三方接口,支付宝支付,微信支付,软著,IOS开发者账号