PayController.java 39 KB

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