From 70aeac289c132085e91d59dc82bc1facd41889fa Mon Sep 17 00:00:00 2001
From: liurunyu <lry9898@163.com>
Date: 星期一, 24 二月 2025 15:33:53 +0800
Subject: [PATCH] 有关表阀一体机(王江海制定)通信协议: 1、根据新版本协议,解析部分更新; 2、根据测试一体阀协议数据处理需求与逻辑,进行表阀一体机数据处理。
---
pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PaymentCtrl.java | 102 ++++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 84 insertions(+), 18 deletions(-)
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PaymentCtrl.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PaymentCtrl.java
index 2d237fa..af8e887 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PaymentCtrl.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PaymentCtrl.java
@@ -6,6 +6,7 @@
import com.dy.common.webUtil.BaseResponse;
import com.dy.common.webUtil.BaseResponseUtils;
import com.dy.common.webUtil.ResultCodeMsg;
+import com.dy.pipIrrGlobal.cert.WxCertUtil;
import com.dy.pipIrrGlobal.pojoSe.*;
import com.dy.pipIrrGlobal.voSe.VoClient;
import com.dy.pipIrrSell.client.ClientSv;
@@ -18,9 +19,7 @@
import com.dy.pipIrrSell.virtualCard.enums.LastOperateENUM;
import com.dy.pipIrrSell.virtualCard.enums.RefundItemStateENUM;
import com.dy.pipIrrSell.wallet.enums.RefundStatusENUM;
-import com.dy.pipIrrSell.wechatpay.dto.DtoOrder;
-import com.dy.pipIrrSell.wechatpay.dto.NotifyResource;
-import com.dy.pipIrrSell.wechatpay.dto.OrderNotify;
+import com.dy.pipIrrSell.wechatpay.dto.*;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
@@ -32,6 +31,7 @@
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.core.io.ResourceLoader;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.transaction.annotation.Transactional;
@@ -47,10 +47,7 @@
import java.security.SignatureException;
import java.security.spec.InvalidKeySpecException;
import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
/**
* @author ZhuBaoMin
@@ -65,14 +62,17 @@
@RequestMapping(path="payment")
@RequiredArgsConstructor
public class PaymentCtrl {
+ private final ResourceLoader resourceLoader;
+
private final PaymentSv paymentSv;
private final RestTemplateUtil restTemplateUtil;
private final PayHelper payHelper;
private final VirtualCardSv virtualCardSv;
private final ClientSv clientSv;
- private final String privateCertFileName = PayInfo.privateCertFileName;
+ //private final String privateCertFileName = PayInfo.privateCertFileName;
private final String appid = PayInfo.appid;
+ private final String secret = PayInfo.secret;
private final String mchid = PayInfo.mchid;
private final String schema = PayInfo.schema;
private final String signType = PayInfo.signType;
@@ -83,6 +83,68 @@
// 骞冲彴璇佷功鍏挜
private final Map CERTIFICATE_MAP = new HashMap();
+
+ /**
+ * 鐧诲綍鍑瘉鏍¢獙锛屽啘鎴风粦瀹氳处鍙烽�昏緫鍖呭惈鐧诲綍鍑瘉鏍¢獙锛屾鎺ュ彛浣滃簾
+ * @param code2Session 鐧诲綍鍑瘉鏍¢獙浼犲叆瀵硅薄
+ * @param bindingResult
+ * @return
+ * @throws Exception
+ */
+ @Operation(summary = "鐧诲綍鍑瘉鏍¢獙", description = "鐧诲綍鍑瘉鏍¢獙")
+ @ApiResponses(value = {
+ @ApiResponse(
+ responseCode = ResultCodeMsg.RsCode.SUCCESS_CODE,
+ description = "鎿嶄綔缁撴灉锛歵rue锛氭垚鍔燂紝false锛氬け璐ワ紙BaseResponse.content锛�",
+ content = {@Content(mediaType = MediaType.APPLICATION_JSON_VALUE,
+ schema = @Schema(implementation = Boolean.class))}
+ )
+ })
+ @PostMapping(path = "getSessionId")
+ @Transactional(rollbackFor = Exception.class)
+ @SsoAop()
+ public BaseResponse<Boolean> getSessionId(@RequestBody @Valid Code2Session code2Session, BindingResult bindingResult) throws Exception {
+ if(bindingResult != null && bindingResult.hasErrors()){
+ return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
+ }
+
+ String phoneNumber = code2Session.getPhoneNumber();
+ String jsCode = code2Session.getJs_code();
+
+ Map<String, Object> queryParams = new HashMap<>();
+ queryParams.put("appid", appid);
+ queryParams.put("secret", secret);
+ queryParams.put("js_code", jsCode);
+ queryParams.put("grant_type", grantType);
+ Map<String, String> headerParams = new HashMap<>();
+ JSONObject job = restTemplateUtil.get(loginUrl, queryParams, headerParams);
+
+ if(job.getLong("errcode") != null && job.getLong("errcode") >= -1) {
+ return BaseResponseUtils.buildFail("鐧诲綍鍑瘉鏍¢獙澶辫触");
+ }
+
+ String openid = job.getString("openid");
+ String sessionKey = job.getString("session_key");
+
+ Long clientId = clientSv.getClientIdByPhone(phoneNumber);
+ String SessionId = "";
+ if(clientId != null) {
+ // 娣诲姞寰俊鐢ㄦ埛璐︽埛璁板綍
+ SeOpenId seOpenId = new SeOpenId();
+ seOpenId.setClientId(clientId);
+ seOpenId.setOpenId(openid);
+ seOpenId.setSessionKey(sessionKey);
+ seOpenId.setCreateTime(new Date());
+ Long rec = clientSv.addOpenId(seOpenId);
+ if(rec != null) {
+ SessionId = String.valueOf(rec);
+ }
+ return BaseResponseUtils.buildSuccess(SessionId);
+
+ } else {
+ return BaseResponseUtils.buildError(SellResultCode.PHONE_NUMBER_IS_ERROR.getMessage());
+ }
+ }
/**
* 涓嬭浇寰俊鏀粯骞冲彴璇佷功 娴嬭瘯瀹屽簾闄�
@@ -107,7 +169,8 @@
String nonceStr = payHelper.generateRandomString();
Long timestamp = System.currentTimeMillis() / 1000;
- String header = schema + " " + payHelper.getToken(method, httpUrl, "", nonceStr, timestamp, privateCertFileName);
+ byte[] keyPemBs = WxCertUtil.getKey_pemBytes(resourceLoader) ;
+ String header = schema + " " + payHelper.getToken(method, httpUrl, "", nonceStr, timestamp, keyPemBs);
Map<String, String> headers = new HashMap<>();
headers.put("Authorization", header);
@@ -125,7 +188,7 @@
// 鏋勯�犻獙绛惧悕涓�
String signatureStr = payHelper.responseSign(wechatpayTimestamp, wechatpayNonce, job_body.toJSONString());
// 楠岃瘉绛惧悕
- Boolean valid = payHelper.responseSignVerify(wechatpaySerial, signatureStr, wechatpaySignature);
+ Boolean valid = payHelper.responseSignVerify(wechatpaySerial, signatureStr, wechatpaySignature, keyPemBs);
return BaseResponseUtils.buildSuccess();
}
@@ -148,14 +211,14 @@
@PostMapping(path = "placeOrder")
@Transactional(rollbackFor = Exception.class)
@SsoAop()
- public BaseResponse<Boolean> placeOrder(@RequestBody @Valid DtoOrder order, BindingResult bindingResult) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeySpecException, IOException, SignatureException, InvalidKeyException {
+ public BaseResponse<Boolean> placeOrder(@RequestBody @Valid DtoOrder order, BindingResult bindingResult) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeySpecException, IOException, SignatureException, InvalidKeyException, Exception {
if(bindingResult != null && bindingResult.hasErrors()){
return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
}
// 鎺ユ敹鍙傛暟锛氱櫥褰曟�両D銆佽櫄鎷熷崱ID銆佸厖鍊奸噾棰濓紙鍒嗭級
Long sessionId = order.getSessionId();
Long virtualId = order.getVcId();
- Integer rechargeAmount = order.getRechargeAmount();
+ //Integer rechargeAmount = order.getRechargeAmount();
String prepayId = "";
@@ -177,7 +240,7 @@
virtualCard.setOrderNumber(orderNumber);
virtualCard.setClientId(clientId);
virtualCard.setVirtualId(virtualId);
- virtualCard.setRechargeAmount(rechargeAmount);
+ virtualCard.setRechargeAmount(order.getRechargeAmount());
BaseResponse result = virtualCardSv.insertVCRecharge(virtualCard);
if(!result.getCode().equals("0001")) {
return BaseResponseUtils.buildFail(SellResultCode.RECHARGE_ADD_FAIL.getMessage());
@@ -192,7 +255,7 @@
//璁㈠崟閲戦
JSONObject job_amount = new JSONObject();
- job_amount.put("total", rechargeAmount);
+ job_amount.put("total", (int)(order.getRechargeAmount()*100));
job_amount.put("currency", "CNY");
job_body.put("amount", job_amount);
@@ -209,7 +272,7 @@
String httpUrl = "/v3/pay/transactions/jsapi";
String body = job_body.toJSONString();
- String header = schema + " " + payHelper.getToken(method, httpUrl, body, nonceStr, timestamp, privateCertFileName);
+ String header = schema + " " + payHelper.getToken(method, httpUrl, body, nonceStr, timestamp, WxCertUtil.getKey_pemBytes(resourceLoader));
Map<String, String> headers = new HashMap<>();
headers.put("Authorization", header);
@@ -221,6 +284,7 @@
if(job_result == null) {
return BaseResponseUtils.buildFail(SellResultCode.RECHARGE_ADD_FAIL.getMessage());
}
+
return BaseResponseUtils.buildSuccess(job_result) ;
}
@@ -250,7 +314,7 @@
String nonceStr = payHelper.generateRandomString();
String pkg = "prepay_id=" + prepayId;
String message = payHelper.buildMessage_signAgain(appid, timeStamp, nonceStr, pkg);
- String paySign = payHelper.sign(message.getBytes("utf-8"), privateCertFileName);
+ String paySign = payHelper.sign(message.getBytes("utf-8"), WxCertUtil.getKey_pemBytes(resourceLoader));
JSONObject job_result = new JSONObject();
job_result.put("timeStamp", timeStamp);
@@ -283,7 +347,7 @@
@PostMapping(path = "orderNotify", consumes = MediaType.APPLICATION_JSON_VALUE)
@Transactional(rollbackFor = Exception.class)
@SsoAop()
- public JSONObject orderNotify(@RequestHeader HttpHeaders headers, HttpServletRequest request, HttpServletResponse response) throws IOException, GeneralSecurityException {
+ public JSONObject orderNotify(@RequestHeader HttpHeaders headers, HttpServletRequest request, HttpServletResponse response) throws IOException, GeneralSecurityException, Exception {
JSONObject result = new JSONObject();
/**
@@ -321,8 +385,9 @@
// 鏋勯�犻獙绛惧悕涓�
String signatureStr = payHelper.responseSign(wechatpayTimestamp, wechatpayNonce, bodyStr);
+ byte[] keyPemBs = WxCertUtil.getKey_pemBytes(resourceLoader) ;
// 楠岃瘉绛惧悕
- Boolean valid = payHelper.responseSignVerify(wechatpaySerial, signatureStr, wechatpaySignature);
+ Boolean valid = payHelper.responseSignVerify(wechatpaySerial, signatureStr, wechatpaySignature, keyPemBs);
if(!valid) {
response.setStatus(500);
result.put("code", "FAIL");
@@ -451,4 +516,5 @@
result.put("message", "鎴愬姛");
return result;
}
+
}
--
Gitblit v1.8.0