From e6a7ffa64a71b9419b7178b0c8bed43097e5d352 Mon Sep 17 00:00:00 2001 From: zhubaomin <zhubaomin> Date: 星期四, 24 十月 2024 16:28:57 +0800 Subject: [PATCH] 2024-10-24 朱宝民 微信小程序中使用的物理卡开关阀记录、虚拟卡开关阀记录 --- pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/wechatpay/PaymentCtrl.java | 92 ++++++++++++++++++++++++++++++++++++--------- 1 files changed, 73 insertions(+), 19 deletions(-) diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/wechatpay/PaymentCtrl.java b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/wechatpay/PaymentCtrl.java index 0e8d641..a0132be 100644 --- a/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/wechatpay/PaymentCtrl.java +++ b/pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/wechatpay/PaymentCtrl.java @@ -2,9 +2,12 @@ import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; +import com.dy.common.multiDataSource.DataSourceContext; +import com.dy.common.util.AES; 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.pipIrrWechat.result.WechatResultCode; @@ -15,10 +18,7 @@ import com.dy.pipIrrWechat.virtualCard.dto.DtoVirtualCard; import com.dy.pipIrrWechat.virtualCard.enums.LastOperateENUM; import com.dy.pipIrrWechat.virtualCard.enums.RefundItemStateENUM; -import com.dy.pipIrrWechat.wechatpay.dto.Code2Session; -import com.dy.pipIrrWechat.wechatpay.dto.DtoOrder; -import com.dy.pipIrrWechat.wechatpay.dto.NotifyResource; -import com.dy.pipIrrWechat.wechatpay.dto.OrderNotify; +import com.dy.pipIrrWechat.wechatpay.dto.*; import com.dy.pipIrrWechat.wechatpay.enums.RefundStatusENUM; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; @@ -31,13 +31,13 @@ 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; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; -import javax.crypto.NoSuchPaddingException; import java.io.BufferedReader; import java.io.IOException; import java.security.GeneralSecurityException; @@ -46,10 +46,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 @@ -64,11 +61,11 @@ @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 String privateCertFileName = com.dy.pipIrrWechat.wechatpay.PayInfo.privateCertFileName; private final String appid = com.dy.pipIrrWechat.wechatpay.PayInfo.appid; private final String secret = com.dy.pipIrrWechat.wechatpay.PayInfo.secret; private final String mchid = com.dy.pipIrrWechat.wechatpay.PayInfo.mchid; @@ -165,7 +162,8 @@ String nonceStr = payHelper.generateRandomString(); Long timestamp = System.currentTimeMillis() / 1000; - String header = schema + " " + payHelper.getToken(method, httpUrl, "", nonceStr, timestamp, privateCertFileName); + byte[] certFileBs = WxCertUtil.getKey_pemBytes(resourceLoader) ; + String header = schema + " " + payHelper.getToken(method, httpUrl, "", nonceStr, timestamp, certFileBs); Map<String, String> headers = new HashMap<>(); headers.put("Authorization", header); @@ -183,7 +181,7 @@ // 鏋勯�犻獙绛惧悕涓� String signatureStr = payHelper.responseSign(wechatpayTimestamp, wechatpayNonce, job_body.toJSONString()); // 楠岃瘉绛惧悕 - Boolean valid = payHelper.responseSignVerify(wechatpaySerial, signatureStr, wechatpaySignature); + Boolean valid = payHelper.responseSignVerify(wechatpaySerial, signatureStr, wechatpaySignature, certFileBs); return BaseResponseUtils.buildSuccess(); } @@ -196,7 +194,7 @@ */ @PostMapping(path = "placeOrder") @Transactional(rollbackFor = Exception.class) - 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 NoSuchAlgorithmException, InvalidKeySpecException, IOException, SignatureException, InvalidKeyException, Exception { if(bindingResult != null && bindingResult.hasErrors()){ return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); } @@ -236,8 +234,26 @@ virtualCard.setClientId(clientId); virtualCard.setOrderNumber(orderNumber); virtualCard.setRechargeAmount(rechargeAmount); - BaseResponse result = virtualCardSv.insertVCRecharge(virtualCard); - if(!result.getCode().equals("0001")) { + + // -1锛氳櫄鎷熷崱涓嶅瓨鍦紝0锛氭坊鍔犲厖鍊艰褰曞け璐� + Long rechargeId = virtualCardSv.insertVCRecharge(virtualCard); + if(rechargeId.equals(-1)) { + return BaseResponseUtils.buildFail(WechatResultCode.NO_ACCOUNT.getMessage()); + } + if(rechargeId.equals(0)) { + return BaseResponseUtils.buildFail(WechatResultCode.RECHARGE_FAIL.getMessage()); + } + + // 鐢熸垚鍏呭�兼搷浣滆褰曪紝鍏呭�兼搷浣滀汉涓哄啘鎴� + SeVcOperate seVcOperate = new SeVcOperate(); + seVcOperate.setVcId(virtualId); + seVcOperate.setClientId(clientId); + seVcOperate.setOperateType(LastOperateENUM.RECHARGE.getCode()); + seVcOperate.setRechargeId(rechargeId); + seVcOperate.setOperator(clientId); + seVcOperate.setOperateTime(new Date()); + Long vcOperateId = virtualCardSv.insertVcOperate(seVcOperate); + if(vcOperateId == null) { return BaseResponseUtils.buildErrorMsg(WechatResultCode.RECHARGE_ADD_FAIL.getMessage()); } @@ -246,6 +262,7 @@ job_body.put("mchid", mchid); job_body.put("description", description); job_body.put("out_trade_no", orderNumber); + job_body.put("attach", DataSourceContext.get()); job_body.put("notify_url", notifyUrl); //璁㈠崟閲戦 @@ -267,7 +284,8 @@ String httpUrl = "/v3/pay/transactions/jsapi"; String body = job_body.toJSONString(); - String header = schema + " " + payHelper.getToken(method, httpUrl, body, nonceStr, timestamp, privateCertFileName); + byte[] certFileBs = WxCertUtil.getKey_pemBytes(resourceLoader) ; + String header = schema + " " + payHelper.getToken(method, httpUrl, body, nonceStr, timestamp, certFileBs); Map<String, String> headers = new HashMap<>(); headers.put("Authorization", header); @@ -308,7 +326,8 @@ 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); + byte[] certFileBs = WxCertUtil.getKey_pemBytes(resourceLoader) ; + String paySign = payHelper.sign(message.getBytes("utf-8"), certFileBs); JSONObject job_result = new JSONObject(); job_result.put("timeStamp", timeStamp); @@ -340,7 +359,7 @@ }) @PostMapping(path = "orderNotify", consumes = MediaType.APPLICATION_JSON_VALUE) @Transactional(rollbackFor = Exception.class) - 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(); /** @@ -378,8 +397,9 @@ // 鏋勯�犻獙绛惧悕涓� String signatureStr = payHelper.responseSign(wechatpayTimestamp, wechatpayNonce, bodyStr); + byte[] certFileBs = WxCertUtil.getKey_pemBytes(resourceLoader) ; // 楠岃瘉绛惧悕 - Boolean valid = payHelper.responseSignVerify(wechatpaySerial, signatureStr, wechatpaySignature); + Boolean valid = payHelper.responseSignVerify(wechatpaySerial, signatureStr, wechatpaySignature, certFileBs); if(!valid) { response.setStatus(500); result.put("code", "FAIL"); @@ -420,6 +440,8 @@ JSONObject job_resource = JSONObject.parseObject(resource); // 瑙e瘑鍚庡彇鍑猴細鍟嗘埛璁㈠崟鍙枫�佸井淇℃敮浠樿鍗曞彿銆佷氦鏄撶姸鎬併�佹敮浠樺畬鎴愭椂闂� + String attach = job_resource.getString("attach"); + DataSourceContext.set(attach); String out_trade_no = job_resource.getString("out_trade_no"); String transaction_id = job_resource.getString("transaction_id"); String trade_state = job_resource.getString("trade_state"); @@ -508,4 +530,36 @@ result.put("message", "鎴愬姛"); return result; } + + /** + * 娣诲姞寰俊鏀粯淇℃伅 + * @param po + * @param bindingResult + * @return + */ + @PostMapping(path = "add_wechatpay", consumes = MediaType.APPLICATION_JSON_VALUE) + public BaseResponse<Boolean> addWechatpay(@RequestBody @Valid Wechatpay po, BindingResult bindingResult) throws Exception { + if(bindingResult != null && bindingResult.hasErrors()){ + return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); + } + + if(paymentSv.getWechatpayByAppId(po.getAppId()) != null) { + return BaseResponseUtils.buildErrorMsg("璇ュ井淇℃敮浠樹俊鎭凡缁忓瓨鍦�"); + } + + SeWechatpay seWechatpay = new SeWechatpay(); + seWechatpay.setAppId(AES.encrypt(po.getAppId())); + seWechatpay.setAppSecret(AES.encrypt(po.getAppSecret())); + seWechatpay.setMchId(AES.encrypt(po.getMchId())); + seWechatpay.setMchKey(AES.encrypt(po.getMchKey())); + seWechatpay.setSerialNo((AES.encrypt(po.getSerialNo()))); + seWechatpay.setNotifyUrl(AES.encrypt(po.getNotifyUrl())); + seWechatpay.setRemarks(po.getRemarks()); + + Long rec = Optional.ofNullable(paymentSv.addWechatpay(seWechatpay)).orElse(0L); + if(rec == 0) { + return BaseResponseUtils.buildFail("娣诲姞寰俊鏀粯淇℃伅澶辫触"); + } + return BaseResponseUtils.buildSuccess(true) ; + } } \ No newline at end of file -- Gitblit v1.8.0