!96 账户预存费用功能

Merge pull request !96 from wangquanzhen/hotfix_poster
This commit is contained in:
山东云则
2025-06-26 07:38:15 +00:00
committed by Gitee
10 changed files with 257 additions and 3 deletions
@@ -1,6 +1,8 @@
package com.yunze.common.mapper.mysql;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
@@ -90,4 +92,6 @@ public interface YzAgentPackageMapper {
public List<Map<String, Object>> exportallorders(Map map);
String findAgentId(Object appId);
Map<String, Object> findAgent(@Param("appId") Object appId);
}
@@ -258,5 +258,11 @@ public interface YzOrderMapper {
void insertOrder(HashMap<String, Object> insertMap);
int selectExistAgent(String agentId);
void insertRenewalAccount(@Param("agentId") String agentId, @Param("agentName") String agentName);
void insertRechargeAccount(HashMap<String, Object> insertMap);
}
@@ -887,6 +887,21 @@ public static String getLastDayOfMonth(int year,int month)
}
public static String getUserDateWithHalfHour(String sformat) {
// 获取当前时间
LocalDateTime now = LocalDateTime.now();
// 加上30分钟
LocalDateTime halfHourLater = now.plusMinutes(30);
// 格式化时间
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(sformat);
String dateString = halfHourLater.format(formatter);
return dateString;
}
/**
*获取 多少秒后的时间
@@ -220,6 +220,14 @@
WHERE
app_id = #{appId}
</select>
<select id="findAgent" resultType="java.util.Map">
SELECT
total_money as Balance
FROM
yz_renewal_account
WHERE
dept_id = ( SELECT agent_id AS appId FROM yz_agent_account WHERE app_id = #{appId} )
</select>
</mapper>
@@ -597,6 +597,16 @@
</choose>
)
</insert>
<insert id="insertRenewalAccount">
insert into yz_renewal_account
(dept_id, dept_name, total_money, create_time, last_recharge_wx_order_no, last_recharge_time)
value (#{agentId},#{agentName},0,now(),null,now())
</insert>
<insert id="insertRechargeAccount">
insert into yz_recharge_record
(dept_id, dept_name, recharge_amount, recharge_time, update_time,order_no, wx_order_no, payment_type, status)
value ( #{dept_id},#{dept_name},#{total_money},now(),null,#{order_no},null,'wx','0')
</insert>
<select id="exportallorders" parameterType="java.util.HashMap" resultType="java.util.HashMap">
SELECT
@@ -1055,6 +1065,14 @@
create_time DESC
LIMIT 1
</select>
<select id="selectExistAgent" resultType="java.lang.Integer">
select
count(1)
from
yz_renewal_account
where
dept_id = #{agent_id}
</select>
</mapper>
+6
View File
@@ -112,6 +112,12 @@
<groupId>com.yunze</groupId>
<artifactId>yunze-common</artifactId>
</dependency>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-pay</artifactId>
<version>3.9.6.B</version>
<scope>compile</scope>
</dependency>
</dependencies>
@@ -0,0 +1,63 @@
package com.yunze.iotapi.config;
import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
import com.yunze.common.mapper.mysql.wechat.YzWxConfigMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Slf4j
@Service
@Configuration
@ConditionalOnClass(WxPayService.class)
public class SysWxPayServiceInterface {
public static Map<String,WxPayService> wxPayServiceMap =new ConcurrentHashMap<>();
@Resource
private YzWxConfigMapper yzWxConfigMapper;
/**
* return: 获取所有配置
*/
public List<WxPayConfig> queryConfigs(){
List<Map <String,Object>> list = yzWxConfigMapper.getWxConfigs();
List<WxPayConfig> configs =new ArrayList<>();
for(int i=0;i<list.size();i++){
Map <String,Object> wxConfig =list.get(i);
WxPayConfig wxPayConfig = new WxPayConfig();
wxPayConfig.setAppId(wxConfig.get("app_id").toString());
wxPayConfig.setMchId(wxConfig.get("mch_id").toString());
wxPayConfig.setMchKey(wxConfig.get("paterner_key").toString());
wxPayConfig.setTradeType("NATIVE");
configs.add(wxPayConfig);
}
return configs;
}
/**
* return: 获取支付的weixinpay
*/
public WxPayService getWxPayService(String appId){
return wxPayServiceMap.get(appId);
}
public void afterPropertiesSet() throws Exception {
List<WxPayConfig> configs= queryConfigs();
for(int i=0;i<configs.size();i++){
WxPayService wxPayService=new WxPayServiceImpl();
wxPayService.setConfig(configs.get(i));
wxPayServiceMap.put(configs.get(i).getAppId(),wxPayService);
}
log.error("{}",wxPayServiceMap);
}
}
@@ -689,6 +689,18 @@ public class PublicOpenAapiController {
}
@RequestMapping("/rechargeAccountForZSZF")
@ResponseBody
@LogAnnotation(action = "预存费用接口")
public JSONObject rechargeAccountForZSZF(HttpServletRequest request) {
ResponseJson responseJson = null;
responseJson = newOpenApiService.rechargeAccountForZSZF(request);
if (responseJson.get("data") != null || !"500".equals(responseJson.get("status"))) {
return new ResponseJson().successNewOpen(responseJson);
}
return new ResponseJson().error("500", responseJson.get("message").toString());
}
public static void main(String[] args) {
@@ -29,4 +29,7 @@ public interface NewOpenApiService {
Map<String, Object> queryDueExpireDateXQ(HttpServletRequest request);
ResponseJson queryRenewalStatus(HttpServletRequest request);
ResponseJson rechargeAccountForZSZF(HttpServletRequest request);
}
@@ -3,9 +3,9 @@ package com.yunze.iotapi.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.TypeReference;
import com.yunze.apiCommon.upstreamAPI.DianXinCMP.Inquire.Query_DX;
import com.yunze.apiCommon.upstreamAPI.DianXinCMP5G.Inquire.Query_DX5G;
import com.yunze.apiCommon.upstreamAPI.YiDongEC.Inquire.Query_YD;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderResult;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.yunze.apiCommon.utils.Arith;
import com.yunze.apiCommon.utils.VeDate;
import com.yunze.common.mapper.mysql.YzAgentPackageMapper;
@@ -16,13 +16,18 @@ import com.yunze.common.mapper.mysql.card.YzApplicationforRenewalMapper;
import com.yunze.common.mapper.mysql.card.YzApplicationforRenewalPrimaryIccidMapper;
import com.yunze.common.mapper.mysql.card.YzApplicationforRenewalPrimaryMapper;
import com.yunze.common.mapper.mysql.card.YzApplicationforRenewalPrimaryOrdNoMapper;
import com.yunze.common.mapper.mysql.wechat.YzWxConfigMapper;
import com.yunze.iotapi.config.SysWxPayServiceInterface;
import com.yunze.iotapi.service.NewOpenApiService;
import com.yunze.iotapi.utils.ResponseJson;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -35,6 +40,7 @@ import java.util.Map;
* @Date: 2024/10/09/15:14
* @Description:
*/
@Slf4j
@Service
public class NewOPenApiServiceImpl implements NewOpenApiService {
@Resource
@@ -53,6 +59,10 @@ public class NewOPenApiServiceImpl implements NewOpenApiService {
private YzApplicationforRenewalPrimaryOrdNoMapper yzApplicationforRenewalPrimaryOrdNoMapper;
@Resource
private YzApplicationforRenewalPrimaryIccidMapper yzApplicationforRenewalPrimaryIccidMapper;
@Resource
private YzWxConfigMapper yzWxConfigMapper;
@Resource
private SysWxPayServiceInterface sysWxPayServiceInterface;
@Override
public Map<String, Object> queryCardInfoList(HttpServletRequest request) {
@@ -398,4 +408,113 @@ public class NewOPenApiServiceImpl implements NewOpenApiService {
ReturnMap.put("renewalStatus", renewalStatus);
return new ResponseJson().initSuccessOpen(ReturnMap);
}
@Transactional
@Override
public ResponseJson rechargeAccountForZSZF(HttpServletRequest request) {
Map<String, Object> rMap = new HashMap<>();
String map = (String) request.getAttribute("map");
Map<String, Object> ParamMap = JSON.parseObject(map, new TypeReference<Map<String, Object>>() {
});
Map<String, Object> param = (Map<String, Object>) ParamMap.get("Param");
Map<String, Object> verify = (Map<String, Object>) ParamMap.get("verify");
//查询当前API登录用户agent_id
Object appId = verify.get("appId");
BigDecimal totalAmount = new BigDecimal(param.get("money").toString());
Map<String, Object> agent = agentPackageMapper.findAgent(appId);
String agentId = agent.get("appId").toString();
String agentName = agent.get("agentName").toString();
WxPayUnifiedOrderRequest wxPayUnifiedOrderRequest = null;
WxPayUnifiedOrderResult wxPayUnifiedOrderResult = null;
String Message = "";
String wx_appId = null;
String nativeUrl = null;
String codeUrl = "";
String ord_no = "";
String productId = String.valueOf(System.currentTimeMillis());
try {
//支付页面信息
String body = "预存费用企业名称-" + agentName;
Map<String, Object> findMap = new HashMap<>();
findMap.put("agent_id", "100");
Map<String, Object> wxConfig = yzWxConfigMapper.findOne(findMap);
if (wxConfig == null) {
Message = "未找到收款方,请联系管理员进行配置!";
}
//获取收款的 appid 统一默认为 平台代理 100
wx_appId = wxConfig.get("app_id").toString();
nativeUrl = wxConfig.get("native_url").toString();
//请求支付的订单号和业务区分 时间戳加10位随机数
ord_no = com.yunze.common.utils.yunze.VeDate.getNo(10);
String time_end = com.yunze.common.utils.yunze.VeDate.getUserDateWithHalfHour("yyyyMMddHHmmss");
//更新前先判断是否存在该账号 是则更新 否则新增
int sum = yzOrderMapper.selectExistAgent(agentId);
if (sum == 0) {
//先新增账户
yzOrderMapper.insertRenewalAccount(agentId, agentName);
//新增充值表信息
this.insertRechargeAccount(ord_no, agentId, agentName, totalAmount);
} else {
//增充值表信息
this.insertRechargeAccount(ord_no, agentId, agentName, totalAmount);
}
BigDecimal bigDecimal = new BigDecimal(String.valueOf(totalAmount));
wxPayUnifiedOrderRequest = WxPayUnifiedOrderRequest
.newBuilder()
//订单号
.outTradeNo(ord_no)
//金额
.totalFee(yuanToFee(bigDecimal))
//描述
.body(body)
//ip
.spbillCreateIp(InetAddress.getLoopbackAddress().getHostAddress())
.notifyUrl(nativeUrl)
.productId(productId)
//设置订单失效时间
.timeExpire(time_end)
.build();
//微信支付参数初始化
sysWxPayServiceInterface.afterPropertiesSet();
} catch (NumberFormatException e) {
log.error("微信支付开始调起异常 NumberFormatException----------------");
log.error(e.getMessage());
} catch (Exception e) {
log.error("Exception " + e.getMessage());
}
try {
wxPayUnifiedOrderResult = sysWxPayServiceInterface
.getWxPayService(wx_appId)
.unifiedOrder(wxPayUnifiedOrderRequest);
} catch (WxPayException e) {
log.error(e.getMessage());
throw new RuntimeException("微信支付调起失败");
} catch (Exception e) {
e.printStackTrace();
}
codeUrl = wxPayUnifiedOrderResult.getCodeURL();
rMap.put("codeUrl", codeUrl);
rMap.put("orderNo", ord_no);
return new ResponseJson().initSuccessOpen(rMap);
}
private void insertRechargeAccount(String ordNo, String agentId, String agentName, BigDecimal totalAmount) {
if (ordNo != null) {
HashMap<String, Object> insertMap = new HashMap<>();
insertMap.put("order_no", ordNo);
insertMap.put("total_money", totalAmount);
insertMap.put("dept_id", agentId);
insertMap.put("dept_name", agentName);
yzOrderMapper.insertRechargeAccount(insertMap);
}
}
/**
* 描述: 1元钱转为 100分
*/
private int yuanToFee(BigDecimal bigDecimal) {
return bigDecimal.multiply(new BigDecimal(100)).intValue();
}
}