支付交易风险控制小知识:iOS设备限制境外交易

简介: 支付交易风险控制小知识:iOS设备限制境外交易

本文重点:

  • 限制商户的经验地址定位至大陆以外地区

通过经纬度进行判断。利用高德SDK进行判断。(如果是手动输入位置信息就进行逆地理编码获取经纬度再进行判断

image.png

  • 优化定位权限的检测逻辑:针对 kCLAuthorizationStatusNotDetermined  情况的处理

用户没有选择是否要使用定位服务(弹框没选择,或者根本没有弹框)[AMapLocationKit] 要在iOS 11及以上版本使用后台定位服务, 需要实现amapLocationManager:doRequireLocationAuth: 代理方法】

I 限制境_外定_位

原理:根据经纬度判断是否在大陆地区

1.1 根据经纬度判断是否在大陆地区

  • AMapLocationDataAvailableForCoordinate
/**
 根据经纬度判断 是否在大陆地区
 */
+ (BOOL)inChineseMainlandWithCLLocation:(CLLocation *)location regeocode:(AMapLocationReGeocode *)regeocode{
    if(AMapLocationDataAvailableForCoordinate(location.coordinate)){//当前位置在大陆、港澳地区
        //香港特别行政区
//        澳门特别行政区
        /////省/直辖市
//        @property (nonatomic, copy) NSString *province;
        if([regeocode.province isEqualToString:@"香港特别行政区"] || [regeocode.province isEqualToString:@"澳门特别行政区"]){
            return NO;
        }else{
            return YES;
        }
    }else{//其他地区
        return NO;
    }
    return YES;
}

用法

CLLocation *location = [[CLLocation alloc]initWithLatitude:[array.lastObject doubleValue] longitude:[array.firstObject doubleValue]];
                AMapLocationReGeocode* regeocode = [AMapLocationReGeocode mj_objectWithKeyValues:geocodesDto.mj_keyValues];
                if([ERPAMapLocationTool inChineseMainlandWithCLLocation:location regeocode:regeocode]){
                }else{
                    [SVProgressHUD showInfoWithStatus:@"您最新定位不在支持范围内!"];
                    return;
                }
                [weakSelf locotionRequestLat:[NSNumber numberWithDouble:location.coordinate.latitude].description Lon:[NSNumber numberWithDouble:location.coordinate.longitude].description adress:weakSelf.locationView.adressTextView.text];

1.2  通过逆地理编码进行判断定_位是否在大_陆

  • 逆地理编码:将经纬度转换为详细结构化的地址,且返回附近周边的POI、AOI信息。

例如:116.480881,39.989410 转换地址描述后:北京市朝阳区阜通东大街6号

  • 通过逆地理编码进行判断是否在大陆的处理流程

1、 请求https://restapi.amap.com/v3/geocode/geo把用户输入的经营地址位置信息转为经纬度信息 2、根据获取的经纬度信息再进行判断是否在大陆

/**
 通过逆地理编码进行判断是否在大陆
 */
- (void)setupGeocode{
    __weak __typeof__(self) weakSelf = self;
    if (weakSelf.locationView.adressTextView.text.length > 0) {//1、 判断经营地址信息,不为空进行逆地理编码(请求`https://restapi.amap.com/v3/geocode/geo`把用户输入的经营地址位置信息转为经纬度信息)
        [SVProgressHUD showWithStatus:@"定位中.."];
        AFHTTPSessionManager *managers = [AFHTTPSessionManager manager];
        managers.requestSerializer = [AFHTTPRequestSerializer serializer];
        managers.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",@"text/plain",@"application/json",@"text/javascript",nil];
//        NSString *urlStr = [NSString stringWithFormat:@"https://restapi.amap.com/v3/geocode/geo"];
        NSString *urlStr = k_amap_geocode;
        NSDictionary *dict = @{@"key" : @"6ccba78b7" , @"address" : weakSelf.locationView.adressTextView.text};
        [managers GET:urlStr parameters:dict headers:@{} progress:^(NSProgress * _Nonnull downloadProgress) {
            NSLog(@"downloadProgress:  %@",downloadProgress);
            [SVProgressHUD dismiss];
        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            NSLog(@"商户进件→商户详情,重新定_位,若输入的地址只有国家+市(例如:中国浙江),点击确定后,去请求第三方地理编码信息(高德API)的时候会转换失败,获取不到经纬度信息。 提示:【获取经纬度失败,请输入详细地址!】 responseObject:  %@",responseObject);
            //status
//            返回结果状态值
//            返回值为 0 或 1,0 表示请求失败;1 表示请求成功
            CRMgeoDto *dto = [CRMgeoDto mj_objectWithKeyValues:responseObject];
            if(dto.status.integerValue == 1){
                // 获取经纬度 ,如果失败,提示【获取经纬度失败,请输入准确的经营地址!】
                void (^noLocationdataBlock)(void) = ^void(void) {
                    [SVProgressHUD showInfoWithStatus:@"获取经纬度失败,请输入准确的经营地址!"];
                };
//                responseObject:  {
//                    status = 1;
//                    info = OK;
//                    infocode = 10000;
//                    count = 0;
//                    geocodes = (
//                );
                if(dto.geocodes.count<=0){
                    noLocationdataBlock();
                    return ;
                }
                CRMgeocodesDto *geocodesDto = dto.geocodes.firstObject;
                if([NSStringQCTtoll isBlankString:geocodesDto.location]){
                    noLocationdataBlock();
                    return ;
                }
                NSArray *array = [responseObject[@"geocodes"][0][@"location"] componentsSeparatedByString:@","];
                if(array.count<=1){
                    noLocationdataBlock();
                    return;
                }
                //2、根据获取的经纬度信息再进行判断是否在大陆
                CLLocation *location = [[CLLocation alloc]initWithLatitude:[array.lastObject doubleValue] longitude:[array.firstObject doubleValue]];
                AMapLocationReGeocode* regeocode = [AMapLocationReGeocode mj_objectWithKeyValues:geocodesDto.mj_keyValues];
                if([ERPAMapLocationTool inChineseMainlandWithCLLocation:location regeocode:regeocode]){
                }else{
                    [SVProgressHUD showInfoWithStatus:@"您最新定位不在支持范围内!"];
                    return;
                }
                [weakSelf locotionRequestLat:[NSNumber numberWithDouble:location.coordinate.latitude].description Lon:[NSNumber numberWithDouble:location.coordinate.longitude].description adress:weakSelf.locationView.adressTextView.text];
                [weakSelf.locationView.adressTextView resignFirstResponder];
                weakSelf.locationView.frame = CGRectMake(0, kHeight, kWidth, KWratio(self.locationViewH));
                weakSelf.bacV.hidden = YES;
            }else{
                [SVProgressHUD showInfoWithStatus:@"请输入准确的经营地址!"];
            }
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            [SVProgressHUD showInfoWithStatus:@"网络错误!"];
        }];
    } else {// 经营地址为空
        [SVProgressHUD showInfoWithStatus:@"请输入经营地址"];
    }
}

II  测试验证

测试方法:修改位_置信息

方法1:借助i4Tools修改真机地址

  • 借助i4Tools
安装命令行工具代码:xcode-select --install
自签命令代码:codesign -f -s - --deep /Applications/i4Tools.app

方法2:使用模拟器修改地址

image.png

image.png

  • 测试数据
// province=香港特别行政区
 latitude=22.26429541107516
 longitude=114.18135238995905
// province=澳门特别行政区
 latitude=22.135584619138957
 longitude=113.57214697205735
2020-04-09 15:39:54.504424+0800 retail[8369:4238323] reGeocode:AMapLocationReGeocode:{formattedAddress:澳门特别行政区圣方济各堂区靠近澳门青年挑战营; country:中国;province:澳门特别行政区; city:(null); district:圣方济各堂区; citycode:1853; adcode:820008; street:(null); number:(null); POIName:澳门青年挑战营; AOIName:(null);}
121.524582,25.028822
2020-04-09 16:02:47.411507+0800 retail[8369:4238323] reGeocode:AMapLocationReGeocode:{formattedAddress:台湾省(私)私立七田真超右脑教育托儿所; country:中国;province:台湾省; city:(null); district:(null); citycode:1886; adcode:710000; street:(null); number:(null); POIName:(私)私立七田真超右脑教育托儿所; AOIName:(null);}

【获取更多经纬度数据:https://lbs.amap.com/console/show/picker

方法3:通过GPX文件修改经纬度信息

iOS测试技巧:通过GPX文件修改经纬度信息(模拟iOS设备的位置)

相关文章

III 定_位权限的检测逻辑

优化定_位权限的检测逻辑:

主要针对iOS13访问位置信息信息新增的【下次询问】的场景):iOS 13新增App地理位置访问“仅允许一次”

测试方法:先设置【使用app时允许】,再去系统的设置修改定位信息的权限为:【下次询问】。回到app去更新定位信息。

定位之前检测权限发现是kCLAuthorizationStatusNotDetermined的时,需要实现amapLocationManager:(AMapLocationManager *)manager doRequireLocationAuth:(CLLocationManager*)locationManager方法,来让用户进行选择

- (void)amapLocationManager:(AMapLocationManager *)manager doRequireLocationAuth:(CLLocationManager*)locationManager
{
    [locationManager requestAlwaysAuthorization];
}

IV、风险商户处理

  • 盗刷拒付风险
  • 疑似欺诈、电诈、套现风险
  • 赌博、异常大额、异常测试:
  • 跨境风险

see also


目录
相关文章
|
5月前
|
Android开发 iOS开发 UED
探索未来:Android与iOS在智能穿戴设备上的较量
随着科技的飞速进步,智能穿戴设备已经成为我们日常生活中不可或缺的一部分。本文将深入探讨两大操作系统——Android和iOS——在智能穿戴领域的竞争与发展,分析它们各自的优势与挑战,并预测未来的发展趋势。通过比较两者在设计哲学、生态系统、用户体验及创新技术的应用等方面的差异,揭示这场较量对消费者选择和市场格局的影响。 【7月更文挑战第31天】
57 0
|
7月前
|
机器学习/深度学习 PyTorch TensorFlow
是否有其他框架可以在iOS设备上进行机器学习?
是否有其他框架可以在iOS设备上进行机器学习?
54 1
|
7月前
|
存储 数据建模 iOS开发
iOS设备功能和框架: 什么是 Core Data,它在 iOS 中的作用是什么?
iOS设备功能和框架: 什么是 Core Data,它在 iOS 中的作用是什么?
110 1
|
7月前
|
定位技术 iOS开发
iOS设备功能和框架: 如何使用 Core Location 获取设备的位置信息?
iOS设备功能和框架: 如何使用 Core Location 获取设备的位置信息?
82 0
|
安全 开发工具 数据安全/隐私保护
iOS-面试之你做过支付没有?
iOS-面试之你做过支付没有?
77 0
|
7月前
|
Linux 数据安全/隐私保护 iOS开发
如何使用 Xcode 打包导出 IPA 文件并进行 iOS 应用内测,无需支付苹果开发者账号费用?
如何使用 Xcode 打包导出 IPA 文件并进行 iOS 应用内测,无需支付苹果开发者账号费用?
|
4月前
|
运维 网络安全 iOS开发
厉害!外国网络工程师用Ansible给思科IOS设备升级!
厉害!外国网络工程师用Ansible给思科IOS设备升级!
|
4月前
|
BI Linux 数据安全/隐私保护
忘了 iOS(iPad、IPhone) 设备上的「屏幕使用时间」密码怎么办?找回屏幕密码
忘了 iOS(iPad、IPhone) 设备上的「屏幕使用时间」密码怎么办?找回屏幕密码
141 0
|
5月前
|
Android开发 数据安全/隐私保护 iOS开发
探索未来:安卓与iOS在智能穿戴设备领域的较量
随着科技的飞速发展,智能穿戴设备已逐渐成为我们日常生活的一部分。从健康监测到通讯交流,它们正以惊人的速度改变着我们的生活方式。本文将深入探讨安卓和iOS这两大操作系统在智能穿戴领域的现状、竞争以及未来发展趋势,揭示它们如何通过创新技术满足用户需求,并预测未来可能的发展方向。
48 0
|
7月前
|
缓存 开发工具 iOS开发
优化iOS中Objective-C代码调起支付流程的速度
优化iOS中Objective-C代码调起支付流程的速度
125 2