GeoIP处理;newOrderEnabled参数

master
yixian 3 years ago
parent 5c8d50fd3a
commit a24024ff9b

@ -5,11 +5,11 @@
<parent>
<groupId>au.com.royalpay.payment</groupId>
<artifactId>payment-parent</artifactId>
<version>2.2.28</version>
<version>2.2.29</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>manage</artifactId>
<version>2.3.83</version>
<version>2.3.84-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<jib-maven-plugin.version>2.4.0</jib-maven-plugin.version>

@ -1,10 +1,11 @@
package au.com.royalpay.payment.manage;
import au.com.royalpay.payment.tools.geo.GeoIPSupport;
import au.com.royalpay.payment.tools.geo.MaxmindGeoIPLite2Support;
import com.alibaba.fastjson.parser.ParserConfig;
import com.google.code.kaptcha.Producer;
import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
import com.maxmind.geoip.LookupService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
@ -44,15 +45,15 @@ public class PaymentManageApplication {
}
@Bean
public LookupService lookupService(@Value("${app.geo.dat-file:''}") String datFile, @Value("classpath:data/geo/GeoLiteCity.dat") Resource geoCityFile) throws IOException {
public GeoIPSupport geoIPSupport(@Value("${app.geo.mmdb-file:''}") String datFile, @Value("classpath:data/geo/GeoLite2-City.mmdb") Resource mmdbFile) throws IOException {
try {
if (StringUtils.isNotEmpty(datFile) && new File(datFile).exists()) {
return new LookupService(datFile);
return new MaxmindGeoIPLite2Support(datFile);
}
} catch (IOException e) {
e.printStackTrace();
}
return new LookupService(geoCityFile.getFile());
return new MaxmindGeoIPLite2Support(mmdbFile);
}
@Bean

@ -15,13 +15,14 @@ import au.com.royalpay.payment.tools.connections.mpsupport.MpWechatApi;
import au.com.royalpay.payment.tools.connections.mpsupport.MpWechatApiProvider;
import au.com.royalpay.payment.tools.connections.mpsupport.beans.TemplateMessage;
import au.com.royalpay.payment.tools.env.PlatformEnvironment;
import au.com.royalpay.payment.tools.geo.GeoIPSupport;
import au.com.royalpay.payment.tools.geo.entity.GeoLocation;
import au.com.royalpay.payment.tools.utils.PageListUtils;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.github.miemiedev.mybatis.paginator.domain.Order;
import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import com.github.miemiedev.mybatis.paginator.domain.PageList;
import com.maxmind.geoip.LookupService;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
@ -72,7 +73,7 @@ public class CustomersAnalysisServiceImp implements CustomersAnalysisService {
@Resource
private RetailAppService retailAppService;
@Resource
private LookupService lookupService;
private GeoIPSupport geoIPSupport;
@Override
public List<JSONObject> getCustomersAnalysis(JSONObject params) {
@ -105,7 +106,7 @@ public class CustomersAnalysisServiceImp implements CustomersAnalysisService {
@Override
public JSONObject getCustomersRanking(JSONObject params, int page, int limit) {
PageList<JSONObject> logs = orderAnalysisMapper.listCustomersData(params, new PageBounds(page, limit, Order.formString( params.getString("orderValue") )));
PageList<JSONObject> logs = orderAnalysisMapper.listCustomersData(params, new PageBounds(page, limit, Order.formString(params.getString("orderValue"))));
if (!logs.isEmpty()) {
for (JSONObject log : logs) {
generatorUserProfile(log, params);
@ -259,7 +260,7 @@ public class CustomersAnalysisServiceImp implements CustomersAnalysisService {
node.put("name", client.getString("client_moniker"));
node.put("label", client.getString("short_name"));
node.put("value", client.getString("short_name"));
node.put("symbolSize", clientInTotal.compareTo(new BigDecimal(10))<0?10:clientInTotal.toPlainString());
node.put("symbolSize", clientInTotal.compareTo(new BigDecimal(10)) < 0 ? 10 : clientInTotal.toPlainString());
if (clientInTotal.compareTo(new BigDecimal(300)) == 0) {
node.put("symbolSize", 100);
}
@ -267,21 +268,21 @@ public class CustomersAnalysisServiceImp implements CustomersAnalysisService {
node.put("flag", true);
node.put("draggable", true);
nodes.add(node);
JSONObject totalAmountInfo = getClientAmountInfo(id,"x0", "交易金额", client);
JSONObject totalAmountInfo = getClientAmountInfo(id, "x0", "交易金额", client);
totalAmountInfo.put("label", client.getString("total_amount"));
totalAmountInfo.put("value", client.getBigDecimal("total_amount").setScale(2,RoundingMode.HALF_UP));
totalAmountInfo.put("symbolSize",amountInTotal.compareTo(new BigDecimal(10))<0?10:amountInTotal.toPlainString());
totalAmountInfo.put("value", client.getBigDecimal("total_amount").setScale(2, RoundingMode.HALF_UP));
totalAmountInfo.put("symbolSize", amountInTotal.compareTo(new BigDecimal(10)) < 0 ? 10 : amountInTotal.toPlainString());
nodes.add(totalAmountInfo);
JSONObject OrdersInfo = getClientAmountInfo(id,"x1", "订单数", client);
JSONObject OrdersInfo = getClientAmountInfo(id, "x1", "订单数", client);
OrdersInfo.put("label", client.getString("orders"));
OrdersInfo.put("value", client.getString("orders"));
OrdersInfo.put("symbolSize", orderInTotal.compareTo(new BigDecimal(10))<0?10:orderInTotal.toPlainString());
OrdersInfo.put("symbolSize", orderInTotal.compareTo(new BigDecimal(10)) < 0 ? 10 : orderInTotal.toPlainString());
nodes.add(OrdersInfo);
JSONObject priceInfo = getClientAmountInfo(id,"x2", "客单价", client);
JSONObject priceInfo = getClientAmountInfo(id, "x2", "客单价", client);
BigDecimal price = client.getBigDecimal("total_amount").divide(client.getBigDecimal("orders"), 2, RoundingMode.HALF_UP);
priceInfo.put("label", price.toPlainString());
priceInfo.put("value", price.toPlainString());
priceInfo.put("symbolSize", price.divide(new BigDecimal(50), 0, RoundingMode.DOWN).compareTo(new BigDecimal(10))<0?5:price.divide(new BigDecimal(50), 0, RoundingMode.DOWN).toPlainString());
priceInfo.put("symbolSize", price.divide(new BigDecimal(50), 0, RoundingMode.DOWN).compareTo(new BigDecimal(10)) < 0 ? 5 : price.divide(new BigDecimal(50), 0, RoundingMode.DOWN).toPlainString());
nodes.add(priceInfo);
id++;
}
@ -289,7 +290,7 @@ public class CustomersAnalysisServiceImp implements CustomersAnalysisService {
JSONObject link = new JSONObject();
String linkId = node.getString("id");
link.put("source", linkId);
link.put("target", linkId.indexOf("x")>0?linkId.substring(0,linkId.indexOf("x")):0);
link.put("target", linkId.indexOf("x") > 0 ? linkId.substring(0, linkId.indexOf("x")) : 0);
links.add(link);
}
graph.put("nodes", nodes);
@ -384,8 +385,8 @@ public class CustomersAnalysisServiceImp implements CustomersAnalysisService {
List<JSONObject> mostUseIndustryByCustomer = orderAnalysisMapper.mostUseIndustryByCustomer(params);
List<JSONObject> mostUseAddressByCustomer = orderAnalysisMapper.mostUseAddressByCustomer(params);
for (JSONObject address : mostUseAddressByCustomer) {
String city = lookupService.getLocation(address.getString("customer_ip")).city;
if (topAddress.size() < 3 && !topAddress.contains(city) && StringUtils.isNotBlank(city) && city != null) {
String city = geoIPSupport.getLocation(address.getString("customer_ip")).map(GeoLocation::getCity).orElse(null);
if (topAddress.size() < 3 && !topAddress.contains(city) && StringUtils.isNotBlank(city)) {
topAddress.add(city);
}
}
@ -394,7 +395,7 @@ public class CustomersAnalysisServiceImp implements CustomersAnalysisService {
int amount = mostUseAmountByCustomer.getIntValue("amount_int");
if (amount == 0) {
topAmountRange = "0~100";
}else {
} else {
topAmountRange = String.valueOf(amount * 100) + "~" + String.valueOf((amount + 1) * 100);
}
}

@ -8,6 +8,8 @@ import au.com.royalpay.payment.manage.mappers.system.CustomerMapper;
import au.com.royalpay.payment.manage.mappers.system.ManagerCustomerRelationAlipayMapper;
import au.com.royalpay.payment.tools.exceptions.BadRequestException;
import au.com.royalpay.payment.tools.exceptions.NotFoundException;
import au.com.royalpay.payment.tools.geo.GeoIPSupport;
import au.com.royalpay.payment.tools.geo.entity.GeoLocation;
import au.com.royalpay.payment.tools.lock.Locker;
import au.com.royalpay.payment.tools.utils.PageListUtils;
import com.alibaba.fastjson.JSON;
@ -15,7 +17,6 @@ import com.alibaba.fastjson.JSONObject;
import com.github.miemiedev.mybatis.paginator.domain.Order;
import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import com.github.miemiedev.mybatis.paginator.domain.PageList;
import com.maxmind.geoip.LookupService;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.joda.time.DateTime;
@ -42,7 +43,7 @@ public class CustomerImpressionServiceImpl implements CustomerImpressionService
@Resource
private OrderMapper orderMapper;
@Resource
private LookupService lookupService;
private GeoIPSupport geoIPSupport;
@Resource
private ManagerCustomerRelationAlipayMapper managerCustomerRelationAlipayMapper;
@Resource
@ -77,7 +78,7 @@ public class CustomerImpressionServiceImpl implements CustomerImpressionService
JSONObject order = ordersLast.get(0);
JSONObject paymentInfo = new JSONObject();
paymentInfo.put("pay_time", DateFormatUtils.format(order.getDate("create_time"), "yyyy-MM-dd HH:mm:ss"));
String city = lookupService.getLocation(order.getString("customer_ip")).city;
String city = geoIPSupport.getLocation(order.getString("customer_ip")).map(GeoLocation::getCity).orElse(null);
if (!StringUtils.isEmpty(city)) {
paymentInfo.put("pay_location", city);
}
@ -89,7 +90,7 @@ public class CustomerImpressionServiceImpl implements CustomerImpressionService
JSONObject order = ordersFirst.get(0);
JSONObject paymentInfo = new JSONObject();
paymentInfo.put("pay_time", DateFormatUtils.format(order.getDate("create_time"), "yyyy-MM-dd HH:mm:ss"));
String city = lookupService.getLocation(order.getString("customer_ip")).city;
String city = geoIPSupport.getLocation(order.getString("customer_ip")).map(GeoLocation::getCity).orElse(null);
if (!StringUtils.isEmpty(city)) {
paymentInfo.put("pay_location", city);
}
@ -179,7 +180,7 @@ public class CustomerImpressionServiceImpl implements CustomerImpressionService
clientCustomersMapper.updateAfterPaymentFinish(clientCustomerInfo);
}
} finally {
locker.unlock(CUSTOMER_IMPRESSION_PREFIX+customer_id);
locker.unlock(CUSTOMER_IMPRESSION_PREFIX + customer_id);
}
} catch (Exception e) {
logger.debug("Reduce Customer Impression Error Redis Value =" + redisValue, e);

@ -1,8 +1,12 @@
package au.com.royalpay.payment.manage.dev.web;
import au.com.royalpay.payment.tools.geo.GeoIPSupport;
import au.com.royalpay.payment.tools.geo.entity.GeoLocation;
import com.alibaba.fastjson.JSONObject;
import com.maxmind.geoip.LookupService;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@ -11,12 +15,12 @@ import javax.annotation.Resource;
public class IPController {
@Resource
private LookupService lookupService;
private GeoIPSupport geoIPSupport;
@GetMapping("/{ipAddr}")
public JSONObject getIpInfo(@PathVariable String ipAddr) {
JSONObject result = new JSONObject();
result.put("city", lookupService.getLocation(ipAddr).city);
result.put("city", geoIPSupport.getLocation(ipAddr).map(GeoLocation::getCity).orElse("Unknown"));
return result;
}
}

@ -12,7 +12,6 @@ import au.com.royalpay.payment.channels.rpaypaymentsvc.runtime.RPayPaymentCardSv
import au.com.royalpay.payment.channels.rpaypaymentsvc.runtime.request.entities.RPayMerchantEntity;
import au.com.royalpay.payment.channels.wechat.config.WeChatPayConfig;
import au.com.royalpay.payment.channels.wechat.config.WechatPayEnvironment;
import au.com.royalpay.payment.channels.wechat.runtime.MpPaymentApi;
import au.com.royalpay.payment.channels.wechat.runtime.beans.SubMerchantInfo;
import au.com.royalpay.payment.channels.wechat.runtime.beans.SubMerchantInfoInheritance;
import au.com.royalpay.payment.channels.wechat.runtime.beans.WechatMerchantInfo;
@ -20,10 +19,12 @@ import au.com.royalpay.payment.channels.wechat.runtime.impls.WxPayMerchantRegist
import au.com.royalpay.payment.channels.wechat.runtime.impls.WxPayMerchantRegisterLegacy;
import au.com.royalpay.payment.channels.wechat.runtime.mappers.PaymentChannelMccGoodMapper;
import au.com.royalpay.payment.channels.wechat.runtime.mappers.WxMerchantApplyMapper;
import au.com.royalpay.payment.core.ChannelContractSource;
import au.com.royalpay.payment.core.PaymentApi;
import au.com.royalpay.payment.core.PaymentChannelApi;
import au.com.royalpay.payment.core.beans.ChannelMerchantInfo;
import au.com.royalpay.payment.core.beans.EmptyMerchantApplication;
import au.com.royalpay.payment.core.beans.MchChannelContract;
import au.com.royalpay.payment.core.beans.MerchantApplicationResult;
import au.com.royalpay.payment.core.exceptions.EmailException;
import au.com.royalpay.payment.core.exceptions.InvalidShortIdException;
@ -551,11 +552,11 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
}
client.put("enable_alipayplus", false);
MerchantChannelPermissionResolver resolver = this.paymentApi.channelApi(PayChannel.ALIPAY_PLUS.getChannelCode()).getChannelPermissionResolver();
if (!Objects.isNull(resolver)) {
if (resolver.newOrderEnabled(client)) {
client.put("enable_alipayplus", true);
}
if (!Objects.isNull(resolver) &&
resolver.newOrderEnabled(client, null, PlatformEnvironment.getEnv().getForeignCurrency())) {
client.put("enable_alipayplus", true);
}
return client;
}
@ -1078,31 +1079,29 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
throw new InvalidShortIdException();
}
checkOrgPermission(manager, client);
JSONObject update = new JSONObject();
int clientId = client.getIntValue("client_id");
String originSubMerchantId = client.getString("sub_merchant_id");
update.put("client_id", clientId);
String subMerchantId = subMerchantInfo.getString("sub_merchant_id");
MpPaymentApi wxApi = (MpPaymentApi) paymentApi.channelApi(PayChannel.WECHAT.getChannelCode());
WeChatPayConfig.Merchant availableMerchant = wxApi.determineMerchant(subMerchantId);
update.put("merchant_id", availableMerchant == null ? null : availableMerchant.getMerchantId());
update.put("sub_merchant_id", subMerchantId);
ChannelContractSource wxContractSource = paymentApi.channelApi(PayChannel.WECHAT.getChannelCode()).initContractSource();
MchChannelContract contract = new MchChannelContract().setClientId(clientId).setMid(subMerchantId);
wxContractSource.saveContract(contract);
try {
recordSubMerchantLog(client, subMerchantInfo, manager);
} catch (Exception e) {
logger.error("记录log_client_sub_merchant_id失败", e);
}
clientMapper.update(update);
List<JSONObject> children = clientMapper.listChildClients(clientId);
for (JSONObject child : children) {
if (Objects.equals(child.getString("sub_merchant_id"), originSubMerchantId)) {
update.put("client_id", child.getIntValue("client_id"));
MchChannelContract childContract = new MchChannelContract()
.setClientId(child.getIntValue("client_id"))
.setMid(subMerchantId);
try {
recordSubMerchantLog(child, subMerchantInfo, manager);
} catch (Exception e) {
logger.error("记录log_client_sub_merchant_id失败", e);
}
clientMapper.update(update);
wxContractSource.saveContract(childContract);
}
}
clientInfoCacheSupport.clearClientCache(clientId);
@ -5729,7 +5728,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
params.put("client_id", client.getString("client_id"));
params.put("create_time", new Date());
params.put("operator", manager.getString("display_name"));
params.put("is_valid","1");
params.put("is_valid", "1");
SubMerchantInfoInheritance subMerchantInfo = JSON.toJavaObject(params, SubMerchantInfoInheritance.class);
MerchantApplicationResult res = Optional.ofNullable(merchantChannelApplicationManager.getRegister(WxPayMerchantRegister.class))
.map(channel -> channel.apply(client, subMerchantInfo, manager))
@ -5841,8 +5840,8 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
String rejectReason = responseElement.elementText("reject_reason");
return "查询成功:" + responseElement.elementText("secondary_merchant_id") +
"报备状态:" + responseElement.elementText("status") + StringUtils.defaultString(rejectReason, "");
}catch (BadRequestException e){
logger.error(e.getMessage(),e);
} catch (BadRequestException e) {
logger.error(e.getMessage(), e);
return e.getMessage();
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 MiB

@ -18,8 +18,8 @@ public class AESTest {
@Test
public void testEncrypt() {
String keyStr = "Aa+MtthC4Ztq4Kfa9aL+UA==";
String source = "2020@Zxcvb1026";
String keyStr = "EPrfsM2JE69ZPR7BhXn34g==";
String source = "Rpay2021";
Key key = AESCrypt.fromKeyString(Base64.decodeBase64(keyStr));
byte[] encrypted = AESCrypt.encrypt(source.getBytes(StandardCharsets.UTF_8), key);
System.out.println("encrypted: " + Base64.encodeBase64String(encrypted));

@ -0,0 +1,19 @@
package au.com.royalpay.payment.manage.valid;
import au.com.royalpay.payment.tools.geo.MaxmindGeoIPLite2Support;
import au.com.royalpay.payment.tools.geo.entity.GeoLocation;
import org.junit.Test;
import java.io.IOException;
import java.net.URL;
public class IPTest {
@Test
public void testIP() throws IOException {
String ip = "193.82.236.78";
URL datFile = getClass().getClassLoader().getResource("data/geo/GeoLite2-City.mmdb");
GeoLocation location = new MaxmindGeoIPLite2Support(datFile.getFile())
.getLocation(ip).orElse(null);
System.out.println(location);
}
}
Loading…
Cancel
Save