PayController.java 175 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688
  1. package com.platform.yijia.controller;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.alibaba.fastjson.parser.Feature;
  5. import com.google.gson.Gson;
  6. import com.platform.yijia.config.YiJiaRequest;
  7. import com.platform.yijia.param.request.*;
  8. import com.platform.yijia.pojo.*;
  9. import com.platform.yijia.service.*;
  10. import com.platform.yijia.utils.*;
  11. import com.platform.yijia.utils.redis.RedisCacheUtil;
  12. import com.platform.yijia.utils.weixinapp.WeiXinUserUtil;
  13. import com.platform.yijia.utils.weixinapp.WxPushUtil;
  14. import com.saobei.open.sdk.DefaultSaobeiApiClient;
  15. import com.saobei.open.sdk.model.requst.trade.SaobeiMiniPayRequest;
  16. import com.saobei.open.sdk.model.response.trade.SaobeiMiniPayResponse;
  17. import lombok.SneakyThrows;
  18. import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
  19. import org.apache.commons.lang3.StringUtils;
  20. import org.slf4j.Logger;
  21. import org.slf4j.LoggerFactory;
  22. import org.springframework.beans.factory.annotation.Value;
  23. import org.springframework.stereotype.Controller;
  24. import org.springframework.transaction.annotation.Transactional;
  25. import org.springframework.web.bind.annotation.*;
  26. import javax.annotation.Resource;
  27. import java.math.BigDecimal;
  28. import java.math.BigInteger;
  29. import java.math.RoundingMode;
  30. import java.sql.Timestamp;
  31. import java.text.ParseException;
  32. import java.text.SimpleDateFormat;
  33. import java.util.*;
  34. @Controller
  35. @YiJiaRequest()
  36. @CrossOrigin
  37. public class PayController {
  38. private static Logger logger =(Logger) LoggerFactory.getLogger(PayController.class);
  39. @Resource
  40. private PayOrderService payOrderService;
  41. @Resource
  42. private AppUserInfoService appUserInfoService;
  43. @Resource
  44. private StationOilGunService stationOilGunService;
  45. @Resource
  46. private CustomerGradeServices customerGradeServices;
  47. @Resource
  48. private StationService stationService;
  49. @Resource
  50. private CustomerPointsService customerPointsService;
  51. @Resource
  52. private IntegralRuleService integralRuleService;
  53. @Resource
  54. private CustomerPointsRecordService customerPointsRecordService;
  55. @Resource
  56. private WxPushUtil wxPushUtil;
  57. @Resource
  58. private GzhNewsTemplateService gzhNewsTemplateService;
  59. @Resource
  60. private CustomerManagerService customerManagerService;
  61. @Resource
  62. private CouponService couponService;
  63. @Value("${yijia.path.global-prefix}")
  64. private String globalPrefix;
  65. @Value("${yijia.domainName}")
  66. private String domainName;
  67. /***
  68. * 微信子商户支付接口
  69. * @param weChatPaySetRequest
  70. * @return
  71. */
  72. @RequestMapping(value = "/weChatPaySet", consumes = "application/json", method = RequestMethod.POST)
  73. @ResponseBody
  74. public String weChatPaySet(@RequestBody WeChatPaySetRequest weChatPaySetRequest){
  75. Gson gson = new Gson();
  76. ResultData resultData = null; //返回结果
  77. try {
  78. String type = weChatPaySetRequest.getType(); //获取配置类型
  79. JSONObject reqData = new JSONObject(); //微信子商户支付参数配置
  80. reqData.put("mno", weChatPaySetRequest.getMno()); //商编
  81. reqData.put("subMchIdsubMchId", weChatPaySetRequest.getSubMchIdsubMchId()); //获取微信子商号
  82. if(type != null && type !=""){
  83. reqData.put("type", type);
  84. //根据类型设置必传参数
  85. switch (type){
  86. case "01": //支付Appid
  87. reqData.put("accountType", weChatPaySetRequest.getAccountType()); // 支付Appid类型 配置类型为01时必传
  88. reqData.put("subAppid", weChatPaySetRequest.getSubAppid()); // 支付Appid 配置类型为01,02时必传
  89. break;
  90. case "02": //关注Appid
  91. reqData.put("subAppid", weChatPaySetRequest.getSubAppid()); // 支付Appid 配置类型为01,02时必传
  92. reqData.put("subscribeAppid", weChatPaySetRequest.getSubscribeAppid()); // 推荐关注公众号Appid 配置类型为02时与推荐关注 小程序Appid二选一
  93. reqData.put("receiptAppid", weChatPaySetRequest.getReceiptAppid()); // 推荐关注小程序Appid 配置类型为02时与推荐关注 公众号Appid二选一
  94. break;
  95. case "03": //jsapi授权目录
  96. reqData.put("jsapiPath", weChatPaySetRequest.getJsapiPath()); // jsapi授权目录 配置类型为03时必传
  97. break;
  98. }
  99. }
  100. String sxfPay = SXFPaySign.getSXFPay(reqData); //封装传参信息,增加公共信息,增加业务信息
  101. logger.debug("参数信息:"+ sxfPay);
  102. System.out.println("req:" + sxfPay);
  103. //此处不要改变reqData里面值的顺序用LinkedHashMap
  104. HashMap reqMap = JSON.parseObject(sxfPay, LinkedHashMap.class, Feature.OrderedField);
  105. //组装加密串
  106. String signContent = RSASignature.getOrderContent(reqMap);
  107. System.out.println("拼接后的参数:" + signContent);
  108. logger.debug("拼接后的参数:"+signContent);
  109. //sign
  110. String sign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  111. reqMap.put("sign", sign);
  112. String reqStr = JSON.toJSONString(reqMap);
  113. System.out.println("请求参数:" + reqMap);
  114. System.out.println("请求参数:" + reqStr);
  115. //String url = "https://openapi-test.tianquetech.com/merchant/weChatPaySet/addConf"; //测试环境
  116. String url = "https://openapi.tianquetech.com/merchant/weChatPaySet/addConf"; //生产环境
  117. //访问第三方接口
  118. String resultJson = HttpUtils.connectPostUrl(url, reqStr);
  119. System.out.println("返回信息:" + resultJson);
  120. // logger.debug("返回信息:"+resultJson);
  121. //不要对reqData排序 所以用LinkedHashMap
  122. HashMap<String, Object> result = JSON.parseObject(resultJson, LinkedHashMap.class, Feature.OrderedField);
  123. if ("0000".equals(result.get("code"))) {
  124. //验签
  125. String signResult = result.get("sign").toString();
  126. result.remove("sign");
  127. String resultStr = RSASignature.getOrderContent(result);
  128. System.out.println(resultStr);
  129. //sign
  130. String resultSign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  131. System.out.println("resultSign:" + resultSign);
  132. //组装加密串
  133. if (RSASignature.doCheck(resultStr, signResult, SXFPaySign.sxfPublic)) {
  134. System.out.println("===================验签成功==============");
  135. }
  136. }
  137. resultData=ResultData.success(result);
  138. } catch (Exception e) {
  139. resultData=ResultData.error(CodeMsg.YEWU_FAIL,"支付失败");
  140. e.printStackTrace();
  141. }
  142. return gson.toJson(resultData);
  143. }
  144. /**
  145. * 支付接口,前台上传支付信息,支付数据落地生产订单,调用随行付支付接口
  146. * @param
  147. * @return
  148. */
  149. @RequestMapping(value = "/getJhPayInfo", consumes = "application/json", method = RequestMethod.POST)
  150. @ResponseBody
  151. @Transactional
  152. public String getJhPayInfo(@RequestBody PayInfoRequest payInfoRequest){
  153. Gson gson =new Gson();
  154. ResultData resultData =null;
  155. String openId = payInfoRequest.getOpenId(); //用户openId
  156. String userType=payInfoRequest.getUserType();//用户登录类型 1 公众号。2 小程序
  157. String ordNo = payInfoRequest.getOrdNo();
  158. AppUserInfo appUserInfo =new AppUserInfo();
  159. //订单类型 是小程序还是公众号
  160. appUserInfo.setUserType(userType);
  161. if(userType.equals("1")){
  162. //1 是微信
  163. appUserInfo.setMinaOpenid(openId);
  164. }else if(userType.equals("2")){
  165. //2是支付宝
  166. appUserInfo.setALiId(openId);
  167. }
  168. //appUserInfo.setStationId(stationInfos.getGroupId());
  169. StationInfo stationInfo = new StationInfo();
  170. stationInfo.setStationId(Integer.valueOf(payInfoRequest.getStationId()));
  171. StationInfo stationInfos = stationService.selectStationInfo(stationInfo);
  172. appUserInfo.setStationId(stationInfos.getGroupId());
  173. AppUserInfo appUserInfos =appUserInfoService.getAppUserInfo(appUserInfo);
  174. if(appUserInfos!=null){
  175. //调用聚合支付
  176. try{
  177. //根据订单号查询订单信息
  178. PayOrder payOrder=payOrderService.selectOrderInfoByOrdNo(ordNo);
  179. if(payOrder!=null ){
  180. if(payOrder.getStatus() !=null && payOrder.getStatus().equals("0")){
  181. //是否开启优惠券功能
  182. if(stationInfos.getCouponEnabledFlag() !=null && stationInfos.getCouponEnabledFlag().equals("1")){
  183. if(StringUtils.isNotBlank(payInfoRequest.getId()) && !payInfoRequest.getId().equals("undefined")){
  184. String id = payInfoRequest.getId();
  185. logger.info("优惠券ID:" + id);
  186. UserCoupon userCoupon = new UserCoupon();
  187. userCoupon.setId(Integer.valueOf(id));
  188. UserCoupon ucResult = couponService.selectUserCouponInfo(userCoupon);
  189. if(ucResult !=null){
  190. PayOrder p =new PayOrder();
  191. BigDecimal couponAmt = ucResult.getCouponAmt(); //优惠券优惠参数
  192. String couponType = ucResult.getCouponType(); //优惠券类型
  193. Double amt = payOrder.getAmt();
  194. Double discountAmt = payOrder.getDiscountAmt();
  195. Double receivableAmt = payOrder.getReceivableAmt();
  196. BigDecimal amtNew = new BigDecimal(amt.toString());
  197. BigDecimal discountAmtNew = new BigDecimal(discountAmt.toString());
  198. switch (couponType){
  199. case "1":
  200. amtNew = new BigDecimal(amt.toString()).subtract(couponAmt);
  201. discountAmtNew = new BigDecimal(discountAmt.toString()).add(couponAmt);
  202. break;
  203. case "2":
  204. //amtNew;
  205. BigDecimal divide = new BigDecimal(amt.toString()).multiply(couponAmt).divide(new BigDecimal("100"));
  206. discountAmtNew = discountAmtNew.add(divide);
  207. amtNew = amtNew.subtract(divide);
  208. break;
  209. }
  210. //优惠方案选择
  211. String discountSetting = stationInfos.getDiscountSetting();
  212. if(discountSetting!=null && discountSetting.equals("0")){
  213. //为0时,表示无营销方案,只有等级
  214. if(!ucResult.getIsGradeFlag().equals("1")){
  215. //表示该优惠券与等级不叠加
  216. switch (couponType){
  217. case "1":
  218. amtNew = new BigDecimal(receivableAmt.toString()).subtract(couponAmt);
  219. discountAmtNew = couponAmt;
  220. break;
  221. case "2":
  222. amtNew = new BigDecimal(receivableAmt.toString()).multiply(couponAmt).divide(new BigDecimal("100"));
  223. discountAmtNew = new BigDecimal(receivableAmt.toString()).subtract(amtNew);
  224. break;
  225. }
  226. }
  227. }else {
  228. //不为0时,表示有营销方案
  229. if(!ucResult.getIsMarketFlag().equals("1")){
  230. //表示该优惠券与营销方案不叠加
  231. //表示该优惠券与等级不叠加
  232. switch (couponType){
  233. case "1":
  234. amtNew = new BigDecimal(receivableAmt.toString()).subtract(couponAmt);
  235. discountAmtNew = couponAmt;
  236. break;
  237. case "2":
  238. amtNew = new BigDecimal(receivableAmt.toString()).multiply(couponAmt).divide(new BigDecimal("100"));
  239. discountAmtNew = new BigDecimal(receivableAmt.toString()).subtract(amtNew);
  240. break;
  241. }
  242. }
  243. }
  244. amtNew = amtNew.signum() == -1 ? new BigDecimal("0.01") : amtNew.setScale(2,BigDecimal.ROUND_HALF_UP);
  245. discountAmtNew = discountAmtNew.signum() == -1 ? new BigDecimal("0.01") : discountAmtNew.setScale(2,BigDecimal.ROUND_HALF_UP);
  246. p.setAmt(Double.valueOf(amtNew.toString()));
  247. p.setDiscountAmt(Double.valueOf(discountAmtNew.toString()));
  248. p.setDiscountCoupon(id);
  249. p.setOrderNo(ordNo);
  250. payOrderService.getUpdatePayOrder(p);
  251. logger.info("优惠券更新完成!");
  252. }
  253. }
  254. }
  255. //将业务参数存放在 JSON 对象中
  256. JSONObject reqData = new JSONObject();
  257. PayOrder payOrderNew=payOrderService.selectOrderInfoByOrdNo(ordNo);
  258. logger.info("使用优惠券后的金额:" + payOrderNew.getAmt());
  259. reqData.put("ordNo", payOrder.getOrderNo()); //商户订单号
  260. //reqData.put("subMechId", ""); //子商户号
  261. reqData.put("amt", payOrderNew.getAmt()); //订单总金额
  262. //reqData.put("amt", "0.01");
  263. //reqData.put("discountAmt", ""); //参与优惠金额
  264. //reqData.put("unDiscountAmt", ""); //不参与优惠金额
  265. Map<String, String> stationAppIdAndAppSecret = stationService.getStationAppIdAndAppSecret(Integer.valueOf(payInfoRequest.getStationId()));
  266. if(stationAppIdAndAppSecret !=null && stationAppIdAndAppSecret.containsKey("appId") && stationAppIdAndAppSecret.containsKey("mno")){
  267. if(userType.equals("1")){
  268. reqData.put("subAppid", stationAppIdAndAppSecret.get("appId")); //微信小程序
  269. logger.info("支付子商户:"+ stationAppIdAndAppSecret.get("appId"));
  270. }else if(userType.equals("2")){
  271. reqData.put("subAppid", stationAppIdAndAppSecret.get("aliAppId")); //支付宝小程序
  272. logger.info("支付子商户:"+ stationAppIdAndAppSecret.get("aliAppId"));
  273. }
  274. reqData.put("mno", stationAppIdAndAppSecret.get("mno")); //商户编号
  275. logger.info("商户编号:"+ stationAppIdAndAppSecret.get("mno"));
  276. }
  277. if(userType.equals("1")){
  278. //1 是微信小程序
  279. reqData.put("payType", "WECHAT"); //支付渠道 WECHAT:微信;ALIPAY:支付宝;UNIONPAY:银联
  280. reqData.put("payWay", "03"); //支付方式 02 公众号/服 务窗/js支付 03 小程序
  281. reqData.put("userId", appUserInfos.getMinaOpenid()); //用户号 微信:openid; 支付宝:userid;银联:userid;微信&支付宝必传,银联js为非必传
  282. }else if(userType.equals("2")){
  283. //2 是支付宝
  284. reqData.put("payType", "ALIPAY"); //支付渠道 WECHAT:微信;ALIPAY:支付宝;UNIONPAY:银联
  285. reqData.put("payWay", "02"); //支付方式 02 公众号/服 务窗/js支付 03 小程序
  286. reqData.put("userId", appUserInfos.getALiId()); //用户号 微信:openid; 支付宝:userid;银联:userid;微信&支付宝必传,银联js为非必传
  287. }
  288. //reqData.put("timeExpire", "10"); //订单失效时间, 以分钟为单位
  289. //reqData.put("limitPay", "00"); //限制卡类型: 00-全部 01-限定不能使 用信用卡支付 默认值 00
  290. reqData.put("subject", payOrder.getOilName() + " - " +payOrder.getStationName()); //订单标题
  291. //reqData.put("hbFqNum", "6"); //花呗分期数,仅可上送 6 或 12
  292. reqData.put("tradeSource", "01"); //交易来源 01服务商,02收银台,03硬件
  293. reqData.put("trmIp", "172.16.2.1");//商家ip地址
  294. // reqData.put("customerIp", ""); //持卡人ip地址,银联js支付时必传
  295. //reqData.put("outFrontUrl", ""); //js 支付,前台 成功通知地址
  296. reqData.put("outFrontFailUrl", ""); //js 支付,前台 事变通知地址
  297. //globalPrefix
  298. String notifyUrl = "https://"+domainName+"/"+globalPrefix+"/getCallback";
  299. logger.info("随行付调用回调地址:" + notifyUrl);
  300. //reqData.put("notifyUrl", "https://www.huijy.net/api/getCallback"); //回调地址
  301. reqData.put("notifyUrl", notifyUrl); //回调地址
  302. //reqData.put("needReceipt", "00"); //电子发票功能 微信开具电子 发票使用
  303. //reqData.put("ledgerAccountFlag", "00"); //是否做分账 分账交易使 用;00:做; 01:不做;不传默认为不做分账
  304. //reqData.put("ledgerAccountEffectTime", "00"); //分账有效时间 单位为天;是 否做分账选择 00 时该字段必传
  305. // reqData.put("ruleId", "00"); //同 步 分 账 规 则 id
  306. //是否开启分账
  307. if(stationAppIdAndAppSecret.containsKey("mnoStatus") && stationAppIdAndAppSecret.get("mnoStatus").equals("1")){
  308. if(stationAppIdAndAppSecret.containsKey("mnoArray") && stationAppIdAndAppSecret.containsKey("mnoProportion")){
  309. logger.info("该商户号使用分账分账");
  310. //分账商户号
  311. //商户号
  312. List<Map<String, Object>> fusruleId = new ArrayList<>();
  313. String mnoArray = stationAppIdAndAppSecret.get("mnoArray");
  314. String[] mnoArraySplit = mnoArray.split(",");
  315. List<String> mnoArrayList = Arrays.asList(mnoArraySplit);
  316. //比例
  317. String mnoProportion = stationAppIdAndAppSecret.get("mnoProportion");
  318. String[] mnoProportionSplit = mnoProportion.split(":");
  319. List<String> mnoProportionList = Arrays.asList(mnoProportionSplit);
  320. for (int i=0; i<mnoArrayList.size(); i++){
  321. for (int y=0; y<mnoProportionList.size()-1; y++){
  322. String mno = mnoArrayList.get(i);
  323. String mnoPro = mnoProportionList.get(y);
  324. //本单金额
  325. String amt = payOrder.getAmt().toString();
  326. BigDecimal allotValue = new BigDecimal(amt).multiply(new BigDecimal(mnoPro)).divide(new BigDecimal("10")).setScale(2, BigDecimal.ROUND_HALF_UP);
  327. Map<String, Object> m = new HashMap<>();
  328. m.put("mno", mno);
  329. m.put("allotValue", allotValue);
  330. //map.put(allotValue.toString(), mno);
  331. fusruleId.add(m);
  332. }
  333. }
  334. logger.info("fusruleId 分账规则:" + fusruleId.toString());
  335. reqData.put("fusruleId", fusruleId); //同步分账规则
  336. }
  337. }
  338. // reqData.put("fusruleId", "00"); //同步分账规则
  339. //reqData.put("ylTrmNo", ""); //银联终端号
  340. //reqData.put("terminalId", ""); //TQ机具编号
  341. //reqData.put("deviceNo ", "1111"); //设备号
  342. // reqData.put("identityFlag", ""); //是否是实名支付
  343. // reqData.put("buyerIdType", "IDCARD"); //证件类型
  344. // reqData.put("buyerIdNo", "410523198701054018"); //证件号
  345. // reqData.put("buyerName", "张三"); //买家姓名
  346. // reqData.put("mobileNum", ""); //手机号
  347. // reqData.put("extend", ""); //备用
  348. String req= SXFPaySign.getSXFPay(reqData);
  349. logger.debug("参数信息:"+req);
  350. System.out.println("req:" + req);
  351. //此处不要改变reqData里面值的顺序用LinkedHashMap
  352. HashMap reqMap = JSON.parseObject(req, LinkedHashMap.class, Feature.OrderedField);
  353. //组装加密串
  354. String signContent = RSASignature.getOrderContent(reqMap);
  355. System.out.println("拼接后的参数:" + signContent);
  356. logger.debug("拼接后的参数:"+signContent);
  357. //sign
  358. String sign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  359. System.out.println("============签名:" + sign);
  360. reqMap.put("sign", sign);
  361. String reqStr = JSON.toJSONString(reqMap);
  362. System.out.println("请求参数:" + reqMap);
  363. System.out.println("请求参数:" + reqStr);
  364. //调用第三方接口地址
  365. //String url = "https://openapi-test.tianquetech.com/order/jsapiScan";//测试地址
  366. String url = "https://openapi.suixingpay.com/order/jsapiScan";//生产地址
  367. String resultJson = HttpUtils.connectPostUrl(url, reqStr);
  368. System.out.println("返回信息:" + resultJson);
  369. // logger.debug("返回信息:"+resultJson);
  370. //不要对reqData排序 所以用LinkedHashMap
  371. HashMap<String, Object> result = JSON.parseObject(resultJson, LinkedHashMap.class, Feature.OrderedField);
  372. if ("0000".equals(result.get("code"))) {
  373. //验签
  374. String signResult = result.get("sign").toString();
  375. result.remove("sign");
  376. String resultStr = RSASignature.getOrderContent(result);
  377. System.out.println("resultStr: " + resultStr);
  378. //sign
  379. String resultSign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  380. System.out.println("resultSign: " + resultSign);
  381. //组装加密串
  382. if (RSASignature.doCheck(resultStr, signResult, SXFPaySign.sxfPublic)) {
  383. System.out.println("===================验签成功==============");
  384. }
  385. }
  386. resultData=ResultData.success(result);
  387. }else {
  388. resultData=ResultData.error(CodeMsg.ALREADY_PAY);
  389. }
  390. }else {
  391. resultData=ResultData.error(CodeMsg.YEWU_FAIL,"未查询到订单");
  392. }
  393. }catch (Exception e){
  394. resultData=ResultData.error(CodeMsg.YEWU_FAIL,"订单支付失败");
  395. e.printStackTrace();
  396. }
  397. }else{
  398. //返回失败支付失败信息
  399. resultData=ResultData.error(CodeMsg.USER_NOT_EXSIST);
  400. }
  401. return gson.toJson(resultData);
  402. }
  403. /**
  404. * 新修订支付通道:传参payChannelType 来区分使用随行付还是云闪付 用户充值电子会员卡(储蓄卡)拉起支付接口
  405. * @param
  406. * @return
  407. */
  408. @RequestMapping(value = "/getPayChannelInfo", consumes = "application/json", method = RequestMethod.POST)
  409. @ResponseBody
  410. public String getPayChannelInfo(@RequestBody PayInfoRequest payInfoRequest){
  411. Gson gson =new Gson();
  412. ResultData resultData =null;
  413. String openId = payInfoRequest.getOpenId(); //用户openId
  414. String userType=payInfoRequest.getUserType();//用户登录类型 1 公众号。2 小程序
  415. String ordNo = payInfoRequest.getOrdNo();
  416. AppUserInfo appUserInfo =new AppUserInfo();
  417. //订单类型 是小程序还是公众号
  418. appUserInfo.setUserType(userType);
  419. if(userType.equals("1")){
  420. //1 是微信
  421. appUserInfo.setMinaOpenid(openId);
  422. }else if(userType.equals("2")){
  423. //2是支付宝
  424. appUserInfo.setALiId(openId);
  425. }
  426. //appUserInfo.setStationId(stationInfos.getGroupId());
  427. StationInfo stationInfo = new StationInfo();
  428. stationInfo.setStationId(Integer.valueOf(payInfoRequest.getStationId()));
  429. StationInfo stationInfos = stationService.selectStationInfo(stationInfo);
  430. appUserInfo.setStationId(stationInfos.getGroupId());
  431. AppUserInfo appUserInfos =appUserInfoService.getAppUserInfo(appUserInfo);
  432. if(appUserInfos!=null){
  433. //调用聚合支付
  434. try{
  435. //根据订单号查询订单信息
  436. PayOrder payOrder=payOrderService.selectOrderInfoByOrdNo(ordNo);
  437. if(payOrder!=null ){
  438. if(payOrder.getStatus() !=null && payOrder.getStatus().equals("0")){
  439. if(payInfoRequest.getPayChannelType() !=null && payInfoRequest.getPayChannelType().equals("2")){
  440. /******************************************************云闪付支付***********************************************************/
  441. //云闪付支付方式
  442. Map<String, String> staPayChannelInfo = stationService.getStationAppIdAndAppSecret(Integer.valueOf(payInfoRequest.getStationId()));
  443. if(staPayChannelInfo !=null && staPayChannelInfo.containsKey("merchantNo") && staPayChannelInfo.containsKey("terminalId")
  444. && staPayChannelInfo.containsKey("yunKey") && staPayChannelInfo.containsKey("appId")) {
  445. //秘钥
  446. String yunKey = staPayChannelInfo.get("yunKey"); //23570b46a955484d92038f6a18d2b9d6
  447. logger.info("==============================云闪付 小程序支付油品 拉起支付 ** 开始 **============================================");
  448. DefaultSaobeiApiClient defaultSaobeiApiClient = new DefaultSaobeiApiClient(yunKey); //2ef428f4f76c414282e831baea9e4b0e
  449. SaobeiMiniPayRequest requst = new SaobeiMiniPayRequest();
  450. requst.setPay_ver("100");
  451. requst.setPay_type("010");
  452. requst.setService_id("015");
  453. requst.setMerchant_no(staPayChannelInfo.get("merchantNo")); //商户号 845104816000034
  454. requst.setTerminal_id(staPayChannelInfo.get("terminalId")); //终端号 18241101
  455. requst.setTerminal_trace(payOrder.getOrderNo()); //订单号 202003252204310000 6683315853083916109905
  456. requst.setTerminal_time(new SimpleDateFormat("yyyyMMddhhmmss").format(new Date())); //"20200325220431"
  457. //云闪付单位为分
  458. BigDecimal totalFee = new BigDecimal(payOrder.getAmt().toString()).multiply(new BigDecimal("100")).setScale(0, BigDecimal.ROUND_DOWN);
  459. logger.info("该订单金额:" + payOrder.getAmt().toString()+"; 拉起云闪付上送金额(单位:分):" + totalFee.toString());
  460. requst.setTotal_fee(totalFee.toString());
  461. requst.setOpen_id(payInfoRequest.getOpenId()); // oRwjv4iHjSUgxNxOJOQ_60Ln7cno obnG9jhDLvom5fGwuhYysmQTW4qQ
  462. //订单内容
  463. String orderBody = payOrder.getOilName()+ " - " + payOrder.getOilGun() + "号枪 - " +payOrder.getStationName();
  464. requst.setOrder_body(orderBody);
  465. //回调地址
  466. String notifyUrl = "https://" + this.domainName + "/" + this.globalPrefix + "/getYunPayCallback";
  467. logger.info("回调地址:" + notifyUrl);
  468. requst.setNotify_url(notifyUrl);
  469. //小程序appId
  470. requst.setSub_appid(staPayChannelInfo.get("appId")); // wxe1135cd390b38a54 wxe568c727d466aef9 智慧易加公众号:wxc8189d3b3a7283e0
  471. logger.info("请求报文:" + JSON.toJSONString(requst));
  472. SaobeiMiniPayResponse response = (SaobeiMiniPayResponse) defaultSaobeiApiClient.execute(requst);
  473. logger.info("返回报文:" + JSON.toJSONString(response));
  474. //返回前端字段
  475. Map<String, Object> reqData = new HashMap<>();
  476. //Map<String, Object> resultMap = new HashMap<>();
  477. if(response !=null && response.getResult_code().equals("01")){
  478. reqData.put("timeStamp", response.getTimeStamp());
  479. reqData.put("payPackage", response.getPackage_str());
  480. reqData.put("signType", response.getSignType());
  481. reqData.put("paySign", response.getPaySign());
  482. reqData.put("return_msg", response.getReturn_msg());
  483. reqData.put("merchant_name", response.getMerchant_name());
  484. reqData.put("total_fee", response.getTotal_fee());
  485. reqData.put("terminal_time", response.getTerminal_time());
  486. reqData.put("terminal_trace", response.getTerminal_trace());
  487. reqData.put("code", response.getResult_code());
  488. }else if(response !=null && response.getResult_code().equals("02")){
  489. reqData.put("code", response.getResult_code());
  490. reqData.put("return_msg", response.getReturn_msg());
  491. }else {
  492. //自己定义
  493. reqData.put("code", "03");
  494. reqData.put("return_msg", "当前支付系统参数配置错误请检查!");
  495. }
  496. //resultMap.put("respData", reqData);
  497. logger.info("云闪付返回给前端字段:" + JSON.toJSONString(reqData));
  498. resultData = ResultData.success(reqData);
  499. logger.info("==============================云闪付 小程序支付油品 拉起支付 ** 结束 **============================================");
  500. }else {
  501. resultData = ResultData.error(CodeMsg.STATION_NULL_INFO);
  502. }
  503. }else{
  504. /******************************************************随行付支付***********************************************************/
  505. //将业务参数存放在 JSON 对象中
  506. JSONObject reqData = new JSONObject();
  507. reqData.put("ordNo", payOrder.getOrderNo()); //商户订单号
  508. //reqData.put("subMechId", ""); //子商户号
  509. reqData.put("amt", payOrder.getAmt()); //订单总金额
  510. //reqData.put("amt", "0.01");
  511. //reqData.put("discountAmt", ""); //参与优惠金额
  512. //reqData.put("unDiscountAmt", ""); //不参与优惠金额
  513. Map<String, String> stationAppIdAndAppSecret = stationService.getStationAppIdAndAppSecret(Integer.valueOf(payInfoRequest.getStationId()));
  514. if(stationAppIdAndAppSecret !=null && stationAppIdAndAppSecret.containsKey("appId") && stationAppIdAndAppSecret.containsKey("mno")){
  515. if(userType.equals("1")){
  516. reqData.put("subAppid", stationAppIdAndAppSecret.get("appId")); //微信小程序
  517. logger.info("支付子商户:"+ stationAppIdAndAppSecret.get("appId"));
  518. }else if(userType.equals("2")){
  519. reqData.put("subAppid", stationAppIdAndAppSecret.get("aliAppId")); //支付宝小程序
  520. logger.info("支付子商户:"+ stationAppIdAndAppSecret.get("aliAppId"));
  521. }
  522. reqData.put("mno", stationAppIdAndAppSecret.get("mno")); //商户编号
  523. logger.info("商户编号:"+ stationAppIdAndAppSecret.get("mno"));
  524. }
  525. if(userType.equals("1")){
  526. //1 是微信小程序
  527. reqData.put("payType", "WECHAT"); //支付渠道 WECHAT:微信;ALIPAY:支付宝;UNIONPAY:银联
  528. reqData.put("payWay", "03"); //支付方式 02 公众号/服 务窗/js支付 03 小程序
  529. reqData.put("userId", appUserInfos.getMinaOpenid()); //用户号 微信:openid; 支付宝:userid;银联:userid;微信&支付宝必传,银联js为非必传
  530. }else if(userType.equals("2")){
  531. //2 是支付宝
  532. reqData.put("payType", "ALIPAY"); //支付渠道 WECHAT:微信;ALIPAY:支付宝;UNIONPAY:银联
  533. reqData.put("payWay", "03"); //支付方式 02 公众号/服 务窗/js支付 03 小程序
  534. reqData.put("userId", appUserInfos.getALiId()); //用户号 微信:openid; 支付宝:userid;银联:userid;微信&支付宝必传,银联js为非必传
  535. }
  536. //reqData.put("timeExpire", "10"); //订单失效时间, 以分钟为单位
  537. //reqData.put("limitPay", "00"); //限制卡类型: 00-全部 01-限定不能使 用信用卡支付 默认值 00
  538. reqData.put("subject", payOrder.getOilName() + " - " +payOrder.getStationName()); //订单标题
  539. //reqData.put("hbFqNum", "6"); //花呗分期数,仅可上送 6 或 12
  540. reqData.put("tradeSource", "01"); //交易来源 01服务商,02收银台,03硬件
  541. reqData.put("trmIp", "172.16.2.1");//商家ip地址
  542. // reqData.put("customerIp", ""); //持卡人ip地址,银联js支付时必传
  543. //reqData.put("outFrontUrl", ""); //js 支付,前台 成功通知地址
  544. reqData.put("outFrontFailUrl", ""); //js 支付,前台 事变通知地址
  545. //globalPrefix
  546. String notifyUrl = "https://"+domainName+"/"+globalPrefix+"/getCallback";
  547. logger.info("随行付调用回调地址:" + notifyUrl);
  548. //reqData.put("notifyUrl", "https://www.huijy.net/api/getCallback"); //回调地址
  549. reqData.put("notifyUrl", notifyUrl); //回调地址
  550. //reqData.put("needReceipt", "00"); //电子发票功能 微信开具电子 发票使用
  551. //reqData.put("ledgerAccountFlag", "00"); //是否做分账 分账交易使 用;00:做; 01:不做;不传默认为不做分账
  552. //reqData.put("ledgerAccountEffectTime", "00"); //分账有效时间 单位为天;是 否做分账选择 00 时该字段必传
  553. // reqData.put("ruleId", "00"); //同 步 分 账 规 则 id
  554. // reqData.put("fusruleId", "00"); //同步分账规则
  555. //reqData.put("ylTrmNo", ""); //银联终端号
  556. //reqData.put("terminalId", ""); //TQ机具编号
  557. //reqData.put("deviceNo ", "1111"); //设备号
  558. // reqData.put("identityFlag", ""); //是否是实名支付
  559. // reqData.put("buyerIdType", "IDCARD"); //证件类型
  560. // reqData.put("buyerIdNo", "410523198701054018"); //证件号
  561. // reqData.put("buyerName", "张三"); //买家姓名
  562. // reqData.put("mobileNum", ""); //手机号
  563. // reqData.put("extend", ""); //备用
  564. String req= SXFPaySign.getSXFPay(reqData);
  565. logger.debug("参数信息:"+req);
  566. System.out.println("req:" + req);
  567. //此处不要改变reqData里面值的顺序用LinkedHashMap
  568. HashMap reqMap = JSON.parseObject(req, LinkedHashMap.class, Feature.OrderedField);
  569. //组装加密串
  570. String signContent = RSASignature.getOrderContent(reqMap);
  571. System.out.println("拼接后的参数:" + signContent);
  572. logger.debug("拼接后的参数:"+signContent);
  573. //sign
  574. String sign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  575. System.out.println("============签名:" + sign);
  576. reqMap.put("sign", sign);
  577. String reqStr = JSON.toJSONString(reqMap);
  578. System.out.println("请求参数:" + reqMap);
  579. System.out.println("请求参数:" + reqStr);
  580. //调用第三方接口地址
  581. //String url = "https://openapi-test.tianquetech.com/order/jsapiScan";//测试地址
  582. String url = "https://openapi.suixingpay.com/order/jsapiScan";//生产地址
  583. String resultJson = HttpUtils.connectPostUrl(url, reqStr);
  584. System.out.println("返回信息:" + resultJson);
  585. // logger.debug("返回信息:"+resultJson);
  586. //不要对reqData排序 所以用LinkedHashMap
  587. HashMap<String, Object> result = JSON.parseObject(resultJson, LinkedHashMap.class, Feature.OrderedField);
  588. Map<String, Object> r = new HashMap<>(); //返回前端参数
  589. if ("0000".equals(result.get("code"))) {
  590. //验签
  591. String signResult = result.get("sign").toString();
  592. result.remove("sign");
  593. String resultStr = RSASignature.getOrderContent(result);
  594. System.out.println("resultStr: " + resultStr);
  595. //sign
  596. String resultSign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  597. System.out.println("resultSign: " + resultSign);
  598. //组装加密串
  599. if (RSASignature.doCheck(resultStr, signResult, SXFPaySign.sxfPublic)) {
  600. System.out.println("===================验签成功==============");
  601. logger.info("随行付返回字段:" +result);
  602. r.put("code", result.get("code"));
  603. r.put("msg", result.get("msg"));
  604. //net.sf.json.JSONObject result = location.getJSONObject("result").getJSONObject("addressComponent");
  605. JSONObject respData = (JSONObject)result.get("respData");
  606. r.put("payTimeStamp", respData.get("payTimeStamp"));
  607. r.put("ordNo", respData.get("ordNo"));
  608. r.put("payPackage", respData.get("payPackage"));
  609. r.put("bizMsg", respData.get("bizMsg"));
  610. r.put("paySign", respData.get("paySign"));
  611. r.put("bizCode", respData.get("bizCode"));
  612. r.put("payAppId", respData.get("payAppId"));
  613. r.put("sxfUuid", respData.get("sxfUuid"));
  614. r.put("paynonceStr", respData.get("paynonceStr"));
  615. r.put("paySignType", respData.get("paySignType"));
  616. r.put("uuid", respData.get("uuid"));
  617. r.put("orgId", result.get("orgId"));
  618. r.put("signType", result.get("signType"));
  619. r.put("reqId", result.get("reqId"));
  620. }
  621. }else {
  622. r.put("code", result.get("code"));
  623. r.put("msg", result.get("msg"));
  624. }
  625. logger.info("随行付支付时系统返回前端参数字段:" +r);
  626. resultData=ResultData.success(r);
  627. }
  628. }else {
  629. resultData=ResultData.error(CodeMsg.ALREADY_PAY);
  630. }
  631. }else {
  632. resultData=ResultData.error(CodeMsg.YEWU_FAIL,"未查询到订单");
  633. }
  634. }catch (Exception e){
  635. resultData=ResultData.error(CodeMsg.YEWU_FAIL,"订单支付失败");
  636. e.printStackTrace();
  637. }
  638. }else{
  639. //返回失败支付失败信息
  640. resultData=ResultData.error(CodeMsg.USER_NOT_EXSIST);
  641. }
  642. return gson.toJson(resultData);
  643. }
  644. /**
  645. * 验证商户信息查询
  646. */
  647. @RequestMapping(value = "/getJhPayMnoInfo", method = RequestMethod.GET)
  648. @ResponseBody
  649. public String getJhPayMnoInfo(@RequestParam String mno){
  650. try {
  651. JSONObject reqData = new JSONObject();
  652. reqData.put("mno", mno); //商户编号
  653. String req = SXFPaySign.getSXFPay(reqData);
  654. logger.debug("参数信息:" + req);
  655. System.out.println("req:" + req);
  656. //此处不要改变reqData里面值的顺序用LinkedHashMap
  657. HashMap reqMap = JSON.parseObject(req, LinkedHashMap.class, Feature.OrderedField);
  658. //组装加密串
  659. String signContent = RSASignature.getOrderContent(reqMap);
  660. System.out.println("拼接后的参数:" + signContent);
  661. logger.debug("拼接后的参数:" + signContent);
  662. //sign
  663. String sign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  664. System.out.println("============签名:" + sign);
  665. reqMap.put("sign", sign);
  666. String reqStr = JSON.toJSONString(reqMap);
  667. System.out.println("请求参数:" + reqMap);
  668. System.out.println("请求参数:" + reqStr);
  669. //调用第三方接口地址
  670. //String url = "https://openapi-test.tianquetech.com/merchant/merchantInfoQuery";//测试地址
  671. String url = "https://openapi.tianquetech.com/merchant/merchantInfoQuery";//生产地址
  672. String resultJson = HttpUtils.connectPostUrl(url, reqStr);
  673. HashMap<String, Object> result = JSON.parseObject(resultJson, LinkedHashMap.class, Feature.OrderedField);
  674. if ("0000".equals(result.get("code"))) {
  675. // //验签
  676. // String signResult = result.get("sign").toString();
  677. // result.remove("sign");
  678. // String resultStr = RSASignature.getOrderContent(result);
  679. // System.out.println(resultStr);
  680. // //sign
  681. // String resultSign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  682. // System.out.println("resultSign:" + resultSign);
  683. // //组装加密串
  684. // if (RSASignature.doCheck(resultStr, signResult, SXFPaySign.sxfPublic)) {
  685. // System.out.println("===================验签成功==============");
  686. // }
  687. }
  688. }catch (Exception e){
  689. e.printStackTrace();
  690. }
  691. return "";
  692. }
  693. /**
  694. * 关单接口
  695. */
  696. @RequestMapping(value = "/getPayOrderClose", consumes = "application/json", method = RequestMethod.POST)
  697. @ResponseBody
  698. public String getPayOrderClose(@RequestBody PayCloseRequestParamter payCloseRequestParamter) {
  699. String results="";
  700. Gson gson =new Gson();
  701. String mno=payCloseRequestParamter.getMno();
  702. String origOrderNo=payCloseRequestParamter.getOrigOrderNo();
  703. String origUuid=payCloseRequestParamter.getOrigUuid();
  704. String token=payCloseRequestParamter.getToken();
  705. String userType=payCloseRequestParamter.getUserType();
  706. boolean flag =appUserInfoService.selectAppUserInfo(token,userType);
  707. ResultData resultData =null;
  708. if(flag){
  709. try {
  710. JSONObject reqData = new JSONObject();
  711. reqData.put("mno",mno); //商户编号
  712. reqData.put("origOrderNo",origOrderNo);//系统商户订单号
  713. reqData.put("origUuid", origUuid);//随行付订单号
  714. String req= SXFPaySign.getSXFPay(reqData);
  715. //此处不要改变reqData里面值的顺序用LinkedHashMap
  716. HashMap reqMap = JSON.parseObject(req, LinkedHashMap.class, Feature.OrderedField);
  717. //组装加密串
  718. String signContent = RSASignature.getOrderContent(reqMap);
  719. System.out.println("拼接后的参数:" + signContent);
  720. //sign
  721. String sign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  722. System.out.println("============签名:" + sign);
  723. reqMap.put("sign", sign);
  724. String reqStr = JSON.toJSONString(reqMap);
  725. System.out.println("请求参数:" + reqMap);
  726. System.out.println("请求参数:" + reqStr);
  727. //调用第三方接口地址
  728. // String url = "https://openapi-test.tianquetech.com/query/close";//测试地址
  729. String url = "https://openapi.tianquetech.com/query/close";//生产地址
  730. String resultJson = HttpUtils.connectPostUrl(url, reqStr);
  731. System.out.println("返回信息:" + resultJson);
  732. //不要对reqData排序 所以用LinkedHashMap
  733. HashMap<String, Object> result = JSON.parseObject(resultJson, LinkedHashMap.class, Feature.OrderedField);
  734. if ("0000".equals(result.get("code"))) {
  735. //验签
  736. String signResult = result.get("sign").toString();
  737. result.remove("sign");
  738. String resultStr = RSASignature.getOrderContent(result);
  739. System.out.println(resultStr);
  740. //sign
  741. String resultSign = RSASignature.encryptBASE64(RSASignature.sign(signContent,SXFPaySign.privateKey));
  742. System.out.println("resultSign:" + resultSign);
  743. //组装加密串
  744. if (RSASignature.doCheck(resultStr, signResult, SXFPaySign.sxfPublic)) {
  745. System.out.println("===================验签成功==============");
  746. }
  747. }
  748. resultData=ResultData.success(result);
  749. }catch (Exception e){
  750. resultData=ResultData.error(CodeMsg.YEWU_FAIL,"关闭订单失败");
  751. e.printStackTrace();
  752. }
  753. }else{
  754. resultData=ResultData.error(CodeMsg.USER_NOT_EXSIST);
  755. }
  756. return gson.toJson(resultData);
  757. }
  758. /**
  759. * 异步回调通知
  760. */
  761. @RequestMapping(value = "/getCallback", consumes = "application/json", method = RequestMethod.POST)
  762. @ResponseBody
  763. @Transactional
  764. public JSONObject getCallback(@RequestBody JSONObject request) throws ParseException {
  765. logger.info("-------------------------------回调开始----------------------------------------------");
  766. logger.info("回调返回过来的参数"+request);
  767. // logger.info("ordNo信息:" + request.get("ordNo").toString());
  768. // logger.info("sign信息:" + request.get("sign").toString());
  769. Gson gson =new Gson();
  770. String sxfUuid=request.get("sxfUuid").toString(); //随行付落单号
  771. String payWay=request.get("payWay").toString(); //随行付交易方式
  772. String payTime=request.get("payTime").toString(); //随行付交易时间
  773. String uuid=request.get("uuid").toString(); //随行付交易流水号
  774. String mno=request.get("mno").toString();//发起交易的商户编号
  775. String ordNo=request.get("ordNo").toString();//商户生成的订单号
  776. String amt=request.get("amt").toString();//金额
  777. String buyerId=request.get("buyerId").toString();//用户登录
  778. String transactionId=request.get("transactionId").toString();
  779. String drType=request.get("drType").toString();//借贷记标识 1-借,2-贷,3-其他
  780. String payType=request.get("payType").toString();//对订单的描述,取值范围:WECHAT:微信,ALIPAY:支付宝,UNIONPAY:
  781. String payBank=request.get("payBank").toString();//付款银行银行编码,例如 ICBC
  782. String pointAmount=request.get("pointAmount").toString();//代金券金额
  783. String totalOffstAmt=request.get("totalOffstAmt").toString();//消 费 者 付 款金额
  784. String settleAmt=request.get("settleAmt").toString();//商家入账金额
  785. String timeStamp=request.get("timeStamp").toString();//响应时间
  786. String sign=request.get("sign").toString();//签名
  787. String bizCode=request.get("bizCode").toString();//业务返回码
  788. String bizMsg=request.get("bizMsg").toString();//业 务 返 回 信息
  789. String openid=request.get("openid").toString();//微 信 或 支 付宝身份id()opendid userid
  790. String channelId=request.get("channelId").toString();//渠道商户号
  791. String subMechId=request.get("subMechId").toString();//子商户号
  792. String finishTime=request.get("finishTime").toString();//交易完成时间
  793. String clearDt=request.get("clearDt").toString();
  794. String settlementBatchNo=request.get("settlementBatchNo").toString();
  795. //String origOrdNo=request.get("origOrdNo").toString();//反交易退款异步通知
  796. //String origUuid=request.get("origUuid").toString();//token
  797. //String scene=request.get("scene").toString();//用户登录
  798. //String buyerAccount=request.get("buyerAccount").toString();//
  799. //String realRefundAmount=request.get("realRefundAmount").toString();//商家出账金额
  800. //String recFeeAmt=request.get("recFeeAmt").toString();//交易手续费
  801. //String recFeeRate=request.get("recFeeRate").toString();//交易手续费率
  802. //String refBuyerAmt=request.get("refBuyerAmt").toString();//消 费 者 到 账金额
  803. //String extend = extend=request.get("extend").toString();//备用
  804. //将业务参数存放在 JSON 对象中
  805. JSONObject reqData = new JSONObject();
  806. //支付场景
  807. if(request.containsKey("scene") && request.get("scene") !=null){
  808. String scene = request.get("scene").toString();
  809. reqData.put("scene", scene);
  810. }
  811. //消 费 者 到 账金额
  812. if(request.containsKey("refBuyerAmt") && request.get("refBuyerAmt") !=null){
  813. String refBuyerAmt = request.get("refBuyerAmt").toString();
  814. reqData.put("refBuyerAmt", refBuyerAmt);
  815. }
  816. //buyerAccount 支付宝买家登录账号 掩码;示例:135***1234
  817. if(request.containsKey("buyerAccount") && request.get("buyerAccount") !=null){
  818. String buyerAccount = request.get("buyerAccount").toString();
  819. reqData.put("buyerAccount", buyerAccount);
  820. }
  821. //备用
  822. if(request.containsKey("extend") && request.get("extend") !=null){
  823. String extend = request.get("extend").toString();
  824. reqData.put("extend", extend);
  825. }
  826. //优惠券参数
  827. if(request.containsKey("promotionDetail") && request.get("promotionDetail") !=null){
  828. String promotionDetail = request.get("promotionDetail").toString();
  829. reqData.put("promotionDetail", promotionDetail);
  830. }
  831. //商家出账金额
  832. if(request.containsKey("realRefundAmount") && request.get("realRefundAmount") !=null){
  833. String realRefundAmount = request.get("realRefundAmount").toString();
  834. reqData.put("realRefundAmount", realRefundAmount);
  835. }
  836. //szltFlag
  837. if(request.containsKey("szltFlag") && request.get("szltFlag") !=null){
  838. String szltFlag = request.get("szltFlag").toString();
  839. reqData.put("szltFlag", szltFlag);
  840. }
  841. //recFeeAmt
  842. if(request.containsKey("recFeeAmt") && request.get("recFeeAmt") !=null){
  843. String recFeeAmt = request.get("recFeeAmt").toString();
  844. reqData.put("recFeeAmt", recFeeAmt);
  845. }
  846. //szltRecfeeAmt
  847. if(request.containsKey("szltRecfeeAmt") && request.get("szltRecfeeAmt") !=null){
  848. String szltRecfeeAmt = request.get("szltRecfeeAmt").toString();
  849. reqData.put("szltRecfeeAmt", szltRecfeeAmt);
  850. }
  851. reqData.put("sxfUuid",sxfUuid);
  852. reqData.put("payWay",payWay);
  853. reqData.put("payTime",payTime);
  854. reqData.put("uuid",uuid);
  855. reqData.put("mno",mno);
  856. reqData.put("ordNo",ordNo);
  857. reqData.put("amt",amt);
  858. reqData.put("buyerId",buyerId);
  859. reqData.put("transactionId",transactionId);
  860. reqData.put("drType",drType);
  861. reqData.put("payType",payType);
  862. reqData.put("payBank",payBank);
  863. reqData.put("pointAmount",pointAmount);
  864. reqData.put("totalOffstAmt",totalOffstAmt);
  865. reqData.put("settleAmt",settleAmt);
  866. reqData.put("timeStamp",timeStamp);
  867. reqData.put("bizCode",bizCode);
  868. reqData.put("bizMsg",bizMsg);
  869. reqData.put("openid",openid);
  870. reqData.put("channelId",channelId);
  871. reqData.put("subMechId",subMechId);
  872. reqData.put("finishTime",finishTime);
  873. reqData.put("clearDt",clearDt);
  874. reqData.put("settlementBatchNo",settlementBatchNo);
  875. //reqData.put("realRefundAmount",realRefundAmount);
  876. //reqData.put("recFeeAmt",recFeeAmt);
  877. //reqData.put("recFeeRate",recFeeRate);
  878. //reqData.put("buyerAccount",buyerAccount);
  879. //reqData.put("origOrdNo",origOrdNo);
  880. //reqData.put("origUuid",origUuid);
  881. //reqData.put("scene",scene);
  882. //reqData.put("refBuyerAmt",refBuyerAmt);
  883. //reqData.put("extend",extend);
  884. //根据回调信息,先进行验签,验签后修改状态
  885. logger.info("打印参数信息"+gson.toJson(reqData));
  886. //不要对reqData排序 所以用LinkedHashMap
  887. HashMap<String, Object> result = JSON.parseObject(gson.toJson(reqData), LinkedHashMap.class, Feature.OrderedField);
  888. //验签
  889. String resultStr = RSASignature.getOrderContent(result);
  890. JSONObject req = new JSONObject();
  891. System.out.println(resultStr);
  892. if (RSASignature.doCheck(resultStr, sign, SXFPaySign.sxfPublic)) {
  893. req.put("code","success");
  894. req.put("msg","成功");
  895. logger.info("验签成功");
  896. //验签成功,修改订单状态
  897. List<PayOrder> list = payOrderService.getPayOrderList(ordNo);
  898. //logger.info("根据订单号,查询订单"+gson.toJson(list));
  899. if (list != null && list.size() == 1) {
  900. String status = list.get(0).getStatus();
  901. //状态为未支付 0 修改状态为1已支付
  902. if (status.equals("0")) {
  903. PayOrder payOrder = new PayOrder();
  904. payOrder.setOrderNo(ordNo);
  905. payOrder.setStatus("1");
  906. if(payType.equals("WECHAT")){ //WECHAT:微信,ALIPAY:支付宝,UNIONPAY:
  907. payOrder.setPayType("wx");
  908. }else if(payType.equals("ALIPAY")){
  909. payOrder.setPayType("zfb");
  910. }
  911. payOrder.setWxAmt(Double.valueOf(amt));
  912. payOrder.setDzkAmt(Double.valueOf("0"));
  913. payOrder.setPayDate(new Timestamp(new Date().getTime())); //支付时间
  914. payOrder.setReceivedAmt(Double.valueOf(settleAmt)); //settleAmt商家入账金额
  915. //修改订单状态
  916. int count = payOrderService.getUpdatePayOrder(payOrder);
  917. if(count == 1){
  918. //将用户消费的信息插入顾客表: 以手机号 油品名称 油站id为条件插入且存入 加油升数、实收金额、油站名称 根据订单号查询用户手机号
  919. Map<String, Object> infoMap = payOrderService.getOrderInfoAndUserInfoByOrderNo(payOrder); //获取该订单手机号、加油升数、实收金额、油站名称
  920. logger.info("根据订单查询用户手机号等订单信息"+ infoMap.toString());
  921. //手机号必须有
  922. if(infoMap != null && infoMap.containsKey("mobilePhone") && infoMap.get("mobilePhone") !=null ){
  923. int integral =0;
  924. StationInfo stationInfo = new StationInfo();
  925. stationInfo.setStationId(Integer.valueOf(infoMap.get("stationId").toString()));
  926. StationInfo stationInfos = stationService.selectStationInfo(stationInfo);
  927. if(stationInfos.getIsLngFlagGroup() !=null && stationInfos.getIsLngFlagGroup().equals("1")){
  928. //等于1表示次要业务:LNG集团平台加气(可能会出现); 插入油站余额记录
  929. StationBalanceChange stationBalanceChange = new StationBalanceChange();
  930. stationBalanceChange.setStationId(stationInfos.getStationId());
  931. stationBalanceChange.setAmt(Double.valueOf(infoMap.get("sellAmt").toString()));
  932. stationBalanceChange.setCreateTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(infoMap.get("payDate").toString()));
  933. stationBalanceChange.setType("-");
  934. stationBalanceChange.setOrderNo(ordNo);
  935. stationBalanceChange.setNowAmt(stationInfos.getBalance());
  936. //生成记录
  937. payOrderService.insertStationBalanceExchange(stationBalanceChange);
  938. StationInfo s = new StationInfo();
  939. BigDecimal subtract = new BigDecimal(String.valueOf(stationInfos.getBalance())).subtract(new BigDecimal(infoMap.get("sellAmt").toString()));
  940. s.setBalance(subtract.doubleValue());
  941. s.setStationId(stationInfos.getStationId());
  942. //更新油站余额
  943. stationService.updateStationBalance(s);
  944. logger.info("LNG加气平台支付更新余额完成!");
  945. }else {
  946. if(stationInfos.getCouponEnabledFlag() !=null && stationInfos.getCouponEnabledFlag().equals("1")){
  947. //discountCoupon
  948. if(infoMap.containsKey("discountCoupon") && infoMap.get("discountCoupon") !=null && infoMap.get("discountCoupon").toString() !=""){
  949. UserCoupon userCoupon = new UserCoupon();
  950. userCoupon.setCouponIsUsed("1");
  951. String discountCoupon = infoMap.get("discountCoupon").toString();
  952. userCoupon.setId(Integer.valueOf(discountCoupon));
  953. userCoupon.setCreateTime(new Date());
  954. userCoupon.setVerificationTime(new Date());
  955. if(infoMap.containsKey("personnelPhone")){
  956. userCoupon.setMobilePhone(infoMap.get("personnelPhone").toString());
  957. }
  958. couponService.updateCouponUserInfo(userCoupon);
  959. //更新该优惠券的使用数量
  960. UserCoupon u = new UserCoupon();
  961. u.setId(Integer.valueOf(discountCoupon));
  962. UserCoupon userCouponInfo = couponService.selectUserCouponInfo(u);
  963. Coupon coupon_up = new Coupon();
  964. coupon_up.setCouponId(userCouponInfo.getCouponId());
  965. Integer couponUseNum = userCouponInfo.getCouponUseNum();
  966. logger.info("当前优惠券模板已使用次数:"+ couponUseNum.toString());
  967. couponUseNum = couponUseNum + 1;
  968. logger.info("当前优惠券模板本次使用后次数:"+ couponUseNum.toString());
  969. coupon_up.setCouponUseNum(couponUseNum);
  970. couponService.updateCouponInfo(coupon_up);
  971. //主动领取优惠券
  972. this.drawCoupon(infoMap);
  973. }
  974. }
  975. //当前系统主要业务逻辑
  976. CustomerManage customerManage = this.insertCustomerManage(infoMap); //插入客户积分返回要插入客户的信息
  977. CalculateIntegral calculateIntegral = new CalculateIntegral();
  978. calculateIntegral.setOrderNo(ordNo);
  979. if(infoMap.containsKey("consumer") && infoMap.get("consumer") !=null){
  980. calculateIntegral.setNickName(infoMap.get("consumer").toString());
  981. }else {
  982. calculateIntegral.setNickName("");
  983. }
  984. calculateIntegral.setGroupId(Integer.valueOf(infoMap.get("groupId").toString())); //集团ID
  985. calculateIntegral.setCustomerGrade(customerManage.getGrade()); //客户等级
  986. calculateIntegral.setIntegralRuleFlag(stationInfos.getIntegralRuleFlagGroup()); //是否共享积分规则
  987. calculateIntegral.setOpenId(infoMap.get("minaOpenid").toString()); //客户小程序ID
  988. if(infoMap.containsKey("blogOpenid") && StringUtils.isNotBlank(infoMap.get("blogOpenid").toString())){
  989. calculateIntegral.setBlogOpenid(infoMap.get("blogOpenid").toString());
  990. }
  991. calculateIntegral.setStationId(Integer.valueOf(infoMap.get("stationId").toString())); //油站ID
  992. calculateIntegral.setStationName(infoMap.get("stationName").toString()); //油站名称
  993. calculateIntegral.setAmt(new BigDecimal(infoMap.get("amt").toString())); //实收金额
  994. calculateIntegral.setOilType(infoMap.get("oilType").toString()); //订单类型
  995. calculateIntegral.setOilName(infoMap.get("oilName").toString()); //油品名称
  996. calculateIntegral.setOilLiters(new BigDecimal(infoMap.get("orderLiters").toString())); //加油升数
  997. calculateIntegral.setUnionId(infoMap.get("unionId").toString()); //客户unionId
  998. calculateIntegral.setNickName(infoMap.get("consumer").toString()); //客户昵称
  999. calculateIntegral.setMobilePhone(infoMap.get("mobilePhone").toString()); //客户手机号
  1000. calculateIntegral.setReceivableAmt(new BigDecimal(infoMap.get("receivableAmt").toString())); //应收金额
  1001. CustomerPoints customerPoints;
  1002. //计算积分
  1003. CalculateIntegral calculateIntegralInfos;
  1004. if(stationInfos.getIntegralRuleFlagGroup().equals("1")){ //表示积分共享
  1005. if(stationInfos.getIntegralFlagGroup().equals("1")){ //集团开启积分功能
  1006. //calculateIntegral.setGroupId(stationInfos.getGroupId());
  1007. calculateIntegralInfos = this.calculateIntegral(calculateIntegral);
  1008. //插入客户所得积分
  1009. customerPoints = this.insertUserIntegral(calculateIntegralInfos);
  1010. integral =calculateIntegralInfos.getIntegral();
  1011. //推送积分
  1012. this.pushIntegral(customerPoints, calculateIntegral);
  1013. }
  1014. }else {
  1015. if(stationInfos.getIntegralFlag().equals("1")){
  1016. //calculateIntegral.setStationId(stationInfos.getStationId());
  1017. calculateIntegralInfos = this.calculateIntegral(calculateIntegral);
  1018. //插入客户所得积分
  1019. customerPoints = this.insertUserIntegral(calculateIntegralInfos);
  1020. //推送积分
  1021. integral =calculateIntegralInfos.getIntegral();
  1022. this.pushIntegral(customerPoints, calculateIntegral);
  1023. }
  1024. }
  1025. }
  1026. //获取油枪绑定的POS机信息
  1027. StationDeviceManager stationDeviceManager = new StationDeviceManager();
  1028. stationDeviceManager.setGunNo(infoMap.get("oilGun").toString());
  1029. stationDeviceManager.setStationId(Integer.valueOf(infoMap.get("stationId").toString()));
  1030. List<StationDeviceManager> stationDeviceManagerList = stationService.getStationDeviceManagerList(stationDeviceManager);
  1031. if(stationDeviceManagerList !=null && stationDeviceManagerList.size() >0){
  1032. if(stationDeviceManagerList.get(0).getDeviceType() !=null && stationDeviceManagerList.get(0).getDeviceType() !=""){
  1033. switch (stationDeviceManagerList.get(0).getDeviceType()){
  1034. case "1":
  1035. logger.info("小票机打印方式");
  1036. infoMap.put("sn", stationDeviceManagerList.get(0).getDeviceNo());
  1037. infoMap.put("printSetting", stationInfos.getPrintSetting());
  1038. infoMap.put("isLngFlagGroup", stationInfos.getIsLngFlagGroup());
  1039. this.printReceipt(infoMap);
  1040. break;
  1041. case "2":
  1042. logger.info("POS机打印方式");
  1043. payOrder.setIntegral(String.valueOf(integral));
  1044. payOrder.setPrintSetting(stationInfos.getPrintSetting());
  1045. payOrder.setIsLngFlagGroup(stationInfos.getIsLngFlagGroup());
  1046. if(stationInfos.getIsLngFlagGroup() !=null && stationInfos.getIsLngFlagGroup().equals("1")){
  1047. payOrder.setSellAmt(Double.valueOf(infoMap.get("sellAmt").toString()));
  1048. }
  1049. if(stationDeviceManagerList.get(0).getPosFanoutExchange() !=null && stationDeviceManagerList.get(0).getPosQueue() !=null){
  1050. logger.info("POS设备交换机信息:" + stationDeviceManagerList.get(0).getPosFanoutExchange());
  1051. payOrder.setPosFanoutExchange(stationDeviceManagerList.get(0).getPosFanoutExchange());
  1052. payOrder.setPosQueue(stationDeviceManagerList.get(0).getPosQueue());
  1053. payOrder.setDeviceNo(stationDeviceManagerList.get(0).getDeviceNo());
  1054. this.posPrintReceipt(payOrder);
  1055. }
  1056. break;
  1057. }
  1058. }
  1059. }
  1060. //logger.info("小票打印方式:" + stationInfo.getPrintDeviceType());
  1061. // if(stationInfos !=null && stationInfos.getPrintDeviceType() !=null){
  1062. // switch (stationInfos.getPrintDeviceType()){
  1063. // case "1": //小票机打印
  1064. // logger.info("小票机打印");
  1065. // Map map = new HashMap();
  1066. // map.put("stationId", infoMap.get("stationId").toString());
  1067. // map.put("oilGunNo", infoMap.get("oilGun").toString());
  1068. // map.put("deviceType", stationInfos.getPrintDeviceType());
  1069. // List<Map> listDevices = stationOilGunService.getPrinterSnByStationIdAndOilGunNoList(map);
  1070. // infoMap.put("sn", listDevices.get(0).get("printerSn").toString());
  1071. // infoMap.put("printSetting", stationInfos.getPrintSetting());
  1072. // this.printReceipt(infoMap);
  1073. // break;
  1074. // case "2": //POS机打印
  1075. // logger.info("POS机打印");
  1076. // payOrder.setIntegral(String.valueOf(integral));
  1077. // payOrder.setPrintSetting(stationInfos.getPrintSetting());
  1078. // this.posPrintReceipt(payOrder);
  1079. // break;
  1080. // }
  1081. // }
  1082. }else{
  1083. logger.info("该用户无手机号!");
  1084. }
  1085. }else {
  1086. logger.info("更新订单状态失败!");
  1087. }
  1088. }
  1089. }else {
  1090. logger.info("该订单不存在!");
  1091. }
  1092. }else {
  1093. logger.info("验签失败");
  1094. req.put("code","fail");
  1095. req.put("msg","失败");
  1096. }
  1097. logger.info("返回随行付参数信息:"+req.toString());
  1098. return req;
  1099. }
  1100. /***
  1101. * 小程序云闪付扫呗回调
  1102. * @param params
  1103. * @return
  1104. */
  1105. @RequestMapping(value = "/getYunPayCallback", consumes = "text/xml", method = RequestMethod.POST)
  1106. @ResponseBody
  1107. @Transactional
  1108. public net.sf.json.JSONObject getYunPayCallback(@RequestBody String params) throws ParseException {
  1109. logger.info("=============================云闪付(扫呗) 小程序支付完成 回调接口 ** 开始 ** ===============================================");
  1110. net.sf.json.JSONObject result = new net.sf.json.JSONObject(); //返回
  1111. YunPayCallBack yunPayCallBack = JSON.parseObject(params, YunPayCallBack.class);
  1112. logger.info("云闪付扫呗 小程序支付 回调接口返回参数:" + params);
  1113. //logger.info("云闪付扫呗调用回调接口状态码:" + yunPayCallBack.getResult_code());
  1114. if(yunPayCallBack.getResult_code() !=null && yunPayCallBack.getResult_code().equals("01")){
  1115. logger.info("-------------------------云闪付回调成功-------------------------- ");
  1116. //返给云闪付状态码
  1117. result.put("return_code", "01");
  1118. result.put("return_msg", "success");
  1119. //业务逻辑
  1120. String ordNo = yunPayCallBack.getTerminal_trace();
  1121. List<PayOrder> list = payOrderService.getPayOrderList(ordNo);
  1122. //logger.info("根据订单号,查询订单"+gson.toJson(list));
  1123. if (list != null && list.size() == 1) {
  1124. String status = list.get(0).getStatus();
  1125. if(status !=null && status.equals("0")){
  1126. PayOrder payOrder = new PayOrder();
  1127. payOrder.setOrderNo(ordNo);
  1128. payOrder.setStatus("1");
  1129. if(yunPayCallBack.getPay_type().equals("010")){ //WECHAT:微信,ALIPAY:支付宝,UNIONPAY:
  1130. payOrder.setPayType("wx");
  1131. }else if(yunPayCallBack.getPay_type().equals("020")){
  1132. payOrder.setPayType("zfb");
  1133. }
  1134. payOrder.setWxAmt(Double.valueOf(yunPayCallBack.getTotal_fee()));
  1135. payOrder.setDzkAmt(Double.valueOf("0"));
  1136. payOrder.setPayDate(new Timestamp(new Date().getTime())); //支付时间
  1137. payOrder.setReceivedAmt(Double.valueOf(yunPayCallBack.getTotal_fee())); //settleAmt商家入账金额
  1138. payOrder.setReceivedAmt((new BigDecimal(yunPayCallBack.getTotal_fee()).divide(new BigDecimal("100")).doubleValue())); //settleAmt商家入账金额
  1139. //修改订单状态
  1140. int count = payOrderService.getUpdatePayOrder(payOrder);
  1141. if(count == 1){
  1142. Map<String, Object> infoMap = payOrderService.getOrderInfoAndUserInfoByOrderNo(payOrder); //获取该订单手机号、加油升数、实收金额、油站名称
  1143. logger.info("根据订单查询用户手机号等订单信息"+ infoMap.toString());
  1144. //手机号必须有
  1145. if(infoMap != null && infoMap.containsKey("mobilePhone") && infoMap.get("mobilePhone") !=null ){
  1146. int integral =0;
  1147. StationInfo stationInfo = new StationInfo();
  1148. stationInfo.setStationId(Integer.valueOf(infoMap.get("stationId").toString()));
  1149. StationInfo stationInfos = stationService.selectStationInfo(stationInfo);
  1150. if(stationInfos.getIsLngFlagGroup() !=null && stationInfos.getIsLngFlagGroup().equals("1")){
  1151. //等于1表示次要业务:LNG集团平台加气(可能会出现); 插入油站余额记录
  1152. StationBalanceChange stationBalanceChange = new StationBalanceChange();
  1153. stationBalanceChange.setStationId(stationInfos.getStationId());
  1154. stationBalanceChange.setAmt(Double.valueOf(infoMap.get("sellAmt").toString()));
  1155. stationBalanceChange.setCreateTime(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse(infoMap.get("payDate").toString()));
  1156. stationBalanceChange.setType("-");
  1157. stationBalanceChange.setOrderNo(ordNo);
  1158. //生成记录
  1159. payOrderService.insertStationBalanceExchange(stationBalanceChange);
  1160. StationInfo s = new StationInfo();
  1161. BigDecimal subtract = new BigDecimal(String.valueOf(stationInfos.getBalance())).subtract(new BigDecimal(infoMap.get("sellAmt").toString()));
  1162. s.setBalance(subtract.doubleValue());
  1163. s.setStationId(stationInfos.getStationId());
  1164. //更新油站余额
  1165. stationService.updateStationBalance(s);
  1166. logger.info("LNG加气平台支付更新余额完成!");
  1167. }else {
  1168. if(stationInfos.getCouponEnabledFlag() !=null && stationInfos.getCouponEnabledFlag().equals("1")){
  1169. //discountCoupon
  1170. if(infoMap.containsKey("discountCoupon") && infoMap.get("discountCoupon") !=null && infoMap.get("discountCoupon").toString() !=""){
  1171. UserCoupon userCoupon = new UserCoupon();
  1172. userCoupon.setCouponIsUsed("2");
  1173. String discountCoupon = infoMap.get("discountCoupon").toString();
  1174. userCoupon.setId(Integer.valueOf(discountCoupon));
  1175. userCoupon.setCreateTime(new Date());
  1176. userCoupon.setVerificationTime(new Date());
  1177. couponService.updateCouponUserInfo(userCoupon);
  1178. //更新该优惠券的使用数量
  1179. UserCoupon u = new UserCoupon();
  1180. u.setId(Integer.valueOf(discountCoupon));
  1181. UserCoupon userCouponInfo = couponService.selectUserCouponInfo(u);
  1182. Coupon coupon_up = new Coupon();
  1183. coupon_up.setCouponId(userCouponInfo.getCouponId());
  1184. Integer couponUseNum = userCouponInfo.getCouponUseNum();
  1185. couponUseNum = couponUseNum + 1;
  1186. coupon_up.setCouponCumulativeNum(couponUseNum);
  1187. couponService.updateCouponInfo(coupon_up);
  1188. //主动领取优惠券
  1189. this.drawCoupon(infoMap);
  1190. }
  1191. }
  1192. //当前系统主要业务逻辑
  1193. CustomerManage customerManage = this.insertCustomerManage(infoMap); //插入客户积分返回要插入客户的信息
  1194. CalculateIntegral calculateIntegral = new CalculateIntegral();
  1195. calculateIntegral.setOrderNo(ordNo);
  1196. if(infoMap.containsKey("consumer") && infoMap.get("consumer") !=null){
  1197. calculateIntegral.setNickName(infoMap.get("consumer").toString());
  1198. }else {
  1199. calculateIntegral.setNickName("");
  1200. }
  1201. calculateIntegral.setGroupId(Integer.valueOf(infoMap.get("groupId").toString())); //集团ID
  1202. calculateIntegral.setCustomerGrade(customerManage.getGrade()); //客户等级
  1203. calculateIntegral.setIntegralRuleFlag(stationInfos.getIntegralRuleFlagGroup()); //是否共享积分规则
  1204. calculateIntegral.setOpenId(infoMap.get("minaOpenid").toString()); //客户小程序ID
  1205. if(infoMap.containsKey("blogOpenid") && StringUtils.isNotBlank(infoMap.get("blogOpenid").toString())){
  1206. calculateIntegral.setBlogOpenid(infoMap.get("blogOpenid").toString());
  1207. }
  1208. calculateIntegral.setStationId(Integer.valueOf(infoMap.get("stationId").toString())); //油站ID
  1209. calculateIntegral.setStationName(infoMap.get("stationName").toString()); //油站名称
  1210. calculateIntegral.setAmt(new BigDecimal(infoMap.get("amt").toString())); //实收金额
  1211. calculateIntegral.setOilType(infoMap.get("oilType").toString()); //订单类型
  1212. calculateIntegral.setOilName(infoMap.get("oilName").toString()); //油品名称
  1213. calculateIntegral.setOilLiters(new BigDecimal(infoMap.get("orderLiters").toString())); //加油升数
  1214. calculateIntegral.setUnionId(infoMap.get("unionId").toString()); //客户unionId
  1215. calculateIntegral.setNickName(infoMap.get("consumer").toString()); //客户昵称
  1216. calculateIntegral.setMobilePhone(infoMap.get("mobilePhone").toString()); //客户手机号
  1217. calculateIntegral.setReceivableAmt(new BigDecimal(infoMap.get("receivableAmt").toString())); //应收金额
  1218. CustomerPoints customerPoints;
  1219. //计算积分
  1220. CalculateIntegral calculateIntegralInfos;
  1221. if(stationInfos.getIntegralRuleFlagGroup().equals("1")){ //表示积分共享
  1222. if(stationInfos.getIntegralFlagGroup().equals("1")){ //集团开启积分功能
  1223. //calculateIntegral.setGroupId(stationInfos.getGroupId());
  1224. calculateIntegralInfos = this.calculateIntegral(calculateIntegral);
  1225. //插入客户所得积分
  1226. customerPoints = this.insertUserIntegral(calculateIntegralInfos);
  1227. integral =calculateIntegralInfos.getIntegral();
  1228. //推送积分
  1229. this.pushIntegral(customerPoints, calculateIntegral);
  1230. }
  1231. }else {
  1232. if(stationInfos.getIntegralFlag().equals("1")){
  1233. //calculateIntegral.setStationId(stationInfos.getStationId());
  1234. calculateIntegralInfos = this.calculateIntegral(calculateIntegral);
  1235. //插入客户所得积分
  1236. customerPoints = this.insertUserIntegral(calculateIntegralInfos);
  1237. //推送积分
  1238. integral =calculateIntegralInfos.getIntegral();
  1239. this.pushIntegral(customerPoints, calculateIntegral);
  1240. }
  1241. }
  1242. }
  1243. //获取油枪绑定的POS机信息
  1244. StationDeviceManager stationDeviceManager = new StationDeviceManager();
  1245. stationDeviceManager.setGunNo(infoMap.get("oilGun").toString());
  1246. stationDeviceManager.setStationId(Integer.valueOf(infoMap.get("stationId").toString()));
  1247. List<StationDeviceManager> stationDeviceManagerList = stationService.getStationDeviceManagerList(stationDeviceManager);
  1248. if(stationDeviceManagerList !=null && stationDeviceManagerList.size() >0){
  1249. if(stationDeviceManagerList.get(0).getDeviceType() !=null && stationDeviceManagerList.get(0).getDeviceType() !=""){
  1250. switch (stationDeviceManagerList.get(0).getDeviceType()){
  1251. case "1":
  1252. logger.info("小票机打印方式");
  1253. infoMap.put("sn", stationDeviceManagerList.get(0).getDeviceNo());
  1254. infoMap.put("printSetting", stationInfos.getPrintSetting());
  1255. infoMap.put("isLngFlagGroup", stationInfos.getIsLngFlagGroup());
  1256. this.printReceipt(infoMap);
  1257. break;
  1258. case "2":
  1259. logger.info("POS机打印方式");
  1260. payOrder.setIntegral(String.valueOf(integral));
  1261. payOrder.setPrintSetting(stationInfos.getPrintSetting());
  1262. payOrder.setIsLngFlagGroup(stationInfos.getIsLngFlagGroup());
  1263. if(stationInfos.getIsLngFlagGroup() !=null && stationInfos.getIsLngFlagGroup().equals("1")){
  1264. payOrder.setSellAmt(Double.valueOf(infoMap.get("sellAmt").toString()));
  1265. }
  1266. if(stationDeviceManagerList.get(0).getPosFanoutExchange() !=null && stationDeviceManagerList.get(0).getPosQueue() !=null){
  1267. logger.info("POS设备交换机信息:" + stationDeviceManagerList.get(0).getPosFanoutExchange());
  1268. payOrder.setPosFanoutExchange(stationDeviceManagerList.get(0).getPosFanoutExchange());
  1269. payOrder.setPosQueue(stationDeviceManagerList.get(0).getPosQueue());
  1270. payOrder.setDeviceNo(stationDeviceManagerList.get(0).getDeviceNo());
  1271. this.posPrintReceipt(payOrder);
  1272. }
  1273. break;
  1274. }
  1275. }
  1276. }
  1277. }
  1278. }
  1279. }
  1280. }
  1281. }else {
  1282. result.put("return_code", "02");
  1283. result.put("return_msg", "fail");
  1284. }
  1285. logger.info("返给云闪付结果信息:" + result);
  1286. logger.info(" =======================================云闪付(扫呗) 小程序支付完成 回调接口 ** 结束 ** ===============================================");
  1287. return result;
  1288. }
  1289. //主动领取
  1290. public void drawCoupon(Map infoMap){
  1291. //按照应付来主动发放
  1292. //查询该油站是否有主动发放
  1293. BigDecimal receivableAmt = new BigDecimal(infoMap.get("receivableAmt").toString());
  1294. Integer stationId = Integer.valueOf(infoMap.get("stationId").toString());
  1295. String unionId = infoMap.get("unionId").toString();
  1296. Coupon coupon = new Coupon();
  1297. coupon.setStationId(stationId);
  1298. coupon.setIssueType("1");
  1299. List<Coupon> couponList = couponService.selectStaGrantCouponList(coupon);;
  1300. if(couponList !=null && couponList.size()>0){
  1301. //获取该油站已主动发放的优惠券
  1302. for(Coupon c: couponList){
  1303. if(!(receivableAmt.compareTo(c.getDiscountThresholdAmt()) == -1)){
  1304. Integer couponHoldNum = c.getCouponHoldNum(); //持有张数
  1305. Integer couponReceiveNum = c.getCouponReceiveNum(); //最多领取张数
  1306. Integer couponNum = c.getCouponNum(); //改模板最大数量
  1307. String couponIssueId = c.getCouponIssueId(); //领取方式的ID
  1308. Integer couponId = c.getCouponId(); //优惠券模板ID
  1309. Integer couponCumulativeNum = c.getCouponCumulativeNum(); //当前优惠券已领取的数量
  1310. UserCoupon u = new UserCoupon();
  1311. u.setUnionId(unionId);
  1312. u.setStationId(stationId);
  1313. int userCouponCountUsed = couponService.selectUserCouponCount(u);
  1314. u.setCouponIsUsed("0");
  1315. int userCouponCount = couponService.selectUserCouponCount(u);
  1316. if(couponNum >0){
  1317. if(userCouponCount < couponHoldNum){
  1318. if(userCouponCountUsed < couponReceiveNum){
  1319. UserCoupon userCouponParam = new UserCoupon();
  1320. userCouponParam.setCouponIsUsed("0"); //是否使用:0、未使用;1、已使用;
  1321. long currentTimeMillis = System.currentTimeMillis();
  1322. String s = stationId + Long.toString(currentTimeMillis) + Math.round((Math.random() + 1) * 1000);
  1323. String s1 = CryptUtil.useMD5(s);
  1324. userCouponParam.setCouponNo(s1); //优惠券编码
  1325. userCouponParam.setUnionId(unionId); //用户unionId
  1326. userCouponParam.setIssueId(couponIssueId); //领取方式ID
  1327. userCouponParam.setCouponId(c.getCouponId()); //优惠券模板ID
  1328. userCouponParam.setStationId(stationId); //油站ID
  1329. userCouponParam.setCouponIsEffective("1"); //优惠券是否有效
  1330. userCouponParam.setGetCouponTime(new Date()); //优惠券领取时间
  1331. String effectiveTimeType = c.getEffectiveTimeType();
  1332. //'有效时间类型: 1,固定时间;2,领取后x天内有效'
  1333. switch (effectiveTimeType) {
  1334. case "1":
  1335. userCouponParam.setCouponEffectiveTime(c.getEffectiveTimeEnd()); //优惠券有效期截止时间
  1336. break;
  1337. case "2":
  1338. Calendar calendar = Calendar.getInstance();
  1339. calendar.setTime(userCouponParam.getGetCouponTime());
  1340. calendar.add(Calendar.DATE, c.getEffectiveDayNum()); //领取后多少天有效
  1341. userCouponParam.setCouponEffectiveTime(calendar.getTime()); //优惠券有效期截止时间
  1342. break;
  1343. }
  1344. couponService.addUserCoupon(userCouponParam);
  1345. //更新该优惠券的领取数量
  1346. Coupon coupon_up = new Coupon();
  1347. coupon_up.setCouponId(couponId);
  1348. couponCumulativeNum = couponCumulativeNum + 1;
  1349. coupon_up.setCouponCumulativeNum(couponCumulativeNum);
  1350. couponService.updateCouponInfo(coupon_up);
  1351. }
  1352. }
  1353. }
  1354. }
  1355. }
  1356. }
  1357. }
  1358. //领取后优惠券推送告知用户
  1359. //插入客户信息
  1360. public CustomerManage insertCustomerManage(Map infoMap) throws ParseException {
  1361. CustomerManage customerManage = new CustomerManage(); //存放客户信息
  1362. customerManage.setGroupId(Integer.valueOf(infoMap.get("groupId").toString()));
  1363. customerManage.setUnionId(infoMap.get("unionId").toString());
  1364. customerManage.setMinaUserId(Integer.valueOf(infoMap.get("consumerId").toString()));
  1365. customerManage.setPhoneNumber(infoMap.get("mobilePhone").toString());
  1366. customerManage.setCustomerName(infoMap.get("consumer").toString());
  1367. customerManage.setRegtime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(infoMap.get("registeDate").toString()));
  1368. customerManage.setStationId(Integer.valueOf(infoMap.get("stationId").toString())); //油站ID
  1369. customerManage.setOilName(infoMap.get("oilName").toString()); //油品名称
  1370. CustomerManage c = new CustomerManage(); //存放客户信息
  1371. c.setUnionId(infoMap.get("unionId").toString());
  1372. c.setStationId(Integer.valueOf(infoMap.get("stationId").toString())); //油站ID
  1373. c.setOilName(infoMap.get("oilName").toString()); //油品名称
  1374. CustomerManage existCustomer = customerManagerService.getCustomerManageInfo(c); //已存在用户信息 existCustomer
  1375. //判断该用户是否已存在
  1376. if(existCustomer != null){ //存在该用户时更新
  1377. if(existCustomer.getAmt() !=null){
  1378. customerManage.setAmt(existCustomer.getAmt().add(BigDecimal.valueOf((Double) infoMap.get("amt"))));//存入金额 累加原来金额
  1379. }else {
  1380. customerManage.setAmt(BigDecimal.valueOf((Double) infoMap.get("amt")));
  1381. }
  1382. //此处用于更新没有会员ID的用户
  1383. if(!StringUtils.isNotBlank(existCustomer.getMemberId())){
  1384. String customerId=infoMap.get("groupId").toString()+infoMap.get("stationId").toString()+System.nanoTime();
  1385. customerManage.setMemberId(customerId);
  1386. }
  1387. if(infoMap.containsKey("orderType") && infoMap.get("orderType").equals("1")) {
  1388. if (existCustomer.getLiters() != null) {
  1389. customerManage.setLiters(existCustomer.getLiters().add(BigDecimal.valueOf((Double) infoMap.get("orderLiters"))));//存入升数 累加原来升数
  1390. } else {
  1391. customerManage.setLiters(BigDecimal.valueOf((Double) infoMap.get("orderLiters")));
  1392. }
  1393. }
  1394. logger.info("存在客户 更新时手机号参数: " + customerManage.getPhoneNumber());
  1395. //直降时存入等级名称和等级ID
  1396. List<Map> customerGradeInfo = customerGradeServices.getCustomerGradeListOrderByDesc(infoMap); //直降
  1397. logger.info("该站直降等级信息:"+ customerGradeInfo);
  1398. for (Map m: customerGradeInfo){
  1399. if(Double.valueOf(customerManage.getAmt().toString()) >= Double.valueOf(m.get("memberConditStart").toString())){
  1400. customerManage.setGrade(m.get("id").toString()); //存入等级ID
  1401. break;
  1402. }
  1403. }
  1404. logger.info("直降等级信息是否存入客户表:"+ "直降ID:"+ customerManage.getGrade());
  1405. customerManagerService.updateCustomerInfo(customerManage);
  1406. }else{ //该客户不存在时插入
  1407. //直降时存入等级名称和等级ID
  1408. List<Map> customerGradeInfo = customerGradeServices.getCustomerGradeList(infoMap); //直降
  1409. logger.info("该站直降等级信息:"+ customerGradeInfo);
  1410. if(customerGradeInfo !=null && customerGradeInfo.size() >0){
  1411. customerManage.setGrade(customerGradeInfo.get(0).get("id").toString()); //存入等级ID
  1412. }
  1413. logger.info("直降等级信息是否存入客户表:"+ "直降ID:"+ customerManage.getGrade());
  1414. customerManage.setAmt(BigDecimal.valueOf((Double) infoMap.get("amt"))); //存入金额
  1415. if(infoMap.containsKey("orderType") && infoMap.get("orderType").equals("1")){
  1416. customerManage.setLiters(BigDecimal.valueOf((Double) infoMap.get("orderLiters"))); //存入升数
  1417. }
  1418. logger.info("不存在客户 新增时参数: " + customerManage.toString());
  1419. String memberId=infoMap.get("groupId").toString()+infoMap.get("stationId").toString()+System.nanoTime(); //客户会员号
  1420. CustomerManage cm = new CustomerManage();
  1421. cm.setStationId(Integer.valueOf(infoMap.get("stationId").toString()));
  1422. cm.setPhoneNumber(infoMap.get("mobilePhone").toString());
  1423. List<CustomerManage> customerManageInfoList = customerManagerService.getCustomerManageInfoList(cm);
  1424. if(customerManageInfoList !=null && customerManageInfoList.size()>0){
  1425. if(StringUtils.isNotBlank(customerManageInfoList.get(0).getMemberId())){
  1426. customerManage.setMemberId(customerManageInfoList.get(0).getMemberId());
  1427. }else {
  1428. customerManage.setMemberId(memberId);
  1429. }
  1430. }else {
  1431. customerManage.setMemberId(memberId);
  1432. }
  1433. customerManagerService.insertCustomerInfo(customerManage);
  1434. }
  1435. return customerManage;
  1436. }
  1437. //POS机打印小票
  1438. public void posPrintReceipt(PayOrder payOrder){
  1439. Map<String, Object> infoMap = payOrderService.getOrderInfoAndUserInfoByOrderNo(payOrder);
  1440. Map<String, Object> m = new HashMap<>();
  1441. if(payOrder.getTransactionId() !=null){
  1442. m.put("transactionId", payOrder.getTransactionId());
  1443. }
  1444. if(payOrder.getIntegral() !=null){
  1445. m.put("integral", payOrder.getIntegral());
  1446. }
  1447. if(infoMap !=null && infoMap.containsKey("oilPersonnel") && infoMap.get("oilPersonnel") !=null){
  1448. m.put("oilPersonnel", infoMap.get("oilPersonnel").toString());
  1449. }
  1450. if(infoMap !=null && infoMap.containsKey("orderNo") && infoMap.get("orderNo") !=null){
  1451. m.put("orderNo", infoMap.get("orderNo").toString());
  1452. }
  1453. //if(infoMap !=null && infoMap.containsKey("amt") && infoMap.get("amt") !=null){
  1454. if(payOrder.getIsLngFlagGroup() !=null && payOrder.getIsLngFlagGroup().equals("1")){
  1455. m.put("amt", infoMap.get("sellAmt").toString());
  1456. m.put("discountAmt", infoMap.get("sellDiscountAmt").toString());
  1457. }else {
  1458. m.put("amt", infoMap.get("amt").toString());
  1459. m.put("discountAmt", infoMap.get("discountAmt").toString());
  1460. }
  1461. //}
  1462. if(infoMap !=null && infoMap.containsKey("receivableAmt") && infoMap.get("receivableAmt") !=null){
  1463. m.put("receivableAmt", infoMap.get("receivableAmt").toString());
  1464. }
  1465. // if(infoMap !=null && infoMap.containsKey("discountAmt") && infoMap.get("discountAmt") !=null){
  1466. // m.put("discountAmt", infoMap.get("discountAmt").toString());
  1467. // }
  1468. if(infoMap !=null && infoMap.containsKey("oilName") && infoMap.get("oilName") !=null){
  1469. m.put("oilName", infoMap.get("oilName").toString());
  1470. }
  1471. if(infoMap !=null && infoMap.containsKey("oilGun") && infoMap.get("oilGun") !=null){
  1472. m.put("oilGun", infoMap.get("oilGun").toString());
  1473. }
  1474. if(infoMap !=null && infoMap.containsKey("createdDate") && infoMap.get("createdDate") !=null){
  1475. //格式化日期
  1476. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  1477. String createdDate = sdf.format(infoMap.get("createdDate"));
  1478. m.put("createdDate", createdDate);
  1479. }
  1480. if(infoMap !=null && infoMap.containsKey("payDate") && infoMap.get("payDate") !=null){
  1481. //格式化日期
  1482. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  1483. String payDate = sdf.format(infoMap.get("payDate"));
  1484. m.put("payDate", payDate);
  1485. }
  1486. if(infoMap !=null && infoMap.containsKey("payType") && infoMap.get("payType") !=null){
  1487. String payType = "";
  1488. if(infoMap.get("payType").equals("wx")){
  1489. payType ="微信";
  1490. }
  1491. if(infoMap.get("payType").equals("dzk")){
  1492. payType ="电子卡";
  1493. }
  1494. m.put("payType", payType);
  1495. }
  1496. if(infoMap !=null && infoMap.containsKey("mobilePhone") && infoMap.get("mobilePhone") !=null){
  1497. String phone =infoMap.get("mobilePhone")+"";
  1498. //手机号中间四位****代替
  1499. phone = phone.substring(0, 3) + "****" + phone.substring(7, phone.length());
  1500. m.put("mobilePhone", phone);
  1501. }
  1502. if(infoMap !=null && infoMap.containsKey("orderLiters") && infoMap.get("orderLiters") !=null){
  1503. m.put("orderLiters", infoMap.get("orderLiters").toString());
  1504. }
  1505. if(infoMap !=null && infoMap.containsKey("stationName") && infoMap.get("stationName") !=null){
  1506. m.put("stationName", infoMap.get("stationName").toString());
  1507. }
  1508. if(infoMap !=null && infoMap.containsKey("oilPirce") && infoMap.get("oilPirce") !=null){
  1509. m.put("oilPirce", infoMap.get("oilPirce").toString());
  1510. }
  1511. if(infoMap !=null && infoMap.containsKey("stationId") && infoMap.get("stationId") !=null){
  1512. m.put("stationId", infoMap.get("stationId").toString());
  1513. }
  1514. // if(infoMap !=null && infoMap.containsKey("orderType") && infoMap.get("orderType") !=null){
  1515. // m.put("orderType", infoMap.get("orderType").toString());
  1516. // }
  1517. if(infoMap !=null && infoMap.containsKey("oilType") && infoMap.get("oilType") !=null){
  1518. if(infoMap.get("oilType").equals("3")){
  1519. m.put("orderType", "noOil");
  1520. }else {
  1521. m.put("orderType", "oil");
  1522. }
  1523. }
  1524. logger.info("要推送的订单的信息:" +m.toString());
  1525. //定义推送格式
  1526. Map<String, Object> params = new HashMap<>();
  1527. params.put("messageTitle", "pos");
  1528. params.put("messageType", "sys");
  1529. //获取油枪绑定的POS机信息
  1530. // StationDeviceManager stationDeviceManager = new StationDeviceManager();
  1531. // stationDeviceManager.setDeviceType("2");
  1532. // stationDeviceManager.setStationId(Integer.valueOf(infoMap.get("stationId").toString()));
  1533. // stationDeviceManager.setGunNo(infoMap.get("oilGun").toString());
  1534. // StationDeviceManager stationDeviceManagerInfo = stationService.getStationDeviceManager(stationDeviceManager);
  1535. // if(stationDeviceManagerInfo !=null && stationDeviceManagerInfo.getPosFanoutExchange() !=null && stationDeviceManagerInfo.getPosQueue() !=null){
  1536. params.put("posFanoutExchange", payOrder.getPosFanoutExchange());
  1537. params.put("posQueue", payOrder.getPosQueue());
  1538. params.put("tusn", payOrder.getDeviceNo());
  1539. params.put("printSetting", payOrder.getPrintSetting()); //小票打印方式
  1540. List<Map<String, Object>> list = new ArrayList<>();
  1541. list.add(m);
  1542. Map<String, Object> map = new HashMap<>();
  1543. map.put("contentData", list);
  1544. params.put("messageContent", map);
  1545. logger.info("开始推送消息:" +JSONObject.toJSONString(params));
  1546. String resultString = PosPrinterUtil.sendPosPrintDirectMessage(params);
  1547. JSONObject jsonObject = JSONObject.parseObject(resultString);
  1548. if(jsonObject.containsKey("code") && jsonObject.get("code").toString().equals("200")){
  1549. //如果打印成功 添加小票数量
  1550. PayOrder p = new PayOrder();
  1551. p.setPrintCount(1);
  1552. p.setOrderNo(infoMap.get("orderNo").toString());
  1553. payOrderService.getUpdatePayOrder(p);
  1554. }
  1555. //}
  1556. }
  1557. //打印机打印小票
  1558. public void printReceipt(Map infoMap) {
  1559. //打印机打印小票
  1560. String content1;
  1561. String content2;
  1562. String orderNoP = "";
  1563. String createdDateP ="";
  1564. String payDateP ="";
  1565. String oilGunP= "";
  1566. String receiptNameP="";
  1567. String stationNameP ="";
  1568. String oilNameP ="";
  1569. String orderLitersP ="";
  1570. String oilPirceP ="";
  1571. String receivableAmtP = "";
  1572. String discountAmtP = "";
  1573. String amtP = "";
  1574. String mobilePhoneP = "";
  1575. String payWayP = "";
  1576. String oilPersonnelP = "";
  1577. String sn; //打印机编号
  1578. if(StringUtils.isNotBlank(infoMap.get("oilPersonnel").toString())){
  1579. oilPersonnelP =infoMap.get("oilPersonnel").toString();
  1580. }
  1581. if(StringUtils.isNotBlank(infoMap.get("orderNo").toString())){
  1582. orderNoP =infoMap.get("orderNo").toString();
  1583. }
  1584. if(infoMap.containsKey("createdDate") && infoMap.get("createdDate") !=null ){
  1585. //格式化日期
  1586. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  1587. createdDateP =sdf.format(infoMap.get("createdDate"));
  1588. }
  1589. if(infoMap.containsKey("payDate") && infoMap.get("payDate") !=null ){
  1590. //格式化日期
  1591. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  1592. payDateP =sdf.format(infoMap.get("payDate"));
  1593. }
  1594. if(infoMap.containsKey("oilGun") && infoMap.get("oilGun") !=null ){
  1595. oilGunP =infoMap.get("oilGun").toString();
  1596. }
  1597. if(infoMap.containsKey("stationName") && infoMap.get("stationName") !=null ){
  1598. stationNameP =infoMap.get("stationName").toString();
  1599. }
  1600. if(infoMap.containsKey("oilName") && infoMap.get("oilName") !=null ){
  1601. oilNameP =infoMap.get("oilName").toString();
  1602. }
  1603. if(infoMap.containsKey("oilType") && !infoMap.get("oilType").equals("3")) {
  1604. //加油升数
  1605. if (infoMap.containsKey("orderLiters") && infoMap.get("orderLiters") != null) {
  1606. orderLitersP = infoMap.get("orderLiters") + "";
  1607. }
  1608. //油价
  1609. if (infoMap.containsKey("oilPirce") && infoMap.get("oilPirce") != null) {
  1610. oilPirceP = infoMap.get("oilPirce") + "";
  1611. }
  1612. if(infoMap.containsKey("isLngFlagGroup") && infoMap.get("isLngFlagGroup") !=null && infoMap.get("isLngFlagGroup").toString().equals("1")){
  1613. discountAmtP =infoMap.get("sellDiscountAmt")+"";
  1614. }else {
  1615. discountAmtP =infoMap.get("discountAmt")+"";
  1616. }
  1617. receiptNameP = "油品订单";
  1618. }else {
  1619. orderLitersP ="0.00";
  1620. oilPirceP = "0.00";
  1621. discountAmtP ="0.00";
  1622. receivableAmtP=infoMap.get("amt")+"";
  1623. receiptNameP = "非油品订单";
  1624. }
  1625. if(infoMap.containsKey("receivableAmt") && infoMap.get("receivableAmt") !=null ){
  1626. receivableAmtP =infoMap.get("receivableAmt")+"";
  1627. }
  1628. if(infoMap.containsKey("isLngFlagGroup") && infoMap.get("isLngFlagGroup") !=null && infoMap.get("isLngFlagGroup").toString().equals("1")){
  1629. amtP =infoMap.get("sellAmt")+"";
  1630. }else {
  1631. amtP =infoMap.get("amt")+"";
  1632. }
  1633. if(infoMap.containsKey("mobilePhone") && infoMap.get("mobilePhone") !=null ){
  1634. String phone =infoMap.get("mobilePhone")+"";
  1635. //手机号中间四位****代替
  1636. mobilePhoneP = phone.substring(0, 3) + "****" + phone.substring(7, phone.length());
  1637. }
  1638. if(infoMap.containsKey("payType") && infoMap.get("payType") !=null ){
  1639. if(infoMap.get("payType").equals("wx")){
  1640. payWayP ="微信";
  1641. }else {
  1642. payWayP ="电子卡";
  1643. }
  1644. }
  1645. content1 = "<CB>"+receiptNameP+"--顾客联</CB><BR>";
  1646. content1 += "<BR>";
  1647. content1 += "--------------------------------<BR>";
  1648. content1 += "<BR>";
  1649. content1 += "<BOLD><B>原价: "+receivableAmtP+" 元</B></BOLD><BR>";
  1650. content1 += "订单号:"+orderNoP+" <BR>";
  1651. content1 += "支付方式: "+payWayP+" <BR>";
  1652. content1 += "下单时间:"+createdDateP+" <BR>";
  1653. content1 += "付款时间:"+payDateP+" <BR>";
  1654. content1 += "油站:"+stationNameP+" <BR>";
  1655. content1 += "油枪:"+oilGunP+"号枪<BR>";
  1656. content1 += "加油员:"+oilPersonnelP+"<BR>";
  1657. if(infoMap.containsKey("oilType") && !infoMap.get("oilType").toString().equals("3")){
  1658. content1 += "油品: "+oilNameP+" <BR>";
  1659. content1 += "油量: "+orderLitersP+" 升<BR>";
  1660. content1 += "单价: "+oilPirceP+" L/元<BR>";
  1661. }
  1662. if(infoMap.containsKey("oilType") && !infoMap.get("oilType").toString().equals("3")){
  1663. content1 += "优惠: "+discountAmtP+" 元<BR>";
  1664. }
  1665. content1 += "支付: "+amtP+" 元<BR>";
  1666. content1 += "手机号: "+mobilePhoneP+" <BR>";
  1667. content1 += "加油员:"+oilPersonnelP+"<BR>";
  1668. content1 += "<BR>";
  1669. //content1 += "--------------------------------<BR>";
  1670. //content1 += "<BR>";
  1671. content2 = "<CB>"+receiptNameP+"--商户联</CB><BR>";
  1672. content2 += "<BR>";
  1673. content2 += "--------------------------------<BR>";
  1674. content2 += "<BR>";
  1675. content2 += "<BOLD><B>原价: "+receivableAmtP+" 元</B></BOLD><BR>";
  1676. content2 += "订单号:"+orderNoP+" <BR>";
  1677. content2 += "支付方式: "+payWayP+" <BR>";
  1678. content2 += "下单时间:"+createdDateP+" <BR>";
  1679. content2 += "付款时间:"+payDateP+" <BR>";
  1680. content2 += "油站:"+stationNameP+" <BR>";
  1681. content2 += "油枪:"+oilGunP+"号枪<BR>";
  1682. if(infoMap.containsKey("oilType") && !infoMap.get("oilType").toString().equals("3")){
  1683. content2 += "油品: "+oilNameP+" <BR>";
  1684. content2 += "油量: "+orderLitersP+" 升<BR>";
  1685. content2 += "单价: "+oilPirceP+" L/元<BR>";
  1686. }
  1687. if(infoMap.containsKey("oilType") && !infoMap.get("oilType").toString().equals("3")){
  1688. content2 += "优惠: "+discountAmtP+" 元<BR>";
  1689. }
  1690. content2 += "支付: "+amtP+" 元<BR>";
  1691. content2 += "手机号: "+mobilePhoneP+" <BR>";
  1692. content2 += "加油员:"+oilPersonnelP+"<BR>";
  1693. content2 += "<BR>";
  1694. //获取打印机编号
  1695. //sn = "921611605"; //测试打印机 sn:921611605 key:72338zma
  1696. sn = infoMap.get("sn").toString();
  1697. //开始打印
  1698. String printInfo=""; //打印信息
  1699. if(infoMap.containsKey("printSetting") && infoMap.get("printSetting").toString()!= null && infoMap.get("printSetting").toString()!=""){
  1700. switch (infoMap.get("printSetting").toString()){
  1701. case "1": //1 客户联
  1702. printInfo = FeiEPrinterUtil.printReceipt(sn, content1);
  1703. break;
  1704. case "2": //2 商户联
  1705. printInfo = FeiEPrinterUtil.printReceipt(sn, content2);
  1706. break;
  1707. case "3": //3商户联和客户联
  1708. printInfo = FeiEPrinterUtil.printReceipt(sn, content1 + content2);
  1709. break;
  1710. }
  1711. }
  1712. JSONObject jsonObject = JSONObject.parseObject(printInfo);
  1713. if(jsonObject != null && jsonObject.getString("msg").equals("ok")){
  1714. logger.info("打印成功:" + jsonObject.toString());
  1715. //如果打印成功 添加小票数量
  1716. PayOrder p = new PayOrder();
  1717. p.setPrintCount(1);
  1718. p.setOrderNo(infoMap.get("orderNo").toString());
  1719. payOrderService.getUpdatePayOrder(p);
  1720. }
  1721. }
  1722. //计算积分
  1723. public CalculateIntegral calculateIntegral(CalculateIntegral calculateIntegral){
  1724. int integral =0;
  1725. IntegralRule integralRule = new IntegralRule();
  1726. integralRule.setStationId(calculateIntegral.getStationId());
  1727. //获取油站的积分规则是否共享
  1728. String integralRuleFlag = calculateIntegral.getIntegralRuleFlag();
  1729. if(StringUtils.isNotBlank(integralRuleFlag) && integralRuleFlag.equals("1")){
  1730. //如果共享则先根据集团ID查询集团规则
  1731. integralRule.setStationId(calculateIntegral.getGroupId());
  1732. }
  1733. integralRule.setOilName(calculateIntegral.getOilName());
  1734. //获取该油站的积分规则
  1735. List<IntegralRule> integralRuleList = integralRuleService.getIntegralRule(integralRule);
  1736. if(integralRuleList !=null && integralRuleList.size() >0){
  1737. logger.info("该油站积分规则信息:" + integralRuleList.toString());
  1738. Date emptyDate = integralRuleList.get(0).getEmptyDate();
  1739. //积分规则有效时间 为null时 表示永久有效
  1740. if(emptyDate ==null || emptyDate.compareTo(new Date()) == 1 || emptyDate.compareTo(new Date()) == 0){
  1741. List<IntegralRuleDetail> integralRuleDetailList = integralRuleList.get(0).getIntegralRuleDetailList();
  1742. String currentTime = null; //当前时间
  1743. String datePickerTime=null; //活动时间
  1744. String[] datePickerTimeArray ={};
  1745. String integralActivity = integralRuleList.get(0).getIntegralActivity();
  1746. String integralProportion =null;
  1747. if(integralActivity !=null && integralActivity.equals("1")){
  1748. datePickerTime = integralRuleList.get(0).getDatePickerTime();
  1749. integralProportion = integralRuleList.get(0).getIntegralProportion();
  1750. if(datePickerTime.contains(",")){
  1751. datePickerTimeArray = datePickerTime.split(",");
  1752. }else {
  1753. datePickerTimeArray= new String[1];
  1754. datePickerTimeArray[0] = datePickerTime;
  1755. }
  1756. }
  1757. if(integralRuleDetailList !=null && integralRuleDetailList.size() >0){
  1758. Calendar calendar = Calendar.getInstance();
  1759. calendar.setTime(new Date()); //获取当前时间
  1760. for (IntegralRuleDetail integralRuleDetail : integralRuleDetailList){
  1761. if(!StringUtils.isNotBlank(integralRuleDetail.getRuleType()) && !StringUtils.isNotBlank(integralRuleDetail.getGread())){
  1762. //等级和规则类型null为时表示非油品, 没有按照实收,应收,加油升数
  1763. if (calculateIntegral.getReceivableAmt().compareTo(integralRuleDetail.getRuleTerms()) ==1 || calculateIntegral.getReceivableAmt().compareTo(integralRuleDetail.getRuleTerms()) ==0){
  1764. BigDecimal divide = null;
  1765. BigDecimal multiply = null;
  1766. divide = calculateIntegral.getReceivableAmt().divide(integralRuleDetail.getSaleAmt(), 0, BigDecimal.ROUND_DOWN);
  1767. multiply = divide.multiply(integralRuleDetail.getIntegral());
  1768. if(integralActivity !=null && integralActivity.equals("1") && datePickerTimeArray !=null && integralProportion !=null){
  1769. String datePicker = integralRuleList.get(0).getDatePicker(); //获取日期类型
  1770. switch (datePicker){
  1771. case "1": // 1.按周来
  1772. int day_Week = calendar.get(Calendar.DAY_OF_WEEK);
  1773. day_Week= day_Week-1; //减一原因:数据库存的下标从零开始
  1774. currentTime = String.valueOf(day_Week);
  1775. break;
  1776. case "2": // 2.每月的 多少号
  1777. int day_month = calendar.get(Calendar.DAY_OF_MONTH);
  1778. day_month = day_month-1; //减一原因:数据库存的下标从零开始
  1779. currentTime = String.valueOf(day_month); //当前时间
  1780. break;
  1781. case "3": // 3.固定日期
  1782. currentTime =new SimpleDateFormat("yyyy-MM-dd").format(new Date()); //当前时间
  1783. break;
  1784. }
  1785. for (String s : datePickerTimeArray){
  1786. if(s.equals(currentTime)){
  1787. multiply = multiply.multiply(new BigDecimal(integralProportion));
  1788. break;
  1789. }
  1790. }
  1791. }
  1792. integral = multiply.intValue();
  1793. logger.info("本次客户所得积分:" + integral);
  1794. break;
  1795. }
  1796. }else if (StringUtils.isNotBlank(integralRuleDetail.getGread()) && integralRuleDetail.getRuleType().equals("1")){ //按照实收金额
  1797. if(calculateIntegral.getAmt().compareTo(integralRuleDetail.getRuleTerms()) == 1 || calculateIntegral.getAmt().compareTo(integralRuleDetail.getRuleTerms()) == 0){
  1798. BigDecimal divide = null;
  1799. BigDecimal multiply = null;
  1800. if(integralRuleDetail.getGread().equals("0")){ //等级为0时,表示所有人
  1801. divide = calculateIntegral.getAmt().divide(integralRuleDetail.getSaleAmt(), 0, BigDecimal.ROUND_DOWN);
  1802. multiply = divide.multiply(integralRuleDetail.getIntegral());
  1803. if(integralActivity !=null && integralActivity.equals("1") && datePickerTimeArray !=null && integralProportion !=null){
  1804. String datePicker = integralRuleList.get(0).getDatePicker();
  1805. switch (datePicker){
  1806. case "1": // 1.按周来
  1807. int day_Week = calendar.get(Calendar.DAY_OF_WEEK);
  1808. day_Week= day_Week-1; //减一原因:数据库存的下标从零开始
  1809. currentTime = String.valueOf(day_Week);
  1810. break;
  1811. case "2": // 2.每月的多少号
  1812. int day_month = calendar.get(Calendar.DAY_OF_MONTH);
  1813. day_month = day_month-1; //减一原因:数据库存的下标从零开始
  1814. currentTime = String.valueOf(day_month); //当前时间
  1815. break;
  1816. case "3": // 3.固定日期
  1817. currentTime =new SimpleDateFormat("yyyy-MM-dd").format(new Date());
  1818. break;
  1819. }
  1820. for (String s : datePickerTimeArray){
  1821. if(s.equals(currentTime)){
  1822. multiply = multiply.multiply(new BigDecimal(integralProportion));
  1823. break;
  1824. }
  1825. }
  1826. }
  1827. integral =multiply.intValue();
  1828. logger.info("本次客户所得积分:" + integral);
  1829. break;
  1830. }else if(integralRuleDetail.getGread().equals(calculateIntegral.getCustomerGrade())){ //如果等级相同
  1831. divide = calculateIntegral.getAmt().divide(integralRuleDetail.getSaleAmt(), 0, BigDecimal.ROUND_DOWN);
  1832. multiply = divide.multiply(integralRuleDetail.getIntegral());
  1833. if(integralActivity !=null && integralActivity.equals("1") && datePickerTimeArray !=null && integralProportion !=null){
  1834. String datePicker = integralRuleList.get(0).getDatePicker();
  1835. switch (datePicker){
  1836. case "1": // 1.按周来
  1837. int day_Week = calendar.get(Calendar.DAY_OF_WEEK);
  1838. day_Week= day_Week-1; //减一原因:数据库存的下标从零开始
  1839. currentTime = String.valueOf(day_Week);
  1840. break;
  1841. case "2": // 2.每月的多少号
  1842. int day_month = calendar.get(Calendar.DAY_OF_MONTH);
  1843. day_month = day_month-1; //减一原因:数据库存的下标从零开始
  1844. currentTime = String.valueOf(day_month); //当前时间
  1845. break;
  1846. case "3": // 3.固定日期
  1847. currentTime =new SimpleDateFormat("yyyy-MM-dd").format(new Date());
  1848. break;
  1849. }
  1850. for (String s : datePickerTimeArray){
  1851. if(s.equals(currentTime)){
  1852. multiply = multiply.multiply(new BigDecimal(integralProportion));
  1853. break;
  1854. }
  1855. }
  1856. }
  1857. integral =multiply.intValue();
  1858. logger.info("本次客户所得积分:" + integral);
  1859. break;
  1860. }
  1861. }
  1862. }else if(StringUtils.isNotBlank(integralRuleDetail.getGread()) && integralRuleDetail.getRuleType().equals("2")){ //按应收金额
  1863. if(calculateIntegral.getReceivableAmt().compareTo(integralRuleDetail.getRuleTerms()) ==1 || calculateIntegral.getReceivableAmt().compareTo(integralRuleDetail.getRuleTerms()) ==0){
  1864. BigDecimal divide = null;
  1865. BigDecimal multiply = null;
  1866. if(integralRuleDetail.getGread().equals("0")){
  1867. divide = calculateIntegral.getReceivableAmt().divide(integralRuleDetail.getSaleAmt(), 0, BigDecimal.ROUND_DOWN);
  1868. multiply = divide.multiply(integralRuleDetail.getIntegral());
  1869. if(integralActivity !=null && integralActivity.equals("1") && datePickerTimeArray !=null && integralProportion !=null){
  1870. String datePicker = integralRuleList.get(0).getDatePicker();
  1871. switch (datePicker){
  1872. case "1": // 1.按周来
  1873. int day_Week = calendar.get(Calendar.DAY_OF_WEEK);
  1874. day_Week= day_Week-1; //减一原因:数据库存的下标从零开始
  1875. currentTime = String.valueOf(day_Week);
  1876. break;
  1877. case "2": // 2.每月的 多少号
  1878. int day_month = calendar.get(Calendar.DAY_OF_MONTH);
  1879. day_month = day_month-1; //减一原因:数据库存的下标从零开始
  1880. currentTime = String.valueOf(day_month); //当前时间
  1881. break;
  1882. case "3": // 3.固定日期
  1883. currentTime =new SimpleDateFormat("yyyy-MM-dd").format(new Date()); //当前时间
  1884. break;
  1885. }
  1886. for (String s : datePickerTimeArray){
  1887. if(s.equals(currentTime)){
  1888. multiply = multiply.multiply(new BigDecimal(integralProportion));
  1889. break;
  1890. }
  1891. }
  1892. }
  1893. integral = multiply.intValue();
  1894. logger.info("本次客户所得积分:" + integral);
  1895. break;
  1896. }else if(integralRuleDetail.getGread().equals(calculateIntegral.getCustomerGrade())){
  1897. divide = calculateIntegral.getReceivableAmt().divide(integralRuleDetail.getSaleAmt(), 0, BigDecimal.ROUND_DOWN);
  1898. multiply = divide.multiply(integralRuleDetail.getIntegral());
  1899. if(integralActivity !=null && integralActivity.equals("1") && datePickerTimeArray !=null && integralProportion !=null){
  1900. String datePicker = integralRuleList.get(0).getDatePicker();
  1901. switch (datePicker){
  1902. case "1": // 1.按周来
  1903. int day_Week = calendar.get(Calendar.DAY_OF_WEEK);
  1904. day_Week= day_Week-1; //减一原因:数据库存的下标从零开始
  1905. currentTime = String.valueOf(day_Week);
  1906. break;
  1907. case "2": // 2.每月的 多少号
  1908. int day_month = calendar.get(Calendar.DAY_OF_MONTH);
  1909. day_month = day_month-1; //减一原因:数据库存的下标从零开始
  1910. currentTime = String.valueOf(day_month); //当前时间
  1911. break;
  1912. case "3": // 3.固定日期
  1913. currentTime =new SimpleDateFormat("yyyy-MM-dd").format(new Date()); //当前时间
  1914. break;
  1915. }
  1916. for (String s : datePickerTimeArray){
  1917. if(s.equals(currentTime)){
  1918. multiply = multiply.multiply(new BigDecimal(integralProportion));
  1919. break;
  1920. }
  1921. }
  1922. }
  1923. integral = multiply.intValue();
  1924. logger.info("本次客户所得积分:" + integral);
  1925. break;
  1926. }
  1927. }
  1928. }else if(integralRuleDetail.getRuleType().equals("3")){ //按照加油升数
  1929. if(calculateIntegral.getOilLiters().compareTo(integralRuleDetail.getRuleTerms()) ==1 || calculateIntegral.getOilLiters().compareTo(integralRuleDetail.getRuleTerms()) ==0){
  1930. BigDecimal divide = null;
  1931. BigDecimal multiply = null;
  1932. if(integralRuleDetail.getGread().equals("0")){
  1933. divide = calculateIntegral.getOilLiters().divide(integralRuleDetail.getSaleAmt(), 0, BigDecimal.ROUND_DOWN);
  1934. multiply = divide.multiply(integralRuleDetail.getIntegral());
  1935. if(integralActivity !=null && integralActivity.equals("1") && datePickerTimeArray !=null && integralProportion !=null){
  1936. String datePicker = integralRuleList.get(0).getDatePicker();
  1937. switch (datePicker){
  1938. case "1": // 1.按周来
  1939. int day_Week = calendar.get(Calendar.DAY_OF_WEEK);
  1940. day_Week= day_Week-1; //减一原因:数据库存的下标从零开始
  1941. currentTime = String.valueOf(day_Week);
  1942. break;
  1943. case "2": // 2.每月的 多少号
  1944. int day_month = calendar.get(Calendar.DAY_OF_MONTH);
  1945. day_month = day_month-1; //减一原因:数据库存的下标从零开始
  1946. currentTime = String.valueOf(day_month); //当前时间
  1947. break;
  1948. case "3": // 3.固定日期
  1949. currentTime =new SimpleDateFormat("yyyy-MM-dd").format(new Date()); //当前时间
  1950. break;
  1951. }
  1952. for (String s : datePickerTimeArray){
  1953. if(s.equals(currentTime)){
  1954. multiply = multiply.multiply(new BigDecimal(integralProportion));
  1955. break;
  1956. }
  1957. }
  1958. }
  1959. integral =multiply.intValue();
  1960. logger.info("本次客户所得积分:" + integral);
  1961. break;
  1962. }else if(integralRuleDetail.getGread().equals(calculateIntegral.getCustomerGrade())){
  1963. divide = calculateIntegral.getOilLiters().divide(integralRuleDetail.getSaleAmt(), 0, BigDecimal.ROUND_DOWN);
  1964. multiply = divide.multiply(integralRuleDetail.getIntegral());
  1965. if(integralActivity !=null && integralActivity.equals("1") && datePickerTimeArray !=null && integralProportion !=null){
  1966. String datePicker = integralRuleList.get(0).getDatePicker();
  1967. switch (datePicker){
  1968. case "1": // 1.按周来
  1969. int day_Week = calendar.get(Calendar.DAY_OF_WEEK);
  1970. day_Week= day_Week-1; //减一原因:数据库存的下标从零开始
  1971. currentTime = String.valueOf(day_Week);
  1972. break;
  1973. case "2": // 2.每月的 多少号
  1974. int day_month = calendar.get(Calendar.DAY_OF_MONTH);
  1975. day_month = day_month-1; //减一原因:数据库存的下标从零开始
  1976. currentTime = String.valueOf(day_month); //当前时间
  1977. break;
  1978. case "3": // 3.固定日期
  1979. currentTime =new SimpleDateFormat("yyyy-MM-dd").format(new Date()); //当前时间
  1980. break;
  1981. }
  1982. for (String s : datePickerTimeArray){
  1983. if(s.equals(currentTime)){
  1984. multiply = multiply.multiply(new BigDecimal(integralProportion));
  1985. break;
  1986. }
  1987. }
  1988. }
  1989. integral =multiply.intValue();
  1990. logger.info("本次客户所得积分:" + integral);
  1991. break;
  1992. }
  1993. }
  1994. }
  1995. }
  1996. }
  1997. }
  1998. calculateIntegral.setIntegral(integral);
  1999. }
  2000. return calculateIntegral;
  2001. }
  2002. //插入用户积分信息或者更新用户积分信息
  2003. public CustomerPoints insertUserIntegral(CalculateIntegral calculateIntegral){
  2004. CustomerPoints customerPoints = new CustomerPoints();
  2005. customerPoints.setRecentlyPoints(calculateIntegral.getIntegral()); //用户当前所获得的积分
  2006. customerPoints.setStationId(calculateIntegral.getStationId()); //油站ID
  2007. if(StringUtils.isNotBlank(calculateIntegral.getIntegralRuleFlag()) && calculateIntegral.getIntegralRuleFlag().equals("1")){
  2008. customerPoints.setStationId(calculateIntegral.getGroupId());
  2009. }
  2010. customerPoints.setMinaOpenId(calculateIntegral.getOpenId()); //用户小程序ID
  2011. customerPoints.setCustomerName(calculateIntegral.getNickName());
  2012. if(calculateIntegral.getBlogOpenid() !=null){
  2013. customerPoints.setBlogOpenId(calculateIntegral.getBlogOpenid());
  2014. }
  2015. customerPoints.setUnionId(calculateIntegral.getUnionId()); //用户unionId
  2016. //获取客户积分信息
  2017. CustomerPoints customerPointsInfo = customerPointsService.getCustomerPointsInfoByUnionId(customerPoints);
  2018. if(customerPointsInfo !=null){
  2019. logger.info("当前存在客户:"+ customerPointsInfo.getMinaOpenId());
  2020. logger.info("当前客户原有剩余积分:"+ customerPointsInfo.getPoints().toString());
  2021. CustomerPointsRecord customerPointsRecord = new CustomerPointsRecord();
  2022. customerPointsRecord.setCreateTime(new Date());
  2023. customerPointsRecord.setCustomerName(calculateIntegral.getNickName());
  2024. customerPointsRecord.setStationName(calculateIntegral.getStationName());
  2025. customerPointsRecord.setStationId(calculateIntegral.getStationId());
  2026. customerPointsRecord.setRecordType("+");
  2027. customerPointsRecord.setUnionId(customerPointsInfo.getUnionId());
  2028. customerPointsRecord.setIntegral(calculateIntegral.getIntegral());
  2029. customerPointsRecord.setOrderNo(calculateIntegral.getOrderNo());
  2030. //插入客户记录表
  2031. customerPointsRecordService.insertCustomerPointsRecordInfo(customerPointsRecord);
  2032. //如果已存在客户则 客户余额积分= 当前客户已有积分 + 本次所得积分
  2033. BigDecimal surplusIntegral =new BigDecimal(customerPointsInfo.getPoints()).add(new BigDecimal(calculateIntegral.getIntegral()));
  2034. customerPoints.setPoints(surplusIntegral.intValue());
  2035. logger.info("本次加油后客户应有总积分:"+ customerPoints.getPoints().toString());
  2036. //用户已累积积分
  2037. BigDecimal add = new BigDecimal(customerPointsInfo.getAccumulatePoints()).add(new BigDecimal(calculateIntegral.getIntegral()));
  2038. customerPoints.setAccumulatePoints(add.intValue());
  2039. customerPoints.setRecentConsumptionDate(new Date());
  2040. //更新客户积分
  2041. customerPointsService.updateCustomerPointsInfo(customerPoints);
  2042. logger.info("更新客户积分信息成功!");
  2043. }else {
  2044. logger.info("当前系统不存在该客户积分信息");
  2045. CustomerPointsRecord customerPointsRecord = new CustomerPointsRecord();
  2046. customerPointsRecord.setCreateTime(new Date());
  2047. customerPointsRecord.setCustomerName(calculateIntegral.getNickName());
  2048. customerPointsRecord.setStationName(calculateIntegral.getStationName());
  2049. customerPointsRecord.setStationId(calculateIntegral.getStationId());
  2050. customerPointsRecord.setRecordType("+");
  2051. customerPointsRecord.setUnionId(calculateIntegral.getUnionId());
  2052. customerPointsRecord.setIntegral(calculateIntegral.getIntegral());
  2053. customerPointsRecord.setOrderNo(calculateIntegral.getOrderNo());
  2054. customerPointsRecordService.insertCustomerPointsRecordInfo(customerPointsRecord);
  2055. customerPoints.setUnionId(calculateIntegral.getUnionId());
  2056. customerPoints.setPoints(calculateIntegral.getIntegral());
  2057. customerPoints.setConsumptionPoints(0);
  2058. customerPoints.setMobilePhone(calculateIntegral.getMobilePhone());
  2059. customerPoints.setCustomerName(calculateIntegral.getNickName());
  2060. customerPoints.setStationName(calculateIntegral.getStationName());
  2061. customerPoints.setAccumulatePoints(calculateIntegral.getIntegral());
  2062. customerPoints.setInvalidPoints(0);
  2063. customerPoints.setRecentConsumptionDate(new Date());
  2064. customerPoints.setCreateTime(new Date());
  2065. //新增客户积分
  2066. customerPointsService.insertCustomerPointsInfo(customerPoints);
  2067. logger.info("新增客户积分信息成功!");
  2068. }
  2069. return customerPoints;
  2070. }
  2071. //公众号推送积分
  2072. public void pushIntegral(CustomerPoints customerPoints, CalculateIntegral calculateIntegral){
  2073. String gzhAppId ="";
  2074. String gzhAppSecret ="";
  2075. String stationName = ""; //油站名称
  2076. logger.info("客户小程序openId:" + customerPoints.getMinaOpenId());
  2077. logger.info("客户公众号openId:" + calculateIntegral.getBlogOpenid());
  2078. logger.info("客户所加油的油站ID:" + calculateIntegral.getStationId());
  2079. if(calculateIntegral.getStationId() !=null){
  2080. Map<String, String> m = stationService.getStationAppIdAndAppSecret(calculateIntegral.getStationId());
  2081. if(m !=null && m.containsKey("stationName") && m.containsKey("gzhAppId") && m.containsKey("gzhAppSecret")){
  2082. stationName = m.get("stationName");
  2083. gzhAppId = m.get("gzhAppId");
  2084. gzhAppSecret = m.get("gzhAppSecret");
  2085. }
  2086. //String blogOpenId = customerPoints.getBlogOpenId(); //公众号openId
  2087. if(calculateIntegral.getBlogOpenid() !=null){
  2088. //推送模板
  2089. List<WxMpTemplateData> wxMpTemplate = new ArrayList<>();
  2090. wxMpTemplate.add(new WxMpTemplateData("first","尊敬的"+calculateIntegral.getNickName()+",您好:\n" + "您在"+stationName+"的积分最新交易信息如下"));
  2091. wxMpTemplate.add(new WxMpTemplateData("time", new SimpleDateFormat("yyyy年MM月dd日HH时mm分").format(new Date())));
  2092. wxMpTemplate.add(new WxMpTemplateData("type", "增加"));
  2093. wxMpTemplate.add(new WxMpTemplateData("Point", String.valueOf(customerPoints.getRecentlyPoints())));
  2094. wxMpTemplate.add(new WxMpTemplateData("From", stationName));
  2095. wxMpTemplate.add(new WxMpTemplateData("remark",
  2096. "截止至" + new SimpleDateFormat(" yyyy年MM月dd日HH时mm分").format(new Date())+",您在"+stationName+"的可用积分为 "+customerPoints.getPoints().toString()+" 分"));
  2097. GzhNewsTemplate gzhNewsTemplate = new GzhNewsTemplate();
  2098. gzhNewsTemplate.setStationId(calculateIntegral.getStationId());
  2099. gzhNewsTemplate.setTemplateType("1");
  2100. GzhNewsTemplate gzhNewsTemplateInfo = gzhNewsTemplateService.getGzhNewsTemplate(gzhNewsTemplate);
  2101. if(gzhNewsTemplateInfo !=null && gzhNewsTemplateInfo.getTemplateId() !=null){
  2102. wxPushUtil.push(gzhAppId, gzhAppSecret, gzhNewsTemplateInfo.getTemplateId(), calculateIntegral.getBlogOpenid(), wxMpTemplate);
  2103. }
  2104. }
  2105. }
  2106. }
  2107. //支付宝扫码随行付支付
  2108. @RequestMapping(value = "/aliPayAmtToSxf", consumes = "application/json", method = RequestMethod.POST)
  2109. @ResponseBody
  2110. public String aliPayAmtToSxf(@RequestBody PayInfoRequest payInfoRequest){
  2111. Gson gson =new Gson();
  2112. //返回结果集
  2113. ResultData resultData = null;
  2114. if(StringUtils.isNotBlank(payInfoRequest.getOpenId()) && StringUtils.isNotBlank(payInfoRequest.getOrdNo())){
  2115. String openId = payInfoRequest.getOpenId(); //用户openId
  2116. String ordNo = payInfoRequest.getOrdNo();
  2117. try {
  2118. //根据订单号查询订单信息
  2119. PayOrder payOrder = payOrderService.selectOrderInfoByOrdNo(ordNo);
  2120. if(payOrder !=null){
  2121. if(payOrder.getStatus() !=null && payOrder.getStatus().equals("0")){
  2122. //将业务参数存放在 JSON 对象中
  2123. JSONObject reqData = new JSONObject();
  2124. reqData.put("ordNo", payOrder.getOrderNo()); //商户订单号
  2125. //reqData.put("subMechId", ""); //子商户号
  2126. reqData.put("amt", payOrder.getAmt()); //订单总金额
  2127. //reqData.put("amt", "0.01");
  2128. //reqData.put("discountAmt", ""); //参与优惠金额
  2129. //reqData.put("unDiscountAmt", ""); //不参与优惠金额
  2130. Map<String, String> stationAppIdAndAppSecret = stationService.getStationAppIdAndAppSecret(Integer.valueOf(payInfoRequest.getStationId()));
  2131. if(stationAppIdAndAppSecret !=null && stationAppIdAndAppSecret.containsKey("appId") && stationAppIdAndAppSecret.containsKey("mno")){
  2132. //reqData.put("subAppid", stationAppIdAndAppSecret.get("appId")); //支付宝小程序
  2133. //logger.info("支付子商户:"+ stationAppIdAndAppSecret.get("appId"));
  2134. reqData.put("mno", stationAppIdAndAppSecret.get("mno")); //商户编号 stationAppIdAndAppSecret.get("mno")
  2135. logger.info("商户编号:"+ stationAppIdAndAppSecret.get("mno"));
  2136. reqData.put("payType", "ALIPAY"); //支付渠道 WECHAT:微信;ALIPAY:支付宝;UNIONPAY:银联
  2137. reqData.put("payWay", "02"); //支付方式 02 微信公众号/支付宝服务窗/银联js支付/支付宝小程序 03 微信小程序
  2138. reqData.put("userId", openId); //用户号 微信:openid; 支付宝:userid;银联:userid;微信&支付宝必传,银联js为非必传
  2139. //reqData.put("timeExpire", "10"); //订单失效时间, 以分钟为单位
  2140. //reqData.put("limitPay", "00"); //限制卡类型: 00-全部 01-限定不能使 用信用卡支付 默认值 00
  2141. reqData.put("subject", payOrder.getOilName() + " - " +payOrder.getStationName()); //订单标题
  2142. //reqData.put("hbFqNum", "6"); //花呗分期数,仅可上送 6 或 12
  2143. reqData.put("tradeSource", "01"); //交易来源 01服务商,02收银台,03硬件
  2144. reqData.put("trmIp", "172.16.2.1");//商家ip地址
  2145. // reqData.put("customerIp", ""); //持卡人ip地址,银联js支付时必传
  2146. //reqData.put("outFrontUrl", ""); //js 支付,前台 成功通知地址
  2147. reqData.put("outFrontFailUrl", ""); //js 支付,前台 事变通知地址
  2148. //globalPrefix
  2149. String notifyUrl = "https://"+domainName+"/"+globalPrefix+"/getAliPayCallback";
  2150. logger.info("随行付调用回调地址:" + notifyUrl);
  2151. //reqData.put("notifyUrl", "https://www.huijy.net/api/getCallback"); //回调地址
  2152. reqData.put("notifyUrl", notifyUrl); //回调地址
  2153. //reqData.put("needReceipt", "00"); //电子发票功能 微信开具电子 发票使用
  2154. //reqData.put("ledgerAccountFlag", "00"); //是否做分账 分账交易使 用;00:做; 01:不做;不传默认为不做分账
  2155. //reqData.put("ledgerAccountEffectTime", "00"); //分账有效时间 单位为天;是 否做分账选择 00 时该字段必传
  2156. // reqData.put("ruleId", "00"); //同 步 分 账 规 则 id
  2157. // reqData.put("fusruleId", "00"); //同步分账规则
  2158. //reqData.put("ylTrmNo", ""); //银联终端号
  2159. //reqData.put("terminalId", ""); //TQ机具编号
  2160. //reqData.put("deviceNo ", "1111"); //设备号
  2161. // reqData.put("identityFlag", ""); //是否是实名支付
  2162. // reqData.put("buyerIdType", "IDCARD"); //证件类型
  2163. // reqData.put("buyerIdNo", "410523198701054018"); //证件号
  2164. // reqData.put("buyerName", "张三"); //买家姓名
  2165. // reqData.put("mobileNum", ""); //手机号
  2166. // reqData.put("extend", ""); //备用
  2167. String req= SXFPaySign.getSXFPay(reqData);
  2168. logger.debug("参数信息:"+req);
  2169. System.out.println("req:" + req);
  2170. //此处不要改变reqData里面值的顺序用LinkedHashMap
  2171. HashMap reqMap = JSON.parseObject(req, LinkedHashMap.class, Feature.OrderedField);
  2172. //组装加密串
  2173. String signContent = RSASignature.getOrderContent(reqMap);
  2174. System.out.println("拼接后的参数:" + signContent);
  2175. logger.debug("拼接后的参数:"+signContent);
  2176. //sign
  2177. String sign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  2178. System.out.println("============签名:" + sign);
  2179. reqMap.put("sign", sign);
  2180. String reqStr = JSON.toJSONString(reqMap);
  2181. System.out.println("请求参数:" + reqMap);
  2182. System.out.println("请求参数:" + reqStr);
  2183. //调用第三方接口地址
  2184. //String url = "https://openapi-test.tianquetech.com/order/jsapiScan";//测试地址
  2185. String url = "https://openapi.suixingpay.com/order/jsapiScan";//生产地址
  2186. String resultJson = HttpUtils.connectPostUrl(url, reqStr);
  2187. System.out.println("返回信息:" + resultJson);
  2188. // logger.debug("返回信息:"+resultJson);
  2189. //不要对reqData排序 所以用LinkedHashMap
  2190. HashMap<String, Object> result = JSON.parseObject(resultJson, LinkedHashMap.class, Feature.OrderedField);
  2191. if ("0000".equals(result.get("code"))) {
  2192. //验签
  2193. String signResult = result.get("sign").toString();
  2194. result.remove("sign");
  2195. String resultStr = RSASignature.getOrderContent(result);
  2196. System.out.println("resultStr: " + resultStr);
  2197. //sign
  2198. String resultSign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  2199. System.out.println("resultSign: " + resultSign);
  2200. //组装加密串
  2201. if (RSASignature.doCheck(resultStr, signResult, SXFPaySign.sxfPublic)) {
  2202. System.out.println("===================验签成功==============");
  2203. }
  2204. }
  2205. resultData=ResultData.success(result);
  2206. }else {
  2207. resultData = ResultData.error(CodeMsg.STATION_NULL_INFO);
  2208. }
  2209. }else {
  2210. resultData=ResultData.error(CodeMsg.ALREADY_PAY);
  2211. }
  2212. }else {
  2213. resultData=ResultData.error(CodeMsg.YEWU_FAIL,"未查询到订单");
  2214. }
  2215. }catch (Exception e){
  2216. resultData=ResultData.error(CodeMsg.YEWU_FAIL,"订单支付失败");
  2217. e.printStackTrace();
  2218. }
  2219. }else {
  2220. resultData = ResultData.error(CodeMsg.PARAMS_NUll);
  2221. }
  2222. return gson.toJson(resultData);
  2223. }
  2224. /**
  2225. * 异步回调通知
  2226. */
  2227. @RequestMapping(value = "/getAliPayCallback", consumes = "application/json", method = RequestMethod.POST)
  2228. @ResponseBody
  2229. @Transactional
  2230. public JSONObject getAliPayCallback(@RequestBody JSONObject request) throws ParseException {
  2231. logger.info("-------------------------------支付宝回调开始----------------------------------------------");
  2232. logger.info("支付宝回调返回过来的参数"+request);
  2233. // logger.info("ordNo信息:" + request.get("ordNo").toString());
  2234. // logger.info("sign信息:" + request.get("sign").toString());
  2235. Gson gson =new Gson();
  2236. String sxfUuid=request.get("sxfUuid").toString(); //随行付落单号
  2237. String payWay=request.get("payWay").toString(); //随行付交易方式
  2238. String payTime=request.get("payTime").toString(); //随行付交易时间
  2239. String uuid=request.get("uuid").toString(); //随行付交易流水号
  2240. String mno=request.get("mno").toString();//发起交易的商户编号
  2241. String ordNo=request.get("ordNo").toString();//商户生成的订单号
  2242. String amt=request.get("amt").toString();//金额
  2243. String buyerId=request.get("buyerId").toString();//用户登录
  2244. String transactionId=request.get("transactionId").toString();
  2245. String drType=request.get("drType").toString();//借贷记标识 1-借,2-贷,3-其他
  2246. String payType=request.get("payType").toString();//对订单的描述,取值范围:WECHAT:微信,ALIPAY:支付宝,UNIONPAY:
  2247. String pointAmount=request.get("pointAmount").toString();//代金券金额
  2248. String totalOffstAmt=request.get("totalOffstAmt").toString();//消 费 者 付 款金额
  2249. String settleAmt=request.get("settleAmt").toString();//商家入账金额
  2250. String timeStamp=request.get("timeStamp").toString();//响应时间
  2251. String sign=request.get("sign").toString();//签名
  2252. String bizCode=request.get("bizCode").toString();//业务返回码
  2253. String bizMsg=request.get("bizMsg").toString();//业 务 返 回 信息
  2254. String openid=request.get("openid").toString();//微 信 或 支 付宝身份id()opendid userid
  2255. String channelId=request.get("channelId").toString();//渠道商户号
  2256. String subMechId=request.get("subMechId").toString();//子商户号
  2257. String finishTime=request.get("finishTime").toString();//交易完成时间
  2258. String clearDt=request.get("clearDt").toString();
  2259. String settlementBatchNo=request.get("settlementBatchNo").toString();
  2260. //String origOrdNo=request.get("origOrdNo").toString();//反交易退款异步通知
  2261. //String origUuid=request.get("origUuid").toString();//token
  2262. //String scene=request.get("scene").toString();//用户登录
  2263. //String buyerAccount=request.get("buyerAccount").toString();//
  2264. //String realRefundAmount=request.get("realRefundAmount").toString();//商家出账金额
  2265. //String recFeeAmt=request.get("recFeeAmt").toString();//交易手续费
  2266. //String recFeeRate=request.get("recFeeRate").toString();//交易手续费率
  2267. //String refBuyerAmt=request.get("refBuyerAmt").toString();//消 费 者 到 账金额
  2268. //String extend = extend=request.get("extend").toString();//备用
  2269. //将业务参数存放在 JSON 对象中
  2270. JSONObject reqData = new JSONObject();
  2271. if(request.containsKey("payBank") && request.get("payBank") !=null){
  2272. String payBank=request.get("payBank").toString();//付款银行银行编码,例如 ICBC
  2273. reqData.put("payBank", payBank);
  2274. }
  2275. //支付场景
  2276. if(request.containsKey("scene") && request.get("scene") !=null){
  2277. String scene = request.get("scene").toString();
  2278. reqData.put("scene", scene);
  2279. }
  2280. //消 费 者 到 账金额
  2281. if(request.containsKey("refBuyerAmt") && request.get("refBuyerAmt") !=null){
  2282. String refBuyerAmt = request.get("refBuyerAmt").toString();
  2283. reqData.put("refBuyerAmt", refBuyerAmt);
  2284. }
  2285. //buyerAccount 支付宝买家登录账号 掩码;示例:135***1234
  2286. if(request.containsKey("buyerAccount") && request.get("buyerAccount") !=null){
  2287. String buyerAccount = request.get("buyerAccount").toString();
  2288. reqData.put("buyerAccount", buyerAccount);
  2289. }
  2290. //备用
  2291. if(request.containsKey("extend") && request.get("extend") !=null){
  2292. String extend = request.get("extend").toString();
  2293. reqData.put("extend", extend);
  2294. }
  2295. //优惠券参数
  2296. if(request.containsKey("promotionDetail") && request.get("promotionDetail") !=null){
  2297. String promotionDetail = request.get("promotionDetail").toString();
  2298. reqData.put("promotionDetail", promotionDetail);
  2299. }
  2300. //商家出账金额
  2301. if(request.containsKey("realRefundAmount") && request.get("realRefundAmount") !=null){
  2302. String realRefundAmount = request.get("realRefundAmount").toString();
  2303. reqData.put("realRefundAmount", realRefundAmount);
  2304. }
  2305. //szltFlag
  2306. if(request.containsKey("szltFlag") && request.get("szltFlag") !=null){
  2307. String szltFlag = request.get("szltFlag").toString();
  2308. reqData.put("szltFlag", szltFlag);
  2309. }
  2310. //recFeeAmt
  2311. if(request.containsKey("recFeeAmt") && request.get("recFeeAmt") !=null){
  2312. String recFeeAmt = request.get("recFeeAmt").toString();
  2313. reqData.put("recFeeAmt", recFeeAmt);
  2314. }
  2315. //szltRecfeeAmt
  2316. if(request.containsKey("szltRecfeeAmt") && request.get("szltRecfeeAmt") !=null){
  2317. String szltRecfeeAmt = request.get("szltRecfeeAmt").toString();
  2318. reqData.put("szltRecfeeAmt", szltRecfeeAmt);
  2319. }
  2320. reqData.put("sxfUuid",sxfUuid);
  2321. reqData.put("payWay",payWay);
  2322. reqData.put("payTime",payTime);
  2323. reqData.put("uuid",uuid);
  2324. reqData.put("mno",mno);
  2325. reqData.put("ordNo",ordNo);
  2326. reqData.put("amt",amt);
  2327. reqData.put("buyerId",buyerId);
  2328. reqData.put("transactionId",transactionId);
  2329. reqData.put("drType",drType);
  2330. reqData.put("payType",payType);
  2331. //reqData.put("payBank",payBank);
  2332. reqData.put("pointAmount",pointAmount);
  2333. reqData.put("totalOffstAmt",totalOffstAmt);
  2334. reqData.put("settleAmt",settleAmt);
  2335. reqData.put("timeStamp",timeStamp);
  2336. reqData.put("bizCode",bizCode);
  2337. reqData.put("bizMsg",bizMsg);
  2338. reqData.put("openid",openid);
  2339. reqData.put("channelId",channelId);
  2340. reqData.put("subMechId",subMechId);
  2341. reqData.put("finishTime",finishTime);
  2342. reqData.put("clearDt",clearDt);
  2343. reqData.put("settlementBatchNo",settlementBatchNo);
  2344. //reqData.put("realRefundAmount",realRefundAmount);
  2345. //reqData.put("recFeeAmt",recFeeAmt);
  2346. //reqData.put("recFeeRate",recFeeRate);
  2347. //reqData.put("buyerAccount",buyerAccount);
  2348. //reqData.put("origOrdNo",origOrdNo);
  2349. //reqData.put("origUuid",origUuid);
  2350. //reqData.put("scene",scene);
  2351. //reqData.put("refBuyerAmt",refBuyerAmt);
  2352. //reqData.put("extend",extend);
  2353. //根据回调信息,先进行验签,验签后修改状态
  2354. logger.info("打印参数信息"+gson.toJson(reqData));
  2355. //不要对reqData排序 所以用LinkedHashMap
  2356. HashMap<String, Object> result = JSON.parseObject(gson.toJson(reqData), LinkedHashMap.class, Feature.OrderedField);
  2357. //验签
  2358. String resultStr = RSASignature.getOrderContent(result);
  2359. JSONObject req = new JSONObject();
  2360. System.out.println(resultStr);
  2361. if (RSASignature.doCheck(resultStr, sign, SXFPaySign.sxfPublic)) {
  2362. req.put("code","success");
  2363. req.put("msg","成功");
  2364. logger.info("验签成功");
  2365. //验签成功,修改订单状态
  2366. List<PayOrder> list = payOrderService.getPayOrderList(ordNo);
  2367. //logger.info("根据订单号,查询订单"+gson.toJson(list));
  2368. if (list != null && list.size() == 1) {
  2369. String status = list.get(0).getStatus();
  2370. //状态为未支付 0 修改状态为1已支付
  2371. if (status.equals("0")) {
  2372. PayOrder payOrder = new PayOrder();
  2373. payOrder.setOrderNo(ordNo);
  2374. payOrder.setStatus("1");
  2375. if(payType.equals("WECHAT")){ //WECHAT:微信,ALIPAY:支付宝,UNIONPAY:
  2376. payOrder.setPayType("wx");
  2377. }else if(payType.equals("ALIPAY")){
  2378. payOrder.setPayType("zfb");
  2379. }
  2380. payOrder.setAmt(Double.valueOf(amt));
  2381. payOrder.setDzkAmt(Double.valueOf("0"));
  2382. payOrder.setPayDate(new Timestamp(new Date().getTime())); //支付时间
  2383. payOrder.setReceivedAmt(Double.valueOf(settleAmt)); //settleAmt商家入账金额
  2384. //修改订单状态
  2385. int count = payOrderService.getUpdatePayOrder(payOrder);
  2386. if(count == 1){
  2387. //将用户消费的信息插入顾客表: 以手机号 油品名称 油站id为条件插入且存入 加油升数、实收金额、油站名称 根据订单号查询用户手机号
  2388. Map<String, Object> infoMap = payOrderService.getOrderInfoAndUserInfoByOrderNo(payOrder); //获取该订单手机号、加油升数、实收金额、油站名称
  2389. //logger.info("根据订单查询用户手机号等订单信息"+ infoMap.toString());
  2390. //手机号必须有
  2391. //if(infoMap != null && infoMap.containsKey("mobilePhone") && infoMap.get("mobilePhone") !=null ){
  2392. int integral =0;
  2393. StationInfo stationInfo = new StationInfo();
  2394. stationInfo.setStationId(Integer.valueOf(infoMap.get("stationId").toString()));
  2395. StationInfo stationInfos = stationService.selectStationInfo(stationInfo);
  2396. if(stationInfos.getIsLngFlagGroup() !=null && stationInfos.getIsLngFlagGroup().equals("1")){
  2397. //等于1表示次要业务:LNG集团平台加气(可能会出现); 插入油站余额记录
  2398. StationBalanceChange stationBalanceChange = new StationBalanceChange();
  2399. stationBalanceChange.setStationId(stationInfos.getStationId());
  2400. stationBalanceChange.setAmt(Double.valueOf(infoMap.get("sellAmt").toString()));
  2401. stationBalanceChange.setCreateTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(infoMap.get("payDate").toString()));
  2402. stationBalanceChange.setType("-");
  2403. stationBalanceChange.setOrderNo(ordNo);
  2404. stationBalanceChange.setNowAmt(stationInfos.getBalance());
  2405. //生成记录
  2406. payOrderService.insertStationBalanceExchange(stationBalanceChange);
  2407. StationInfo s = new StationInfo();
  2408. BigDecimal subtract = new BigDecimal(String.valueOf(stationInfos.getBalance())).subtract(new BigDecimal(infoMap.get("sellAmt").toString()));
  2409. s.setBalance(subtract.doubleValue());
  2410. s.setStationId(stationInfos.getStationId());
  2411. //更新油站余额
  2412. stationService.updateStationBalance(s);
  2413. logger.info("LNG加气平台支付更新余额完成!");
  2414. }
  2415. //获取油枪绑定的POS机信息
  2416. StationDeviceManager stationDeviceManager = new StationDeviceManager();
  2417. stationDeviceManager.setGunNo(infoMap.get("oilGun").toString());
  2418. stationDeviceManager.setStationId(Integer.valueOf(infoMap.get("stationId").toString()));
  2419. List<StationDeviceManager> stationDeviceManagerList = stationService.getStationDeviceManagerList(stationDeviceManager);
  2420. if(stationDeviceManagerList !=null && stationDeviceManagerList.size() >0){
  2421. if(stationDeviceManagerList.get(0).getDeviceType() !=null && stationDeviceManagerList.get(0).getDeviceType() !=""){
  2422. switch (stationDeviceManagerList.get(0).getDeviceType()){
  2423. case "1":
  2424. logger.info("小票机打印方式");
  2425. infoMap.put("sn", stationDeviceManagerList.get(0).getDeviceNo());
  2426. infoMap.put("printSetting", stationInfos.getPrintSetting());
  2427. infoMap.put("isLngFlagGroup", stationInfos.getIsLngFlagGroup());
  2428. this.printReceipt(infoMap);
  2429. break;
  2430. case "2":
  2431. logger.info("POS机打印方式");
  2432. payOrder.setIntegral(String.valueOf(integral));
  2433. payOrder.setPrintSetting(stationInfos.getPrintSetting());
  2434. payOrder.setIsLngFlagGroup(stationInfos.getIsLngFlagGroup());
  2435. if(stationInfos.getIsLngFlagGroup() !=null && stationInfos.getIsLngFlagGroup().equals("1")){
  2436. payOrder.setSellAmt(Double.valueOf(infoMap.get("sellAmt").toString()));
  2437. }
  2438. if(stationDeviceManagerList.get(0).getPosFanoutExchange() !=null && stationDeviceManagerList.get(0).getPosQueue() !=null){
  2439. logger.info("POS设备交换机信息:" + stationDeviceManagerList.get(0).getPosFanoutExchange());
  2440. payOrder.setPosFanoutExchange(stationDeviceManagerList.get(0).getPosFanoutExchange());
  2441. payOrder.setPosQueue(stationDeviceManagerList.get(0).getPosQueue());
  2442. payOrder.setDeviceNo(stationDeviceManagerList.get(0).getDeviceNo());
  2443. this.posPrintReceipt(payOrder);
  2444. }
  2445. break;
  2446. }
  2447. }
  2448. }
  2449. // }else{
  2450. // logger.info("该用户无手机号!");
  2451. // }
  2452. }else {
  2453. logger.info("更新订单状态失败!");
  2454. }
  2455. }
  2456. }else {
  2457. logger.info("该订单不存在!");
  2458. }
  2459. }else {
  2460. logger.info("验签失败");
  2461. req.put("code","fail");
  2462. req.put("msg","失败");
  2463. }
  2464. logger.info("返回随行付参数信息:"+req.toString());
  2465. return req;
  2466. }
  2467. @RequestMapping(value = "/posPrintReceiptCeshi", consumes = "application/json", method = RequestMethod.POST)
  2468. @ResponseBody
  2469. public String posPrintReceiptCeshi(@RequestBody PayOrder payOrder){
  2470. Gson gson =new Gson();
  2471. //返回结果集
  2472. ResultData resultData = null;
  2473. Map<String, Object> infoMap = payOrderService.getOrderInfoAndUserInfoByOrderNo(payOrder);
  2474. Map<String, Object> m = new HashMap<>();
  2475. if(payOrder.getTransactionId() !=null){
  2476. m.put("transactionId", payOrder.getTransactionId());
  2477. }
  2478. if(payOrder.getIntegral() !=null){
  2479. m.put("integral", payOrder.getIntegral());
  2480. }
  2481. if(infoMap !=null && infoMap.containsKey("orderNo") && infoMap.get("orderNo") !=null){
  2482. m.put("orderNo", infoMap.get("orderNo").toString());
  2483. }
  2484. if(infoMap !=null && infoMap.containsKey("amt") && infoMap.get("amt") !=null){
  2485. m.put("amt", infoMap.get("amt").toString());
  2486. }
  2487. if(infoMap !=null && infoMap.containsKey("receivableAmt") && infoMap.get("receivableAmt") !=null){
  2488. m.put("receivableAmt", infoMap.get("receivableAmt").toString());
  2489. }
  2490. if(infoMap !=null && infoMap.containsKey("discountAmt") && infoMap.get("discountAmt") !=null){
  2491. m.put("discountAmt", infoMap.get("discountAmt").toString());
  2492. }
  2493. if(infoMap !=null && infoMap.containsKey("oilName") && infoMap.get("oilName") !=null){
  2494. m.put("oilName", infoMap.get("oilName").toString());
  2495. }
  2496. if(infoMap !=null && infoMap.containsKey("oilGun") && infoMap.get("oilGun") !=null){
  2497. m.put("oilGun", infoMap.get("oilGun").toString());
  2498. }
  2499. if(infoMap !=null && infoMap.containsKey("createdDate") && infoMap.get("createdDate") !=null){
  2500. //格式化日期
  2501. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  2502. String createdDate = sdf.format(infoMap.get("createdDate"));
  2503. m.put("createdDate", createdDate);
  2504. }
  2505. if(infoMap !=null && infoMap.containsKey("payDate") && infoMap.get("payDate") !=null){
  2506. //格式化日期
  2507. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  2508. String payDate = sdf.format(infoMap.get("payDate"));
  2509. m.put("payDate", payDate);
  2510. }
  2511. if(infoMap !=null && infoMap.containsKey("payType") && infoMap.get("payType") !=null){
  2512. String payType = "";
  2513. if(infoMap.get("payType").equals("wx")){
  2514. payType ="微信";
  2515. }
  2516. if(infoMap.get("payType").equals("dzk")){
  2517. payType ="电子卡";
  2518. }
  2519. m.put("payType", payType);
  2520. }
  2521. if(infoMap !=null && infoMap.containsKey("mobilePhone") && infoMap.get("mobilePhone") !=null){
  2522. String phone =infoMap.get("mobilePhone")+"";
  2523. //手机号中间四位****代替
  2524. phone = phone.substring(0, 3) + "****" + phone.substring(7, phone.length());
  2525. m.put("mobilePhone", phone);
  2526. }
  2527. if(infoMap !=null && infoMap.containsKey("orderLiters") && infoMap.get("orderLiters") !=null){
  2528. m.put("orderLiters", infoMap.get("orderLiters").toString());
  2529. }
  2530. if(infoMap !=null && infoMap.containsKey("stationName") && infoMap.get("stationName") !=null){
  2531. m.put("stationName", infoMap.get("stationName").toString());
  2532. }
  2533. if(infoMap !=null && infoMap.containsKey("oilPirce") && infoMap.get("oilPirce") !=null){
  2534. m.put("oilPirce", infoMap.get("oilPirce").toString());
  2535. }
  2536. if(infoMap !=null && infoMap.containsKey("stationId") && infoMap.get("stationId") !=null){
  2537. m.put("stationId", infoMap.get("stationId").toString());
  2538. }
  2539. // if(infoMap !=null && infoMap.containsKey("orderType") && infoMap.get("orderType") !=null){
  2540. // m.put("orderType", infoMap.get("orderType").toString());
  2541. // }
  2542. if(infoMap !=null && infoMap.containsKey("oilType") && infoMap.get("oilType") !=null){
  2543. if(infoMap.get("oilType").equals("3")){
  2544. m.put("orderType", "noOil");
  2545. }else {
  2546. m.put("orderType", "oil");
  2547. }
  2548. }
  2549. logger.info("要推送的订单的信息:" +m.toString());
  2550. //定义推送格式
  2551. Map<String, Object> params = new HashMap<>();
  2552. params.put("messageTitle", "pos");
  2553. params.put("messageType", "sys");
  2554. //获取油枪绑定的POS机信息
  2555. StationDeviceManager stationDeviceManager = new StationDeviceManager();
  2556. stationDeviceManager.setDeviceType("2");
  2557. stationDeviceManager.setStationId(Integer.valueOf(infoMap.get("stationId").toString()));
  2558. stationDeviceManager.setGunNo(infoMap.get("oilGun").toString());
  2559. StationDeviceManager stationDeviceManagerInfo = stationService.getStationDeviceManager(stationDeviceManager);
  2560. if(stationDeviceManagerInfo !=null && stationDeviceManagerInfo.getPosFanoutExchange() !=null && stationDeviceManagerInfo.getPosQueue() !=null){
  2561. params.put("posFanoutExchange", stationDeviceManagerInfo.getPosFanoutExchange());
  2562. params.put("posQueue", stationDeviceManagerInfo.getPosQueue());
  2563. params.put("tusn", stationDeviceManagerInfo.getDeviceNo());
  2564. params.put("printSetting", payOrder.getPrintSetting()); //小票打印方式
  2565. List<Map<String, Object>> list = new ArrayList<>();
  2566. list.add(m);
  2567. Map<String, Object> map = new HashMap<>();
  2568. map.put("contentData", list);
  2569. params.put("messageContent", map);
  2570. logger.info("开始推送消息:" +JSONObject.toJSONString(params));
  2571. String resultString = PosPrinterUtil.sendPosPrintDirectMessage(params);
  2572. JSONObject jsonObject = JSONObject.parseObject(resultString);
  2573. if(jsonObject.containsKey("code") && jsonObject.get("code").toString().equals("200")){
  2574. //如果打印成功 添加小票数量
  2575. PayOrder p = new PayOrder();
  2576. p.setPrintCount(1);
  2577. p.setOrderNo(infoMap.get("orderNo").toString());
  2578. payOrderService.getUpdatePayOrder(p);
  2579. }
  2580. }
  2581. return gson.toJson(resultData);
  2582. }
  2583. }