PayController.java 31 KB

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