PayController.java 54 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865
  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.param.request.*;
  7. import com.platform.yijia.pojo.*;
  8. import com.platform.yijia.service.*;
  9. import com.platform.yijia.utils.*;
  10. import org.apache.commons.lang3.StringUtils;
  11. import org.slf4j.Logger;
  12. import org.slf4j.LoggerFactory;
  13. import org.springframework.stereotype.Controller;
  14. import org.springframework.web.bind.annotation.*;
  15. import javax.annotation.Resource;
  16. import java.math.BigDecimal;
  17. import java.math.RoundingMode;
  18. import java.text.ParseException;
  19. import java.text.SimpleDateFormat;
  20. import java.util.*;
  21. @Controller
  22. @RequestMapping("/api")
  23. public class PayController {
  24. private static Logger logger =(Logger) LoggerFactory.getLogger(PayController.class);
  25. @Resource
  26. private PayOrderService payOrderService;
  27. @Resource
  28. private AppUserInfoService appUserInfoService;
  29. @Resource
  30. private StationOilGunService stationOilGunService;
  31. @Resource
  32. private CustomerGradeServices customerGradeServices;
  33. @Resource
  34. private StationService stationService;
  35. @Resource
  36. private CustomerPointsService customerPointsService;
  37. @Resource
  38. private IntegralRuleService integralRuleService;
  39. /***
  40. * 微信子商户支付接口
  41. * @param weChatPaySetRequest
  42. * @return
  43. */
  44. @RequestMapping(value = "/weChatPaySet", consumes = "application/json", method = RequestMethod.POST)
  45. @ResponseBody
  46. public String weChatPaySet(@RequestBody WeChatPaySetRequest weChatPaySetRequest){
  47. Gson gson = new Gson();
  48. ResultData resultData = null; //返回结果
  49. try {
  50. String type = weChatPaySetRequest.getType(); //获取配置类型
  51. JSONObject reqData = new JSONObject(); //微信子商户支付参数配置
  52. reqData.put("mno", weChatPaySetRequest.getMno()); //商编
  53. reqData.put("subMchIdsubMchId", weChatPaySetRequest.getSubMchIdsubMchId()); //获取微信子商号
  54. if(type != null && type !=""){
  55. reqData.put("type", type);
  56. //根据类型设置必传参数
  57. switch (type){
  58. case "01": //支付Appid
  59. reqData.put("accountType", weChatPaySetRequest.getAccountType()); // 支付Appid类型 配置类型为01时必传
  60. reqData.put("subAppid", weChatPaySetRequest.getSubAppid()); // 支付Appid 配置类型为01,02时必传
  61. break;
  62. case "02": //关注Appid
  63. reqData.put("subAppid", weChatPaySetRequest.getSubAppid()); // 支付Appid 配置类型为01,02时必传
  64. reqData.put("subscribeAppid", weChatPaySetRequest.getSubscribeAppid()); // 推荐关注公众号Appid 配置类型为02时与推荐关注 小程序Appid二选一
  65. reqData.put("receiptAppid", weChatPaySetRequest.getReceiptAppid()); // 推荐关注小程序Appid 配置类型为02时与推荐关注 公众号Appid二选一
  66. break;
  67. case "03": //jsapi授权目录
  68. reqData.put("jsapiPath", weChatPaySetRequest.getJsapiPath()); // jsapi授权目录 配置类型为03时必传
  69. break;
  70. }
  71. }
  72. String sxfPay = SXFPaySign.getSXFPay(reqData); //封装传参信息,增加公共信息,增加业务信息
  73. logger.debug("参数信息:"+ sxfPay);
  74. System.out.println("req:" + sxfPay);
  75. //此处不要改变reqData里面值的顺序用LinkedHashMap
  76. HashMap reqMap = JSON.parseObject(sxfPay, LinkedHashMap.class, Feature.OrderedField);
  77. //组装加密串
  78. String signContent = RSASignature.getOrderContent(reqMap);
  79. System.out.println("拼接后的参数:" + signContent);
  80. logger.debug("拼接后的参数:"+signContent);
  81. //sign
  82. String sign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  83. reqMap.put("sign", sign);
  84. String reqStr = JSON.toJSONString(reqMap);
  85. System.out.println("请求参数:" + reqMap);
  86. System.out.println("请求参数:" + reqStr);
  87. //String url = "https://openapi-test.tianquetech.com/merchant/weChatPaySet/addConf"; //测试环境
  88. String url = "https://openapi.tianquetech.com/merchant/weChatPaySet/addConf"; //生产环境
  89. //访问第三方接口
  90. String resultJson = HttpUtils.connectPostUrl(url, reqStr);
  91. System.out.println("返回信息:" + resultJson);
  92. // logger.debug("返回信息:"+resultJson);
  93. //不要对reqData排序 所以用LinkedHashMap
  94. HashMap<String, Object> result = JSON.parseObject(resultJson, LinkedHashMap.class, Feature.OrderedField);
  95. if ("0000".equals(result.get("code"))) {
  96. //验签
  97. String signResult = result.get("sign").toString();
  98. result.remove("sign");
  99. String resultStr = RSASignature.getOrderContent(result);
  100. System.out.println(resultStr);
  101. //sign
  102. String resultSign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  103. System.out.println("resultSign:" + resultSign);
  104. //组装加密串
  105. if (RSASignature.doCheck(resultStr, signResult, SXFPaySign.sxfPublic)) {
  106. System.out.println("===================验签成功==============");
  107. }
  108. }
  109. resultData=ResultData.success(result);
  110. } catch (Exception e) {
  111. resultData=ResultData.error(CodeMsg.YEWU_FAIL,"支付失败");
  112. e.printStackTrace();
  113. }
  114. return gson.toJson(resultData);
  115. }
  116. /**
  117. * 支付接口,前台上传支付信息,支付数据落地生产订单,调用随行付支付接口
  118. * @param
  119. * @return
  120. */
  121. @RequestMapping(value = "/getJhPayInfo", consumes = "application/json", method = RequestMethod.POST)
  122. @ResponseBody
  123. public String getJhPayInfo(@RequestBody PayInfoRequest payInfoRequest){
  124. Gson gson =new Gson();
  125. ResultData resultData =null;
  126. //String token=payInfoRequest.getToken();//token
  127. String openId = payInfoRequest.getOpenId(); //用户openId
  128. String userType=payInfoRequest.getUserType();//用户登录类型 1 公众号。2 小程序
  129. //String mno=payInfoRequest.getMno();//获取商户号
  130. Integer orderId =payInfoRequest.getOrderId();
  131. //根据token 和登录类型 身份验证
  132. AppUserInfo appUserInfo =new AppUserInfo();
  133. //订单类型 是小程序还是公众号
  134. appUserInfo.setUserType(userType);
  135. if(userType.equals("1")){
  136. //1 是公众号
  137. appUserInfo.setBlogOpenid(openId);
  138. }else if(userType.equals("2")){
  139. //2是小程序
  140. appUserInfo.setMinaOpenid(openId);
  141. }
  142. List<AppUserInfo> appUserInfoList =appUserInfoService.Authentication(appUserInfo);
  143. if(appUserInfoList!=null&&appUserInfoList.size()==1){
  144. //调用聚合支付
  145. try{
  146. //根据订单号查询订单信息
  147. PayOrder payOrder=payOrderService.searchPayOrder(orderId);
  148. if(payOrder!=null){
  149. //将业务参数存放在 JSON 对象中
  150. JSONObject reqData = new JSONObject();
  151. reqData.put("ordNo", payOrder.getOrderNo()); //商户订单号
  152. //reqData.put("subMechId", ""); //子商户号
  153. reqData.put("amt", payOrder.getAmt()); //订单总金额
  154. //reqData.put("amt", "0.01");
  155. //reqData.put("discountAmt", ""); //参与优惠金额
  156. //reqData.put("unDiscountAmt", ""); //不参与优惠金额
  157. reqData.put("payType", "WECHAT"); //支付渠道
  158. Map<String, String> stationAppIdAndAppSecret = stationService.getStationAppIdAndAppSecret(Integer.valueOf(payInfoRequest.getStationId()));
  159. if(stationAppIdAndAppSecret !=null && stationAppIdAndAppSecret.containsKey("appId") && stationAppIdAndAppSecret.containsKey("mno")){
  160. if(userType.equals("1")){
  161. reqData.put("subAppid", stationAppIdAndAppSecret.get("gzhAppId")); //微信公众号
  162. logger.info("支付子商户:"+ stationAppIdAndAppSecret.get("gzhAppId"));
  163. }else if(userType.equals("2")){
  164. reqData.put("subAppid", stationAppIdAndAppSecret.get("appId")); //微信小程序
  165. logger.info("支付子商户:"+ stationAppIdAndAppSecret.get("appId"));
  166. }
  167. reqData.put("mno", stationAppIdAndAppSecret.get("mno")); //商户编号
  168. logger.info("商户编号:"+ stationAppIdAndAppSecret.get("mno"));
  169. }
  170. if(userType.equals("1")){
  171. //1 是公众号
  172. reqData.put("payWay", "02"); //支付方式 02 公众号/服 务窗/js支付 03 小程序
  173. reqData.put("userId", appUserInfoList.get(0).getBlogOpenid()); //用户号 微信:openid; 支付宝:userid;银联:userid;微信&支付宝必传,银联js为非必传
  174. }else if(userType.equals("2")){
  175. //2是小程序
  176. reqData.put("payWay", "03"); //支付方式 02 公众号/服 务窗/js支付 03 小程序
  177. reqData.put("userId", appUserInfoList.get(0).getMinaOpenid()); //用户号 微信:openid; 支付宝:userid;银联:userid;微信&支付宝必传,银联js为非必传
  178. }
  179. //reqData.put("timeExpire", "10"); //订单失效时间, 以分钟为单位
  180. //reqData.put("limitPay", "00"); //限制卡类型: 00-全部 01-限定不能使 用信用卡支付 默认值 00
  181. if(StringUtils.isNotBlank(payInfoRequest.getSubject())){
  182. reqData.put("subject", payInfoRequest.getSubject()); //订单标题
  183. }else {
  184. reqData.put("subject", "聚合支付测试"); //订单标题
  185. }
  186. //reqData.put("hbFqNum", "6"); //花呗分期数,仅可上送 6 或 12
  187. reqData.put("tradeSource", "01"); //交易来源 01服务商,02收银台,03硬件
  188. reqData.put("trmIp", "172.16.2.1");//商家ip地址
  189. // reqData.put("customerIp", ""); //持卡人ip地址,银联js支付时必传
  190. //reqData.put("outFrontUrl", ""); //js 支付,前台 成功通知地址
  191. //reqData.put("outFrontFailUrl", ""); //js 支付,前台 事变通知地址
  192. reqData.put("notifyUrl", "https://www.huijy.net/api/getCallback"); //回调地址
  193. //reqData.put("notifyUrl", "https://www.huijy.net/demo/getCallback"); //回调地址
  194. //reqData.put("needReceipt", "00"); //电子发票功能 微信开具电子 发票使用
  195. //reqData.put("ledgerAccountFlag", "00"); //是否做分账 分账交易使 用;00:做; 01:不做;不传默认为不做分账
  196. //reqData.put("ledgerAccountEffectTime", "00"); //分账有效时间 单位为天;是 否做分账选择 00 时该字段必传
  197. // reqData.put("ruleId", "00"); //同 步 分 账 规 则 id
  198. // reqData.put("fusruleId", "00"); //同步分账规则
  199. //reqData.put("ylTrmNo", ""); //银联终端号
  200. //reqData.put("terminalId", ""); //TQ机具编号
  201. //reqData.put("deviceNo ", "1111"); //设备号
  202. // reqData.put("identityFlag", ""); //是否是实名支付
  203. // reqData.put("buyerIdType", "IDCARD"); //证件类型
  204. // reqData.put("buyerIdNo", "410523198701054018"); //证件号
  205. // reqData.put("buyerName", "张三"); //买家姓名
  206. // reqData.put("mobileNum", ""); //手机号
  207. // reqData.put("extend", ""); //备用
  208. String req= SXFPaySign.getSXFPay(reqData);
  209. logger.debug("参数信息:"+req);
  210. System.out.println("req:" + req);
  211. //此处不要改变reqData里面值的顺序用LinkedHashMap
  212. HashMap reqMap = JSON.parseObject(req, LinkedHashMap.class, Feature.OrderedField);
  213. //组装加密串
  214. String signContent = RSASignature.getOrderContent(reqMap);
  215. System.out.println("拼接后的参数:" + signContent);
  216. logger.debug("拼接后的参数:"+signContent);
  217. //sign
  218. String sign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  219. System.out.println("============签名:" + sign);
  220. reqMap.put("sign", sign);
  221. String reqStr = JSON.toJSONString(reqMap);
  222. System.out.println("请求参数:" + reqMap);
  223. System.out.println("请求参数:" + reqStr);
  224. //调用第三方接口地址
  225. //String url = "https://openapi-test.tianquetech.com/order/jsapiScan";//测试地址
  226. String url = "https://openapi.suixingpay.com/order/jsapiScan";//生产地址
  227. String resultJson = HttpUtils.connectPostUrl(url, reqStr);
  228. System.out.println("返回信息:" + resultJson);
  229. // logger.debug("返回信息:"+resultJson);
  230. //不要对reqData排序 所以用LinkedHashMap
  231. HashMap<String, Object> result = JSON.parseObject(resultJson, LinkedHashMap.class, Feature.OrderedField);
  232. if ("0000".equals(result.get("code"))) {
  233. //验签
  234. String signResult = result.get("sign").toString();
  235. result.remove("sign");
  236. String resultStr = RSASignature.getOrderContent(result);
  237. System.out.println(resultStr);
  238. //sign
  239. String resultSign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  240. System.out.println("resultSign:" + resultSign);
  241. //组装加密串
  242. if (RSASignature.doCheck(resultStr, signResult, SXFPaySign.sxfPublic)) {
  243. System.out.println("===================验签成功==============");
  244. }
  245. }
  246. resultData=ResultData.success(result);
  247. }else {
  248. resultData=ResultData.error(CodeMsg.YEWU_FAIL,"未查询到订单");
  249. }
  250. }catch (Exception e){
  251. resultData=ResultData.error(CodeMsg.YEWU_FAIL,"订单支付失败");
  252. e.printStackTrace();
  253. }
  254. }else{
  255. //返回失败支付失败信息
  256. resultData=ResultData.error(CodeMsg.USER_NOT_EXSIST);
  257. }
  258. return gson.toJson(resultData);
  259. }
  260. /**
  261. * 验证商户信息查询
  262. */
  263. @RequestMapping(value = "/getJhPayMnoInfo", method = RequestMethod.GET)
  264. @ResponseBody
  265. public String getJhPayMnoInfo(@RequestParam String mno){
  266. try {
  267. JSONObject reqData = new JSONObject();
  268. reqData.put("mno", mno); //商户编号
  269. String req = SXFPaySign.getSXFPay(reqData);
  270. logger.debug("参数信息:" + req);
  271. System.out.println("req:" + req);
  272. //此处不要改变reqData里面值的顺序用LinkedHashMap
  273. HashMap reqMap = JSON.parseObject(req, LinkedHashMap.class, Feature.OrderedField);
  274. //组装加密串
  275. String signContent = RSASignature.getOrderContent(reqMap);
  276. System.out.println("拼接后的参数:" + signContent);
  277. logger.debug("拼接后的参数:" + signContent);
  278. //sign
  279. String sign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  280. System.out.println("============签名:" + sign);
  281. reqMap.put("sign", sign);
  282. String reqStr = JSON.toJSONString(reqMap);
  283. System.out.println("请求参数:" + reqMap);
  284. System.out.println("请求参数:" + reqStr);
  285. //调用第三方接口地址
  286. //String url = "https://openapi-test.tianquetech.com/merchant/merchantInfoQuery";//测试地址
  287. String url = "https://openapi.tianquetech.com/merchant/merchantInfoQuery";//生产地址
  288. String resultJson = HttpUtils.connectPostUrl(url, reqStr);
  289. HashMap<String, Object> result = JSON.parseObject(resultJson, LinkedHashMap.class, Feature.OrderedField);
  290. if ("0000".equals(result.get("code"))) {
  291. // //验签
  292. // String signResult = result.get("sign").toString();
  293. // result.remove("sign");
  294. // String resultStr = RSASignature.getOrderContent(result);
  295. // System.out.println(resultStr);
  296. // //sign
  297. // String resultSign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  298. // System.out.println("resultSign:" + resultSign);
  299. // //组装加密串
  300. // if (RSASignature.doCheck(resultStr, signResult, SXFPaySign.sxfPublic)) {
  301. // System.out.println("===================验签成功==============");
  302. // }
  303. }
  304. }catch (Exception e){
  305. e.printStackTrace();
  306. }
  307. return "";
  308. }
  309. /**
  310. * 关单接口
  311. */
  312. @RequestMapping(value = "/getPayOrderClose", consumes = "application/json", method = RequestMethod.POST)
  313. @ResponseBody
  314. public String getPayOrderClose(@RequestBody PayCloseRequestParamter payCloseRequestParamter) {
  315. String results="";
  316. Gson gson =new Gson();
  317. String mno=payCloseRequestParamter.getMno();
  318. String origOrderNo=payCloseRequestParamter.getOrigOrderNo();
  319. String origUuid=payCloseRequestParamter.getOrigUuid();
  320. String token=payCloseRequestParamter.getToken();
  321. String userType=payCloseRequestParamter.getUserType();
  322. boolean flag =appUserInfoService.selectAppUserInfo(token,userType);
  323. ResultData resultData =null;
  324. if(flag){
  325. try {
  326. JSONObject reqData = new JSONObject();
  327. reqData.put("mno",mno); //商户编号
  328. reqData.put("origOrderNo",origOrderNo);//系统商户订单号
  329. reqData.put("origUuid", origUuid);//随行付订单号
  330. String req= SXFPaySign.getSXFPay(reqData);
  331. //此处不要改变reqData里面值的顺序用LinkedHashMap
  332. HashMap reqMap = JSON.parseObject(req, LinkedHashMap.class, Feature.OrderedField);
  333. //组装加密串
  334. String signContent = RSASignature.getOrderContent(reqMap);
  335. System.out.println("拼接后的参数:" + signContent);
  336. //sign
  337. String sign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  338. System.out.println("============签名:" + sign);
  339. reqMap.put("sign", sign);
  340. String reqStr = JSON.toJSONString(reqMap);
  341. System.out.println("请求参数:" + reqMap);
  342. System.out.println("请求参数:" + reqStr);
  343. //调用第三方接口地址
  344. // String url = "https://openapi-test.tianquetech.com/query/close";//测试地址
  345. String url = "https://openapi.tianquetech.com/query/close";//生产地址
  346. String resultJson = HttpUtils.connectPostUrl(url, reqStr);
  347. System.out.println("返回信息:" + resultJson);
  348. //不要对reqData排序 所以用LinkedHashMap
  349. HashMap<String, Object> result = JSON.parseObject(resultJson, LinkedHashMap.class, Feature.OrderedField);
  350. if ("0000".equals(result.get("code"))) {
  351. //验签
  352. String signResult = result.get("sign").toString();
  353. result.remove("sign");
  354. String resultStr = RSASignature.getOrderContent(result);
  355. System.out.println(resultStr);
  356. //sign
  357. String resultSign = RSASignature.encryptBASE64(RSASignature.sign(signContent,SXFPaySign.privateKey));
  358. System.out.println("resultSign:" + resultSign);
  359. //组装加密串
  360. if (RSASignature.doCheck(resultStr, signResult, SXFPaySign.sxfPublic)) {
  361. System.out.println("===================验签成功==============");
  362. }
  363. }
  364. resultData=ResultData.success(result);
  365. }catch (Exception e){
  366. resultData=ResultData.error(CodeMsg.YEWU_FAIL,"关闭订单失败");
  367. e.printStackTrace();
  368. }
  369. }else{
  370. resultData=ResultData.error(CodeMsg.USER_NOT_EXSIST);
  371. }
  372. return gson.toJson(resultData);
  373. }
  374. /**
  375. * 异步回调通知
  376. */
  377. @RequestMapping(value = "/getCallback", consumes = "application/json", method = RequestMethod.POST)
  378. @ResponseBody
  379. public void getCallback(@RequestBody JSONObject request){
  380. logger.info("-------------------------------回调开始----------------------------------------------");
  381. logger.info("回调返回过来的参数"+request);
  382. logger.info("ordNo信息:" + request.get("ordNo").toString());
  383. logger.info("sign信息:" + request.get("sign").toString());
  384. Gson gson =new Gson();
  385. String sxfUuid=request.get("sxfUuid").toString(); //随行付落单号
  386. String payWay=request.get("payWay").toString(); //随行付交易方式
  387. String payTime=request.get("payTime").toString(); //随行付交易时间
  388. String uuid=request.get("uuid").toString(); //随行付交易流水号
  389. String mno=request.get("mno").toString();//发起交易的商户编号
  390. String ordNo=request.get("ordNo").toString();//商户生成的订单号
  391. String amt=request.get("amt").toString();//金额
  392. String buyerId=request.get("buyerId").toString();//用户登录
  393. String transactionId=request.get("transactionId").toString();//用户登录
  394. String drType=request.get("drType").toString();//借贷记标识 1-借,2-贷,3-其他
  395. String payType=request.get("payType").toString();//对订单的描述,取值范围:WECHAT:微信,ALIPAY:支付宝,UNIONPAY:
  396. String payBank=request.get("payBank").toString();//付款银行银行编码,例如 ICBC
  397. String pointAmount=request.get("pointAmount").toString();//代金券金额
  398. String totalOffstAmt=request.get("totalOffstAmt").toString();//消 费 者 付 款金额
  399. String settleAmt=request.get("settleAmt").toString();//商家入账金额
  400. String timeStamp=request.get("timeStamp").toString();//响应时间
  401. String sign=request.get("sign").toString();//签名
  402. String bizCode=request.get("bizCode").toString();//业务返回码
  403. String bizMsg=request.get("bizMsg").toString();//业 务 返 回 信息
  404. String openid=request.get("openid").toString();//微 信 或 支 付宝身份id()opendid userid
  405. String channelId=request.get("channelId").toString();//渠道商户号
  406. String subMechId=request.get("subMechId").toString();//子商户号
  407. String finishTime=request.get("finishTime").toString();//交易完成时间
  408. String clearDt=request.get("clearDt").toString();
  409. String settlementBatchNo=request.get("settlementBatchNo").toString();
  410. //String origOrdNo=request.get("origOrdNo").toString();//反交易退款异步通知
  411. //String origUuid=request.get("origUuid").toString();//token
  412. //String scene=request.get("scene").toString();//用户登录
  413. //String buyerAccount=request.get("buyerAccount").toString();//
  414. //String realRefundAmount=request.get("realRefundAmount").toString();//商家出账金额
  415. //String recFeeAmt=request.get("recFeeAmt").toString();//交易手续费
  416. //String recFeeRate=request.get("recFeeRate").toString();//交易手续费率
  417. //String refBuyerAmt=request.get("refBuyerAmt").toString();//消 费 者 到 账金额
  418. //String extend = extend=request.get("extend").toString();//备用
  419. //将业务参数存放在 JSON 对象中
  420. JSONObject reqData = new JSONObject();
  421. //备用
  422. if(request.containsKey("extend") && request.get("extend") !=null){
  423. String extend = request.get("extend").toString();
  424. reqData.put("extend", extend);
  425. }
  426. //优惠券参数
  427. if(request.containsKey("promotionDetail") && request.get("promotionDetail") !=null){
  428. String promotionDetail = request.get("promotionDetail").toString();
  429. reqData.put("promotionDetail", promotionDetail);
  430. }
  431. //商家出账金额
  432. if(request.containsKey("realRefundAmount") && request.get("realRefundAmount") !=null){
  433. String realRefundAmount = request.get("realRefundAmount").toString();
  434. reqData.put("realRefundAmount", realRefundAmount);
  435. }
  436. //szltFlag
  437. if(request.containsKey("szltFlag") && request.get("szltFlag") !=null){
  438. String szltFlag = request.get("szltFlag").toString();
  439. reqData.put("szltFlag", szltFlag);
  440. }
  441. //recFeeAmt
  442. if(request.containsKey("recFeeAmt") && request.get("recFeeAmt") !=null){
  443. String recFeeAmt = request.get("recFeeAmt").toString();
  444. reqData.put("recFeeAmt", recFeeAmt);
  445. }
  446. //szltRecfeeAmt
  447. if(request.containsKey("szltRecfeeAmt") && request.get("szltRecfeeAmt") !=null){
  448. String szltRecfeeAmt = request.get("szltRecfeeAmt").toString();
  449. reqData.put("szltRecfeeAmt", szltRecfeeAmt);
  450. }
  451. reqData.put("sxfUuid",sxfUuid);
  452. reqData.put("payWay",payWay);
  453. reqData.put("payTime",payTime);
  454. reqData.put("uuid",uuid);
  455. reqData.put("mno",mno);
  456. reqData.put("ordNo",ordNo);
  457. reqData.put("amt",amt);
  458. reqData.put("buyerId",buyerId);
  459. reqData.put("transactionId",transactionId);
  460. reqData.put("drType",drType);
  461. reqData.put("payType",payType);
  462. reqData.put("payBank",payBank);
  463. reqData.put("pointAmount",pointAmount);
  464. reqData.put("totalOffstAmt",totalOffstAmt);
  465. reqData.put("settleAmt",settleAmt);
  466. reqData.put("timeStamp",timeStamp);
  467. reqData.put("bizCode",bizCode);
  468. reqData.put("bizMsg",bizMsg);
  469. reqData.put("openid",openid);
  470. reqData.put("channelId",channelId);
  471. reqData.put("subMechId",subMechId);
  472. reqData.put("finishTime",finishTime);
  473. reqData.put("clearDt",clearDt);
  474. reqData.put("settlementBatchNo",settlementBatchNo);
  475. //reqData.put("realRefundAmount",realRefundAmount);
  476. //reqData.put("recFeeAmt",recFeeAmt);
  477. //reqData.put("recFeeRate",recFeeRate);
  478. //reqData.put("buyerAccount",buyerAccount);
  479. //reqData.put("origOrdNo",origOrdNo);
  480. //reqData.put("origUuid",origUuid);
  481. //reqData.put("scene",scene);
  482. //reqData.put("refBuyerAmt",refBuyerAmt);
  483. //reqData.put("extend",extend);
  484. //根据回调信息,先进行验签,验签后修改状态
  485. logger.info("打印参数信息"+gson.toJson(reqData));
  486. //不要对reqData排序 所以用LinkedHashMap
  487. HashMap<String, Object> result = JSON.parseObject(gson.toJson(reqData), LinkedHashMap.class, Feature.OrderedField);
  488. //验签
  489. String resultStr = RSASignature.getOrderContent(result);
  490. JSONObject req = new JSONObject();
  491. System.out.println(resultStr);
  492. if (RSASignature.doCheck(resultStr, sign, SXFPaySign.sxfPublic)) {
  493. logger.info("验签成功");
  494. //验签成功,修改订单状态
  495. List<PayOrder> list = payOrderService.getPayOrderList(ordNo);
  496. logger.info("根据订单号,查询订单"+gson.toJson(list));
  497. if (list != null && list.size() == 1) {
  498. String status = list.get(0).getStatus();
  499. //状态为未支付 0 修改状态为1已支付
  500. if (status.equals("0")) {
  501. PayOrder payOrder = new PayOrder();
  502. payOrder.setOrderNo(ordNo);
  503. payOrder.setStatus("1");
  504. payOrder.setPayDate(new Date()); //支付时间
  505. payOrder.setReceivedAmt(Double.valueOf(settleAmt)); //settleAmt商家入账金额
  506. //修改订单状态
  507. int count = payOrderService.getUpdatePayOrder(payOrder);
  508. if(count == 1){
  509. req.put("code","success");
  510. req.put("msg","修改订单状态成功");
  511. logger.info(req.toString());
  512. //将用户消费的信息插入顾客表: 以手机号 油品名称 油站id为条件插入且存入 加油升数、实收金额、油站名称 根据订单号查询用户手机号
  513. Map<String, Object> infoMap = payOrderService.getOrderInfoAndUserInfoByOrderNo(payOrder); //获取该订单手机号、加油升数、实收金额、油站名称
  514. //手机号必须有
  515. if(infoMap != null && infoMap.containsKey("mobilePhone") && infoMap.get("mobilePhone") !=null ){
  516. //存放客户信息
  517. CustomerManage customerManage = new CustomerManage();
  518. //存放查询用户信息
  519. AppUserInfo appUserInfo = new AppUserInfo();
  520. appUserInfo.setMobilePhone(infoMap.get("mobilePhone").toString());
  521. //从客户信息表查询数据用于插入客户表 使用List原因:app_user_info存在小程序和公众号两种信息
  522. List<AppUserInfo> appUserInfoList = payOrderService.getUserInfoByOpenId(appUserInfo);
  523. Date blogRegTime = null; //公众号注册时间
  524. Date minaRegTime = null; //小程序注册时间
  525. if(appUserInfoList != null && appUserInfoList.size() >0){
  526. for(AppUserInfo u : appUserInfoList){
  527. //向客户表插入小程序和公众号的openId 用户表ID 用户手机号 注册时间
  528. switch (u.getUserType()){
  529. case "1":
  530. customerManage.setBlogOpenid(u.getBlogOpenid());
  531. customerManage.setBlogUserId(u.getUserId());
  532. customerManage.setPhoneNumber(u.getMobilePhone());
  533. customerManage.setCustomerName(u.getBlogNickName());
  534. blogRegTime =u.getRegisteDate();
  535. break;
  536. case "2":
  537. customerManage.setMinaOpenid(u.getMinaOpenid());
  538. customerManage.setMinaUserId(u.getUserId());
  539. customerManage.setPhoneNumber(u.getMobilePhone());
  540. customerManage.setCustomerName(u.getBlogNickName());
  541. minaRegTime = u.getRegisteDate();
  542. break;
  543. }
  544. }
  545. //判断公众号和小程序时间取最早的时间
  546. if(blogRegTime !=null && minaRegTime != null){
  547. if(blogRegTime.compareTo(minaRegTime) >0){
  548. customerManage.setRegtime(minaRegTime);
  549. }else if(blogRegTime.compareTo(minaRegTime) <0){
  550. customerManage.setRegtime(blogRegTime);
  551. }else if(blogRegTime.compareTo(minaRegTime) ==0){
  552. //相等时随便取一个
  553. customerManage.setRegtime(minaRegTime);
  554. }
  555. }else if(blogRegTime == null){
  556. customerManage.setRegtime(minaRegTime);
  557. }else if(minaRegTime == null){
  558. customerManage.setRegtime(blogRegTime);
  559. }
  560. }
  561. customerManage.setStationId(Integer.valueOf(infoMap.get("stationId").toString())); //油站ID
  562. customerManage.setOilName(infoMap.get("oilName").toString()); //油品名称
  563. customerManage.setStationName(infoMap.get("stationName").toString()); //存入油站名称
  564. //已存在用户信息 existCustomer
  565. CustomerManage existCustomer = payOrderService.isExistCustomer(customerManage);
  566. logger.info("查询出客户是否存在数据 null 表示没有" + existCustomer);
  567. //判断该用户是否已存在
  568. if(existCustomer != null){ //存在该用户时更新
  569. //此处if放null处理
  570. if(existCustomer.getAmt() !=null){
  571. //存入金额 累加原来金额
  572. customerManage.setAmt(existCustomer.getAmt().add(BigDecimal.valueOf((Double) infoMap.get("amt"))));
  573. }else {
  574. customerManage.setAmt(BigDecimal.valueOf((Double) infoMap.get("amt")));
  575. }
  576. if(infoMap.containsKey("orderType") && infoMap.get("orderType").equals("1")) {
  577. if (existCustomer.getLiters() != null) {
  578. //存入升数 累加原来升数
  579. customerManage.setLiters(existCustomer.getLiters().add(BigDecimal.valueOf((Double) infoMap.get("orderLiters"))));
  580. } else {
  581. customerManage.setLiters(BigDecimal.valueOf((Double) infoMap.get("orderLiters")));
  582. }
  583. }
  584. logger.info("存在客户 更新时手机号参数: " + customerManage.getPhoneNumber());
  585. //获取该油站的优惠方式
  586. String discountPlanType = stationService.getStationDiscountWay(infoMap.get("stationId").toString());
  587. logger.info("油站优惠方式:"+discountPlanType);
  588. if(discountPlanType !=null && discountPlanType.equals("1")){
  589. //直降时存入等级名称和等级ID
  590. List<Map> customerGradeInfo = customerGradeServices.getCustomerGradeList(infoMap); //直降
  591. logger.info("该站直降等级信息:"+ customerGradeInfo);
  592. for (Map m: customerGradeInfo){
  593. if(Double.valueOf(customerManage.getAmt().toString()) >= Double.valueOf(m.get("memberConditStart").toString()) && Double.valueOf(customerManage.getAmt().toString()) < Double.valueOf(m.get("memberConditEnd").toString())){
  594. customerManage.setGrade(m.get("grade").toString()); //存入等级名称
  595. customerManage.setMemberGrade(m.get("id").toString()); //存入等级ID
  596. break;
  597. }
  598. }
  599. logger.info("直降等级信息是否存入客户表:"+ "直降ID:"+ customerManage.getMemberGrade()+ "直降名称: "+customerManage.getGrade());
  600. }
  601. //存在 更新
  602. payOrderService.updateCustomer(customerManage);
  603. }else{
  604. //该客户不存在时插入
  605. String discountPlanType = stationService.getStationDiscountWay(infoMap.get("stationId").toString());
  606. if(discountPlanType !=null && discountPlanType.equals("1")){
  607. //直降时存入等级名称和等级ID
  608. List<Map> customerGradeInfo = customerGradeServices.getCustomerGradeList(infoMap); //直降
  609. logger.info("该站直降等级信息:"+ customerGradeInfo);
  610. if(customerGradeInfo !=null && customerGradeInfo.size() >0){
  611. customerManage.setGrade(customerGradeInfo.get(0).get("grade").toString()); //存入等级名称
  612. customerManage.setMemberGrade(customerGradeInfo.get(0).get("id").toString()); //存入等级ID
  613. }
  614. logger.info("直降等级信息是否存入客户表:"+ "直降ID:"+ customerManage.getMemberGrade()+ "直降名称: "+customerManage.getGrade());
  615. }
  616. customerManage.setAmt(BigDecimal.valueOf((Double) infoMap.get("amt"))); //存入金额
  617. if(infoMap.containsKey("orderType") && infoMap.get("orderType").equals("1")){
  618. customerManage.setLiters(BigDecimal.valueOf((Double) infoMap.get("orderLiters"))); //存入升数
  619. }
  620. //不存在 新增
  621. logger.info("不存在客户 新增时参数: " + customerManage.toString());
  622. payOrderService.insertCustomer(customerManage);
  623. }
  624. //==========================================================================================================================================================//
  625. //客户积分
  626. /*CustomerPoints customerPoints = new CustomerPoints();
  627. customerPoints.setCustomerName(infoMap.get("consumer").toString());
  628. customerPoints.setMobilePhone(infoMap.get("mobilePhone").toString()); //存入手机号
  629. if(infoMap.containsKey("userType") && infoMap.get("userType") !=null){
  630. switch (infoMap.get("userType").toString()){
  631. case "1":
  632. customerPoints.setBlogOpenId(infoMap.get("blogOpenid").toString());
  633. break;
  634. case "2":
  635. customerPoints.setMinaOpenId(infoMap.get("minaOpenid").toString());
  636. break;
  637. }
  638. }
  639. IntegralRule integralRule =new IntegralRule();
  640. integralRule.setStationId(Integer.valueOf(infoMap.get("stationId").toString()));
  641. integralRule.setOilName(infoMap.get("oilName").toString());
  642. //获取该油站的积分规则
  643. List<IntegralRule> rule = integralRuleService.getIntegralRule(integralRule);
  644. if(rule !=null && rule.size() > 0){
  645. //获取该用户积分信息
  646. CustomerPoints customerPointsInfo = customerPointsService.getCustomerPointsInfo(customerPoints);
  647. if(customerPointsInfo !=null){ //已存在
  648. String ruleType = rule.get(0).getRuleType(); //获取积分规则
  649. switch (ruleType){
  650. case "1": //以订单实付累计
  651. //已存在:现有余额积分 + 本次消费所获得的积分
  652. BigDecimal amt1 = new BigDecimal(infoMap.get("amt").toString()); //本次消费实收金额
  653. if(amt1.compareTo(rule.get(0).getRuleAmt()) ==1){
  654. //计算积分并取整
  655. BigDecimal integral = amt1.divide(rule.get(0).getSaleAmt(), 0).multiply(rule.get(0).getIntegral()).setScale(0, BigDecimal.ROUND_DOWN);
  656. customerPoints.setPoints(customerPointsInfo.getPoints() + Integer.valueOf(integral.toString()));
  657. customerPoints.setAccumulatePoints(customerPointsInfo.getPoints() + Integer.valueOf(integral.toString()));
  658. }
  659. break;
  660. case "2": //以订单应付累计
  661. //已存在:现有余额积分 + 本次消费所获得的积分
  662. BigDecimal receivableAmt = new BigDecimal(infoMap.get("receivableAmt").toString()); //本次消费实收金额
  663. if(receivableAmt.compareTo(rule.get(0).getRuleAmt()) ==1){
  664. //计算积分并取整
  665. BigDecimal integral = receivableAmt.divide(rule.get(0).getSaleAmt(), 0).multiply(rule.get(0).getIntegral()).setScale(0, BigDecimal.ROUND_DOWN);
  666. customerPoints.setPoints(customerPointsInfo.getPoints() + Integer.valueOf(integral.toString()));
  667. customerPoints.setAccumulatePoints(customerPointsInfo.getPoints() + Integer.valueOf(integral.toString()));
  668. }
  669. break;
  670. case "3": //以加油升数
  671. break;
  672. }
  673. //更新客户余额积分
  674. customerPointsService.updateCustomerPointsInfo(customerPoints);
  675. }
  676. }*/
  677. //========================================================================================================================================================//
  678. //打印机打印小票
  679. String content1;
  680. String content2;
  681. String orderNoP = "";
  682. String createdDateP ="";
  683. String stationNameP ="";
  684. String oilNameP ="";
  685. String orderLitersP ="";
  686. String oilPirceP ="";
  687. String receivableAmtP = "";
  688. String discountAmtP = "";
  689. String amtP = "";
  690. String mobilePhoneP = "";
  691. String payWayP = "";
  692. String sn; //打印机编号
  693. if(StringUtils.isNotBlank(infoMap.get("orderNo").toString())){
  694. orderNoP =infoMap.get("orderNo").toString();
  695. }
  696. if(infoMap.containsKey("createdDate") && infoMap.get("createdDate") !=null ){
  697. //格式化日期
  698. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  699. createdDateP =sdf.format(infoMap.get("createdDate"));
  700. }
  701. if(infoMap.containsKey("stationName") && infoMap.get("stationName") !=null ){
  702. stationNameP =infoMap.get("stationName").toString();
  703. }
  704. if(infoMap.containsKey("oilName") && infoMap.get("oilName") !=null ){
  705. oilNameP =infoMap.get("oilName").toString();
  706. }
  707. if(infoMap.containsKey("orderType") && infoMap.get("orderType").equals("1")) {
  708. //加油升数
  709. if (infoMap.containsKey("orderLiters") && infoMap.get("orderLiters") != null) {
  710. orderLitersP = infoMap.get("orderLiters") + "";
  711. }
  712. //油价
  713. if (infoMap.containsKey("oilPirce") && infoMap.get("oilPirce") != null) {
  714. oilPirceP = infoMap.get("oilPirce") + "";
  715. }
  716. if(infoMap.containsKey("discountAmt") && infoMap.get("discountAmt") !=null ){
  717. discountAmtP =infoMap.get("discountAmt")+"";
  718. }
  719. }else if(infoMap.containsKey("orderType") && infoMap.get("orderType").equals("2")) {
  720. orderLitersP ="0.00";
  721. oilPirceP = "0.00";
  722. discountAmtP ="0.00";
  723. receivableAmtP=infoMap.get("amt")+"";
  724. }
  725. if(infoMap.containsKey("receivableAmt") && infoMap.get("receivableAmt") !=null ){
  726. receivableAmtP =infoMap.get("receivableAmt")+"";
  727. }
  728. if(infoMap.containsKey("amt") && infoMap.get("amt") !=null ){
  729. amtP =infoMap.get("amt")+"";
  730. }
  731. if(infoMap.containsKey("mobilePhone") && infoMap.get("mobilePhone") !=null ){
  732. String phone =infoMap.get("mobilePhone")+"";
  733. //手机号中间四位****代替
  734. mobilePhoneP = phone.substring(0, 3) + "****" + phone.substring(7, phone.length());
  735. }
  736. if(infoMap.containsKey("payWay") && infoMap.get("payWay") !=null ){
  737. if(infoMap.get("payWay").equals("02") || infoMap.get("payWay").equals("03")){
  738. payWayP ="微信";
  739. }
  740. }
  741. content1 = "<CB>支付小票--顾客联</CB><BR>";
  742. content1 += "订单号:"+orderNoP+" <BR>";
  743. content1 += "时间:"+createdDateP+" <BR>";
  744. content1 += "油站:"+stationNameP+" <BR>";
  745. if(infoMap.containsKey("orderType") && infoMap.get("orderType").equals("1")){
  746. content1 += "油品: "+oilNameP+" <BR>";
  747. content1 += "油量: "+orderLitersP+" 升<BR>";
  748. content1 += "单价: "+oilPirceP+" L/元<BR>";
  749. }
  750. content1 += "<BOLD><B>原价: "+receivableAmtP+" 元</B></BOLD><BR>";
  751. if(infoMap.containsKey("orderType") && infoMap.get("orderType").equals("1")){
  752. content1 += "优惠: "+discountAmtP+" 元<BR>";
  753. }
  754. content1 += "支付: "+amtP+" 元<BR>";
  755. content1 += "支付方式: "+payWayP+" <BR>";
  756. content1 += "<BR>";
  757. //content1 += "--------------------------------<BR>";
  758. content1 += "<BR>";
  759. content2 = "<CB>支付小票--商户联</CB><BR>";
  760. content2 += "订单号:"+orderNoP+" <BR>";
  761. content2 += "时间:"+createdDateP+"<BR>";
  762. content2 += "油站:"+stationNameP+" <BR>";
  763. if(infoMap.containsKey("orderType") && infoMap.get("orderType").equals("1")){
  764. content2 += "油品: "+oilNameP+" <BR>";
  765. content2 += "油量: "+orderLitersP+" 升<BR>";
  766. content2 += "单价: "+oilPirceP+" L/元<BR>";
  767. }
  768. content2 += "<BOLD><B>原价: "+receivableAmtP+" 元</B></BOLD><BR>";
  769. if(infoMap.containsKey("orderType") && infoMap.get("orderType").equals("1")){
  770. content2 += "优惠: "+discountAmtP+" 元<BR>";
  771. }
  772. content2 += "支付: "+amtP+" 元<BR>";
  773. content2 += "手机号: "+mobilePhoneP+" <BR>";
  774. content2 += "支付方式: "+payWayP+" <BR>";
  775. content2 += "<BR>";
  776. //获取打印机编号
  777. //sn = "921611605"; //测试打印机 sn:921611605 key:72338zma
  778. Map params =new HashMap();
  779. params.put("stationId", infoMap.get("stationId").toString());
  780. params.put("oilGunNo", infoMap.get("oilGun").toString());
  781. Map m = stationOilGunService.getPrinterSnByStationIdAndOilGunNo(params);
  782. if(m.containsKey("printerSn") && m.get("printerSn").toString()!= null && m.get("printerSn").toString()!=""){
  783. sn = m.get("printerSn").toString();
  784. // //查询打印机的状态
  785. // JSONObject jsonPrintStatus = JSONObject.parseObject(FeiEPrinterUtil.queryPrinterStatus(sn));
  786. // if(jsonPrintStatus.getString("data").equals("\\u5728\u7ebf\\uff0c\\u5de5\\u4f5c\\u72b6\u6001\\u6b63\\u5e38\\u3002")){
  787. // logger.info("打印机在线,工作状态正常:" + jsonPrintStatus.toString());
  788. //开始打印
  789. String printInfo=""; //打印信息
  790. if(m.containsKey("printSetting") && m.get("printSetting").toString()!= null && m.get("printSetting").toString()!=""){
  791. switch (m.get("printSetting").toString()){
  792. case "1": //1 客户联
  793. printInfo = FeiEPrinterUtil.printReceipt(sn, content1);
  794. break;
  795. case "2": //2 商户联
  796. printInfo = FeiEPrinterUtil.printReceipt(sn, content2);
  797. break;
  798. case "3": //3商户联和客户联
  799. printInfo = FeiEPrinterUtil.printReceipt(sn, content1 + content2);
  800. break;
  801. }
  802. }
  803. JSONObject jsonObject = JSONObject.parseObject(printInfo);
  804. if(jsonObject != null && jsonObject.getString("msg").equals("ok")){
  805. logger.info("打印成功:" + jsonObject.toString());
  806. //如果打印成功 添加小票数量
  807. PayOrder p = new PayOrder();
  808. p.setPrintCount(1);
  809. p.setOrderNo(ordNo);
  810. payOrderService.getUpdatePayOrder(p);
  811. }
  812. // }else if(jsonPrintStatus.getString("data").equals("\\u79bb\\u7ebf\\u3002")){
  813. // logger.info("打印机离线:" + jsonPrintStatus.toString());
  814. // }else if(jsonPrintStatus.getString("data").equals("\\u5728\\u7ebf\\uff0c\\u5de5\\u4f5c\\u72b6\\u6001\\u4e0d\\u6b63\\u5e38\\u3002")){
  815. // logger.info("打印机在线,纸异常: "+jsonPrintStatus.toString());
  816. // }
  817. }else {
  818. logger.info("请正确配置打印机");
  819. }
  820. }else{
  821. logger.info("该用户无手机号!");
  822. }
  823. }
  824. }
  825. }
  826. }else {
  827. logger.info("验签失败");
  828. req.put("code","fail");
  829. req.put("msg","失败");
  830. }
  831. }
  832. }