PayController.java 17 KB

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