ResponseWechatPayHandler.java 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944
  1. package com.iamberry.wechat.handles.pay;
  2. import com.iamberry.app.tool.log.RatFWLogger;
  3. import com.iamberry.wechat.core.entity.AdminUtils;
  4. import com.iamberry.wechat.core.entity.OrderUtil;
  5. import com.iamberry.wechat.core.entity.admin.ShopSystemRule;
  6. import com.iamberry.wechat.core.entity.agentInfo.AgentOrder;
  7. import com.iamberry.wechat.core.entity.coupon.CouponItem;
  8. import com.iamberry.wechat.core.entity.coupon.CouponItemDto;
  9. import com.iamberry.wechat.core.entity.giftCard.AgentInfo;
  10. import com.iamberry.wechat.core.entity.giftCard.AgentMachine;
  11. import com.iamberry.wechat.core.entity.giftCard.AgentPayLogs;
  12. import com.iamberry.wechat.core.entity.lease.LeaseOrder;
  13. import com.iamberry.wechat.core.entity.machine.Machine;
  14. import com.iamberry.wechat.core.entity.member.CashLog;
  15. import com.iamberry.wechat.core.entity.member.Member;
  16. import com.iamberry.wechat.core.entity.mq.MQMessage;
  17. import com.iamberry.wechat.core.entity.order.Order;
  18. import com.iamberry.wechat.core.entity.order.OrderItem;
  19. import com.iamberry.wechat.core.entity.order.ProbationOrder;
  20. import com.iamberry.wechat.core.entity.order.ProbationOrderDto;
  21. import com.iamberry.wechat.core.entity.probation.ProbationAwardRelu;
  22. import com.iamberry.wechat.core.entity.qrcode.QrcodeResult;
  23. import com.iamberry.wechat.core.entity.rent.RentApply;
  24. import com.iamberry.wechat.core.entity.wx.WxPayResult;
  25. import com.iamberry.wechat.face.admin.SystemService;
  26. import com.iamberry.wechat.face.agentInfo.AgentPurchaseOrderService;
  27. import com.iamberry.wechat.face.apparatus.ApparatusService;
  28. import com.iamberry.wechat.face.cart.CartService;
  29. import com.iamberry.wechat.face.coupon.CouponItemService;
  30. import com.iamberry.wechat.face.giftCard.AgentMachineService;
  31. import com.iamberry.wechat.face.giftCard.AgentService;
  32. import com.iamberry.wechat.face.giftCard.GiftCardService;
  33. import com.iamberry.wechat.face.home.HomeService;
  34. import com.iamberry.wechat.face.lease.LeaseOrderService;
  35. import com.iamberry.wechat.face.member.CashLogService;
  36. import com.iamberry.wechat.face.member.MemberService;
  37. import com.iamberry.wechat.face.mq.EfastOrderService;
  38. import com.iamberry.wechat.face.order.AdminOrderService;
  39. import com.iamberry.wechat.face.order.AdminProbationOrderService;
  40. import com.iamberry.wechat.face.order.CodeService;
  41. import com.iamberry.wechat.face.order.ProbationShopOrderService;
  42. import com.iamberry.wechat.face.qrcode.TemporaryQrcodeService;
  43. import com.iamberry.wechat.handles.mq.MQServiceProxy;
  44. import com.iamberry.wechat.service.ImberryConfig;
  45. import com.iamberry.wechat.tools.*;
  46. import com.iamberry.wechat.utils.SendMessageUtil;
  47. import org.apache.commons.lang3.StringUtils;
  48. import org.jdom.Document;
  49. import org.jdom.Element;
  50. import org.jdom.input.SAXBuilder;
  51. import org.springframework.beans.factory.annotation.Autowired;
  52. import org.springframework.stereotype.Controller;
  53. import org.springframework.web.bind.annotation.RequestMapping;
  54. import org.xml.sax.InputSource;
  55. import javax.servlet.http.HttpServletRequest;
  56. import javax.servlet.http.HttpServletResponse;
  57. import java.io.BufferedOutputStream;
  58. import java.io.IOException;
  59. import java.io.StringReader;
  60. import java.net.URLDecoder;
  61. import java.text.MessageFormat;
  62. import java.text.SimpleDateFormat;
  63. import java.util.*;
  64. import java.util.logging.Logger;
  65. /**
  66. * @author 何秀刚
  67. * Class Description: 微信支付回调handler,所有的支付回调,都在本类完成
  68. * Create Date:2016年4月19日
  69. * Update Date:2016年4月19日
  70. */
  71. @Controller
  72. @RequestMapping("/callback")
  73. public class ResponseWechatPayHandler {
  74. @Autowired
  75. private RatFWLogger ratFWLogger;
  76. private Object lock = new Object();
  77. @Autowired
  78. private CartService cartService;
  79. @Autowired
  80. private MemberService memberService;
  81. @Autowired
  82. private MQServiceProxy mQservice;
  83. @Autowired
  84. CashLogService cashLogService;
  85. @Autowired
  86. CouponItemService couponItemService;
  87. @Autowired
  88. private AdminProbationOrderService adminProbationOrderService;
  89. @Autowired
  90. private ProbationShopOrderService probationShopOrderService;
  91. @Autowired
  92. private SendMessageUtil sendMessageUtil;
  93. @Autowired
  94. private HomeService homeService;
  95. @Autowired
  96. private TemporaryQrcodeService temporaryQrcodeService;
  97. @Autowired
  98. private RatFWLogger inLongLogger;
  99. @Autowired
  100. private LeaseOrderService leaseOrderService;
  101. @Autowired
  102. private AdminUtils adminUtils;
  103. @Autowired
  104. private CodeService codeService;
  105. @Autowired
  106. private AgentService agentService;
  107. @Autowired
  108. private GiftCardService cardService;
  109. @Autowired
  110. private AgentMachineService agentMachineService;
  111. @Autowired
  112. private SystemService systemService;
  113. @Autowired
  114. private EfastOrderService efastOrderService;
  115. @Autowired
  116. private AgentPurchaseOrderService agentPurchaseOrderService;
  117. @Autowired
  118. private AdminOrderService adminOrderService;
  119. @Autowired
  120. private ApparatusService apparatusService;
  121. /**
  122. * 销售订单支付回调方法 -- tooth订单返回
  123. */
  124. @RequestMapping("/orderPayBack")
  125. public synchronized void orderPayBack(HttpServletRequest request,
  126. HttpServletResponse response) throws IOException {
  127. String inputLine;
  128. String notityXml = "";
  129. String resXml = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
  130. try {
  131. //获取XML参数
  132. while ((inputLine = request.getReader().readLine()) != null) {
  133. notityXml += inputLine;
  134. }
  135. request.getReader().close();
  136. //解析XML格式的数据
  137. Map<String, String> m = parseXmlToList2(notityXml);
  138. WxPayResult wpr = new WxPayResult();
  139. wpr=setWxPayResultObj(wpr,m);
  140. //判断
  141. if("SUCCESS".equalsIgnoreCase(wpr.getResultCode())){
  142. //resXml:返回给微信服务器的数据
  143. resXml = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
  144. String orderIdMD5 = StaticInfo.orderIdMD5.decrypt(wpr.getAttach());
  145. //System.out.println("===========pay 117==============");
  146. if (orderIdMD5.equals(wpr.getOutTradeNo())) {
  147. Date nowDate = new Date();
  148. // 组装数据
  149. Order order = new Order();
  150. order.setSalesOrderid(orderIdMD5);
  151. order.setSalesStatus(2); // 已支付
  152. order.setSalesTransactionId(wpr.getTransactionId()); // 微信支付ID
  153. order.setSalesTransactionDate(new Date()); // 微信支付时间
  154. order.setSalesOpenid(wpr.getOpenid());
  155. Order or = adminOrderService.getShopOrderByOrderId(orderIdMD5);
  156. if(or.getSalesStatus() != 1){
  157. return;
  158. }
  159. // 修改订单状态
  160. int count = cartService.updateOrderStatus(order);
  161. //发送短信给运营部
  162. /*ShopSystemRule rule = cartService.getReluByRid(241);
  163. try {
  164. String text = MessageFormat.format(ImberryConfig.ORDER_UPDATE_STATUS_TEXT, "发货");
  165. codeService.informShipping(rule.getRuleDesc(),text);
  166. } catch (Exception e) {
  167. System.out.println("订单换货发送消息失败!");
  168. }*/
  169. /*计算使用优惠券优惠的金额*/
  170. Integer couponAmount = 0;
  171. //修改优惠券状态
  172. order=cartService.selectOrderInfoById(order);
  173. String couponId=order.getCouponId();
  174. if(couponId!=null && !couponId.equals("")){
  175. CouponItem couponItem=new CouponItem();
  176. couponItem.setCouponItemId(couponId);
  177. couponItem.setCouponUseStatus(2);
  178. couponItem.setCouponUseDate(new Date());
  179. couponItemService.updateCouponItemById(couponItem);
  180. CouponItemDto couponItemDto = couponItemService.getCouponItemById(couponId);
  181. if(couponItemDto.getCouponType() == 1){ //按照金额
  182. couponAmount = couponItemDto.getCouponReduce()/100;
  183. }else if(couponItemDto.getCouponType() == 2){ ////按照折扣
  184. couponAmount = or.getSalesAmount() - or.getSalesAmount()/(couponItemDto.getCouponReduce()/100)/100;
  185. }
  186. }
  187. /*----------计算积分-----------
  188. * x * (n1*3 - n1) + y * (n2*3) - coupon*3 + 400
  189. */
  190. List<OrderItem> orderItemList = adminOrderService.getShopOrderItemByOrderId(orderIdMD5);
  191. Integer allIntegral = 0; //总积分
  192. for(int i=0;i<orderItemList.size();i++){
  193. OrderItem orderItem = orderItemList.get(i);
  194. Integer amount = orderItem.getItemProductDiscount() / 100;
  195. if(orderItem.getItemProductType()==100){//类型为电动牙刷
  196. Integer integral = amount * (orderItem.getItemNum()*3-orderItem.getItemNum());
  197. allIntegral += integral;
  198. }else{
  199. Integer integral = amount * (orderItem.getItemNum()*3);
  200. allIntegral += integral;
  201. }
  202. }
  203. if(couponAmount > 0){ //有优惠券减去优惠券的金额
  204. allIntegral += -couponAmount*3;
  205. }
  206. ratFWLogger.error(this, "订单:"+ orderIdMD5 +"订单使用优惠卷金额:" + couponAmount +"所得积分为:"+allIntegral);
  207. boolean flag = apparatusService.addStayIntegral(or.getSalesOpenid(),3,allIntegral,or.getSalesOrderid());
  208. ratFWLogger.info("积分是否入账:"+ flag);
  209. /*----------计算积分-----------*/
  210. if (count < 1) {
  211. resXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文有误]]></return_msg></xml>";
  212. }
  213. // 给订单的回调修改状态
  214. try {
  215. MQMessage message = new MQMessage();
  216. message.setServiceToMessage(orderIdMD5);
  217. message.setServiceOtherMessage(wpr.getTransactionId());
  218. message.setServiceIsSend(2); // 没有推送的信息
  219. message.setServiceStatus(1); // 推送成功
  220. message.setServiceHandlerObjectName("cartServiceImpl");
  221. message.setServiceHandlerMethodName("supdateStateByOrderId");
  222. message.setServiceType(1);
  223. mQservice.insertMQMessage(message);
  224. } catch (Exception e) {
  225. // TODO: handle exception
  226. }
  227. //System.out.println("===========pay 182 插入返利到mq=============="+count);
  228. //rebackServices.loadSingleOrderReward(order);
  229. //添加到返利表
  230. //rebackServices.loadSingleOrderReward(order);
  231. // 给百胜推送信息
  232. try {
  233. MQMessage message = new MQMessage();
  234. message.setServiceToMessage(orderIdMD5);
  235. message.setServiceOtherMessage("efast.trade.new.add");
  236. message.setServiceIsSend(2); // 没有推送的信息
  237. message.setServiceStatus(1); // 推送成功
  238. message.setServiceType(1); // 添加订单信息
  239. message.setServiceHandlerObjectName("efastOrderServiceImpl");
  240. message.setServiceHandlerMethodName("addOrderInfoToEfast");
  241. mQservice.insertMQMessage(message);
  242. } catch (Exception e) {
  243. //System.out.println("===========pay 201 插入返利到百胜失败==============");
  244. }
  245. //System.out.println("===========pay 201 插入返利到百胜完成==============");
  246. try { //修改用户购买记录为已购买
  247. memberService.updateIsBaughtByOpenid(wpr.getOpenid(), 2);
  248. //更新用户绑定状态
  249. Member member = memberService.getMemberByUserOpenId(order.getSalesOpenid());
  250. if (member.getUserIsFlag()!= null && member.getUserIsFlag() == 1) {
  251. member.setUserIsFlag(2);//终身绑定
  252. homeService.updateMemberIsFlagByOpenid(member);
  253. }
  254. QrcodeResult qr = temporaryQrcodeService.applyTempQrcode(order.getSalesOpenid());//为用户生成二维码
  255. inLongLogger.info("为用户-->" + order.getSalesOpenid() + ",生成二维码:" + qr.getQroceUrl());
  256. } catch (Exception e) {
  257. System.out.println("修改已购买状态和终身绑定失败!");
  258. e.printStackTrace();
  259. }
  260. } else {
  261. resXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文有误]]></return_msg></xml>";
  262. ratFWLogger.error(this, "订单:" + orderIdMD5 + "支付成功,但是没有通过校验!");
  263. }
  264. }else{
  265. resXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文为空]]></return_msg></xml>";
  266. }
  267. BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
  268. out.write(resXml.getBytes());
  269. out.flush();
  270. out.close();
  271. } catch (Exception e) {
  272. e.printStackTrace();
  273. }
  274. }
  275. /**
  276. * 解析xml片段为Map
  277. * @param xml
  278. * @return
  279. */
  280. @SuppressWarnings({"unchecked"})
  281. private Map<String, String> parseXmlToList2(String xml) {
  282. Map<String, String> retMap = new HashMap<String, String>();
  283. try {
  284. StringReader read = new StringReader(xml);
  285. // 创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入
  286. InputSource source = new InputSource(read);
  287. // 创建一个新的SAXBuilder
  288. SAXBuilder sb = new SAXBuilder();
  289. // 通过输入源构造一个Document
  290. Document doc = (Document) sb.build(source);
  291. Element root = doc.getRootElement();// 指向根节点
  292. List<Element> es = root.getChildren();
  293. if (es != null && es.size() != 0) {
  294. for (Element element : es) {
  295. retMap.put(element.getName(), element.getValue());
  296. }
  297. }
  298. } catch (Exception e) {
  299. e.printStackTrace();
  300. }
  301. return retMap;
  302. }
  303. //封装参数
  304. public WxPayResult setWxPayResultObj(WxPayResult wpr ,Map<String, String> m){
  305. //解析参数
  306. wpr.setAppid(m.get("appid").toString());
  307. wpr.setBankType(m.get("bank_type").toString());
  308. wpr.setCashFee(m.get("cash_fee").toString());
  309. wpr.setFeeType(m.get("fee_type").toString());
  310. wpr.setIsSubscribe(m.get("is_subscribe").toString());
  311. wpr.setMchId(m.get("mch_id").toString());
  312. wpr.setNonceStr(m.get("nonce_str").toString());
  313. wpr.setOpenid(m.get("openid").toString());
  314. wpr.setOutTradeNo(m.get("out_trade_no").toString());
  315. wpr.setAttach(m.get("attach").toString());
  316. wpr.setResultCode(m.get("result_code").toString());
  317. wpr.setReturnCode(m.get("return_code").toString());
  318. wpr.setSign(m.get("sign").toString());
  319. wpr.setTimeEnd(m.get("time_end").toString());
  320. wpr.setTotalFee(m.get("total_fee").toString());
  321. wpr.setTradeType(m.get("trade_type").toString());
  322. wpr.setTransactionId(m.get("transaction_id").toString());
  323. return wpr;
  324. }
  325. /**
  326. * 试用订单支付回调方法
  327. */
  328. @RequestMapping("/probationOrderPayBack")
  329. public synchronized void probationOrderPayBack(HttpServletRequest request,
  330. HttpServletResponse response) throws IOException {
  331. String inputLine;
  332. String notityXml = "";
  333. String resXml = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
  334. try {
  335. //获取XML参数
  336. while ((inputLine = request.getReader().readLine()) != null) {
  337. notityXml += inputLine;
  338. }
  339. request.getReader().close();
  340. //解析XML格式的数据
  341. Map<String, String> m = parseXmlToList2(notityXml);
  342. WxPayResult wpr = new WxPayResult();
  343. wpr=setWxPayResultObj(wpr,m);
  344. //判断
  345. if("SUCCESS".equalsIgnoreCase(wpr.getResultCode())){
  346. //resXml:返回给微信服务器的数据
  347. resXml = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
  348. String orderIdMD5 = StaticInfo.orderIdMD5.decrypt(wpr.getAttach());
  349. if (orderIdMD5.equals(wpr.getOutTradeNo())) {
  350. // 组装数据
  351. ProbationOrder order = new ProbationOrder();
  352. order.setProbationOrderid(orderIdMD5);
  353. order.setProbationStatus(5);// 已支付
  354. order.setProbationTransactionId(wpr.getTransactionId());// 微信支付ID
  355. order.setProbationTransactionTime(new Date());// 微信支付时间
  356. order.setProbationOpenid(wpr.getOpenid());
  357. ProbationOrderDto orderDto = probationShopOrderService.selectProbationOrderByOrderId(orderIdMD5);
  358. /*计算保存用户订单备注*/
  359. if(orderDto != null && orderDto.getProbationEndTime() != null){
  360. /*
  361. * 1.试用结束时间减去当前时间,为试用剩余时间
  362. * 2.试用总天数(30)减去试用剩余时间,为实际已经试用天数(不含暂停天数)
  363. * 3.判断实际已经试用天数 符合最早的则奖励
  364. */
  365. long remainingTime = DateTimeUtil.getDiffTimeMinutes(new Date(), orderDto.getProbationEndTime());
  366. long pastTime = 21 * 24 *60 - remainingTime;
  367. List< ProbationAwardRelu> list = probationShopOrderService.selectProbationAwardRelu();
  368. for (ProbationAwardRelu awardRelu : list) {
  369. if((int)pastTime + 1 < awardRelu.getAwardNum().intValue()){
  370. order.setProbationUserRemark(awardRelu.getAwardInfo());
  371. break;
  372. }
  373. }
  374. }
  375. // 修改订单状态 及前台备注
  376. boolean flag = adminProbationOrderService.updateProbationOrderStatus(order);
  377. try { //修改用户购买记录为已购买
  378. memberService.updateIsBaughtByOpenid(wpr.getOpenid(), 2);
  379. //更新用户绑定状态
  380. Member member = memberService.getMemberByUserOpenId(order.getProbationOpenid());
  381. if (member.getUserIsFlag()!= null && member.getUserIsFlag() == 1) {
  382. member.setUserIsFlag(2);//终身绑定
  383. homeService.updateMemberIsFlagByOpenid(member);
  384. }
  385. try {
  386. QrcodeResult qr = temporaryQrcodeService.applyTempQrcode(order.getProbationOpenid());//为用户生成二维码
  387. inLongLogger.info("为用户-->" + order.getProbationOpenid() + ",生成二维码:" + qr.getQroceUrl());
  388. } catch (Exception e) {
  389. System.out.println("为用户生成二维码失败!");
  390. }
  391. } catch (Exception e) {
  392. System.out.println("修改已购买状态失败!");
  393. e.printStackTrace();
  394. }
  395. try {
  396. Member member = memberService.getMemberByUserOpenId(order.getProbationOpenid()); // 当前用户
  397. probationShopOrderService.insertSalesOrder(orderIdMD5, member.getUserId());
  398. } catch (Exception e) {
  399. System.out.println("试用订单转存到订单表出错!");
  400. }
  401. double money = orderDto.getProbationYetAmount().intValue() / 100;
  402. try {
  403. sendMessageUtil.probationPaySuccess(
  404. ResultInfo.PAYSUCCESS,
  405. money + "元",
  406. orderDto.getProductName(),
  407. ResultInfo.PAYSUCCESSFOOT,
  408. order.getProbationOpenid(),
  409. ResultInfo.TRY_ORDER_DETAIL + "?orderId=" + orderIdMD5);
  410. } catch (Exception e) {
  411. System.out.println("推送支付成功消息失败!");
  412. }
  413. if (!flag) {
  414. resXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文有误]]></return_msg></xml>";
  415. }
  416. } else {
  417. resXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文有误]]></return_msg></xml>";
  418. ratFWLogger.error(this, "订单:" + orderIdMD5 + "支付成功,但是没有通过校验!");
  419. }
  420. }else{
  421. resXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文为空]]></return_msg></xml>";
  422. }
  423. BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
  424. out.write(resXml.getBytes());
  425. out.flush();
  426. out.close();
  427. } catch (Exception e) {
  428. e.printStackTrace();
  429. }
  430. }
  431. /**
  432. * 销售订单支付回调方法
  433. */
  434. @RequestMapping("/leaseOrderPayBack")
  435. public void leaseOrderPayBack(HttpServletRequest request,
  436. HttpServletResponse response) throws IOException {
  437. synchronized (lock) {
  438. String inputLine;
  439. String notityXml = "";
  440. String resXml = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
  441. try {
  442. //获取XML参数
  443. while ((inputLine = request.getReader().readLine()) != null) {
  444. notityXml += inputLine;
  445. }
  446. request.getReader().close();
  447. //解析XML格式的数据
  448. Map<String, String> m = parseXmlToList2(notityXml);
  449. WxPayResult wpr = new WxPayResult();
  450. wpr=setWxPayResultObj(wpr,m);
  451. //判断
  452. if("SUCCESS".equalsIgnoreCase(wpr.getResultCode())){
  453. //resXml:返回给微信服务器的数据
  454. resXml = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
  455. String orderIdMD5 = StaticInfo.orderIdMD5.decrypt(wpr.getAttach());
  456. //System.out.println("===========pay 117==============");
  457. if (orderIdMD5.equals(wpr.getOutTradeNo())) {
  458. Date nowDate = new Date();
  459. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  460. // 组装订单数据
  461. LeaseOrder order = new LeaseOrder();
  462. order.setOrderId(orderIdMD5);
  463. order.setOrderStatus(2); // 已支付
  464. order.setOrderTransactionId(wpr.getTransactionId()); // 微信支付ID
  465. order.setOrderTransactionDate(new Date()); // 微信支付时间
  466. order.setOrderOpenid(wpr.getOpenid());
  467. // 产生安全的code
  468. String code = adminUtils.byte2hex(adminUtils.createRandomByte());
  469. try {
  470. code = NameUtils.getConfig("MACHINE_CODE") + adminUtils.byte2hex(adminUtils.createRandomByte()).substring(0, 10);
  471. } catch (Exception e) {
  472. code = NameUtils.getConfig("MACHINE_CODE") + UUID.randomUUID().toString().replaceAll("-", "").substring(0, 10);
  473. }
  474. order.setOrderInitCode(code);
  475. order.setOrderCodeState(1);
  476. //查询购买后机器的初始水量
  477. ShopSystemRule ShopSystemRule = cartService.getReluByRid(211);
  478. //组装机器数据
  479. Machine machine = new Machine();
  480. machine.setMachineOrderId(orderIdMD5);
  481. machine.setMachineOpenid(order.getOrderOpenid());
  482. machine.setMachineDeviceId(order.getOrderTransactionId());
  483. machine.setMachineSurplusWater(ShopSystemRule.getRuleNum().intValue());
  484. machine.setMachineConnectState(2);
  485. machine.setMachineInitState(2);
  486. machine.setMachineState(2);
  487. machine.setMachineInitCode(code);
  488. // 修改订单状态即添加激活码
  489. int count = leaseOrderService.updateLeaseOrderInfo(order,machine);
  490. //System.out.println("===========pay 132 修改订单状态==============");
  491. if (count < 1) {
  492. resXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文有误]]></return_msg></xml>";
  493. }
  494. //System.out.println("===========pay 182 插入返利到mq=============="+count);
  495. //rebackServices.loadSingleOrderReward(order);
  496. //查询订单的收货人和押金
  497. LeaseOrder leaseOrder = leaseOrderService.selectDepositByOrderId(orderIdMD5);
  498. //发送短信
  499. // try{
  500. // codeService.sendLeaseOrderToUser(leaseOrder.getOrderAddressTel(),
  501. // format.format(nowDate), leaseOrder.getOrderDeposit(), ShopSystemRule.getRuleNum().intValue());
  502. // } catch (Exception e) {
  503. // inLongLogger.info("为订单-->" + order.getOrderId() + ",:" + "发送短信失败");
  504. // }
  505. //添加到返利表
  506. //rebackServices.loadSingleOrderReward(order);
  507. // 给百胜推送信息
  508. try {
  509. MQMessage message = new MQMessage();
  510. message.setServiceToMessage(orderIdMD5);
  511. message.setServiceOtherMessage("efast.trade.new.add");
  512. message.setServiceIsSend(2); // 没有推送的信息
  513. message.setServiceStatus(1); // 推送成功
  514. message.setServiceType(1); // 添加订单信息
  515. message.setServiceHandlerObjectName("efastOrderServiceImpl");
  516. message.setServiceHandlerMethodName("addOrderInfoToEfast");
  517. mQservice.insertMQMessage(message);
  518. } catch (Exception e) {
  519. //System.out.println("===========pay 201 插入返利到百胜失败==============");
  520. }
  521. //System.out.println("===========pay 201 插入返利到百胜完成==============");
  522. try { //修改用户购买记录为已购买
  523. memberService.updateIsBaughtByOpenid(wpr.getOpenid(), 2);
  524. //更新用户绑定状态
  525. Member member = memberService.getMemberByUserOpenId(order.getOrderId());
  526. if (member.getUserIsFlag()!= null && member.getUserIsFlag() == 1) {
  527. member.setUserIsFlag(2);//终身绑定
  528. homeService.updateMemberIsFlagByOpenid(member);
  529. }
  530. QrcodeResult qr = temporaryQrcodeService.applyTempQrcode(order.getOrderId());//为用户生成二维码
  531. inLongLogger.info("为用户-->" + order.getOrderId() + ",生成二维码:" + qr.getQroceUrl());
  532. } catch (Exception e) {
  533. System.out.println("修改已购买状态和终身绑定失败!");
  534. e.printStackTrace();
  535. }
  536. } else {
  537. resXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文有误]]></return_msg></xml>";
  538. ratFWLogger.error(this, "订单:" + orderIdMD5 + "支付成功,但是没有通过校验!");
  539. }
  540. }else{
  541. resXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文为空]]></return_msg></xml>";
  542. }
  543. BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
  544. out.write(resXml.getBytes());
  545. out.flush();
  546. out.close();
  547. } catch (Exception e) {
  548. e.printStackTrace();
  549. }
  550. }
  551. }
  552. /**
  553. * 付费代理订单支付回调方法
  554. * 2017年2月17日
  555. * @author muzx
  556. */
  557. @RequestMapping("/agent_order_pay_back")
  558. public synchronized void agentOrderPayBack(HttpServletRequest request,
  559. HttpServletResponse response) throws IOException {
  560. String inputLine;
  561. String notityXml = "";
  562. String resXml = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
  563. try {
  564. //获取XML参数
  565. while ((inputLine = request.getReader().readLine()) != null) {
  566. notityXml += inputLine;
  567. }
  568. request.getReader().close();
  569. //解析XML格式的数据
  570. Map<String, String> m = parseXmlToList2(notityXml);
  571. WxPayResult wpr = new WxPayResult();
  572. wpr=setWxPayResultObj(wpr,m);
  573. //判断
  574. if("SUCCESS".equalsIgnoreCase(wpr.getResultCode())){
  575. //resXml:返回给微信服务器的数据
  576. resXml = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
  577. String orderIdMD5 = StaticInfo.orderIdMD5.decrypt(wpr.getAttach());
  578. inLongLogger.info(this, "orderIdMD5--->>" + orderIdMD5);
  579. if (orderIdMD5.equals(wpr.getOutTradeNo())) {
  580. // 组装数据
  581. AgentPayLogs payLogs = new AgentPayLogs();
  582. //单号格式:AOID000_ + 支付记录id + "_" + 代理商物流记录id + ("_" + 推荐人物流记录id)<若无推荐人则无此项>
  583. String[] ids = StrUtils.strToArr(orderIdMD5, "_");
  584. payLogs.setPayId(Integer.parseInt(ids[1]));
  585. payLogs.setPayTransactionId(wpr.getTransactionId());// 微信支付ID
  586. payLogs.setPayTransactionDate(new Date());// 微信支付时间
  587. payLogs.setPayStatus(2);
  588. // 修改支付状态
  589. boolean flag1 = agentService.updatePayLogsById(payLogs);
  590. //修改当前代理商和推荐人物流记录状态
  591. Integer agentId1 = Integer.parseInt(ids[2]);
  592. Integer agentId2 = ids.length > 3 ? Integer.parseInt(ids[3]) : null;
  593. boolean flag2 = cardService.saveCardAndMachine(1, wpr.getOpenid(), agentId1, agentId2);
  594. try {
  595. //推送百胜
  596. AgentMachine agentMachine = agentMachineService.selectAgentMachine(Integer.parseInt(ids[2]));
  597. efastOrderService.giftCard(agentMachine.getAgentMachineAddressInfo(), "ZS1111111_" + agentMachine.getAgentMachineId(), agentMachine.getAgentMachineColorId(),
  598. agentMachine.getAgentMachineAddressName(), agentMachine.getAgentMachineAddressTel(), agentMachine.getAgentMachineOpenId());
  599. } catch (Exception e) {
  600. inLongLogger.info(this, "推送百胜失败!");
  601. e.printStackTrace();
  602. }
  603. Member member = memberService.getMemberByUserOpenId(wpr.getOpenid());
  604. AgentInfo agentInfo = agentService.selectAgentByOpenId(member.getUserOpenid());
  605. //有推荐人 则推荐人推送消息
  606. if(agentId2 != null){
  607. try {
  608. //从规则表中获取:付费代理商支付金额
  609. ShopSystemRule shopSystemRule1 = systemService.selectOneShopRuleById(224);
  610. int money = shopSystemRule1.getRuleNum().intValue();
  611. if (agentInfo !=null && StringUtils.isNotEmpty(agentInfo.getAgentReferrerOpenid())) {
  612. sendMessageUtil.prizeReceivePush(
  613. "您好,您成功推荐一位代理商,详情为:",
  614. URLDecoder.decode(member.getUserNickname(), "UTF-8"),
  615. "Watero水时代",
  616. (money / 100) + "元",
  617. DateTimeUtil.format(new Date()),
  618. "美国watero净饮水一体机一台",
  619. "请点击完善收货地址并领取奖励。",
  620. agentInfo.getAgentReferrerOpenid(),
  621. ResultInfo.AGENT_REFERRER_MACHINE_PAGE+"?agentMachineId=" + agentId2
  622. );
  623. }
  624. } catch (Exception e) {
  625. inLongLogger.info(this, "给推荐人推送消息失败!");
  626. e.printStackTrace();
  627. }
  628. }
  629. if (!(flag1 && flag2)) {
  630. resXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文有误]]></return_msg></xml>";
  631. }
  632. } else {
  633. resXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文有误]]></return_msg></xml>";
  634. ratFWLogger.error(this, "订单:" + orderIdMD5 + "支付成功,但是没有通过校验!");
  635. }
  636. }else{
  637. resXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文为空]]></return_msg></xml>";
  638. }
  639. BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
  640. out.write(resXml.getBytes());
  641. out.flush();
  642. out.close();
  643. } catch (Exception e) {
  644. e.printStackTrace();
  645. }
  646. }
  647. /**
  648. * 付费代理订商续费支付回调方法
  649. * 2017年2月17日
  650. * @author LJK
  651. */
  652. @RequestMapping("/agent_renewal_pay_back")
  653. public synchronized void agentRenewalPayBack(HttpServletRequest request,
  654. HttpServletResponse response) throws IOException {
  655. String inputLine;
  656. String notityXml = "";
  657. String resXml = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
  658. try {
  659. //获取XML参数
  660. while ((inputLine = request.getReader().readLine()) != null) {
  661. notityXml += inputLine;
  662. }
  663. request.getReader().close();
  664. //解析XML格式的数据
  665. Map<String, String> m = parseXmlToList2(notityXml);
  666. WxPayResult wpr = new WxPayResult();
  667. wpr=setWxPayResultObj(wpr,m);
  668. //判断
  669. if("SUCCESS".equalsIgnoreCase(wpr.getResultCode())){
  670. //resXml:返回给微信服务器的数据
  671. resXml = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
  672. String orderIdMD5 = StaticInfo.orderIdMD5.decrypt(wpr.getAttach());
  673. System.out.println("orderIdMD5--------------->" + orderIdMD5);
  674. if (orderIdMD5.equals(wpr.getOutTradeNo())) {
  675. // 组装数据
  676. AgentPayLogs payLogs = new AgentPayLogs();
  677. //单号格式:AOID000_ + 支付记录id + "_" + 代理商物流记录id + ("_" + 推荐人物流记录id)<若无推荐人则无此项>
  678. String[] ids = StrUtils.strToArr(orderIdMD5, "_");
  679. payLogs.setPayId(Integer.parseInt(ids[1]));
  680. payLogs.setPayTransactionId(wpr.getTransactionId());// 微信支付ID
  681. payLogs.setPayTransactionDate(new Date());// 微信支付时间
  682. // 修改支付状态
  683. boolean flag1 = agentService.updatePayLogsById(payLogs);
  684. //修改当前代理商和推荐人物流记录状态
  685. Integer agentId1 = Integer.parseInt(ids[2]);
  686. //Integer agentId2 = ids.length > 3 ? Integer.parseInt(ids[3]) : null;
  687. AgentInfo agentInfo = agentService.selectAgentByOpenId(wpr.getOpenid());
  688. int agentType = 1;
  689. if(agentInfo.getAgentIsHudredAgent() == 1){
  690. agentType = 2;
  691. }
  692. boolean flag2 = cardService.saveCardAndMachine(agentType, wpr.getOpenid(), agentId1, null);
  693. try {
  694. //推送百胜
  695. AgentMachine agentMachine = agentMachineService.selectAgentMachine(Integer.parseInt(ids[2]));
  696. efastOrderService.giftCard(agentMachine.getAgentMachineAddressInfo(), "ZS1111111_" + agentMachine.getAgentMachineId(), agentMachine.getAgentMachineColorId(),
  697. agentMachine.getAgentMachineAddressName(), agentMachine.getAgentMachineAddressTel(), agentMachine.getAgentMachineOpenId());
  698. } catch (Exception e) {
  699. System.out.println("推送百胜失败!");
  700. }
  701. if (!(flag1 && flag2)) {
  702. resXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文有误]]></return_msg></xml>";
  703. }
  704. } else {
  705. resXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文有误]]></return_msg></xml>";
  706. ratFWLogger.error(this, "订单:" + orderIdMD5 + "支付成功,但是没有通过校验!");
  707. }
  708. }else{
  709. resXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文为空]]></return_msg></xml>";
  710. }
  711. BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
  712. out.write(resXml.getBytes());
  713. out.flush();
  714. out.close();
  715. } catch (Exception e) {
  716. e.printStackTrace();
  717. }
  718. }
  719. /**
  720. * 租赁申请回调
  721. * @param request
  722. * @param response
  723. * @author 献
  724. * @Time 2017年3月16日
  725. */
  726. @RequestMapping("/rent_appply")
  727. public void rentApplyCallback(HttpServletRequest request,
  728. HttpServletResponse response) {
  729. String inputLine;
  730. String notityXml = "";
  731. String resXml = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
  732. try {
  733. //获取XML参数
  734. while ((inputLine = request.getReader().readLine()) != null) {
  735. notityXml += inputLine;
  736. }
  737. request.getReader().close();
  738. Map<String, String> m = parseXmlToList2(notityXml);
  739. WxPayResult wpr = new WxPayResult();
  740. wpr=setWxPayResultObj(wpr,m);
  741. //判断
  742. if("SUCCESS".equalsIgnoreCase(wpr.getResultCode())){
  743. resXml = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
  744. String orderIdMD5 = StaticInfo.orderIdMD5.decrypt(wpr.getAttach());
  745. if (orderIdMD5.equals(wpr.getOutTradeNo())) {
  746. RentApply apply = new RentApply();
  747. apply.setApplyId(Integer.parseInt(orderIdMD5.replace("DJ00000000", "")));
  748. apply.setApplyPayMoney(Integer.parseInt(wpr.getTotalFee()));
  749. leaseOrderService.updateApply(apply);
  750. } else {
  751. resXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文有误]]></return_msg></xml>";
  752. }
  753. }else{
  754. resXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文为空]]></return_msg></xml>";
  755. }
  756. BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
  757. out.write(resXml.getBytes());
  758. out.flush();
  759. out.close();
  760. } catch (Exception e) {
  761. }
  762. }
  763. /**
  764. * 采购商品订单回调
  765. * @param request
  766. * @param response
  767. */
  768. @RequestMapping("/agentPurchaseOrderPayBack")
  769. public synchronized void agentPurchaseOrderPayBack(HttpServletRequest request, HttpServletResponse response)throws IOException {
  770. String inputLine;
  771. String notityXml = "";
  772. String resXml = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
  773. try {
  774. //获取XML参数
  775. while ((inputLine = request.getReader().readLine()) != null) {
  776. notityXml += inputLine;
  777. }
  778. request.getReader().close();
  779. //解析XML格式的数据
  780. Map<String, String> m = parseXmlToList2(notityXml);
  781. WxPayResult wpr = new WxPayResult();
  782. wpr=setWxPayResultObj(wpr,m);
  783. //判断
  784. if("SUCCESS".equalsIgnoreCase(wpr.getResultCode())){
  785. //resXml:返回给微信服务器的数据
  786. resXml = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
  787. String orderIdMD5 = StaticInfo.orderIdMD5.decrypt(wpr.getAttach());
  788. //System.out.println("===========pay 117==============");
  789. if (orderIdMD5.equals(wpr.getOutTradeNo())) {
  790. Date nowDate = new Date();
  791. // 组装数据
  792. AgentOrder agentOrder = new AgentOrder();
  793. agentOrder.setAgentStatus(OrderUtil.ORDERSTAUTS_PAID); // 已支付
  794. agentOrder.setAgentOrderid(orderIdMD5); //订单id
  795. agentOrder.setAgentTransactionId(wpr.getTransactionId()); // 微信支付ID
  796. agentOrder.setAgentTransactionDate(new Date()); // 微信支付时间
  797. //order.setSalesOpenid(wpr.getOpenid());
  798. // 修改订单状态
  799. int count = agentPurchaseOrderService.updateAgentPurchaseOrder(agentOrder);
  800. if (count < 1) {
  801. resXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文有误]]></return_msg></xml>";
  802. }
  803. //System.out.println("===========pay 168 快速插入=============="+count);
  804. // 给订单的回调修改状态
  805. try {
  806. MQMessage message = new MQMessage();
  807. message.setServiceToMessage(orderIdMD5);
  808. message.setServiceOtherMessage(wpr.getTransactionId());
  809. message.setServiceIsSend(2); // 没有推送的信息
  810. message.setServiceStatus(1); // 推送成功
  811. message.setServiceHandlerObjectName("cartServiceImpl");
  812. message.setServiceHandlerMethodName("supdateStateByOrderId");
  813. message.setServiceType(1);
  814. mQservice.insertMQMessage(message);
  815. } catch (Exception e) {
  816. // TODO: handle exception
  817. }
  818. //System.out.println("===========pay 201 插入返利到百胜=============="+count);
  819. // 给百胜推送信息
  820. try {
  821. MQMessage message = new MQMessage();
  822. message.setServiceToMessage(orderIdMD5);
  823. message.setServiceOtherMessage("efast.trade.new.add");
  824. message.setServiceIsSend(2); // 没有推送的信息
  825. message.setServiceStatus(1); // 推送成功
  826. message.setServiceType(1); // 添加订单信息
  827. message.setServiceHandlerObjectName("efastOrderServiceImpl");
  828. message.setServiceHandlerMethodName("addAgentOrderToEfast");
  829. mQservice.insertMQMessage(message);
  830. } catch (Exception e) {
  831. //System.out.println("===========pay 201 插入返利到百胜失败==============");
  832. }
  833. //System.out.println("===========pay 201 插入返利到百胜完成==============");
  834. } else {
  835. resXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文有误]]></return_msg></xml>";
  836. ratFWLogger.error(this, "订单:" + orderIdMD5 + "支付成功,但是没有通过校验!");
  837. }
  838. }else{
  839. resXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文为空]]></return_msg></xml>";
  840. }
  841. BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
  842. out.write(resXml.getBytes());
  843. out.flush();
  844. out.close();
  845. } catch (Exception e) {
  846. e.printStackTrace();
  847. }
  848. }
  849. /**
  850. * 随机生成一个密码
  851. * @param len 密码总长度
  852. * @param numLen 需要生成数字的总长度
  853. * @return
  854. */
  855. public String getPassward(int len,int numLen) {
  856. StringBuilder sb = new StringBuilder(len);
  857. Random rnd = new Random();
  858. int num = 0;
  859. //除了数字以外的字母的总长度
  860. if (len >= numLen) {
  861. num = len - numLen;
  862. }
  863. if (num > 0) {
  864. String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  865. int j = 0;
  866. while (j < num) {
  867. //生成一个随机的大写字母
  868. String letter = String.valueOf(chars.charAt((int)(Math.random() * 26)));
  869. //该大写字母不能是O,I,L等字母,如果是O,I,L则继续生成并且不添加进sb字符串中
  870. if (!"O".equals(letter) && !"I".equals(letter) && !"L".equals(letter)) {
  871. sb.append(letter);
  872. j++;
  873. }
  874. }
  875. }
  876. for (int i = 0; i < numLen; i++)
  877. sb.append("0123456789".charAt(rnd.nextInt("0123456789".length())));
  878. return sb.toString();
  879. }
  880. }