支付模块-下单接口

This commit is contained in:
童丽然 2024-12-24 17:39:49 +08:00
parent b7eec65e6d
commit 27eac91d1c
21 changed files with 658 additions and 1 deletions

View File

@ -115,6 +115,15 @@ sip:
id: 34020000002000000001 # 同上,另外增加编号,(可保持默认) id: 34020000002000000001 # 同上,另外增加编号,(可保持默认)
password: 12345678 # 监控设备接入的密码 password: 12345678 # 监控设备接入的密码
#微信支付
wx:
pay:
appId: wx308612d2a8423311 #微信公众号或者小程序等的appid
secret: 7f591f559929a3bf2dbea4e156b08ae9
mchId: #微信支付商户号
mchKey: #微信支付商户密钥
notifyUrl: http://192.168.1.5:13088/pay/wxCallback #支付回调地址
# 日志配置 # 日志配置
logging: logging:
level: level:

View File

@ -56,6 +56,8 @@ server:
platform: platform:
expried: 120 expried: 120
# Spring配置 # Spring配置
spring: spring:
# 环境配置dev=开发环境prod=生产环境 # 环境配置dev=开发环境prod=生产环境

View File

@ -0,0 +1,50 @@
package com.fastbee.common.utils.pay;
import java.nio.charset.StandardCharsets;
import java.security.GeneralSecurityException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.GCMParameterSpec;
import javax.crypto.spec.SecretKeySpec;
/**
* @author xy-peng
*/
public class AesUtil {
private static final String TRANSFORMATION = "AES/GCM/NoPadding";
private static final int KEY_LENGTH_BYTE = 32;
private static final int TAG_LENGTH_BIT = 128;
private final byte[] aesKey;
public AesUtil(byte[] key) {
if (key.length != KEY_LENGTH_BYTE) {
throw new IllegalArgumentException("无效的ApiV3Key长度必须为32个字节");
}
this.aesKey = key;
}
public String decryptToString(byte[] associatedData, byte[] nonce, String ciphertext)
throws GeneralSecurityException {
try {
SecretKeySpec key = new SecretKeySpec(aesKey, "AES");
GCMParameterSpec spec = new GCMParameterSpec(TAG_LENGTH_BIT, nonce);
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
cipher.init(Cipher.DECRYPT_MODE, key, spec);
cipher.updateAAD(associatedData);
return new String(cipher.doFinal(Base64.getDecoder().decode(ciphertext)), StandardCharsets.UTF_8);
} catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
throw new IllegalStateException(e);
} catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
throw new IllegalArgumentException(e);
}
}
}

View File

@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDAAj3TYp1jmmC1
Lc6H3aFVm1tiSkDGfQlGg6y87FVUUd1m56FVB4hXBF3/KXK5/rICognPP5l8Uu7o
fk9+i1nuRo3kXcJsaC+zq1hbIGb06JClB+xS436HOL3WNa9EtqVbLFSeEBLEq0qX
BibiNkn5NoEAddfG3C1r3YFg2zt8xKmfV8b6TvqSBKEWVu7fHpF4oeaYqPil6nKJ
Q6ZY5RBsm+AbkKzKjpdrYlWC6T0S7AZwzDjm63LANT4OZqi5OMB7Oy5NY1tTJdUW
JXTkFGUWRiyy8/ecAz01p+Vx93y3NVbpM0L+67TF2iQ3Sr8/WMLGegV2cRzcrrl0
IDzCiSCfAgMBAAECggEAUMkgpi3Ztqyff9t0CCox1Uj2XBaNxnWZT3fbV+m/xShk
lQVkFdiDfskxm0gfIy6MSxtOMUq7E1n5dwyd+co73ksFLE5enSoA2AGBvWWWq/il
0ynQPtfExrQS+2u/AJQwYnn2aEKvAtxnF7/Y4FijKx3JjR4H2X2OBtI9uzjCgK2q
hHEmRqM7rSAj/iq0TKe9JVg843cPa97MrYQ3bgRyiVtzEsN/LcAfS2ZgU6iPUG6f
OQGh9fwQ7/lcmKgBW6lnN/2CVysSF0caVj7xvzT+7eyaK5VzuMVupACUUlst+9zg
QSa+5BA6mnfa0DGpKjnRt6zhy6o0ct7I1R0eseadkQKBgQD1QBYeSQ3wkmXI0lAK
rMWkcnU3T0Lf48tlr2PZocLsaWTlqFSQMUiqVb/WuC+DQ2JLWK4Jf8Agf+BCNRZK
HB2cjOyUvMIq8PgFZm5Bi3OAfD6AVFaDxsNmQWxJykZZuEreOmYVAbWDVB06DUEl
geVtPRewXGFlwyhPmEZ4pZUWywKBgQDIbL13FIF3xT5kHmH205fpPqVugUVjzWih
hhrM+SA9178nU9lnUv+6glYNbr+23iIa1dvLePBSTn8qXLJyX5UbVuUhG010BjfS
uBP3qqMs9BcVhQlEF5B349gnVcYKlmMuq25s9wlhwJfI8fnEjzTfBTqCLiu3DXZ8
F/5Y5AeO/QKBgQCmlwqvNcaPRJJ5MEsIhUWXp9vxXxi5Bn4yK0ozGctTVWAhFA+l
BqUqdybhjqlPi6UoMyu87hcuvE40CuWCH8kJfzxw6Csoihifam24fiZN/5dhCmje
CFTQj94j3Y+eAC5y985BtLB8bdWQilJXTP3wDxCZTpcmTcODFZfA+hDkswKBgCqz
mE5lrQvil19nZcHb5RLJyR9ZJXqVCgTX+J/ROEBU1iI/6CLueRO4rzLfdLM2cpe7
FsAsPS+cD9XruA1MNg2EHv9FvOPKa1xW4dIzpd5vBvgLxySdzKbugWAoEzCwR+Nq
nPVUUMhl6zDh9TAevsoBaCzSP3gZwzO/PO6dbsrVAoGBAK6weNT8OfvNyVQOLTp9
6iTYT1eHnxQyWI7jxU64KYhect6KbdrhUYMMs3AcorU4QmzzAeIidNwVLTe0FBjw
1hQhnoLA8LeLdjXkfeo0LzfRwVIBJUKdXv8BLtJVVgQmy2qTaHfGAldVEBGoz7j+
gKivYhI5cYoUTpaSPpSODTM3
-----END PRIVATE KEY-----

View File

@ -0,0 +1,51 @@
package com.fastbee.common.utils.pay;
import java.io.*;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;
public class wxPayConfig {
// 获取商户私钥
public static PrivateKey getPrivateKey(String privateKeyPath) {
try {
// 读取私钥文件内容
String privateKeyContent = readFile(privateKeyPath);
// 去除私钥文件中的头尾信息
privateKeyContent = privateKeyContent.replace("-----BEGIN PRIVATE KEY-----", "")
.replace("-----END PRIVATE KEY-----", "")
.replaceAll("\\s+", "");
// 使用Base64解码
byte[] keyBytes = Base64.getDecoder().decode(privateKeyContent);
// 通过PKCS#8EncodedKeySpec指定者来构造PrivateKey对象
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
// 获取RSA KeyFactory对象
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
// 从PKCS#8EncodedKeySpec指定者中构造出PrivateKey对象
return keyFactory.generatePrivate(keySpec);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
// 读取文件内容为字符串
private static String readFile(String filePath) {
StringBuilder fileContent = new StringBuilder("");
try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
String line;
while ((line = reader.readLine()) != null) {
fileContent.append(line);
}
} catch (IOException e) {
e.printStackTrace();
}
return fileContent.toString();
}
// 这里可以添加其他与微信支付相关的配置方法
}

View File

@ -0,0 +1,246 @@
package com.fastbee.data.controller.pay;
import cn.hutool.crypto.digest.DigestUtil;
import cn.hutool.json.JSONException;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.hutool.json.ObjectMapper;
import com.fastbee.common.core.controller.BaseController;
import com.fastbee.common.core.domain.AjaxResult;
import com.fastbee.common.utils.pay.AesUtil;
import com.fastbee.common.wechat.WeChatLoginBody;
import com.fastbee.rechargecard.domain.NgUserRechargeRecords;
import com.fastbee.rechargecard.domain.dto.RechargecardUser;
import com.fastbee.rechargecard.domain.dto.WeChatRecharge;
import com.fastbee.rechargecard.domain.dto.WeChatRechargeBacktracking;
import com.fastbee.rechargecard.service.INgUserRechargeRecordsService;
import com.fastbee.rechargecard.service.IUserConsumptionDetailsService;
import com.fastbee.rechargecard.service.IUserRechargeCardsService;
import com.fasterxml.jackson.databind.JsonNode;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.PrivateKey;
import java.security.Signature;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import com.fastbee.common.utils.pay.wxPayConfig;
import static cn.hutool.core.util.XmlUtil.xmlToMap;
import static com.fastbee.common.constant.Constants.LANGUAGE;
@Api(tags = "支付模块")
@Slf4j
@RestController
@RequestMapping("/pay")
public class WeChatPayController extends BaseController {
/** 商户号 */
public static String mchId = "1531795301";
/** 商户API私钥文件路径 */
public static String privateKeyPath = "fastbee-common/src/main/java/com/fastbee/common/utils/pay/apiclient_key.pem";
/** 商户API证书序列号 */
public static String serial_no = "3075B63EF52666EDC3EAFC5D4FB35C02CE123A9C";
/** 商户APIV3密钥 */
public static String apiV3Key = "e85a203e8ca146102f5cd7ecff912580";
//微信小程序appid
public static String appId="wx308612d2a8423311";
//请求随机串
public static String nonce_str="";
//时间戳
public static String timeStamp="";
// 使用HttpClientBuilder创建CloseableHttpClient实例采用默认配置
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
@Autowired
private INgUserRechargeRecordsService ngUserRechargeRecordsService;
@Autowired
private IUserRechargeCardsService userRechargeCardsService;
@Autowired
private IUserConsumptionDetailsService userConsumptionDetailsService;
/**
* 微信支付生成订单
* @return 登录结果
*/
@ApiOperation("生成订单")
@PostMapping("/order")
public AjaxResult BuildOrder(@RequestBody WeChatRecharge recharge) throws Exception {
String out_trade_no=UUID.randomUUID().toString().replace("-", "");
while(ngUserRechargeRecordsService.SelectRechargeRecodeByRechargeCode(out_trade_no) !=null)
{
out_trade_no=UUID.randomUUID().toString().replace("-", "");;
}
recharge.setRechargeCode(out_trade_no);
Map<String,String> result=CreateOrder(recharge);//生成订单
if(result.isEmpty())
{
return toAjax("微信支付订单生成失败");
}
//订单生成成功
int flag=ngUserRechargeRecordsService.insertNgUserRechargeRecordsWeChat(recharge);//插入用户充值记录表
flag=userConsumptionDetailsService.insertUserConsumptionDetailsWechat(recharge);//插入用户消费明细表
if(flag==1)
{
return success(result);
}
return toAjax("系统内部订单生成失败");
}
@PostMapping("/getresult")
@ApiOperation("支付通知结果回溯")
@ResponseBody
public String getResult(@RequestBody WeChatRechargeBacktracking backtracking) throws Exception {
String algorithm=backtracking.getResource().getAlgorithm();
String nonce=backtracking.getResource().getNonce();
String associated_data=backtracking.getResource().getAssociated_data();
String cliphertext=backtracking.getResource().getCliphertext();
AesUtil aesUtil=new AesUtil(apiV3Key.getBytes("utf-8"));
//解密后的值
String decryptKey=aesUtil.decryptToString(associated_data.getBytes("utf-8"),nonce.getBytes("utf-8"),cliphertext);
System.out.println("解密后的:"+decryptKey);
return decryptKey;
}
/**
* 创建订单获取prepay_id和paySign
* @param recharge
* @return
* @throws Exception
*/
public Map<String, String> CreateOrder(WeChatRecharge recharge) throws Exception{
System.out.println("CreateOrder");
//请求URL
HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi");
Map<String,String> result=new HashMap<>();
Map<String,Object> reqdata=new HashMap<String,Object>();
Map<String,Object> amount=new HashMap<>();
Map<String,Object> payer=new HashMap<>();
amount.put("total",recharge.getTotal());
amount.put("currency",recharge.getCurrency());
payer.put("openid",recharge.getOpenId());
reqdata.put("amount",amount);
reqdata.put("appid",appId);
reqdata.put("mchid",mchId);
reqdata.put("description",recharge.getCardnumber()+recharge.getAmount().toString());
reqdata.put("out_trade_no",recharge.getRechargeCode());
reqdata.put("notify_url","https://1481109f.r3.cpolar.cn/pay/getresult");
reqdata.put("payer",payer);
String Signature=getSign(reqdata);
result.put("paySign",Signature);
String Authorization="WECHATPAY2-SHA256-RSA2048 mchid=\""+mchId+"\",nonce_str=\""+nonce_str+"\",signature=\""+Signature+"\",timestamp=\""+timeStamp+"\",serial_no=\""+serial_no+"\"";
StringEntity entity = new StringEntity(JSONUtil.toJsonStr(reqdata), "utf-8");
entity.setContentType("application/json");
httpPost.setEntity(entity);
httpPost.setHeader("Accept", "application/json");
httpPost.setHeader("Authorization",Authorization);
//完成签名并执行请求
CloseableHttpResponse response = httpClient.execute(httpPost);
try {
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 200) {
// 假设responseEntity是包含JSON响应的字符串
String responseEntity = EntityUtils.toString(response.getEntity());
// 使用Hutool的JSONUtil解析JSON字符串
JSONObject jsonObject = JSONUtil.parseObj(responseEntity);
// 安全地获取prepay_id的值
String prepayId = jsonObject.getStr("prepay_id");
System.out.println("Prepay ID: " + prepayId);
result.put("prepay_id",prepayId);
System.out.println("success,return body = " + prepayId);
return result;
} else if (statusCode == 204) {
return null;
} else {
System.out.println("failed,resp code = " + statusCode + ",return body = " + EntityUtils.toString(response.getEntity()));
throw new IOException("request failed");
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
response.close();
httpClient.close();
}
}
/**
* 生成签名
*/
public String getSign(Map<String,Object> reqBody) throws Exception {
//获取时间戳
String reqMethod="POST";
String url="/v3/pay/transactions/jsapi";
/*String reqMethod="GET";
String url="/v3/refund/domestic/refunds/123123123123";*/
timeStamp = String.valueOf(System.currentTimeMillis() / 1000);
//timeStamp="1554208460";
nonce_str= UUID.randomUUID().toString();
//nonce_str="593BEC0C930BF1AFEB40B4A08C8FB242";
String reqParam= JSONUtil.toJsonStr(reqBody);
/*HTTP请求方法\n
URL\n
请求时间戳\n
请求随机串\n
请求报文主体\n
*/
String signStr=reqMethod+"\n"+url+"\n"+timeStamp+"\n"+nonce_str+"\n"+reqParam +"\n";
//String signStr=reqMethod+"\n"+url+"\n"+timeStamp+"\n"+nonce_str+"\n\n";
String sign=sign(signStr.getBytes("utf-8"));
/*//进行sha256
String sha256HexSignStr = DigestUtil.sha256Hex(signStr);
//在进行base64
String base64SignStr = Base64.getEncoder().encodeToString(sha256HexSignStr.getBytes());
*/
return sign;
}
/**
* 生成签名方法
* @param message
* @return
* @throws Exception
*/
private String sign(byte[] message) throws Exception{
Signature sign;
sign = Signature.getInstance("SHA256withRSA");
//这里需要一个PrivateKey类型的参数就是商户的私钥
//获取商户私钥传商户私钥位置
PrivateKey privateKey = wxPayConfig.getPrivateKey(privateKeyPath);
sign.initSign(privateKey);
sign.update(message);
return Base64.getEncoder().encodeToString(sign.sign());
}
}

View File

@ -36,7 +36,6 @@ public class UserRechargeController extends BaseController {
@ApiOperation("修改用户充值卡") @ApiOperation("修改用户充值卡")
public AjaxResult result(@RequestBody RechargecardUser rechargecardUser) public AjaxResult result(@RequestBody RechargecardUser rechargecardUser)
{ {
return toAjax(userRechargeCardsService.updateUserRecharge(rechargecardUser)); return toAjax(userRechargeCardsService.updateUserRecharge(rechargecardUser));
} }
} }

View File

@ -63,6 +63,9 @@
<groupId>com.fastbee</groupId> <groupId>com.fastbee</groupId>
<artifactId>fastbee-framework</artifactId> <artifactId>fastbee-framework</artifactId>
</dependency> </dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -23,6 +23,42 @@
<groupId>com.fastbee</groupId> <groupId>com.fastbee</groupId>
<artifactId>fastbee-common</artifactId> <artifactId>fastbee-common</artifactId>
</dependency> </dependency>
<!-- 微信支付 -->
<!--<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
<version>4.4.2.B</version>
</dependency>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-pay</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
<version>4.4.0</version>
</dependency>-->
<!--微信支付-->
<dependency>
<groupId>com.github.wechatpay-apiv3</groupId>
<artifactId>wechatpay-java</artifactId>
<version>0.2.15</version>
</dependency>
<dependency>
<groupId>com.github.wechatpay-apiv3</groupId>
<artifactId>wechatpay-apache-httpclient</artifactId>
<version>0.5.0</version>
</dependency>
</dependencies> </dependencies>
<properties> <properties>

View File

@ -0,0 +1,18 @@
package com.fastbee.rechargecard.domain.dto;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class WeChatRecharge {
private Integer cardnumber;//卡号
private BigDecimal amount;//充值金额
private Integer type;//充值方式
private Integer areacode;//区域码
private String deviceNumber;//设备码
private Integer water;//充值水量
private String rechargeCode;//订单号
private String openId;//openId
private BigDecimal total;//amount中的total
private String currency;//amount中的currency
}

View File

@ -0,0 +1,13 @@
package com.fastbee.rechargecard.domain.dto;
import lombok.Data;
@Data
public class WeChatRechargeBacktracking {
private String id;
private String create_time;
private String resource_type;
private String event_type;
private String summary;
private WeChatRechargeBacktrackingResource resource;
}

View File

@ -0,0 +1,13 @@
package com.fastbee.rechargecard.domain.dto;
import lombok.Data;
@Data
public class WeChatRechargeBacktrackingResource{
private String original_type;
private String algorithm;
private String cliphertext;
private String associated_data;
private String nonce;
}

View File

@ -3,6 +3,7 @@ package com.fastbee.rechargecard.mapper;
import java.util.List; import java.util.List;
import com.fastbee.rechargecard.domain.NgUserRechargeRecords; import com.fastbee.rechargecard.domain.NgUserRechargeRecords;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
/** /**
* 用户充值记录Mapper接口 * 用户充值记录Mapper接口
@ -13,6 +14,13 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper @Mapper
public interface NgUserRechargeRecordsMapper public interface NgUserRechargeRecordsMapper
{ {
/**
* 根据订单号查询充值记录
* @param rechargeCode
* @return
*/
@Select("select * from ng_user_recharge_records where recharge_code=#{rechargeCode}")
public NgUserRechargeRecords SelectRechargeRecodeByRechargeCode(String rechargeCode);
/** /**
* 查询用户充值记录 * 查询用户充值记录
* *
@ -21,6 +29,13 @@ public interface NgUserRechargeRecordsMapper
*/ */
public List<NgUserRechargeRecords> selectNgUserRechargeRecordsByCardNumber(NgUserRechargeRecords ngUserRechargeRecords); public List<NgUserRechargeRecords> selectNgUserRechargeRecordsByCardNumber(NgUserRechargeRecords ngUserRechargeRecords);
/**
* 根据订单编号查询用户充值记录
* @param rechargeCode
* @return
*/
public NgUserRechargeRecords selectNgUserRechargeRecordsByRechargeCode(String rechargeCode);
/** /**
* 查询充值机充值记录 * 查询充值机充值记录
* *
@ -53,6 +68,11 @@ public interface NgUserRechargeRecordsMapper
*/ */
public int updateNgUserRechargeRecords(NgUserRechargeRecords ngUserRechargeRecords); public int updateNgUserRechargeRecords(NgUserRechargeRecords ngUserRechargeRecords);
/**
* 微信支付成功后修改用户充值记录状态为已支付
*/
public int updateNgUserRechargeRecordsWechat(NgUserRechargeRecords ngUserRechargeRecords);
/** /**
* 删除用户充值记录 * 删除用户充值记录
* *

View File

@ -2,6 +2,8 @@ package com.fastbee.rechargecard.service;
import java.util.List; import java.util.List;
import com.fastbee.rechargecard.domain.NgUserRechargeRecords; import com.fastbee.rechargecard.domain.NgUserRechargeRecords;
import com.fastbee.rechargecard.domain.dto.RechargecardUser;
import com.fastbee.rechargecard.domain.dto.WeChatRecharge;
import com.fastbee.rechargecard.mapper.NgUserRechargeRecordsMapper; import com.fastbee.rechargecard.mapper.NgUserRechargeRecordsMapper;
/** /**
@ -12,6 +14,21 @@ import com.fastbee.rechargecard.mapper.NgUserRechargeRecordsMapper;
*/ */
public interface INgUserRechargeRecordsService public interface INgUserRechargeRecordsService
{ {
/**
* 根据订单编号查找充值记录
* @param rechargeCode
* @return
*/
public NgUserRechargeRecords SelectRechargeRecodeByRechargeCode(String rechargeCode);
/**
* 微信充值-新增用户充值记录
*
* @param
* @return 结果
*/
public int insertNgUserRechargeRecordsWeChat(WeChatRecharge recharge);
/** /**
* 查询用户充值记录 * 查询用户充值记录
* *

View File

@ -3,6 +3,7 @@ package com.fastbee.rechargecard.service;
import java.util.List; import java.util.List;
import com.fastbee.rechargecard.domain.UserConsumptionDetails; import com.fastbee.rechargecard.domain.UserConsumptionDetails;
import com.fastbee.rechargecard.domain.dto.UserConsumptionDetailsDto; import com.fastbee.rechargecard.domain.dto.UserConsumptionDetailsDto;
import com.fastbee.rechargecard.domain.dto.WeChatRecharge;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
/** /**
@ -83,4 +84,9 @@ public interface IUserConsumptionDetailsService
* @return 结果 * @return 结果
*/ */
public int deleteUserConsumptionDetailsById(Long id); public int deleteUserConsumptionDetailsById(Long id);
/**
* 插入微信支付用户充值卡账单明细记录
*/
public int insertUserConsumptionDetailsWechat(WeChatRecharge recharge);
} }

View File

@ -48,6 +48,13 @@ public interface IUserRechargeCardsService
*/ */
public int updateUserRechargeCards(UserRechargeCards userRechargeCards); public int updateUserRechargeCards(UserRechargeCards userRechargeCards);
/**
* 微信支付后修改用户充值卡余额以及订单状态
* @param rechargeCode
* @return
*/
public int updateUserRechargeWechat(String rechargeCode);
/** /**
* 批量删除用户充值卡 * 批量删除用户充值卡
* *

View File

@ -2,6 +2,8 @@ package com.fastbee.rechargecard.service.impl;
import java.util.List; import java.util.List;
import com.fastbee.common.utils.DateUtils; import com.fastbee.common.utils.DateUtils;
import com.fastbee.rechargecard.domain.dto.RechargecardUser;
import com.fastbee.rechargecard.domain.dto.WeChatRecharge;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.fastbee.rechargecard.mapper.NgUserRechargeRecordsMapper; import com.fastbee.rechargecard.mapper.NgUserRechargeRecordsMapper;
@ -20,6 +22,24 @@ public class NgUserRechargeRecordsServiceImpl implements INgUserRechargeRecordsS
@Autowired @Autowired
private NgUserRechargeRecordsMapper ngUserRechargeRecordsMapper; private NgUserRechargeRecordsMapper ngUserRechargeRecordsMapper;
@Override
public NgUserRechargeRecords SelectRechargeRecodeByRechargeCode(String rechargeCode) {
return ngUserRechargeRecordsMapper.SelectRechargeRecodeByRechargeCode(rechargeCode);
}
@Override
public int insertNgUserRechargeRecordsWeChat(WeChatRecharge rechargecardUser) {
NgUserRechargeRecords ngUserRechargeRecords=new NgUserRechargeRecords();
ngUserRechargeRecords.setRechargeTime(DateUtils.getNowDate());
ngUserRechargeRecords.setBalance(rechargecardUser.getAmount());
ngUserRechargeRecords.setType(1);//微信
ngUserRechargeRecords.setStatus(0);//生成订单
ngUserRechargeRecords.setAreaCode(String.valueOf(rechargecardUser.getAreacode()));
ngUserRechargeRecords.setCardNumber(String.valueOf(rechargecardUser.getCardnumber()));
ngUserRechargeRecords.setRechargeCode(rechargecardUser.getRechargeCode());
return ngUserRechargeRecordsMapper.insertNgUserRechargeRecords(ngUserRechargeRecords);
}
/** /**
* 查询用户充值记录 * 查询用户充值记录
* *

View File

@ -6,6 +6,7 @@ import java.util.List;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.fastbee.common.utils.DateUtils; import com.fastbee.common.utils.DateUtils;
import com.fastbee.rechargecard.domain.dto.UserConsumptionDetailsDto; import com.fastbee.rechargecard.domain.dto.UserConsumptionDetailsDto;
import com.fastbee.rechargecard.domain.dto.WeChatRecharge;
import com.fastbee.system.mapper.SysUserMapper; import com.fastbee.system.mapper.SysUserMapper;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -201,4 +202,21 @@ public class UserConsumptionDetailsServiceImpl implements IUserConsumptionDetail
{ {
return userConsumptionDetailsMapper.deleteUserConsumptionDetailsById(id); return userConsumptionDetailsMapper.deleteUserConsumptionDetailsById(id);
} }
@Override
public int insertUserConsumptionDetailsWechat(WeChatRecharge recharge) {
UserConsumptionDetails userConsumptionDetails=new UserConsumptionDetails();
userConsumptionDetails.setCardNumber(String.valueOf(recharge.getCardnumber()));
userConsumptionDetails.setBillingType(0);
userConsumptionDetails.setAreaCode(String.valueOf(recharge.getAreacode()));
userConsumptionDetails.setAmountDue(recharge.getAmount());
userConsumptionDetails.setBillingDate(DateUtils.getNowDate());
userConsumptionDetails.setPaymentStatus(0);
userConsumptionDetails.setPaymentMethod(recharge.getType());
userConsumptionDetails.setPaymentTime(DateUtils.getNowDate());
userConsumptionDetails.setStatus(0);
userConsumptionDetails.setCreateTime(DateUtils.getNowDate());
return userConsumptionDetailsMapper.insertUserConsumptionDetails(userConsumptionDetails);
}
} }

View File

@ -100,6 +100,58 @@ public class UserRechargeCardsServiceImpl implements IUserRechargeCardsService
return userRechargeCardsMapper.updateUserRechargeCards(userRechargeCards); return userRechargeCardsMapper.updateUserRechargeCards(userRechargeCards);
} }
/**
* 微信支付后修改用户充值卡余额以及订单状态
* @param rechargeCode
* @return
*/
@Override
public int updateUserRechargeWechat(String rechargeCode) {
NgUserRechargeRecords ngUserRechargeRecords=new NgUserRechargeRecords();
ngUserRechargeRecords=userRechargeRecordsMapper.selectNgUserRechargeRecordsByRechargeCode(rechargeCode);//查询订单信息
ngUserRechargeRecords.setStatus(1);//状态更改为已支付
ngUserRechargeRecords.setRechargeCode(rechargeCode);
/* userConsumptionDetails.setCreateTime(DateUtils.getNowDate());
NgUserRechargeRecords ngUserRechargeRecords = NgUserRechargeRecords.builder()
.userId(info.getUserId()).userName(info.getUserName())
.cardNumber(info.getCardNumber()).areaCode(rechargecardUser.getAreacode())
.type(rechargecardUser.getStatus()).amount(rechargecardUser.getNumber())
.balance(info.getBalance()).rechargeTime(DateUtils.getNowDate())
.rechargeCode(null).status(0).serialNumber(null).deviceNumber(null).projectId(null)
.deptId(null)
.areaCode(rechargecardUser.getAreacode())
.build();*/
userRechargeRecordsMapper.updateNgUserRechargeRecordsWechat(ngUserRechargeRecords);
/*RechargecardUser rechargecardUser=new RechargecardUser();
// 计算新的余额
BigDecimal newBalance = rechargecardUser.getAmount().add(info.getBalance());*/
// 更新用户充值卡信息包括新的余额
// info.setBalance(newBalance);
// info.setUpdateTime(DateUtils.getNowDate());
// info.setAreaCode(String.valueOf(rechargecardUser.getAreaCode()));
/*//构建主题
String topic ="hzlink/147/"+rechargecardUser.getDeviceNumber()+"/cmd/down";
//构建消息
Map<String,Object> param = new HashMap<>();
//远程阀控
param.put("cmd",1000);
Map<String,Object> data = new HashMap<>();
data.put("orderNum", ngUserRechargeRecords.getId());
data.put("cardNum",rechargecardUser.getCardnumber());
data.put("areaCode",rechargecardUser.getAreacode());
data.put("investBalance",rechargecardUser.getAmount().doubleValue());
data.put("investWater",rechargecardUser.getWater());
param.put("data",data);
pubMqttClient.publish(1,true,topic, JSONUtil.toJsonStr(param));*/
// int i = userRechargeCardsMapper.updateUserRechargeCards(info);
return 1;
}
/** /**
* 批量删除用户充值卡 * 批量删除用户充值卡
* *

View File

@ -76,6 +76,27 @@
</where> </where>
</select> </select>
<select id="selectNgUserRechargeRecordsByRechargeCode" parameterType="String" resultMap="NgUserRechargeRecordsResult">
<include refid="selectNgUserRechargeRecordsVo"/>
<where>
<if test="cardNumber != null and cardNumber != ''"> card_number = #{cardNumber}</if>
<if test="userId != null "> and user_id = #{userId}</if>
<if test="userName != null and userName != ''"> and user_name like concat('%', #{userName}, '%')</if>
<if test="areaCode != null and areaCode != ''"> and area_code = #{areaCode}</if>
<if test="type != null "> and type = #{type}</if>
<if test="amount != null "> and amount = #{amount}</if>
<if test="balance != null "> and balance = #{balance}</if>
<if test="rechargeTime != null "> and recharge_time = #{rechargeTime}</if>
<if test="rechargeCode != null and rechargeCode != ''"> and recharge_code = #{rechargeCode}</if>
<if test="status != null "> and status = #{status}</if>
<if test="serialNumber != null and serialNumber != ''"> and serial_number = #{serialNumber}</if>
<if test="deviceNumber != null and deviceNumber != ''"> and device_number = #{deviceNumber}</if>
<if test="projectId != null "> and project_id = #{projectId}</if>
<if test="deptId != null "> and dept_id = #{deptId}</if>
</where>
</select>
<select id="selectNgUserRechargeRecordsBySerialNumber" parameterType="NgUserRechargeRecords" resultMap="NgUserRechargeRecordsResult"> <select id="selectNgUserRechargeRecordsBySerialNumber" parameterType="NgUserRechargeRecords" resultMap="NgUserRechargeRecordsResult">
<include refid="selectNgUserRechargeRecordsVo"/> <include refid="selectNgUserRechargeRecordsVo"/>
<where> <where>
@ -168,6 +189,31 @@
where id = #{id} where id = #{id}
</update> </update>
<update id="updateNgUserRechargeRecordsWechat" parameterType="NgUserRechargeRecords">
update ng_user_recharge_records
<trim prefix="SET" suffixOverrides=",">
<if test="userId != null">user_id = #{userId},</if>
<if test="userName != null">user_name = #{userName},</if>
<if test="cardNumber != null and cardNumber != ''">card_number = #{cardNumber},</if>
<if test="areaCode != null">area_code = #{areaCode},</if>
<if test="type != null">type = #{type},</if>
<if test="amount != null">amount = #{amount},</if>
<if test="balance != null">balance = #{balance},</if>
<if test="rechargeTime != null">recharge_time = #{rechargeTime},</if>
<if test="status != null">status = #{status},</if>
<if test="serialNumber != null and serialNumber != ''">serial_number = #{serialNumber},</if>
<if test="remark != null">remark = #{remark},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="createBy != null">create_by = #{createBy},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>
<if test="deviceNumber != null">device_number = #{deviceNumber},</if>
<if test="projectId != null">project_id = #{projectId},</if>
<if test="deptId != null">dept_id = #{deptId},</if>
</trim>
where recharge_code = #{rechargeCode}
</update>
<delete id="deleteNgUserRechargeRecordsById" parameterType="Long"> <delete id="deleteNgUserRechargeRecordsById" parameterType="Long">
delete from ng_user_recharge_records where id = #{id} delete from ng_user_recharge_records where id = #{id}
</delete> </delete>

View File

@ -490,6 +490,9 @@
<version>${fastbee.version}</version> <version>${fastbee.version}</version>
</dependency> </dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>