ResponseWechatPayHandler.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. package com.iamberry.wechat.handles.pay;
  2. import java.io.BufferedOutputStream;
  3. import java.io.IOException;
  4. import java.io.StringReader;
  5. import java.text.DecimalFormat;
  6. import java.util.Date;
  7. import java.util.HashMap;
  8. import java.util.List;
  9. import java.util.Map;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12. import com.iamberry.wechat.core.entity.order.OrderItem;
  13. import com.iamberry.wechat.tools.ResultInfo;
  14. import com.iamberry.wechat.tools.SendMessageUtil;
  15. import org.jdom.Document;
  16. import org.jdom.Element;
  17. import org.jdom.input.SAXBuilder;
  18. import org.springframework.beans.factory.annotation.Autowired;
  19. import org.springframework.stereotype.Controller;
  20. import org.springframework.web.bind.annotation.RequestMapping;
  21. import org.xml.sax.InputSource;
  22. import com.iamberry.app.tool.log.RatFWLogger;
  23. import com.iamberry.wechat.core.entity.coupon.CouponItem;
  24. import com.iamberry.wechat.core.entity.drp.PlaceInfo;
  25. import com.iamberry.wechat.core.entity.drp.PlaceOrder;
  26. import com.iamberry.wechat.core.entity.member.CashLog;
  27. import com.iamberry.wechat.core.entity.member.Member;
  28. import com.iamberry.wechat.core.entity.mq.MQMessage;
  29. import com.iamberry.wechat.core.entity.order.Order;
  30. import com.iamberry.wechat.core.entity.wx.WxPayResult;
  31. import com.iamberry.wechat.face.cart.CartService;
  32. import com.iamberry.wechat.face.coupon.CouponItemService;
  33. import com.iamberry.wechat.face.drp.PlaceInfoService;
  34. import com.iamberry.wechat.face.drp.PlaceOrderService;
  35. import com.iamberry.wechat.face.member.CashLogService;
  36. import com.iamberry.wechat.face.member.MemberService;
  37. import com.iamberry.wechat.face.order.AdminOrderService;
  38. import com.iamberry.wechat.face.qrcode.QrcodeService;
  39. import com.iamberry.wechat.face.reback.RebackServices;
  40. import com.iamberry.wechat.handles.mq.MQServiceProxy;
  41. import com.iamberry.wechat.tools.StaticInfo;
  42. /**
  43. * @author 何秀刚
  44. * Class Description: 微信支付回调handler,所有的支付回调,都在本类完成
  45. * Create Date:2016年4月19日
  46. * Update Date:2016年4月19日
  47. */
  48. @Controller
  49. @RequestMapping("/callback")
  50. public class ResponseWechatPayHandler {
  51. @Autowired
  52. private RatFWLogger ratFWLogger;
  53. private Object lock = new Object();
  54. @Autowired
  55. private CartService cartService;
  56. @Autowired
  57. private PlaceOrderService placeOrderService;
  58. @Autowired
  59. private PlaceInfoService placeInfoService;
  60. @Autowired
  61. private MemberService memberService;
  62. @Autowired
  63. private SendMessageUtil sendMessageUtil;
  64. @Autowired
  65. private AdminOrderService adminOrderService;
  66. @Autowired
  67. private MQServiceProxy mQservice;
  68. @Autowired
  69. private RebackServices rebackServices;
  70. @Autowired
  71. private QrcodeService qrcodeService; //二维码处理
  72. @Autowired
  73. CashLogService cashLogService;
  74. @Autowired
  75. CouponItemService couponItemService;
  76. /**
  77. * 销售订单支付回调方法
  78. */
  79. @SuppressWarnings("rawtypes")
  80. @RequestMapping("/orderPayBack")
  81. public void orderPayBack(HttpServletRequest request,
  82. HttpServletResponse response) throws IOException {
  83. synchronized (lock) {
  84. String inputLine;
  85. String notityXml = "";
  86. String resXml = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
  87. try {
  88. //获取XML参数
  89. while ((inputLine = request.getReader().readLine()) != null) {
  90. notityXml += inputLine;
  91. }
  92. request.getReader().close();
  93. //解析XML格式的数据
  94. Map m = parseXmlToList2(notityXml);
  95. WxPayResult wpr = new WxPayResult();
  96. wpr=setWxPayResultObj(wpr,m);
  97. //判断
  98. if("SUCCESS".equalsIgnoreCase(wpr.getResultCode())){
  99. //resXml:返回给微信服务器的数据
  100. resXml = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
  101. String orderIdMD5 = StaticInfo.orderIdMD5.decrypt(wpr.getAttach());
  102. //System.out.println("===========pay 117==============");
  103. if (orderIdMD5.equals(wpr.getOutTradeNo())) {
  104. Date nowDate = new Date();
  105. // 组装数据
  106. Order order = new Order();
  107. order.setSalesOrderid(orderIdMD5);
  108. order.setSalesStatus(2); // 已支付
  109. order.setSalesTransactionId(wpr.getTransactionId()); // 微信支付ID
  110. order.setSalesTransactionDate(new Date()); // 微信支付时间
  111. order.setSalesOpenid(wpr.getOpenid());
  112. Order or = adminOrderService.getShopOrderByOrderId(orderIdMD5);
  113. if(or.getSalesStatus() != 1){
  114. return;
  115. }
  116. List<OrderItem> orderItemList = adminOrderService.getShopOrderItemByOrderId(or.getSalesOrderid());
  117. // 修改订单状态
  118. int count = cartService.updateOrderStatus(order);
  119. //System.out.println("===========pay 132 修改订单状态==============");
  120. //修改优惠券状态
  121. order=cartService.selectOrderInfoById(order);
  122. //System.out.println("===========pay 136 修改订单状态=============="+order.getSalesOrderid());
  123. String couponId=order.getCouponId();
  124. if(couponId!=null && !couponId.equals("")){
  125. CouponItem couponItem=new CouponItem();
  126. couponItem.setCouponItemId(couponId);
  127. couponItem.setCouponUseStatus(2);
  128. couponItem.setCouponUseDate(new Date());
  129. couponItemService.updateCouponItemById(couponItem);
  130. }
  131. //更新账户余额
  132. int balancePayAmount=order.getBalancePayAmount();
  133. if(balancePayAmount>0){
  134. Member member=new Member();
  135. member.setUserOpenid(order.getSalesOpenid());
  136. member.setUserIncome(-balancePayAmount);
  137. memberService.updateUserIncomeByOpenId(member);
  138. //现金使用记录
  139. CashLog log=new CashLog();
  140. log.setCashLogsIntroduction("订单支出");
  141. log.setCashLogsNum(balancePayAmount);
  142. log.setCashLogsOpenid(member.getUserOpenid());
  143. log.setCashLogsType(2);
  144. log.setCashLogsResType(3);
  145. log.setCashLogsOrderid(order.getSalesOrderid());
  146. log.setCashLogsCreateDate(nowDate);
  147. count=cashLogService.addCashLog(log);
  148. }
  149. if (count < 1) {
  150. resXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文有误]]></return_msg></xml>";
  151. }
  152. //System.out.println("===========pay 168 快速插入=============="+count);
  153. // 给订单的回调修改状态
  154. try {
  155. MQMessage message = new MQMessage();
  156. message.setServiceToMessage(orderIdMD5);
  157. message.setServiceOtherMessage(wpr.getTransactionId());
  158. message.setServiceIsSend(2); // 没有推送的信息
  159. message.setServiceStatus(1); // 推送成功
  160. message.setServiceHandlerObjectName("cartServiceImpl");
  161. message.setServiceHandlerMethodName("supdateStateByOrderId");
  162. message.setServiceType(1);
  163. mQservice.insertMQMessage(message);
  164. } catch (Exception e) {
  165. // TODO: handle exception
  166. }
  167. //System.out.println("===========pay 182 插入返利到mq=============="+count);
  168. //rebackServices.loadSingleOrderReward(order);
  169. //添加到返利表
  170. //rebackServices.loadSingleOrderReward(order);
  171. // 给百胜推送信息
  172. try {
  173. MQMessage message = new MQMessage();
  174. message.setServiceToMessage(orderIdMD5);
  175. message.setServiceOtherMessage("efast.trade.new.add");
  176. message.setServiceIsSend(2); // 没有推送的信息
  177. message.setServiceStatus(1); // 推送成功
  178. message.setServiceType(1); // 添加订单信息
  179. message.setServiceHandlerObjectName("efastOrderServiceImpl");
  180. message.setServiceHandlerMethodName("addOrderInfoToEfast");
  181. mQservice.insertMQMessage(message);
  182. } catch (Exception e) {
  183. }
  184. //推送消息到微信
  185. DecimalFormat df=new DecimalFormat("0.00");
  186. String payMoney = df.format((float)or.getSalesYetAmount()/100) + "元";
  187. try {
  188. sendMessageUtil.probationPaySuccess(
  189. ResultInfo.PAYSUCCESS,
  190. orderItemList.get(0).getItemProductName()+"...",
  191. or.getSalesOrderid(),
  192. payMoney,
  193. ResultInfo.sendRemark1,
  194. order.getSalesOpenid(),
  195. ResultInfo.ORDER_DETAIL+order.getSalesOrderid());
  196. } catch (Exception e) {
  197. System.out.println("推送支付成功消息失败!");
  198. }
  199. try {
  200. //给父节点推送返利消息
  201. // rewardsMessage(member,orderIdMD5);
  202. } catch (Exception e) {
  203. e.printStackTrace();
  204. }
  205. } else {
  206. resXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文有误]]></return_msg></xml>";
  207. ratFWLogger.error(this, "订单:" + orderIdMD5 + "支付成功,但是没有通过校验!");
  208. }
  209. }else{
  210. resXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文为空]]></return_msg></xml>";
  211. }
  212. BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
  213. out.write(resXml.getBytes());
  214. out.flush();
  215. out.close();
  216. } catch (Exception e) {
  217. e.printStackTrace();
  218. }
  219. }
  220. }
  221. /**
  222. * 销售订单支付回调方法
  223. */
  224. @SuppressWarnings("rawtypes")
  225. @RequestMapping("/drpPayBack")
  226. public void drpPayBack(HttpServletRequest request,
  227. HttpServletResponse response) throws IOException {
  228. synchronized (lock) {
  229. String inputLine;
  230. String notityXml = "";
  231. String resXml = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
  232. try {
  233. //获取XML参数
  234. while ((inputLine = request.getReader().readLine()) != null) {
  235. notityXml += inputLine;
  236. }
  237. request.getReader().close();
  238. //解析XML格式的数据
  239. Map m = parseXmlToList2(notityXml);
  240. WxPayResult wpr = new WxPayResult();
  241. wpr=setWxPayResultObj(wpr,m);
  242. //判断
  243. if("SUCCESS".equalsIgnoreCase(wpr.getResultCode())){
  244. //resXml:返回给微信服务器的数据
  245. resXml = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
  246. String orderIdMD5 = StaticInfo.orderIdMD5.decrypt(wpr.getAttach());
  247. if (orderIdMD5.equals(wpr.getOutTradeNo())) {
  248. PlaceOrder placeOrder=new PlaceOrder();
  249. placeOrder.setId(orderIdMD5);
  250. placeOrder.setStatus(2); //已付款
  251. int count = placeOrderService.UpdateOrder(placeOrder);
  252. if (count < 1) {
  253. resXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文有误]]></return_msg></xml>";
  254. }
  255. } else {
  256. resXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文有误]]></return_msg></xml>";
  257. ratFWLogger.error(this, "订单:" + orderIdMD5 + "支付成功,但是没有通过校验!");
  258. }
  259. }else{
  260. resXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文为空]]></return_msg></xml>";
  261. }
  262. BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
  263. out.write(resXml.getBytes());
  264. out.flush();
  265. out.close();
  266. } catch (Exception e) {
  267. e.printStackTrace();
  268. }
  269. }
  270. }
  271. /**
  272. * 解析xml片段为Map
  273. * @param xml
  274. * @return
  275. */
  276. @SuppressWarnings({ "rawtypes", "unchecked" })
  277. private Map parseXmlToList2(String xml) {
  278. Map retMap = new HashMap();
  279. try {
  280. StringReader read = new StringReader(xml);
  281. // 创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入
  282. InputSource source = new InputSource(read);
  283. // 创建一个新的SAXBuilder
  284. SAXBuilder sb = new SAXBuilder();
  285. // 通过输入源构造一个Document
  286. Document doc = (Document) sb.build(source);
  287. Element root = doc.getRootElement();// 指向根节点
  288. List<Element> es = root.getChildren();
  289. if (es != null && es.size() != 0) {
  290. for (Element element : es) {
  291. retMap.put(element.getName(), element.getValue());
  292. }
  293. }
  294. } catch (Exception e) {
  295. e.printStackTrace();
  296. }
  297. return retMap;
  298. }
  299. //封装参数
  300. public WxPayResult setWxPayResultObj(WxPayResult wpr ,Map m){
  301. //解析参数
  302. wpr.setAppid(m.get("appid").toString());
  303. wpr.setBankType(m.get("bank_type").toString());
  304. wpr.setCashFee(m.get("cash_fee").toString());
  305. wpr.setFeeType(m.get("fee_type").toString());
  306. wpr.setIsSubscribe(m.get("is_subscribe").toString());
  307. wpr.setMchId(m.get("mch_id").toString());
  308. wpr.setNonceStr(m.get("nonce_str").toString());
  309. wpr.setOpenid(m.get("openid").toString());
  310. wpr.setOutTradeNo(m.get("out_trade_no").toString());
  311. wpr.setAttach(m.get("attach").toString());
  312. wpr.setResultCode(m.get("result_code").toString());
  313. wpr.setReturnCode(m.get("return_code").toString());
  314. wpr.setSign(m.get("sign").toString());
  315. wpr.setTimeEnd(m.get("time_end").toString());
  316. wpr.setTotalFee(m.get("total_fee").toString());
  317. wpr.setTradeType(m.get("trade_type").toString());
  318. wpr.setTransactionId(m.get("transaction_id").toString());
  319. return wpr;
  320. }
  321. /**
  322. * 奖励提醒 下线成功购买后 提示直接上线
  323. * create date 2016年5月14日
  324. * @author 穆再兴
  325. * @return
  326. */
  327. private boolean rewardsMessage(Member member,String orderid){
  328. boolean result = false;
  329. // Integer i = cartService.getItemNumByOrderId(orderid);
  330. // if(i == null || i.intValue() == 0){return false;}
  331. // if(member == null || member.getUserResType() == null) return false;
  332. //
  333. // switch(member.getUserResType().intValue()){//用户来源
  334. // case 2: //用户来源 微代理
  335. //// if(member.getUserRefereeid() == null){return false;}
  336. // Member fatherMember = memberService.getMemberByUserId(member.getUserRefereeid()); //微代理父节点信息
  337. // if(fatherMember != null && StringUtils.isNotEmpty(fatherMember.getUserOpenid())){
  338. // String temp = ResultInfo.REWARDSREMINDTEMP;
  339. // temp = temp.replaceFirst("firstValueIamberry", ResultInfo.REWARDSWILLMESSAGE)
  340. // .replaceFirst("orderValueIamberry", orderid)
  341. // .replaceFirst("moneyValueIamberry", "¥" + new Integer(i.intValue() * 100).toString())
  342. // .replaceFirst("remarkValueIamberry", ResultInfo.INTOSHOP);
  343. // result = wxService.rewardsRemind(temp, fatherMember.getUserOpenid(), ResultInfo.INDEX_PAGE);
  344. // }
  345. // break;
  346. // case 3: //用户来源 线下
  347. //// if(member.getUserResOnline() == null ){return false;}
  348. // PlaceInfo fatherPlace = placeInfoService.getPlaceInfoById(member.getUserResOnline());//分销父节点信息
  349. // /*if(fatherPlace == null || fatherPlace.getPlaceRole() == 7){ return result; }*/
  350. // int num = getRewardsMoneyOfFather(fatherPlace);
  351. // if(num !=0 && StringUtils.isNotEmpty(fatherPlace.getOpenid())){
  352. // String temp = ResultInfo.REWARDSREMINDTEMP;
  353. // temp = temp.replaceFirst("firstValueIamberry", ResultInfo.REWARDSWILLMESSAGE)
  354. // .replaceFirst("orderValueIamberry", orderid)
  355. // .replaceFirst("moneyValueIamberry", "¥" + new Integer(i.intValue() * num / 100).toString())
  356. // .replaceFirst("remarkValueIamberry", ResultInfo.INTOSHOP);
  357. // result = wxService.rewardsRemind(temp, fatherPlace.getOpenid(), ResultInfo.INDEX_PAGE);
  358. // }
  359. // break;
  360. // }
  361. return result;
  362. }
  363. /**
  364. * 获取 返给父节点的 金额
  365. * create date 2016年5月14日
  366. * @author 穆再兴
  367. * @param fatherplace 父节点
  368. * @return
  369. */
  370. private int getRewardsMoneyOfFather(PlaceInfo fatherplace){
  371. if(fatherplace == null ){return 0;}
  372. return 0;
  373. /*ShopSystemRule ruleMoney = null;
  374. switch(fatherplace.getType()){ //父节点类型
  375. case 2: //二级的角色
  376. if(fatherplace.getPlaceRole() == 7){ //角色:奶粉厂 每台机器返利100元
  377. ruleMoney = this.adminOrderService.getReluByRid(97);
  378. break;
  379. }else if(fatherplace.getPlaceRole() == 4){ //角色:特殊渠道管理员 每台机器返利140元
  380. ruleMoney = this.adminOrderService.getReluByRid(98);
  381. break;
  382. }
  383. case 3: //三级的角色
  384. if(fatherplace.getPlaceRole() == 5){ //角色:导购 每台机器返利40元
  385. ruleMoney = this.adminOrderService.getReluByRid(96);
  386. break;
  387. }else if(fatherplace.getPlaceRole() == 6){ //角色:分销员 每台机器返利100元
  388. ruleMoney = this.adminOrderService.getReluByRid(97);
  389. break;
  390. }
  391. }
  392. if(ruleMoney == null){return 0;}
  393. return ruleMoney.getRuleNum() == null ? 0 : ruleMoney.getRuleNum().intValue();
  394. */
  395. }
  396. }