1、处理业务逻辑
2、调取微信支付
public BaseSingleVO<Map<String, Object>> beforePayWechat(Integer type, String orderId, BigDecimal amount,
String attach, String openid, Integer businessType, HttpServletRequest request) {
String appId = "";
if (businessType == 1) {
appId = wechatPayConfig.getYpAppID();
}else if(businessType == 2) {
appId = wechatMpConfig.getYpExpertAppID();
}
BaseSingleVO<Map<String, Object>> result = new BaseSingleVO<Map<String, Object>>();
// 实例化客户端,组装请求微信支付的字符串
AppRequest requestObj = new AppRequest();
requestObj.setAppid(appId);
requestObj.setMch_id(wechatPayConfig.getMchId());
requestObj.setNotify_url(wechatPayConfig.getPayNotifyUrl());
/* 获取终端IP */
String realIP = RemoteIP.getIpAddr(request);
requestObj.setSpbill_create_ip(realIP);
requestObj.setTrade_type("JSAPI");
requestObj.setOpenid(openid);
requestObj.setAttach(attach); // 商家数据包,原样返回。
requestObj.setBody("弈赔");
// 设置随机字符串
String randomCode = ((int) ((Math.random() * 9 + 1) * 1000000000)) + ""; // 生成10位随机数
requestObj.setNonce_str(MD5Tool.MD5Encrypt(randomCode));
requestObj.setOut_trade_no(orderId);
BigDecimal amountRealFen = amount.multiply(BigDecimal.valueOf(100)); // 转化为分
amountRealFen = amountRealFen.setScale(0, BigDecimal.ROUND_HALF_UP); // 去除小数位
requestObj.setTotal_fee(amountRealFen.toString());
// 设置签名
Map<String, Object> mapToSign = SignUtil.beanToMap(requestObj);
String signTemp = SignUtil.dictionaryKeyValue(mapToSign, false, false) + "&key="
+ wechatPayConfig.getCustomerKey();
String sign = MD5Tool.MD5Encrypt(signTemp).toUpperCase(); // 将结果md5并转化为大写
requestObj.setSign(sign);
try {
AppResponse responseObj = (AppResponse) HttpsRequestUtil.httpsRequestXML(wechatPayConfig.getGatway(),
"POST", requestObj, AppResponse.class);
if (responseObj != null) {
if ("SUCCESS".equals(responseObj.getReturn_code())) {
if ("SUCCESS".equals(responseObj.getResult_code())) {
result.setCode(0);
result.setDatasCount(1);
Map<String, Object> datas = new HashMap<String, Object>();
String randomStr = ((int) ((Math.random() * 9 + 1) * 1000000000)) + ""; // 生成10位随机数
datas.put("appId", appId);
datas.put("partnerid", wechatPayConfig.getMchId());
// datas.put("prepayid", responseObj.getPrepay_id());
// datas.put("package", "Sign=WXPay");
datas.put("package", "prepay_id=" + responseObj.getPrepay_id());
datas.put("nonceStr", randomStr);
datas.put("signType", "MD5");
datas.put("timeStamp", System.currentTimeMillis() / 1000 + "");
// 生成签名
// String signTempRtn = SignUtil.dictionaryKeyValue(datas, true, false) +
// "&key="
// + wechatPayConfig.getCustomerKey();
String signTempRtn = "appId=" + appId + "&nonceStr=" + randomStr + "&package=prepay_id="
+ responseObj.getPrepay_id() + "&signType=MD5" + "&timeStamp="
+ System.currentTimeMillis() / 1000 + "&key=" + wechatPayConfig.getCustomerKey();
String signRtn = MD5Tool.MD5Encrypt(signTempRtn).toUpperCase(); // 将结果md5并转化为大写
datas.put("sign", signRtn);
datas.put("orderId", orderId);
result.setDatas(datas);
result.setMessage("获取成功");
} else {
result.setCode(3);
result.setMessage(responseObj.getErr_code() + ":" + responseObj.getErr_code_des());
}
} else {
result.setCode(4);
result.setMessage(responseObj.getReturn_msg());
result.setMessage(responseObj.toString());
}
} else {
result.setCode(5);
result.setMessage("获取失败");
}
return result;
} catch (Exception e) {
e.printStackTrace();
result.setCode(9);
result.setMessage("获取失败");
return result;
}
}
3、配置回调接口
@PostMapping("receiveWechatPayNotify")
public String receiveWechatPayNotify(HttpServletRequest request) {
System.out.println("正在进入回调接口");
Map<String, String[]> parameterMap = request.getParameterMap();
System.out.println(parameterMap.toString());
// 获取微信POST过来反馈信息
BufferedReader bufferReader = null;
try {
bufferReader = request.getReader();
StringBuffer buffer = new StringBuffer();
String line = "";
while ((line = bufferReader.readLine()) != null) {
buffer.append(line);
}
String postData = buffer.toString(); // 获取微信post过来的xml字符串
BaseSingleVO<String> result = this.wechatPayNotify(postData);
return result.getDatas();
} catch (IOException e) {
e.printStackTrace();
return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[服务器内部错误]]></return_msg></xml>";
}
}
/**
* 接收微信支付异步通知(订单支付)
*
* @return
*/
private BaseSingleVO<String> wechatPayNotify(String postData) {
BaseSingleVO<String> result = new BaseSingleVO<String>();
result.setCode(0);
result.setDatasCount(1);
NotifyRtn notifyRtn = new NotifyRtn();
// xml字符串转化为对象
NotifyResponse notifyResponse = (NotifyResponse) XMLUtil.convertXmlStrToObject(NotifyResponse.class, postData);
// 首先进行验证签名
String weixinSign = notifyResponse.getSign(); // 获取微信签名结果
// 我方根据微信请求参数进行签名
notifyResponse.setSign(null); // sign不参与签名
Map<String, Object> mapToSign = SignUtil.beanToMap(notifyResponse);
String signTemp = SignUtil.dictionaryKeyValue(mapToSign, false, false) + "&key="
+ wechatPayConfig.getCustomerKey();
String sign = MD5Tool.MD5Encrypt(signTemp).toUpperCase(); // 将结果md5并转化为大写
// 对比微信的sign和我方签名结果是否一致
if (weixinSign.equals(sign)) {
/*** 验证签名成功 ***/
if (!"SUCCESS".equals(notifyResponse.getReturn_code())) {
// 通信失败
notifyRtn.setReturn_code("FAIL");
notifyRtn.setReturn_msg("通信失败");
result.setDatas(XMLUtil.convertToXml(notifyRtn));
} else {
String orderId = notifyResponse.getAttach();
result.setDatas(XMLUtil.convertToXml(orderService.afterPayWechat(notifyResponse, orderId)));
}
} else {
notifyRtn.setReturn_code("FAIL");
notifyRtn.setReturn_msg("签名不符");
result.setDatas(XMLUtil.convertToXml(notifyRtn));
}
return result;
}
@Override
@Transactional
public NotifyRtn afterPayWechat(NotifyResponse notifyResponse, String orderId) {
NotifyRtn notifyRtn = new NotifyRtn();
Order order = orderMapper.selectByOrderId(orderId);
String transaction_id = notifyResponse.getTransaction_id();
System.out.println("回调orderId" + orderId);
if (order == null) {
// 订单在我方系统不存在
notifyRtn.setReturn_code("SUCCESS");
notifyRtn.setReturn_msg("订单不存在");
return notifyRtn;
}
if (order.getStatus() == PayStatus.SUCCESS.getValue()) {
notifyRtn.setReturn_code("SUCCESS");
notifyRtn.setReturn_msg("已经处理");
return notifyRtn;
}
System.out.println("回调success?" + notifyResponse.getResult_code());
if (!"SUCCESS".equals(notifyResponse.getResult_code())) {
// 微信返回支付失败
Order orderUpdate = new Order();
orderUpdate.setId(order.getId());
orderUpdate.setGmtPay(new Date());
orderUpdate.setStatus(PayStatus.FAIL.getValue());
orderUpdate.setTransactionId(transaction_id);
orderMapper.updateByPrimaryKeySelective(orderUpdate);
notifyRtn.setReturn_code("SUCCESS");
notifyRtn.setReturn_msg("支付失败");
return notifyRtn;
}
BigDecimal amountReal = order.getAmountReal(); // 订单实付金额
amountReal = amountReal.setScale(2, BigDecimal.ROUND_HALF_UP); // 保留两位小数
BigDecimal amountRealFen = amountReal.multiply(BigDecimal.valueOf(100)); // 转化为分;
amountRealFen = amountRealFen.setScale(0, BigDecimal.ROUND_HALF_UP);
if (!amountRealFen.toString().equals(notifyResponse.getTotal_fee())) {
Order orderUpdate = new Order();
orderUpdate.setId(order.getId());
orderUpdate.setGmtPay(new Date());
orderUpdate.setStatus(PayStatus.FAIL.getValue());
orderUpdate.setTransactionId(transaction_id);
orderMapper.updateByPrimaryKeySelective(orderUpdate);
notifyRtn.setReturn_code("SUCCESS");
notifyRtn.setReturn_msg("金额不符");
return notifyRtn;
}
// 支付成功后处理
System.out.println("回调orderid" + order.getId());
Order orderUpdate = new Order();
orderUpdate.setId(order.getId());
orderUpdate.setGmtPay(new Date());
orderUpdate.setStatus(PayStatus.SUCCESS.getValue());
orderUpdate.setTransactionId(transaction_id);
orderMapper.updateByPrimaryKeySelective(orderUpdate);
if (order.getBusinessType() == 1) {
} else if (order.getBusinessType() == 4) {
}
// 处理成功
notifyRtn.setReturn_code("SUCCESS");
notifyRtn.setReturn_msg("处理成功");
return notifyRtn;
}