PayController.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  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.slf4j.Logger;
  13. import org.slf4j.LoggerFactory;
  14. import org.springframework.stereotype.Controller;
  15. import org.springframework.web.bind.annotation.*;
  16. import javax.annotation.Resource;
  17. import javax.servlet.http.HttpServletRequest;
  18. import javax.servlet.http.HttpServletResponse;
  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
  31. * @return
  32. */
  33. @RequestMapping(value = "/getJhPayInfo", consumes = "application/json", method = RequestMethod.POST)
  34. @ResponseBody
  35. public String getJhPayInfo(@RequestBody PayInfoRequest payInfoRequest){
  36. Gson gson =new Gson();
  37. ResultData resultData =null;
  38. String token=payInfoRequest.getToken();//token
  39. String userType=payInfoRequest.getUserType();//用户登录类型 1 公众号。2 小程序
  40. String ordNo=payInfoRequest.getOrdNo();//订单号
  41. //根据token 和登录类型 身份验证
  42. AppUserInfo appUserInfo =new AppUserInfo();
  43. //订单类型 是小程序还是公众号
  44. appUserInfo.setUserType(userType);
  45. if(userType.equals("1")){
  46. //1 是公众号
  47. appUserInfo.setBlogOpenid(token);
  48. }else if(userType.equals("2")){
  49. //2是小程序
  50. appUserInfo.setMinaToken(token);
  51. }
  52. List<AppUserInfo> appUserInfoList =appUserInfoService.Authentication(appUserInfo);
  53. if(appUserInfoList!=null&&appUserInfoList.size()>0){
  54. //调用聚合支付
  55. try{
  56. //将业务参数存放在 JSON 对象中
  57. JSONObject reqData = new JSONObject();
  58. reqData.put("ordNo", ordNo); //商户订单号
  59. reqData.put("mno", "399200427027644"); //商户编号
  60. //reqData.put("subMechId", ""); //子商户号
  61. reqData.put("amt", "0.01"); //订单总金额
  62. //reqData.put("discountAmt", ""); //参与优惠金额
  63. //reqData.put("unDiscountAmt", ""); //不参与优惠金额
  64. reqData.put("payType", "WECHAT"); //支付渠道
  65. reqData.put("payWay", "02"); //支付方式 02 公众号/服 务窗/js支付 03 小程序
  66. //reqData.put("timeExpire", "10"); //订单失效时间, 以分钟为单位
  67. //reqData.put("limitPay", "00"); //限制卡类型: 00-全部 01-限定不能使 用信用卡支付 默认值 00
  68. reqData.put("subject", "聚合支付测试"); //订单标题
  69. //reqData.put("hbFqNum", "6"); //花呗分期数,仅可上送 6 或 12
  70. reqData.put("tradeSource", "01"); //交易来源 01服务商,02收银台,03硬件
  71. reqData.put("trmIp", "172.16.2.1");//商家ip地址
  72. // reqData.put("customerIp", ""); //持卡人ip地址,银联js支付时必传
  73. reqData.put("userId", "2088101117955611"); //用户号 微信:openid; 支付宝:userid;银联:userid;微信&支付宝必传,银联js为非必传
  74. //reqData.put("subAppid", "wx24210004370ec43b"); //微信子公众号
  75. //reqData.put("outFrontUrl", ""); //js 支付,前台 成功通知地址
  76. //reqData.put("outFrontFailUrl", ""); //js 支付,前台 事变通知地址
  77. //reqData.put("notifyUrl", ""); //回调地址
  78. //reqData.put("needReceipt", "00"); //电子发票功能 微信开具电子 发票使用
  79. //reqData.put("ledgerAccountFlag", "00"); //是否做分账 分账交易使 用;00:做; 01:不做;不传默认为不做分账
  80. //reqData.put("ledgerAccountEffectTime", "00"); //分账有效时间 单位为天;是 否做分账选择 00 时该字段必传
  81. // reqData.put("ruleId", "00"); //同 步 分 账 规 则 id
  82. // reqData.put("fusruleId", "00"); //同步分账规则
  83. //reqData.put("ylTrmNo", ""); //银联终端号
  84. //reqData.put("terminalId", ""); //TQ机具编号
  85. reqData.put("deviceNo ", "1111"); //设备号
  86. reqData.put("identityFlag", ""); //是否是实名支付
  87. // reqData.put("buyerIdType", "IDCARD"); //证件类型
  88. // reqData.put("buyerIdNo", "410523198701054018"); //证件号
  89. // reqData.put("buyerName", "张三"); //买家姓名
  90. // reqData.put("mobileNum", ""); //手机号
  91. reqData.put("extend", ""); //备用
  92. String req= SXFPaySign.getSXFPay(reqData);
  93. // logger.debug("参数信息:"+req);
  94. System.out.println("req:" + req);
  95. //此处不要改变reqData里面值的顺序用LinkedHashMap
  96. HashMap reqMap = JSON.parseObject(req, LinkedHashMap.class, Feature.OrderedField);
  97. //组装加密串
  98. String signContent = RSASignature.getOrderContent(reqMap);
  99. System.out.println("拼接后的参数:" + signContent);
  100. // logger.debug("拼接后的参数:"+signContent);
  101. //sign
  102. String sign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  103. System.out.println("============签名:" + sign);
  104. reqMap.put("sign", sign);
  105. String reqStr = JSON.toJSONString(reqMap);
  106. System.out.println("请求参数:" + reqMap);
  107. System.out.println("请求参数:" + reqStr);
  108. //调用第三方接口地址
  109. String url = "https://openapi-test.tianquetech.com/order/jsapiScan";//测试地址
  110. // String url = "https://openapi.suixingpay.com/order/jsapiScan";//生产地址
  111. String resultJson = HttpUtils.connectPostUrl(url, reqStr);
  112. System.out.println("返回信息:" + resultJson);
  113. // logger.debug("返回信息:"+resultJson);
  114. //不要对reqData排序 所以用LinkedHashMap
  115. HashMap<String, Object> result = JSON.parseObject(resultJson, LinkedHashMap.class, Feature.OrderedField);
  116. if ("0000".equals(result.get("code"))) {
  117. //验签
  118. String signResult = result.get("sign").toString();
  119. result.remove("sign");
  120. String resultStr = RSASignature.getOrderContent(result);
  121. System.out.println(resultStr);
  122. //sign
  123. String resultSign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  124. System.out.println("resultSign:" + resultSign);
  125. //组装加密串
  126. if (RSASignature.doCheck(resultStr, signResult, SXFPaySign.sxfPublic)) {
  127. System.out.println("===================验签成功==============");
  128. }
  129. }
  130. resultData=ResultData.success(result);
  131. }catch (Exception e){
  132. resultData=ResultData.error(CodeMsg.YEWU_FAIL,"订单支付失败");
  133. e.printStackTrace();
  134. }
  135. }else{
  136. //返回失败支付失败信息
  137. resultData=ResultData.error(CodeMsg.USER_NOT_EXSIST);
  138. }
  139. return gson.toJson(resultData);
  140. }
  141. /**
  142. * 关单接口
  143. */
  144. @RequestMapping(value = "/getPayOrderClose", consumes = "application/json", method = RequestMethod.POST)
  145. @ResponseBody
  146. public String getPayOrderClose(@RequestBody PayCloseRequestParamter payCloseRequestParamter) {
  147. String results="";
  148. Gson gson =new Gson();
  149. try {
  150. JSONObject reqData = new JSONObject();
  151. reqData.put("mno", payCloseRequestParamter.getMno()); //商户编号
  152. reqData.put("origOrderNo", payCloseRequestParamter.getOrigOrderNo());
  153. reqData.put("origUuid", payCloseRequestParamter.getOrigUuid());
  154. String req= SXFPaySign.getSXFPay(reqData);
  155. //此处不要改变reqData里面值的顺序用LinkedHashMap
  156. HashMap reqMap = JSON.parseObject(req, LinkedHashMap.class, Feature.OrderedField);
  157. //组装加密串
  158. String signContent = RSASignature.getOrderContent(reqMap);
  159. System.out.println("拼接后的参数:" + signContent);
  160. //sign
  161. String sign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  162. System.out.println("============签名:" + sign);
  163. reqMap.put("sign", sign);
  164. String reqStr = JSON.toJSONString(reqMap);
  165. System.out.println("请求参数:" + reqMap);
  166. System.out.println("请求参数:" + reqStr);
  167. //调用第三方接口地址
  168. String url = "https://openapi-test.tianquetech.com/query/close";//测试地址
  169. // String url = "https://openapi.tianquetech.com/query/close";//生产地址
  170. String resultJson = HttpUtils.connectPostUrl(url, reqStr);
  171. System.out.println("返回信息:" + resultJson);
  172. //不要对reqData排序 所以用LinkedHashMap
  173. HashMap<String, Object> result = JSON.parseObject(resultJson, LinkedHashMap.class, Feature.OrderedField);
  174. if ("0000".equals(result.get("code"))) {
  175. //验签
  176. String signResult = result.get("sign").toString();
  177. result.remove("sign");
  178. String resultStr = RSASignature.getOrderContent(result);
  179. System.out.println(resultStr);
  180. //sign
  181. String resultSign = RSASignature.encryptBASE64(RSASignature.sign(signContent,SXFPaySign.privateKey));
  182. System.out.println("resultSign:" + resultSign);
  183. //组装加密串
  184. if (RSASignature.doCheck(resultStr, signResult, SXFPaySign.sxfPublic)) {
  185. System.out.println("===================验签成功==============");
  186. }
  187. }
  188. results=gson.toJson(result);
  189. }catch (Exception e){
  190. e.printStackTrace();
  191. }
  192. return results;
  193. }
  194. /**
  195. * 异步回调通知
  196. */
  197. @RequestMapping(value = "/getCallback", consumes = "application/json", method = RequestMethod.POST)
  198. @ResponseBody
  199. public void getCallback(HttpServletRequest request,HttpServletResponse response){
  200. //获取回调参数信息
  201. String uuid=request.getParameter("uuid");////随行付交易流水号
  202. String mno=request.getParameter("mno");//发起交易的商户编号
  203. String ordNo=request.getParameter("ordNo");//商户生成的订单号
  204. String origOrdNo=request.getParameter("origOrdNo");//反交易退款异步通知
  205. String origUuid=request.getParameter("origUuid");//token
  206. String scene=request.getParameter("scene");//用户登录
  207. String amt=request.getParameter("amt");//用户登录
  208. String buyerId=request.getParameter("buyerId");//用户登录
  209. String buyerAccount=request.getParameter("buyerAccount");//用户登录
  210. String transactionId=request.getParameter("transactionId");//用户登录
  211. String drType=request.getParameter("drType");//借贷记标识 1-借,2-贷,3-其他
  212. String payType=request.getParameter("payType");//对订单的描述,取值范围:WECHAT:微信,ALIPAY:支付宝,UNIONPAY:
  213. String payBank=request.getParameter("payBank");//付款银行银行编码,例如 ICBC
  214. String pointAmount=request.getParameter("pointAmount");//代金券金额
  215. String totalOffstAmt=request.getParameter("totalOffstAmt");//消 费 者 付 款金额
  216. String settleAmt=request.getParameter("settleAmt");//商家入账金额
  217. String realRefundAmount=request.getParameter("realRefundAmount");//商家出账金额
  218. String recFeeAmt=request.getParameter("recFeeAmt");//交易手续费
  219. String recFeeRate=request.getParameter("recFeeRate");//交易手续费率
  220. String timeStamp=request.getParameter("timeStamp");//响应时间
  221. String sign=request.getParameter("sign");//签名
  222. String bizCode=request.getParameter("bizCode");//业务返回码
  223. String bizMsg=request.getParameter("bizMsg");//业 务 返 回 信息
  224. String openid=request.getParameter("openid");//微 信 或 支 付宝身份id()opendid userid
  225. String channelId=request.getParameter("channelId");//渠道商户号
  226. String subMechId=request.getParameter("subMechId");//子商户号
  227. String refBuyerAmt=request.getParameter("refBuyerAmt");//消 费 者 到 账金额
  228. String extend=request.getParameter("extend");//备用
  229. //将业务参数存放在 JSON 对象中
  230. JSONObject reqData = new JSONObject();
  231. reqData.put("uuid",uuid);
  232. reqData.put("mno",mno);
  233. reqData.put("ordNo",ordNo);
  234. reqData.put("origOrdNo",origOrdNo);
  235. reqData.put("origUuid",origUuid);
  236. reqData.put("scene",scene);
  237. reqData.put("amt",amt);
  238. reqData.put("buyerId",buyerId);
  239. reqData.put("buyerAccount",buyerAccount);
  240. reqData.put("transactionId",transactionId);
  241. reqData.put("drType",drType);
  242. reqData.put("payType",payType);
  243. reqData.put("payBank",payBank);
  244. reqData.put("pointAmount",pointAmount);
  245. reqData.put("totalOffstAmt",totalOffstAmt);
  246. reqData.put("settleAmt",settleAmt);
  247. reqData.put("realRefundAmount",realRefundAmount);
  248. reqData.put("recFeeAmt",recFeeAmt);
  249. reqData.put("recFeeRate",recFeeRate);
  250. reqData.put("timeStamp",timeStamp);
  251. reqData.put("sign",sign);
  252. reqData.put("bizCode",bizCode);
  253. reqData.put("bizMsg",bizMsg);
  254. reqData.put("openid",openid);
  255. reqData.put("channelId",channelId);
  256. reqData.put("subMechId",subMechId);
  257. reqData.put("refBuyerAmt",refBuyerAmt);
  258. reqData.put("extend",extend);
  259. //根据回调信息,先进行验签,验签后修改状态
  260. Gson gson =new Gson();
  261. JSONObject req = new JSONObject();
  262. // String resultJson = gson.toJson(callBack);
  263. // System.out.println("返回信息:" + resultJson);
  264. //不要对reqData排序 所以用LinkedHashMap
  265. // HashMap<String, Object> result = JSON.parseObject(resultJson, LinkedHashMap.class, Feature.OrderedField);
  266. // if ("0000".equals(result.get("code"))) {
  267. //验签
  268. // String signResult = result.get("sign").toString();
  269. // result.remove("sign");
  270. // String resultStr = RSASignature.getOrderContent(result);
  271. // System.out.println(resultStr);
  272. //sign
  273. // String resultSign = RSASignature.encryptBASE64(RSASignature.sign(signContent,SXFPaySign.privateKey));
  274. //组装加密串
  275. // if (RSASignature.doCheck(resultStr, signResult, SXFPaySign.sxfPublic)) {
  276. // System.out.println("===================验签成功==============");
  277. //验签成功,修改订单状态
  278. // List<PayOrder> list =payOrderService.getPayOrderList(callBack.getOrdNo());
  279. // if(list!=null&&list.size()==1){
  280. // String status = list.get(0).getStatus();
  281. // //状态为未支付 1 修改状态为已支付
  282. // if(status.equals("1")){
  283. // PayOrder payOrder=new PayOrder();
  284. // // payOrder.setOrderNo(callBack.getOrdNo());
  285. // payOrder.setStatus("2");
  286. // //根据修改状态
  287. // payOrderService.getUpdatePayOrder(payOrder);
  288. // }
  289. //
  290. // }
  291. req.put("code","success");
  292. req.put("msg","成功");
  293. // }
  294. //}
  295. // try {
  296. // response.setContentType("application/json; charset=UTF-8");
  297. // response.setCharacterEncoding("UTF-8");
  298. // response.getWriter().print(req);
  299. // response.getWriter().flush();
  300. // response.getWriter().close();
  301. // }catch (Exception e){
  302. // e.printStackTrace();
  303. // }
  304. }
  305. }