WxJava icon indicating copy to clipboard operation
WxJava copied to clipboard

调用微信支付createOrderV3接口,出现:数据查询结果为空 报错

Open limingAlex1314 opened this issue 1 year ago • 3 comments

调用微信支付v3下单接口,支付单生成了,但是出现调用https://api.mch.weixin.qq.com/v3/merchant-service/complaint-notifications接口记录,并提示:数据查询结果为空

WxJava 模块名: weixin-java-pay WxJava 版本号:4.5.3.B 代码: private R createWxOrder(UnionBaseRequest request, PayConfig payConfig) throws WxPayException { WxPayService wxPayService = new WxPayServiceImpl(); WxPayConfig wxPayConfig = new WxPayConfig(); wxPayConfig.setAppId(request.getSubAppId()); wxPayConfig.setMchId(payConfig.getMchId()); wxPayConfig.setApiV3Key(payConfig.getApiV3Key()); if (StringUtils.isNotBlank(payConfig.getPrivateCertContent())) { wxPayConfig.setPrivateCertContent(payConfig.getPrivateCertContent().getBytes()); } if (StringUtils.isNotBlank(payConfig.getPrivateKeyContent())) { wxPayConfig.setPrivateKeyContent(payConfig.getPrivateKeyContent().getBytes()); } wxPayConfig.setPrivateKeyPath(payConfig.getPrivateKeyPath()); wxPayConfig.setPrivateCertPath(payConfig.getPrivateCertPath()); wxPayService.setConfig(wxPayConfig);

	WxPayUnifiedOrderV3Request v3Request = new WxPayUnifiedOrderV3Request();

	String orderDesc = request.getOrderDesc();

	v3Request.setDescription(orderDesc);
	String merOrderId = request.getMerOrderId();
	if (StringUtils.isNotEmpty(merOrderId) && merOrderId.startsWith(UnionPayConstants.ORDER_ID_PREFIX)) {
		merOrderId = merOrderId.replace(UnionPayConstants.ORDER_ID_PREFIX, "");
	}
	v3Request.setOutTradeNo(merOrderId);
	v3Request.setNotifyUrl(wxPayConfigProperties.getNotifyUrl() + "/" + payConfig.getTenantId());

	WxPayUnifiedOrderV3Request.Amount amount = new WxPayUnifiedOrderV3Request.Amount();
	amount.setTotal(request.getTotalAmount().intValue());
	amount.setCurrency("CNY");
	v3Request.setAmount(amount);

	WxPayUnifiedOrderV3Request.Payer payer = new WxPayUnifiedOrderV3Request.Payer();
	payer.setOpenid(request.getOpenId());
	v3Request.setPayer(payer);

	v3Request.setAttach(request.getSubAppId());
	v3Request.setTimeExpire(DateUtil.format(DateUtil.parse(request.getExpireTime(), "yyyy-MM-dd HH:mm:ss"), "yyyy-MM-dd'T'HH:mm:ssXXX"));

	WxPayUnifiedOrderV3Result.JsapiResult jsapiResult = ((UnionPayController) AopContext.currentProxy()).createOrderV3(v3Request, wxPayService);
	log.info("微信支付jsapiResult:{}", JSON.toJSONString(jsapiResult));
	JSONObject miniPayRequest = new JSONObject();
	JSONObject payParam = new JSONObject();
	payParam.put("appId", jsapiResult.getAppId());
	payParam.put("timeStamp", jsapiResult.getTimeStamp());
	payParam.put("package", jsapiResult.getPackageValue());
	payParam.put("paySign", jsapiResult.getPaySign());
	payParam.put("signType", jsapiResult.getSignType());
	payParam.put("nonceStr", jsapiResult.getNonceStr());
	miniPayRequest.put("miniPayRequest", payParam);

	String miniPayUrl = payConfig.getMiniPayUrl();
	if (StringUtils.isNotEmpty(miniPayUrl)) {
		try {
			miniPayUrl = miniPayUrl + "?payDataStr=" + URLEncoder.encode(payParam.toJSONString(), StandardCharsets.UTF_8.toString());
		} catch (UnsupportedEncodingException e) {
			log.error("", e);
		}
		miniPayRequest.put("miniPayUrl", miniPayUrl);
	}

	return R.ok(miniPayRequest);
}

@AuditLog(obsType = "现金(微信)", stage = "付款(拉起)") public WxPayUnifiedOrderV3Result.JsapiResult createOrderV3(WxPayUnifiedOrderV3Request v3Request, WxPayService wxPayService) throws WxPayException { return wxPayService.createOrderV3(TradeTypeEnum.JSAPI, v3Request); }

日志: 日志

limingAlex1314 avatar Nov 04 '24 07:11 limingAlex1314

发现了问题,只要序列化wxPayService,就会发生这个问题: JSON.toJSONString(wxPayService) 具体原因还没查到

limingAlex1314 avatar Nov 05 '24 11:11 limingAlex1314

为什么要序列化service对象?

binarywang avatar Nov 05 '24 14:11 binarywang

@Around(value = "@annotation(auditLog)") @SneakyThrows public Object around(ProceedingJoinPoint joinPoint, AuditLog auditLog) { Object object = joinPoint.proceed(); Object[] args = joinPoint.getArgs(); AuditLogFlagEnum flag = auditLog.flag(); AuditLogVo auditLogVo = new AuditLogVo(); auditLogVo.setFlagId(flag.getFlagId()); auditLogVo.setTime(LocalDateTime.now()); auditLogVo.setMallId(TenantContextHolder.getMallId()); auditLogVo.setUserId(TenantContextHolder.getUserId()); auditLogVo.setTraceId(TenantContextHolder.getRequestId()); auditLogVo.setObsType(auditLog.obsType()); auditLogVo.setObsId(TenantContextHolder.getObsId()); auditLogVo.setStage(auditLog.stage()); if (ArrayUtil.isNotEmpty(args)) { auditLogVo.setReq(JSON.toJSONString(args)); } auditLogVo.setResp(JSON.toJSONString(object)); log.info("desc={}, data={}", flag.getName(), JSON.toJSONString(auditLogVo)); return object; } 在审计日志切面中序列化了整个入参,本来只想打印WxPayUnifiedOrderV3Request的,没有指定打印的入参,导致把WxPayService 也序列化了,问题可以解决,只要不序列化WxPayService 就可以,但是想知道为啥序列化WxPayService 会出现上面的那个问题?

limingAlex1314 avatar Nov 06 '24 01:11 limingAlex1314