package com.iamberry.wechat.handles.pay;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.StringReader;
import java.text.DecimalFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.iamberry.wechat.core.entity.order.OrderItem;
import com.iamberry.wechat.tools.ResultInfo;
import com.iamberry.wechat.tools.SendMessageUtil;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.xml.sax.InputSource;
import com.iamberry.app.tool.log.RatFWLogger;
import com.iamberry.wechat.core.entity.coupon.CouponItem;
import com.iamberry.wechat.core.entity.drp.PlaceInfo;
import com.iamberry.wechat.core.entity.drp.PlaceOrder;
import com.iamberry.wechat.core.entity.member.CashLog;
import com.iamberry.wechat.core.entity.member.Member;
import com.iamberry.wechat.core.entity.mq.MQMessage;
import com.iamberry.wechat.core.entity.order.Order;
import com.iamberry.wechat.core.entity.wx.WxPayResult;
import com.iamberry.wechat.face.cart.CartService;
import com.iamberry.wechat.face.coupon.CouponItemService;
import com.iamberry.wechat.face.drp.PlaceInfoService;
import com.iamberry.wechat.face.drp.PlaceOrderService;
import com.iamberry.wechat.face.member.CashLogService;
import com.iamberry.wechat.face.member.MemberService;
import com.iamberry.wechat.face.order.AdminOrderService;
import com.iamberry.wechat.face.qrcode.QrcodeService;
import com.iamberry.wechat.face.reback.RebackServices;
import com.iamberry.wechat.handles.mq.MQServiceProxy;
import com.iamberry.wechat.tools.StaticInfo;
/**
* @author 何秀刚
* Class Description: 微信支付回调handler,所有的支付回调,都在本类完成
* Create Date:2016年4月19日
* Update Date:2016年4月19日
*/
@Controller
@RequestMapping("/callback")
public class ResponseWechatPayHandler {
@Autowired
private RatFWLogger ratFWLogger;
private Object lock = new Object();
@Autowired
private CartService cartService;
@Autowired
private PlaceOrderService placeOrderService;
@Autowired
private PlaceInfoService placeInfoService;
@Autowired
private MemberService memberService;
@Autowired
private SendMessageUtil sendMessageUtil;
@Autowired
private AdminOrderService adminOrderService;
@Autowired
private MQServiceProxy mQservice;
@Autowired
private RebackServices rebackServices;
@Autowired
private QrcodeService qrcodeService; //二维码处理
@Autowired
CashLogService cashLogService;
@Autowired
CouponItemService couponItemService;
/**
* 销售订单支付回调方法
*/
@SuppressWarnings("rawtypes")
@RequestMapping("/orderPayBack")
public void orderPayBack(HttpServletRequest request,
HttpServletResponse response) throws IOException {
synchronized (lock) {
String inputLine;
String notityXml = "";
String resXml = "";
try {
//获取XML参数
while ((inputLine = request.getReader().readLine()) != null) {
notityXml += inputLine;
}
request.getReader().close();
//解析XML格式的数据
Map m = parseXmlToList2(notityXml);
WxPayResult wpr = new WxPayResult();
wpr=setWxPayResultObj(wpr,m);
//判断
if("SUCCESS".equalsIgnoreCase(wpr.getResultCode())){
//resXml:返回给微信服务器的数据
resXml = "";
String orderIdMD5 = StaticInfo.orderIdMD5.decrypt(wpr.getAttach());
//System.out.println("===========pay 117==============");
if (orderIdMD5.equals(wpr.getOutTradeNo())) {
Date nowDate = new Date();
// 组装数据
Order order = new Order();
order.setSalesOrderid(orderIdMD5);
order.setSalesStatus(2); // 已支付
order.setSalesTransactionId(wpr.getTransactionId()); // 微信支付ID
order.setSalesTransactionDate(new Date()); // 微信支付时间
order.setSalesOpenid(wpr.getOpenid());
Order or = adminOrderService.getShopOrderByOrderId(orderIdMD5);
if(or.getSalesStatus() != 1){
return;
}
List orderItemList = adminOrderService.getShopOrderItemByOrderId(or.getSalesOrderid());
// 修改订单状态
int count = cartService.updateOrderStatus(order);
//System.out.println("===========pay 132 修改订单状态==============");
//修改优惠券状态
order=cartService.selectOrderInfoById(order);
//System.out.println("===========pay 136 修改订单状态=============="+order.getSalesOrderid());
String couponId=order.getCouponId();
if(couponId!=null && !couponId.equals("")){
CouponItem couponItem=new CouponItem();
couponItem.setCouponItemId(couponId);
couponItem.setCouponUseStatus(2);
couponItem.setCouponUseDate(new Date());
couponItemService.updateCouponItemById(couponItem);
}
//更新账户余额
int balancePayAmount=order.getBalancePayAmount();
if(balancePayAmount>0){
Member member=new Member();
member.setUserOpenid(order.getSalesOpenid());
member.setUserIncome(-balancePayAmount);
memberService.updateUserIncomeByOpenId(member);
//现金使用记录
CashLog log=new CashLog();
log.setCashLogsIntroduction("订单支出");
log.setCashLogsNum(balancePayAmount);
log.setCashLogsOpenid(member.getUserOpenid());
log.setCashLogsType(2);
log.setCashLogsResType(3);
log.setCashLogsOrderid(order.getSalesOrderid());
log.setCashLogsCreateDate(nowDate);
count=cashLogService.addCashLog(log);
}
if (count < 1) {
resXml = "";
}
//System.out.println("===========pay 168 快速插入=============="+count);
// 给订单的回调修改状态
try {
MQMessage message = new MQMessage();
message.setServiceToMessage(orderIdMD5);
message.setServiceOtherMessage(wpr.getTransactionId());
message.setServiceIsSend(2); // 没有推送的信息
message.setServiceStatus(1); // 推送成功
message.setServiceHandlerObjectName("cartServiceImpl");
message.setServiceHandlerMethodName("supdateStateByOrderId");
message.setServiceType(1);
mQservice.insertMQMessage(message);
} catch (Exception e) {
// TODO: handle exception
}
//System.out.println("===========pay 182 插入返利到mq=============="+count);
//rebackServices.loadSingleOrderReward(order);
//添加到返利表
//rebackServices.loadSingleOrderReward(order);
// 给百胜推送信息
try {
MQMessage message = new MQMessage();
message.setServiceToMessage(orderIdMD5);
message.setServiceOtherMessage("efast.trade.new.add");
message.setServiceIsSend(2); // 没有推送的信息
message.setServiceStatus(1); // 推送成功
message.setServiceType(1); // 添加订单信息
message.setServiceHandlerObjectName("efastOrderServiceImpl");
message.setServiceHandlerMethodName("addOrderInfoToEfast");
mQservice.insertMQMessage(message);
} catch (Exception e) {
}
//推送消息到微信
DecimalFormat df=new DecimalFormat("0.00");
String payMoney = df.format((float)or.getSalesYetAmount()/100) + "元";
try {
sendMessageUtil.probationPaySuccess(
ResultInfo.PAYSUCCESS,
orderItemList.get(0).getItemProductName()+"...",
or.getSalesOrderid(),
payMoney,
ResultInfo.sendRemark1,
order.getSalesOpenid(),
ResultInfo.ORDER_DETAIL+order.getSalesOrderid());
} catch (Exception e) {
System.out.println("推送支付成功消息失败!");
}
try {
//给父节点推送返利消息
// rewardsMessage(member,orderIdMD5);
} catch (Exception e) {
e.printStackTrace();
}
} else {
resXml = "";
ratFWLogger.error(this, "订单:" + orderIdMD5 + "支付成功,但是没有通过校验!");
}
}else{
resXml = "";
}
BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
out.write(resXml.getBytes());
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 销售订单支付回调方法
*/
@SuppressWarnings("rawtypes")
@RequestMapping("/drpPayBack")
public void drpPayBack(HttpServletRequest request,
HttpServletResponse response) throws IOException {
synchronized (lock) {
String inputLine;
String notityXml = "";
String resXml = "";
try {
//获取XML参数
while ((inputLine = request.getReader().readLine()) != null) {
notityXml += inputLine;
}
request.getReader().close();
//解析XML格式的数据
Map m = parseXmlToList2(notityXml);
WxPayResult wpr = new WxPayResult();
wpr=setWxPayResultObj(wpr,m);
//判断
if("SUCCESS".equalsIgnoreCase(wpr.getResultCode())){
//resXml:返回给微信服务器的数据
resXml = "";
String orderIdMD5 = StaticInfo.orderIdMD5.decrypt(wpr.getAttach());
if (orderIdMD5.equals(wpr.getOutTradeNo())) {
PlaceOrder placeOrder=new PlaceOrder();
placeOrder.setId(orderIdMD5);
placeOrder.setStatus(2); //已付款
int count = placeOrderService.UpdateOrder(placeOrder);
if (count < 1) {
resXml = "";
}
} else {
resXml = "";
ratFWLogger.error(this, "订单:" + orderIdMD5 + "支付成功,但是没有通过校验!");
}
}else{
resXml = "";
}
BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
out.write(resXml.getBytes());
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 解析xml片段为Map
* @param xml
* @return
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
private Map parseXmlToList2(String xml) {
Map retMap = new HashMap();
try {
StringReader read = new StringReader(xml);
// 创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入
InputSource source = new InputSource(read);
// 创建一个新的SAXBuilder
SAXBuilder sb = new SAXBuilder();
// 通过输入源构造一个Document
Document doc = (Document) sb.build(source);
Element root = doc.getRootElement();// 指向根节点
List es = root.getChildren();
if (es != null && es.size() != 0) {
for (Element element : es) {
retMap.put(element.getName(), element.getValue());
}
}
} catch (Exception e) {
e.printStackTrace();
}
return retMap;
}
//封装参数
public WxPayResult setWxPayResultObj(WxPayResult wpr ,Map m){
//解析参数
wpr.setAppid(m.get("appid").toString());
wpr.setBankType(m.get("bank_type").toString());
wpr.setCashFee(m.get("cash_fee").toString());
wpr.setFeeType(m.get("fee_type").toString());
wpr.setIsSubscribe(m.get("is_subscribe").toString());
wpr.setMchId(m.get("mch_id").toString());
wpr.setNonceStr(m.get("nonce_str").toString());
wpr.setOpenid(m.get("openid").toString());
wpr.setOutTradeNo(m.get("out_trade_no").toString());
wpr.setAttach(m.get("attach").toString());
wpr.setResultCode(m.get("result_code").toString());
wpr.setReturnCode(m.get("return_code").toString());
wpr.setSign(m.get("sign").toString());
wpr.setTimeEnd(m.get("time_end").toString());
wpr.setTotalFee(m.get("total_fee").toString());
wpr.setTradeType(m.get("trade_type").toString());
wpr.setTransactionId(m.get("transaction_id").toString());
return wpr;
}
/**
* 奖励提醒 下线成功购买后 提示直接上线
* create date 2016年5月14日
* @author 穆再兴
* @return
*/
private boolean rewardsMessage(Member member,String orderid){
boolean result = false;
// Integer i = cartService.getItemNumByOrderId(orderid);
// if(i == null || i.intValue() == 0){return false;}
// if(member == null || member.getUserResType() == null) return false;
//
// switch(member.getUserResType().intValue()){//用户来源
// case 2: //用户来源 微代理
//// if(member.getUserRefereeid() == null){return false;}
// Member fatherMember = memberService.getMemberByUserId(member.getUserRefereeid()); //微代理父节点信息
// if(fatherMember != null && StringUtils.isNotEmpty(fatherMember.getUserOpenid())){
// String temp = ResultInfo.REWARDSREMINDTEMP;
// temp = temp.replaceFirst("firstValueIamberry", ResultInfo.REWARDSWILLMESSAGE)
// .replaceFirst("orderValueIamberry", orderid)
// .replaceFirst("moneyValueIamberry", "¥" + new Integer(i.intValue() * 100).toString())
// .replaceFirst("remarkValueIamberry", ResultInfo.INTOSHOP);
// result = wxService.rewardsRemind(temp, fatherMember.getUserOpenid(), ResultInfo.INDEX_PAGE);
// }
// break;
// case 3: //用户来源 线下
//// if(member.getUserResOnline() == null ){return false;}
// PlaceInfo fatherPlace = placeInfoService.getPlaceInfoById(member.getUserResOnline());//分销父节点信息
// /*if(fatherPlace == null || fatherPlace.getPlaceRole() == 7){ return result; }*/
// int num = getRewardsMoneyOfFather(fatherPlace);
// if(num !=0 && StringUtils.isNotEmpty(fatherPlace.getOpenid())){
// String temp = ResultInfo.REWARDSREMINDTEMP;
// temp = temp.replaceFirst("firstValueIamberry", ResultInfo.REWARDSWILLMESSAGE)
// .replaceFirst("orderValueIamberry", orderid)
// .replaceFirst("moneyValueIamberry", "¥" + new Integer(i.intValue() * num / 100).toString())
// .replaceFirst("remarkValueIamberry", ResultInfo.INTOSHOP);
// result = wxService.rewardsRemind(temp, fatherPlace.getOpenid(), ResultInfo.INDEX_PAGE);
// }
// break;
// }
return result;
}
/**
* 获取 返给父节点的 金额
* create date 2016年5月14日
* @author 穆再兴
* @param fatherplace 父节点
* @return
*/
private int getRewardsMoneyOfFather(PlaceInfo fatherplace){
if(fatherplace == null ){return 0;}
return 0;
/*ShopSystemRule ruleMoney = null;
switch(fatherplace.getType()){ //父节点类型
case 2: //二级的角色
if(fatherplace.getPlaceRole() == 7){ //角色:奶粉厂 每台机器返利100元
ruleMoney = this.adminOrderService.getReluByRid(97);
break;
}else if(fatherplace.getPlaceRole() == 4){ //角色:特殊渠道管理员 每台机器返利140元
ruleMoney = this.adminOrderService.getReluByRid(98);
break;
}
case 3: //三级的角色
if(fatherplace.getPlaceRole() == 5){ //角色:导购 每台机器返利40元
ruleMoney = this.adminOrderService.getReluByRid(96);
break;
}else if(fatherplace.getPlaceRole() == 6){ //角色:分销员 每台机器返利100元
ruleMoney = this.adminOrderService.getReluByRid(97);
break;
}
}
if(ruleMoney == null){return 0;}
return ruleMoney.getRuleNum() == null ? 0 : ruleMoney.getRuleNum().intValue();
*/
}
}