package com.matrix.system.shopXcx.api.action;
|
|
import com.matrix.biz.dao.BizUserDao;
|
import com.matrix.component.rabbitmq.RabiitMqTemplate;
|
import com.matrix.core.pojo.AjaxResult;
|
import com.matrix.core.tools.LogUtil;
|
import com.matrix.component.wechat.externalInterface.common.Signature;
|
import com.matrix.component.wechat.externalInterface.common.Util;
|
import com.matrix.component.wechat.externalInterface.protocol.queryProtocol.NotifyData;
|
import com.matrix.system.common.bean.BusParameterSettings;
|
import com.matrix.system.common.constance.AppConstance;
|
import com.matrix.system.common.dao.BusParameterSettingsDao;
|
import com.matrix.system.common.interceptor.HostInterceptor;
|
import com.matrix.system.hive.bean.SysVipInfo;
|
import com.matrix.system.hive.dao.SysVipInfoDao;
|
import com.matrix.system.shopXcx.bean.ShopActivitiesGroupJoin;
|
import com.matrix.system.shopXcx.bean.ShopActivitiesGroupJoinUser;
|
import com.matrix.system.shopXcx.bean.ShopOrder;
|
import com.matrix.system.shopXcx.bean.ShopPayLog;
|
import com.matrix.system.shopXcx.dao.ShopActivitiesGroupJoinDao;
|
import com.matrix.system.shopXcx.dao.ShopActivitiesGroupJoinUserDao;
|
import com.matrix.system.shopXcx.dao.ShopOrderDao;
|
import com.matrix.system.shopXcx.dao.ShopPayLogDao;
|
import com.matrix.system.shopXcx.mqTask.MQTaskRouting;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.stereotype.Controller;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.web.bind.annotation.PathVariable;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.ResponseBody;
|
import org.xml.sax.SAXException;
|
|
import javax.servlet.ServletOutputStream;
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
import javax.xml.parsers.ParserConfigurationException;
|
import java.io.IOException;
|
import java.math.BigDecimal;
|
import java.math.RoundingMode;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
|
/**
|
* @author jyy
|
* @description 微信公共接口
|
* @date 2018-05-23 00:08
|
*/
|
@Controller
|
@RequestMapping(value = "wxCommon")
|
public class WxCommonAction {
|
|
|
/**
|
* 错误报文占位符
|
*/
|
private static final String ERRORMSG = "ERRORMSG";
|
/**
|
* 异步任务和订单类型的映射关系
|
*/
|
private static Map<Integer, String> TASK_ORDER_MAPPING = new HashMap<>();
|
|
@Autowired
|
private ShopOrderDao shopOrderDao;
|
@Autowired
|
private ShopPayLogDao shopPayLogDao;
|
|
@Autowired
|
private RabiitMqTemplate rabiitMqTemplate;
|
|
@Autowired
|
private ShopActivitiesGroupJoinUserDao shopActivitiesGroupJoinUserDao;
|
|
@Autowired
|
private ShopActivitiesGroupJoinDao shopActivitiesGroupJoinDao;
|
|
@Autowired
|
private SysVipInfoDao sysVipInfoDao;
|
|
@Autowired
|
BusParameterSettingsDao busParameterSettingsDao;
|
|
|
|
@Value("${evn}")
|
private String evn;
|
/**
|
* 微信支付回调接口
|
*
|
* @param response
|
* @param request
|
* @throws IOException
|
* @throws Exception
|
*/
|
@Transactional(rollbackFor = Exception.class)
|
@RequestMapping(value = "/wxapi/wxpayCallback")
|
public void payCallBack(HttpServletResponse response, HttpServletRequest request) throws IOException {
|
LogUtil.info("微信支付回调start....");
|
|
// 获取输入参数
|
String inputLine;
|
StringBuffer notityXml = new StringBuffer();
|
String resXml = "";
|
String orderId = "";
|
|
AjaxResult threadResult = new AjaxResult(AjaxResult.STATUS_SUCCESS, "");
|
try {
|
while ((inputLine = request.getReader().readLine()) != null) {
|
notityXml.append(inputLine);
|
}
|
request.getReader().close();
|
// XMl转对象
|
NotifyData data = (NotifyData) Util.getObjectFromXML(notityXml.toString(), NotifyData.class);
|
LogUtil.info(data.toString());
|
LogUtil.info("notityXml ---- :{} ", notityXml);
|
LogUtil.info("----return_code = {}", data.getReturn_code());
|
|
// 返回状态码 SUCCESS/FAIL
|
if (AppConstance.CODE_SUCCESS.equals(data.getReturn_code())) {
|
// 校验签名
|
BusParameterSettings paySecret = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_SECRET, HostInterceptor.getCompanyId());
|
if (Signature.checkIsSignValidFromResponseString(notityXml.toString(),paySecret.getParamValue())) {
|
// 校验业务结果
|
if (AppConstance.CODE_SUCCESS.equals(data.getResult_code())) {
|
// 返回SUCCESS报文
|
resXml = AppConstance.RESULT_XML_SUCCESS;
|
// 支付费用
|
Double total_fee = Double.parseDouble(data.getTotal_fee());
|
// 商户订单号
|
String payNum = data.getOut_trade_no();
|
orderId = data.getAttach();
|
LogUtil.info("支付回调关键信息---total_fee:{},payNum:{},orderId:{}", total_fee, payNum, orderId);
|
// 订单ID
|
BigDecimal payMoney = new BigDecimal(total_fee).divide(new BigDecimal(100), 2,
|
RoundingMode.HALF_UP);
|
|
// 检验订单状态
|
ShopOrder order = shopOrderDao.selectById(Integer.valueOf(orderId));
|
if (order != null && ShopOrder.ORDER_PAY_STATUS_WAIT == order.getPayStatus()) {
|
ShopPayLog payLog = new ShopPayLog();
|
// TODO 校验支付金额
|
LogUtil.debug("检查支付金额payMoney={},order.getPayMoney()={}", payMoney, order.getOrderMoney());
|
|
//构建需要修改订单信息Map
|
Map<String, Object> modifyMap = new HashMap<>();
|
modifyMap.put("id", order.getId());
|
//设置微信支付状态为已支付
|
modifyMap.put("payResult", ShopOrder.ORDER_WX_STATUS_PAY_SUCCESS);
|
//设置支付状态为支付成功
|
modifyMap.put("payStatus", ShopOrder.ORDER_PAY_STATUS_SUCCESS);
|
//设置订单状态
|
if (ShopOrder.ORDER_TYPE_GOODS == order.getOrderType()) {
|
//如果是商品订单则进入待发货
|
modifyMap.put("orderStatus", ShopOrder.ORDER_STATUS_WAIT_SEND);
|
} else {
|
//如果是服务订单则进入待评价
|
modifyMap.put("orderStatus", ShopOrder.ORDER_STATUS_WAIT_REMARK);
|
}
|
shopOrderDao.updateByMap(modifyMap);
|
|
// 判断该订单是否为拼团产生的订单
|
ShopActivitiesGroupJoinUser joinUser = shopActivitiesGroupJoinUserDao.selectGroupJoinUserByOrderId(order.getId().longValue());
|
if (joinUser != null) {
|
joinUser.setIsHasPay(ShopActivitiesGroupJoinUser.IS_HAS_PAY_Y);
|
shopActivitiesGroupJoinUserDao.updateByModel(joinUser);
|
|
ShopActivitiesGroupJoin groupJoin = shopActivitiesGroupJoinDao.selectGroupAndPriceById(joinUser.getGjId());
|
List<ShopActivitiesGroupJoinUser> joinUserList = shopActivitiesGroupJoinUserDao.selectGroupJoinUserListByGjId(joinUser.getGjId());
|
LogUtil.info("#当前已支付完成:{}#", joinUserList.size());
|
// 若拼团中已支付的数量等于几人团预设值,则更新拼团状态为拼团成功
|
if (groupJoin.getGroupPrice().getGpCount() == joinUserList.size()) {
|
groupJoin.setGjStatus(ShopActivitiesGroupJoin.ACTIVITIES_JOIN_SUCCESS);
|
} else {
|
if (joinUser.getUserId().equals(groupJoin.getGjHeadId())) {
|
groupJoin.setGjStatus(ShopActivitiesGroupJoin.ACTIVITIES_JOIN_ING);
|
}
|
}
|
shopActivitiesGroupJoinDao.updateByModel(groupJoin);
|
|
SysVipInfo sysVipInfo = sysVipInfoDao.selectByPhone(order.getUserTel());
|
if(sysVipInfo!=null){
|
sysVipInfo.setIsDeal(SysVipInfo.DEAL_VIP);
|
sysVipInfoDao.update(sysVipInfo);
|
}
|
|
}
|
|
// 根据订单类型创建不同的处理任务
|
rabiitMqTemplate.sendMsg(MQTaskRouting.CREATE_ORDER+evn, orderId);
|
|
|
threadResult.putInMap("status", "success");
|
resXml = AppConstance.RESULT_XML_SUCCESS;
|
|
//支付记录
|
recordPayLog(Integer.valueOf(orderId), payMoney, order, payLog, "支付成功", ShopOrder.ORDER_PAY_STATUS_SUCCESS);
|
|
|
} else {
|
LogUtil.info("订单状态不为待付款,order status=", order.getOrderStatus());
|
}
|
|
} else {
|
LogUtil.info("微信标识业务是失败");
|
threadResult.putInMap("status", "err");
|
threadResult.putInMap("msg", "查询支付信息失败,请联系客服或者刷新支付信息(错误码:001)");
|
resXml = AppConstance.RESULT_XML_FAIL.replace(ERRORMSG, "微信标识业务是失败");
|
}
|
} else {
|
LogUtil.info("无效签名");
|
threadResult.putInMap("status", "err");
|
threadResult.putInMap("msg", "查询支付信息失败,请联系客服或者刷新支付信息(错误码:002)");
|
resXml = AppConstance.RESULT_XML_FAIL.replace(ERRORMSG, "微信标识业务是失败");
|
}
|
} else {
|
LogUtil.info("通信标识失败");
|
threadResult.putInMap("status", "err");
|
threadResult.putInMap("msg", "查询支付信息失败,请联系客服或者刷新支付信息(错误码:003)");
|
resXml = AppConstance.RESULT_XML_FAIL.replace(ERRORMSG, "通信标识失败");
|
}
|
} catch (ParserConfigurationException | IOException | SAXException e) {
|
LogUtil.error("支付回调签名错误", e);
|
threadResult.putInMap("status", "err");
|
threadResult.putInMap("msg", "查询支付信息失败,请联系客服或者刷新支付信息(错误码:004)");
|
resXml = AppConstance.RESULT_XML_FAIL.replace(ERRORMSG, "支付回调签名错误");
|
} finally {
|
// 通知线程消息
|
PayThreadPool.notifyThread(Integer.valueOf(orderId), threadResult);
|
sendResultBack(response, resXml);
|
}
|
return;
|
|
}
|
|
private void recordPayLog(Integer orderId, BigDecimal payMoney, ShopOrder order, ShopPayLog payLog, String payRemark, int payStatus) {
|
//设置支付类型为收款
|
payLog.setPayType(1);
|
payLog.setJoinId(orderId);
|
payLog.setPayMoney(payMoney);
|
payLog.setPayOrderNo(order.getOrderNo());
|
payLog.setPayRemark(payRemark);
|
payLog.setPayStatus(payStatus);
|
payLog.setCreateBy(AppConstance.SYSTEM_USER);
|
payLog.setUpdateBy(AppConstance.SYSTEM_USER);
|
shopPayLogDao.insert(payLog);
|
}
|
|
|
private void sendResultBack(HttpServletResponse response, String resXml) throws IOException {
|
LogUtil.info("返回微信数据={}", resXml);
|
ServletOutputStream out = response.getOutputStream();
|
out.write(resXml.getBytes());
|
out.flush();
|
out.close();
|
}
|
|
/**
|
* 二维码消核
|
*
|
* @param id
|
* @return
|
* @author HEMING
|
* @email 910000889@qq.com
|
* @date 2018年7月7日
|
*/
|
@RequestMapping(value = "/verify/{keys}")
|
public @ResponseBody
|
AjaxResult verify(@PathVariable("keys") String id) {
|
LogUtil.debug("消核请求:{}", id);
|
return null;
|
}
|
|
}
|