ResponseWechatPayHandler.java 39 KB

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