微信商户后端 返回支付结果 <return_msg><![CDATA[请求中含有未在API文档中定义的参数]]></return_msg>
时间: 2023-12-18 09:02:54 浏览: 43
这个错误提示是因为请求中包含了未在微信支付 API 文档中定义的参数。可能是因为请求中包含了错别字、大小写不一致或者参数名不正确的参数。建议检查请求参数,确保所有参数名和数值都与 API 文档中一致。另外,建议使用微信支付官方提供的 SDK 进行开发,可以避免一些常见的错误。如果还有问题,可以查看微信支付官方文档或者联系微信支付的技术支持。
相关问题
public String asyncNotify(String notifyData) { //1.签名校验 PayResponse payResponse = bestPayService.asyncNotify(notifyData); log.info("异步通知 : notifyData={}", payResponse); //2.金额校验(从数据库查订单) //较为严重(正常情况下是不会发生的)发出警告:钉钉,短信 PayInfoDAO payInfo = payInfoMapper.selectByOrderNo(Long.parseLong(payResponse.getOrderId())); if (payInfo == null) { throw new RuntimeException("通过orderNo查询到的结果为null"); } //如果订单支付状态不是"已支付" if (!payInfo.getPlatformStatus().equals(OrderStatusEnum.SUCCESS.name())) { //Double类型比较大小,精度。1.00 1.0 if (payInfo.getPayAmount().compareTo(BigDecimal.valueOf(payResponse.getOrderAmount())) != 0) { //告警 // throw new RuntimeException("异步通知中的金额和数据库里的不一致,orderNo=" + payResponse.getOrderId()); try { throw new Exception("异步通知中的金额和数据库里的不一致,orderNo=" + payResponse.getOrderId()); } catch (Exception e) { e.printStackTrace(); } } //3. 修改订单支付状态 payInfo.setPlatformStatus(OrderStatusEnum.SUCCESS.name()); payInfo.setPlatformNumber(payResponse.getOutTradeNo()); payInfoMapper.updateByPrimaryKeySelective(payInfo); } //TODO pay发送MQ消息,mall接受MQ int i = sysUserService.updateSysUserByUsername(payInfo.getUserId()); if (i <= 0) { //throw new RuntimeException("更改状态错误"); try { throw new Exception("更改状态错误"); } catch (Exception e) { e.printStackTrace(); } } if (payResponse.getPayPlatformEnum() == BestPayPlatformEnum.WX) { //4.告诉微信不要再通知 return "<xml>\n" + " <return_code><![CDATA[SUCCESS]]></return_code>\n" + " <return_msg><![CDATA[OK]]></return_msg>\n" + "</xml>"; } else if (payResponse.getPayPlatformEnum() == BestPayPlatformEnum.ALIPAY) { //return "success"; return "SUCCESS"; } throw new RuntimeException("异步通知中错误的平台"); } 这个代码有没有什么错误
这段代码存在一些问题:
1. 在发生金额校验不一致时,使用了`try-catch`语句,但是在`catch`块中只是打印了异常堆栈信息,没有进行任何处理,这可能会导致问题被忽略。
2. 在订单支付状态不为"已支付"时,如果金额校验一致,也会更新订单状态,这可能会导致订单状态被错误地修改为"已支付"。
针对这些问题,可以进行以下改进:
1. 在发生金额校验不一致时,不应该使用`try-catch`语句,而是应该直接抛出异常,以便及时发现并处理问题。
2. 在订单支付状态不为"已支付"时,应该只有在金额校验一致的情况下才能更新订单状态。
下面是修改后的代码:
```java
public String asyncNotify(String notifyData) {
//1.签名校验
PayResponse payResponse = bestPayService.asyncNotify(notifyData);
log.info("异步通知 : notifyData={}", payResponse);
//2.金额校验(从数据库查订单)
PayInfoDAO payInfo = payInfoMapper.selectByOrderNo(Long.parseLong(payResponse.getOrderId()));
if (payInfo == null) {
throw new RuntimeException("通过orderNo查询到的结果为null");
}
//如果订单支付状态不是"已支付"
if (!payInfo.getPlatformStatus().equals(OrderStatusEnum.SUCCESS.name())) {
//Double类型比较大小,精度。1.00 1.0
if (payInfo.getPayAmount().compareTo(BigDecimal.valueOf(payResponse.getOrderAmount())) != 0) {
//告警
throw new RuntimeException("异步通知中的金额和数据库里的不一致,orderNo=" + payResponse.getOrderId());
}
//3. 修改订单支付状态
payInfo.setPlatformStatus(OrderStatusEnum.SUCCESS.name());
payInfo.setPlatformNumber(payResponse.getOutTradeNo());
payInfoMapper.updateByPrimaryKeySelective(payInfo);
//TODO pay发送MQ消息,mall接受MQ
int i = sysUserService.updateSysUserByUsername(payInfo.getUserId());
if (i <= 0) {
throw new RuntimeException("更改状态错误");
}
}
if (payResponse.getPayPlatformEnum() == BestPayPlatformEnum.WX) {
//4.告诉微信不要再通知
return "<xml>\n" + " <return_code><![CDATA[SUCCESS]]></return_code>\n" + " <return_msg><![CDATA[OK]]></return_msg>\n" + "</xml>";
} else if (payResponse.getPayPlatformEnum() == BestPayPlatformEnum.ALIPAY) {
return "SUCCESS";
}
throw new RuntimeException("异步通知中错误的平台");
}
```
微信 支付回调java
好的,针对微信支付回调的Java代码可以参考以下示例:
```java
@RestController
@RequestMapping("/api/wechat/pay")
public class WechatPayController {
@Autowired
private WechatPayService wechatPayService;
/**
* 微信支付结果回调
*/
@RequestMapping(value = "/notify", method = RequestMethod.POST, produces = "application/xml")
public String payNotify(@RequestBody String xmlData) {
try {
Map<String, String> resultMap = XmlUtil.xmlToMap(xmlData);
if (wechatPayService.verifyNotify(resultMap)) {
// 验证签名通过
String tradeNo = resultMap.get("out_trade_no"); // 商户订单号
String transactionId = resultMap.get("transaction_id"); // 微信支付订单号
String totalFee = resultMap.get("total_fee"); // 订单总金额,单位为分
// TODO: 处理支付成功逻辑
return "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
} else {
// 签名验证失败
return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名验证失败]]></return_msg></xml>";
}
} catch (Exception e) {
e.printStackTrace();
return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[系统异常]]></return_msg></xml>";
}
}
}
```
其中,`WechatPayService`是一个支付相关的服务类,`XmlUtil`是一个用于XML转Map的工具类。在`payNotify`方法中,首先将微信支付回调的XML数据转为Map对象,然后调用`wechatPayService.verifyNotify`方法进行签名验证。如果验证通过,则处理支付成功逻辑并返回`SUCCESS`给微信服务器;如果验证失败,则返回`FAIL`给微信服务器。注意,返回的数据必须是XML格式的字符串。