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,10 +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.Code2Session;
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;
@@ -33,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;
@@ -48,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
@@ -66,13 +62,15 @@
@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;
@@ -171,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);
@@ -189,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();
    }
@@ -212,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());
        }
        // 接收参数:登录态ID、虚拟卡ID、充值金额(分)
        Long sessionId = order.getSessionId();
        Long virtualId = order.getVcId();
        Integer rechargeAmount = order.getRechargeAmount();
        //Integer rechargeAmount = order.getRechargeAmount();
        String prepayId = "";
@@ -241,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());
@@ -256,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);
@@ -273,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);
@@ -315,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);
@@ -348,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();
        /**
@@ -386,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");
@@ -516,4 +516,5 @@
        result.put("message", "成功");
        return  result;
    }
}