【支付平台】java springboot 通过ip获取所在地城市信息

news/2024/11/8 9:16:42/

         如果只是想知道如何通过ip获取所在地城市信息,可直接看第三步.

        如果搭建自己的支付平台,异地支付限制是必不可少的一环.因为市面上一些非法份子,会使用我们平台生成的付款码进行欺诈行为.这也是我们必须杜绝的一种现象.因此限制异地支付就是其中一种手段.

        在上一篇文章【三方支付】java如何获取请求的来源ip 我们可以获取到用户发起支付时的ip,我们只需要再获取到用户扫码时的ip进行对比,即可知道当前是否为异地支付.当然我们不能直接对比ip,因为用户通常使用pc端发起支付获取付款码,而支付时采用的是移动端.两端未必处于同一个网络,因此ip也是不同的.

  •         第一步,如果我们接入是三方支付,通常三方支付会返回给我们一个二维码地址,或者收银台地址,这时候用户扫码时进入的就是三方支付的支付页面,我们是无法获取到用户ip的,这时候我们需要做的便是生成自己的二维码,用户扫描二维码进入是我们自己的页面(也可以是接口,获取ip之后直接跳转到三方支付,通常是制作一个移动端的页面,展示一些订单信息和风险提示等),只要经过我们的服务就可以拿到用户扫码时的ip了.

  •         第二步,对比ip所在城市的信息.通过上面的步骤,我们拿到发起支付时的ip和扫码时的ip.我们就可以通过ip对应的城市进行对比了.目前市面上通过ip获取城市的开放接口有很多,基本都是收费的,免费的通常ip库不全,有可能查不到地址.类似 百度地图,高德地图 都有响应的接口供大家使用.也可以到阿里云市场进行购买(相对优惠很多).

  •         第三步, 如何通过ip获取这里我们介绍一种免费的,内置在我们自己系统的一种获取ip城市信息的方式,这种方式既省钱又不需要担心网络问题

1. 引入 ip2region ,据ip2region官方给出的数据,ip准确率达到99.9%,而且查询速度也非常客观,可以满足我们的需求

        <dependency><groupId>org.lionsoul</groupId><artifactId>ip2region</artifactId><version>2.7.0</version></dependency>

2. 导入ip2region的数据包

可以到官方进行下载xdb文件,并将文件放置到项目的resources下

3. 编写自己的工具类

 

import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.lionsoul.ip2region.xdb.Searcher;
import org.springframework.core.io.ClassPathResource;import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;@Slf4j
public class Ip2Region {protected static Searcher searcher;static {ClassPathResource resource = new ClassPathResource("ip2region/ip2region.xdb");try (InputStream inputStream = resource.getInputStream()) {byte[] cBuff = IoUtil.readBytes(inputStream);searcher = Searcher.newWithBuffer(cBuff);} catch (IOException e) {log.error("获取ip文件失败", e);}}/*** 根据ip从 ip2region.db 中获取地理位置** @param ip* @return 地理位置*/public static Map<String, String> getCityInfo(String ip) {//数据格式: 国家|区域|省份|城市|ISP//192.168.31.160 0|0|0|内网IP|内网IP//47.52.236.180 中国|0|香港|0|阿里云//220.248.12.158 中国|0|上海|上海市|联通//164.114.53.60 美国|0|华盛顿|0|0HashMap<String, String> cityInfo = new HashMap<>(7);try {String searchIpInfo = searcher.search(ip);log.info("ip查询:{},查询结果:{}", ip, searchIpInfo);if (StrUtil.isNotBlank(searchIpInfo)) {String[] splitIpInfo = searchIpInfo.split("\\|");cityInfo.put("ip", ip);cityInfo.put("searchInfo", searchIpInfo);cityInfo.put("country", splitIpInfo[0]);cityInfo.put("region", splitIpInfo[1]);cityInfo.put("province", splitIpInfo[2]);cityInfo.put("city", splitIpInfo[3]);cityInfo.put("ISP", splitIpInfo[4]);return cityInfo;}} catch (Exception e) {log.info("failed to search({}): {}", ip, e);}return null;}/*** 根据ip从 ip2region.db 中获取省份** @param ip* @return 地理位置*/public static String getProvince(String ip) {Map<String, String> cityInfo = getCityInfo(ip);if (cityInfo != null) {return cityInfo.get("province");}else {return null;}}}

4. 使用方式 这里我们获取的是省份,也可以通过实际情况进行调整

    // 获取扫码时的ipString clientIp = IpUtil.getClientIp();String city1 = Ip2Region.getProvince(clientIp);// 获取下单时的ipString city2 = Ip2Region.getProvince(order.getClientIp());log.info("订单校验ip,订单号:{},下单ip:{},支付ip:{}", id, order.getClientIp(), clientIp);if (StrUtil.isNotBlank(city1) && StrUtil.isNotBlank(city2) && !city1.equals(city2)) {return Result.res(ResultEnum.IP_ERROR);}

以上就是通过ip对比省份,进行异地支付的限制


http://www.ppmy.cn/news/292623.html

相关文章

ESP32-S3 边缘人工智能|使用加速度计数据和 ESP-DL 识别人体活动

边缘计算是一种分布式计算范例&#xff0c;指在更靠近设备的地方进行数据存储和计算。边缘人工智能&#xff08;边缘 AI&#xff09;是边缘计算中一项振奋人心的成果&#xff0c;可以令传统技术更高效地运行&#xff0c;在降低功耗的同时又有更好的性能。训练好的神经网络可以在…

c# 从零到精通-ArrayList-Hashtable的操作

c# 从零到精通-ArrayList-Hashtable的操作 1、ArrayList的操作 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; namespace Test11 { class Program { static void Main(string[] args) { ArrayList list …

joplin的安装和使用

本文主要介绍joplin的安装和坚果云的配合使用 坚果云 先到坚果云的官网注册登录坚果云 官网&#xff1a;https://www.jianguoyun.com/ a、点击右上角昵称 b、点击账户信息 c、安全选项 d、第三方应用管理 e、点击添加应用&#xff0c;输入应用名称Joplin(这里可以自定义) f、…

华硕怎么安装linux系统教程,华硕笔记本系统如何安装win10和linux 双系统

稍微了整理了一下win10和linux双系统的安装教程,第一个选项是进入U盘linux live,等等) 第一点设置boot挂载点。 设置BIOS。 然后点击试用用UBUNTU,但是windows上面的数据又删除不得,使用Ultraiso把LINUX UBUNTU14.X这个iso文件【写入硬盘影像】到U盘。 第三个自己看,去正规…

华硕ac68u最佳设置_【华硕RT-AC68U路由器使用总结】频段|设置|信号_摘要频道_什么值得买...

华硕RT-AC68U路由器使用总结(频段|设置|信号) 假如不组建Mesh网络的话,使用第二台AC68U为第一台AC68U做无线桥接,同样可以实现这套211平米房间的信号全覆盖,但是信号经过第二台AC68U桥接之后速度会下降,而且无法实现统一的SSID和无缝漫游。例如第一台AC68U有2.4G和5G两个频…

联想开启物联网救赎

配图来自Canva可画 凭借Pro14、小新15、Air15等多款高性价比的电脑产品&#xff0c;联想在2020年以24%的市场份额&#xff0c;超过惠普、戴尔等厂商&#xff0c;再度蝉联PC市场桂冠。 不过&#xff0c;对联想而言&#xff0c;这样的成绩并不能令人满意。为缓解PC市场面临的压…

联想计算机BIOS开启Intel-vx,各品牌电脑BIOS开启Intel VT-X虚拟化技术方法(华硕,联想,HP,技嘉等)...

我们在电脑上运行虚拟机、模拟器是需要CPU虚拟化技术支持的,如果你的电脑没有开启,那么将无法运行虚拟机或模拟器,那么下面小编整理了华硕,联想,HP,技嘉等品牌电脑BIOS下开启Intel VT-X虚拟化技术方法,有需要的朋友可以学习一下哦。 华硕UEFI BIOS 华硕主板电脑,开机反复按…

华硕电脑连接不上wifi_四招解决华硕笔记本不能连接WiFi!

在笔记本电脑中&#xff0c;我们一般选择通过连接WiFi来上网&#xff0c;因为现在的几乎所有的笔记本都有内置无线网卡&#xff0c;具有支持连接无线网络的功能。如果笔记本电脑出现无法开启WiFi或者连接不了WiFi的情况&#xff0c;应该如何解决呢?下面分析几种可能的原因并为…