ResponseWechatPayHandler.java 33 KB

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