From 27eac91d1ca946d0455220f2b1f397a6e87c714b Mon Sep 17 00:00:00 2001 From: tongliran Date: Tue, 24 Dec 2024 17:39:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E4=BB=98=E6=A8=A1=E5=9D=97-=E4=B8=8B?= =?UTF-8?q?=E5=8D=95=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-dev.yml | 9 + .../src/main/resources/application.yml | 2 + .../com/fastbee/common/utils/pay/AesUtil.java | 50 ++++ .../common/utils/pay/apiclient_key.pem | 28 ++ .../fastbee/common/utils/pay/wxPayConfig.java | 51 ++++ .../controller/pay/WeChatPayController.java | 246 ++++++++++++++++++ .../userRecharge/UserRechargeController.java | 1 - fastbee-pay/fastbee-pay-core/pom.xml | 3 + fastbee-pay/pom.xml | 36 +++ .../domain/dto/WeChatRecharge.java | 18 ++ .../dto/WeChatRechargeBacktracking.java | 13 + .../WeChatRechargeBacktrackingResource.java | 13 + .../mapper/NgUserRechargeRecordsMapper.java | 20 ++ .../INgUserRechargeRecordsService.java | 17 ++ .../IUserConsumptionDetailsService.java | 6 + .../service/IUserRechargeCardsService.java | 7 + .../NgUserRechargeRecordsServiceImpl.java | 20 ++ .../UserConsumptionDetailsServiceImpl.java | 18 ++ .../impl/UserRechargeCardsServiceImpl.java | 52 ++++ .../NgUserRechargeRecordsMapper.xml | 46 ++++ pom.xml | 3 + 21 files changed, 658 insertions(+), 1 deletion(-) create mode 100644 fastbee-common/src/main/java/com/fastbee/common/utils/pay/AesUtil.java create mode 100644 fastbee-common/src/main/java/com/fastbee/common/utils/pay/apiclient_key.pem create mode 100644 fastbee-common/src/main/java/com/fastbee/common/utils/pay/wxPayConfig.java create mode 100644 fastbee-open-api/src/main/java/com/fastbee/data/controller/pay/WeChatPayController.java create mode 100644 fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/domain/dto/WeChatRecharge.java create mode 100644 fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/domain/dto/WeChatRechargeBacktracking.java create mode 100644 fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/domain/dto/WeChatRechargeBacktrackingResource.java diff --git a/fastbee-admin/src/main/resources/application-dev.yml b/fastbee-admin/src/main/resources/application-dev.yml index e8a17df..fed0608 100644 --- a/fastbee-admin/src/main/resources/application-dev.yml +++ b/fastbee-admin/src/main/resources/application-dev.yml @@ -115,6 +115,15 @@ sip: id: 34020000002000000001 # 同上,另外增加编号,(可保持默认) password: 12345678 # 监控设备接入的密码 +#微信支付 +wx: + pay: + appId: wx308612d2a8423311 #微信公众号或者小程序等的appid + secret: 7f591f559929a3bf2dbea4e156b08ae9 + mchId: #微信支付商户号 + mchKey: #微信支付商户密钥 + notifyUrl: http://192.168.1.5:13088/pay/wxCallback #支付回调地址 + # 日志配置 logging: level: diff --git a/fastbee-admin/src/main/resources/application.yml b/fastbee-admin/src/main/resources/application.yml index 26de6ba..489c523 100644 --- a/fastbee-admin/src/main/resources/application.yml +++ b/fastbee-admin/src/main/resources/application.yml @@ -56,6 +56,8 @@ server: platform: expried: 120 + + # Spring配置 spring: # 环境配置,dev=开发环境,prod=生产环境 diff --git a/fastbee-common/src/main/java/com/fastbee/common/utils/pay/AesUtil.java b/fastbee-common/src/main/java/com/fastbee/common/utils/pay/AesUtil.java new file mode 100644 index 0000000..0ea21af --- /dev/null +++ b/fastbee-common/src/main/java/com/fastbee/common/utils/pay/AesUtil.java @@ -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); + } + } +} \ No newline at end of file diff --git a/fastbee-common/src/main/java/com/fastbee/common/utils/pay/apiclient_key.pem b/fastbee-common/src/main/java/com/fastbee/common/utils/pay/apiclient_key.pem new file mode 100644 index 0000000..065f5a5 --- /dev/null +++ b/fastbee-common/src/main/java/com/fastbee/common/utils/pay/apiclient_key.pem @@ -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----- diff --git a/fastbee-common/src/main/java/com/fastbee/common/utils/pay/wxPayConfig.java b/fastbee-common/src/main/java/com/fastbee/common/utils/pay/wxPayConfig.java new file mode 100644 index 0000000..7710a3d --- /dev/null +++ b/fastbee-common/src/main/java/com/fastbee/common/utils/pay/wxPayConfig.java @@ -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(); + } + + // 这里可以添加其他与微信支付相关的配置方法 +} \ No newline at end of file diff --git a/fastbee-open-api/src/main/java/com/fastbee/data/controller/pay/WeChatPayController.java b/fastbee-open-api/src/main/java/com/fastbee/data/controller/pay/WeChatPayController.java new file mode 100644 index 0000000..6442a29 --- /dev/null +++ b/fastbee-open-api/src/main/java/com/fastbee/data/controller/pay/WeChatPayController.java @@ -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 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 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 result=new HashMap<>(); + + Map reqdata=new HashMap(); + Map amount=new HashMap<>(); + Map 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 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()); + } +} diff --git a/fastbee-open-api/src/main/java/com/fastbee/data/controller/userRecharge/UserRechargeController.java b/fastbee-open-api/src/main/java/com/fastbee/data/controller/userRecharge/UserRechargeController.java index e475f5e..797f972 100644 --- a/fastbee-open-api/src/main/java/com/fastbee/data/controller/userRecharge/UserRechargeController.java +++ b/fastbee-open-api/src/main/java/com/fastbee/data/controller/userRecharge/UserRechargeController.java @@ -36,7 +36,6 @@ public class UserRechargeController extends BaseController { @ApiOperation("修改用户充值卡") public AjaxResult result(@RequestBody RechargecardUser rechargecardUser) { - return toAjax(userRechargeCardsService.updateUserRecharge(rechargecardUser)); } } diff --git a/fastbee-pay/fastbee-pay-core/pom.xml b/fastbee-pay/fastbee-pay-core/pom.xml index 86962c6..ea753e0 100644 --- a/fastbee-pay/fastbee-pay-core/pom.xml +++ b/fastbee-pay/fastbee-pay-core/pom.xml @@ -63,6 +63,9 @@ com.fastbee fastbee-framework + + + diff --git a/fastbee-pay/pom.xml b/fastbee-pay/pom.xml index dec85d8..c7db205 100644 --- a/fastbee-pay/pom.xml +++ b/fastbee-pay/pom.xml @@ -23,6 +23,42 @@ com.fastbee fastbee-common + + + + + + + com.github.wechatpay-apiv3 + wechatpay-java + 0.2.15 + + + com.github.wechatpay-apiv3 + wechatpay-apache-httpclient + 0.5.0 + + + diff --git a/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/domain/dto/WeChatRecharge.java b/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/domain/dto/WeChatRecharge.java new file mode 100644 index 0000000..5ea8931 --- /dev/null +++ b/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/domain/dto/WeChatRecharge.java @@ -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 +} diff --git a/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/domain/dto/WeChatRechargeBacktracking.java b/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/domain/dto/WeChatRechargeBacktracking.java new file mode 100644 index 0000000..9b4122f --- /dev/null +++ b/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/domain/dto/WeChatRechargeBacktracking.java @@ -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; +} diff --git a/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/domain/dto/WeChatRechargeBacktrackingResource.java b/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/domain/dto/WeChatRechargeBacktrackingResource.java new file mode 100644 index 0000000..2d5c4bb --- /dev/null +++ b/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/domain/dto/WeChatRechargeBacktrackingResource.java @@ -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; + +} diff --git a/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/mapper/NgUserRechargeRecordsMapper.java b/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/mapper/NgUserRechargeRecordsMapper.java index a70d968..a54642a 100644 --- a/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/mapper/NgUserRechargeRecordsMapper.java +++ b/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/mapper/NgUserRechargeRecordsMapper.java @@ -3,6 +3,7 @@ package com.fastbee.rechargecard.mapper; import java.util.List; import com.fastbee.rechargecard.domain.NgUserRechargeRecords; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; /** * 用户充值记录Mapper接口 @@ -13,6 +14,13 @@ import org.apache.ibatis.annotations.Mapper; @Mapper 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 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 updateNgUserRechargeRecordsWechat(NgUserRechargeRecords ngUserRechargeRecords); + /** * 删除用户充值记录 * diff --git a/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/service/INgUserRechargeRecordsService.java b/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/service/INgUserRechargeRecordsService.java index b588d6c..1192fc8 100644 --- a/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/service/INgUserRechargeRecordsService.java +++ b/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/service/INgUserRechargeRecordsService.java @@ -2,6 +2,8 @@ package com.fastbee.rechargecard.service; import java.util.List; 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; /** @@ -12,6 +14,21 @@ import com.fastbee.rechargecard.mapper.NgUserRechargeRecordsMapper; */ public interface INgUserRechargeRecordsService { + /** + * 根据订单编号查找充值记录 + * @param rechargeCode + * @return + */ + public NgUserRechargeRecords SelectRechargeRecodeByRechargeCode(String rechargeCode); + + /** + * 微信充值-新增用户充值记录 + * + * @param + * @return 结果 + */ + public int insertNgUserRechargeRecordsWeChat(WeChatRecharge recharge); + /** * 查询用户充值记录 * diff --git a/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/service/IUserConsumptionDetailsService.java b/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/service/IUserConsumptionDetailsService.java index a770587..d3f7912 100644 --- a/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/service/IUserConsumptionDetailsService.java +++ b/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/service/IUserConsumptionDetailsService.java @@ -3,6 +3,7 @@ package com.fastbee.rechargecard.service; import java.util.List; import com.fastbee.rechargecard.domain.UserConsumptionDetails; import com.fastbee.rechargecard.domain.dto.UserConsumptionDetailsDto; +import com.fastbee.rechargecard.domain.dto.WeChatRecharge; import org.springframework.stereotype.Service; /** @@ -83,4 +84,9 @@ public interface IUserConsumptionDetailsService * @return 结果 */ public int deleteUserConsumptionDetailsById(Long id); + + /** + * 插入微信支付用户充值卡账单明细记录 + */ + public int insertUserConsumptionDetailsWechat(WeChatRecharge recharge); } diff --git a/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/service/IUserRechargeCardsService.java b/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/service/IUserRechargeCardsService.java index b3d1c2a..3e2f5ba 100644 --- a/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/service/IUserRechargeCardsService.java +++ b/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/service/IUserRechargeCardsService.java @@ -48,6 +48,13 @@ public interface IUserRechargeCardsService */ public int updateUserRechargeCards(UserRechargeCards userRechargeCards); + /** + * 微信支付后修改用户充值卡余额以及订单状态 + * @param rechargeCode + * @return + */ + public int updateUserRechargeWechat(String rechargeCode); + /** * 批量删除用户充值卡 * diff --git a/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/service/impl/NgUserRechargeRecordsServiceImpl.java b/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/service/impl/NgUserRechargeRecordsServiceImpl.java index 8c6ee39..9736e82 100644 --- a/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/service/impl/NgUserRechargeRecordsServiceImpl.java +++ b/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/service/impl/NgUserRechargeRecordsServiceImpl.java @@ -2,6 +2,8 @@ package com.fastbee.rechargecard.service.impl; import java.util.List; 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.stereotype.Service; import com.fastbee.rechargecard.mapper.NgUserRechargeRecordsMapper; @@ -20,6 +22,24 @@ public class NgUserRechargeRecordsServiceImpl implements INgUserRechargeRecordsS @Autowired 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); + } + /** * 查询用户充值记录 * diff --git a/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/service/impl/UserConsumptionDetailsServiceImpl.java b/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/service/impl/UserConsumptionDetailsServiceImpl.java index 2b100c9..3edd5e8 100644 --- a/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/service/impl/UserConsumptionDetailsServiceImpl.java +++ b/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/service/impl/UserConsumptionDetailsServiceImpl.java @@ -6,6 +6,7 @@ import java.util.List; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.fastbee.common.utils.DateUtils; import com.fastbee.rechargecard.domain.dto.UserConsumptionDetailsDto; +import com.fastbee.rechargecard.domain.dto.WeChatRecharge; import com.fastbee.system.mapper.SysUserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -201,4 +202,21 @@ public class UserConsumptionDetailsServiceImpl implements IUserConsumptionDetail { 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); + + } } diff --git a/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/service/impl/UserRechargeCardsServiceImpl.java b/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/service/impl/UserRechargeCardsServiceImpl.java index b66751a..de67f48 100644 --- a/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/service/impl/UserRechargeCardsServiceImpl.java +++ b/fastbee-service/fastbee-rechargecard-service/src/main/java/com/fastbee/rechargecard/service/impl/UserRechargeCardsServiceImpl.java @@ -100,6 +100,58 @@ public class UserRechargeCardsServiceImpl implements IUserRechargeCardsService 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 param = new HashMap<>(); + //远程阀控 + param.put("cmd",1000); + Map 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; + } + /** * 批量删除用户充值卡 * diff --git a/fastbee-service/fastbee-rechargecard-service/src/main/resources/mapper/rechargecard/NgUserRechargeRecordsMapper.xml b/fastbee-service/fastbee-rechargecard-service/src/main/resources/mapper/rechargecard/NgUserRechargeRecordsMapper.xml index b500542..fcc419a 100644 --- a/fastbee-service/fastbee-rechargecard-service/src/main/resources/mapper/rechargecard/NgUserRechargeRecordsMapper.xml +++ b/fastbee-service/fastbee-rechargecard-service/src/main/resources/mapper/rechargecard/NgUserRechargeRecordsMapper.xml @@ -76,6 +76,27 @@ + +