SaoBeiPayController.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. package com.platform.yijia.controller;
  2. import com.alibaba.fastjson.JSON;
  3. import com.google.gson.Gson;
  4. import com.platform.yijia.config.YiJiaRequest;
  5. import com.platform.yijia.param.request.PayInfoRequest;
  6. import com.platform.yijia.pojo.PayOrder;
  7. import com.platform.yijia.service.*;
  8. import com.platform.yijia.utils.CodeMsg;
  9. import com.platform.yijia.utils.ResultData;
  10. import com.platform.yijia.utils.weixinapp.WxPushUtil;
  11. import com.saobei.open.sdk.DefaultSaobeiApiClient;
  12. import com.saobei.open.sdk.SaobeiApiClient;
  13. import com.saobei.open.sdk.model.requst.trade.SaobeiJsPayRequest;
  14. import com.saobei.open.sdk.model.requst.trade.SaobeiMiniPayRequest;
  15. import com.saobei.open.sdk.model.requst.trade.preauth.SaobeiPreAuthMiniPayRequest;
  16. import com.saobei.open.sdk.model.response.trade.SaobeiJsPayResponse;
  17. import com.saobei.open.sdk.model.response.trade.SaobeiMiniPayResponse;
  18. import com.saobei.open.sdk.model.response.trade.preauth.SaobeiPreAuthMiniPayResponse;
  19. import net.sf.json.JSONObject;
  20. import org.slf4j.Logger;
  21. import org.slf4j.LoggerFactory;
  22. import org.springframework.beans.factory.annotation.Value;
  23. import org.springframework.stereotype.Controller;
  24. import org.springframework.transaction.annotation.Transactional;
  25. import org.springframework.web.bind.annotation.*;
  26. import javax.annotation.Resource;
  27. import java.math.BigDecimal;
  28. import java.text.SimpleDateFormat;
  29. import java.util.Date;
  30. import java.util.Map;
  31. import java.util.Random;
  32. /*
  33. * <Title> SaoBeiPayController </Title>
  34. * <Description> 第三方扫呗支付 </Description>
  35. * @Author JK
  36. * @Date 2021年8月18日
  37. */
  38. @Controller
  39. @YiJiaRequest()
  40. @CrossOrigin
  41. public class SaoBeiPayController {
  42. private static Logger logger =(Logger) LoggerFactory.getLogger(SaoBeiPayController.class);
  43. @Resource
  44. private PayOrderService payOrderService;
  45. @Resource
  46. private AppUserInfoService appUserInfoService;
  47. @Resource
  48. private StationOilGunService stationOilGunService;
  49. @Resource
  50. private CustomerGradeServices customerGradeServices;
  51. @Resource
  52. private StationService stationService;
  53. @Resource
  54. private CustomerPointsService customerPointsService;
  55. @Resource
  56. private IntegralRuleService integralRuleService;
  57. @Resource
  58. private CustomerPointsRecordService customerPointsRecordService;
  59. @Resource
  60. private WxPushUtil wxPushUtil;
  61. @Resource
  62. private GzhNewsTemplateService gzhNewsTemplateService;
  63. @Resource
  64. private CustomerManagerService customerManagerService;
  65. @Value("${yijia.path.global-prefix}")
  66. private String globalPrefix;
  67. @Value("${yijia.domainName}")
  68. private String domainName;
  69. // 商户号:852107011000070
  70. // 终端号:33336510
  71. // 密钥(token):dbea558077934b95a2f2adf57d278c40
  72. //测试
  73. // 商户号码:852105942000011
  74. // 终端号:18237172
  75. // 密钥:2ef428f4f76c414282e831baea9e4b0e
  76. //智慧易加
  77. // 商户号码:845104816000034
  78. // 终端号:18241101
  79. // 密钥:23570b46a955484d92038f6a18d2b9d6
  80. // public static final String PAY_VER = "110"; //版本号
  81. // public static final String KEY = ""; //机构秘钥
  82. // public static final String ACCESS_TOKEN = "2ef428f4f76c414282e831baea9e4b0e"; //支付秘钥
  83. // public static final String INST_NO = ""; //机构号
  84. // public static final String MERCHANT_NO = "852105942000011"; //商户号
  85. // public static final String TERMINAL_ID = "18237172"; //终端号
  86. /***
  87. * 公众号云闪付拉起支付
  88. * @param payInfoRequest
  89. * @return
  90. * @throws Exception
  91. */
  92. @RequestMapping(value = {"/yunPayGzh"}, consumes = {"application/json"}, method = {RequestMethod.POST})
  93. @ResponseBody
  94. public String yunPayGzh(@RequestBody PayInfoRequest payInfoRequest) throws Exception {
  95. //智慧易加
  96. // 商户号码:845104816000034
  97. // 终端号:18241101
  98. // 密钥:23570b46a955484d92038f6a18d2b9d6
  99. Gson gson = new Gson();
  100. ResultData resultData = null;
  101. //根据订单号查询订单信息
  102. String ordNo = payInfoRequest.getOrdNo();
  103. PayOrder payOrder=payOrderService.selectOrderInfoByOrdNo(ordNo);
  104. if(payOrder !=null){
  105. if(payOrder.getStatus().equals("0")){
  106. //String stationId = payInfoRequest.getStationId();
  107. Map<String, String> staPayChannelInfo = stationService.getStationAppIdAndAppSecret(Integer.valueOf(payInfoRequest.getStationId()));
  108. if(staPayChannelInfo !=null && staPayChannelInfo.containsKey("merchantNo") && staPayChannelInfo.containsKey("terminalId")
  109. && staPayChannelInfo.containsKey("yunKey") && staPayChannelInfo.containsKey("gzhAppId")){
  110. //创建client
  111. SaobeiApiClient<SaobeiJsPayRequest, SaobeiJsPayResponse> client = new DefaultSaobeiApiClient<>(staPayChannelInfo.get("yunKey"));
  112. //创建requst
  113. SaobeiJsPayRequest requst = new SaobeiJsPayRequest();
  114. requst.setPay_ver("110");
  115. requst.setPay_type("010");
  116. requst.setService_id("012");
  117. requst.setMerchant_no(staPayChannelInfo.get("merchantNo")); //商户号
  118. requst.setTerminal_id(staPayChannelInfo.get("terminalId")); //终端号
  119. requst.setTerminal_trace(payOrder.getOrderNo()); //订单号
  120. requst.setTerminal_time(new SimpleDateFormat("yyyyMMddhhmmss").format(new Date()));
  121. //云闪付金额单位为分
  122. BigDecimal totalFee = new BigDecimal(payOrder.getAmt().toString()).multiply(new BigDecimal("100")).setScale(0, BigDecimal.ROUND_DOWN);
  123. logger.info("该订单金额:" + payOrder.getAmt().toString()+"; 拉起云闪付上送金额(单位:分):" + totalFee.toString());
  124. requst.setTotal_fee(totalFee.toString());
  125. requst.setSub_appid(staPayChannelInfo.get("gzhAppId"));
  126. requst.setOpen_id(payInfoRequest.getOpenId()); //oJR5R6r4EJhaORFcPap70r_mtFZo //oRwjv4iHjSUgxNxOJOQ_60Ln7cno
  127. String orderBody = payOrder.getOilName() + " - " +payOrder.getStationName();
  128. requst.setOrder_body(orderBody);
  129. String notifyUrl = "https://" + this.domainName + "/" + this.globalPrefix + "/getYunPayGzhCallback";
  130. //logger.info("回调地址:"+ notifyUrl);
  131. requst.setNotify_url(notifyUrl);
  132. //发送请求
  133. System.out.println("请求报文:"+JSON.toJSONString(requst));
  134. SaobeiJsPayResponse response = client.execute(requst);
  135. System.out.println("返回报文:"+JSON.toJSONString(response));
  136. resultData = ResultData.success(response);
  137. }else {
  138. resultData = ResultData.error(CodeMsg.STATION_NULL_INFO);
  139. }
  140. }else {
  141. resultData = ResultData.error(CodeMsg.ALREADY_PAY);
  142. }
  143. }else {
  144. resultData = ResultData.error(CodeMsg.NO_ORDER);
  145. }
  146. return gson.toJson(resultData);
  147. }
  148. /***
  149. * 公众号扫呗支付回调
  150. * @param jsonObject
  151. * @return
  152. */
  153. @RequestMapping(value = "/getYunPayGzhCallback", consumes = "application/json", method = RequestMethod.POST)
  154. @ResponseBody
  155. @Transactional
  156. public JSONObject getYunPayGzhCallback(@RequestBody JSONObject jsonObject){
  157. JSONObject result = new JSONObject(); //返回给扫呗状态码
  158. System.out.println("扫呗调用回调接口返回参数:" + jsonObject);
  159. if(jsonObject.containsKey("result_code") && jsonObject.get("result_code").toString().equals("01")){
  160. //业务逻辑
  161. //返给扫呗状态码
  162. result.put("return_code", "01");
  163. result.put("return_msg", "success");
  164. }else {
  165. result.put("return_code", "02");
  166. result.put("return_msg", "fail");
  167. }
  168. return result;
  169. }
  170. /***
  171. * 小程序云闪付拉起支付
  172. * @param payInfoRequest
  173. * @return
  174. * @throws Exception
  175. */
  176. @RequestMapping(value = {"/yunPay"}, consumes = {"application/json"}, method = {RequestMethod.POST})
  177. @ResponseBody
  178. public String yunPay(@RequestBody PayInfoRequest payInfoRequest) throws Exception {
  179. // 智慧易加
  180. // 商户号码:845104816000034
  181. // 终端号:18241101
  182. // 密钥:23570b46a955484d92038f6a18d2b9d6
  183. Gson gson = new Gson();
  184. ResultData resultData = null;
  185. //根据订单号查询订单信息
  186. String ordNo = payInfoRequest.getOrdNo();
  187. PayOrder payOrder=payOrderService.selectOrderInfoByOrdNo(ordNo);
  188. if(payOrder !=null){
  189. if(payOrder.getStatus().equals("0")) {
  190. //String stationId = payInfoRequest.getStationId();
  191. Map<String, String> staPayChannelInfo = stationService.getStationAppIdAndAppSecret(Integer.valueOf(payInfoRequest.getStationId()));
  192. if(staPayChannelInfo !=null && staPayChannelInfo.containsKey("merchantNo") && staPayChannelInfo.containsKey("terminalId")
  193. && staPayChannelInfo.containsKey("yunKey") && staPayChannelInfo.containsKey("appId")) {
  194. //秘钥
  195. String yunKey = staPayChannelInfo.get("yunKey"); //23570b46a955484d92038f6a18d2b9d6
  196. DefaultSaobeiApiClient defaultSaobeiApiClient = new DefaultSaobeiApiClient(yunKey); //2ef428f4f76c414282e831baea9e4b0e
  197. SaobeiMiniPayRequest requst = new SaobeiMiniPayRequest();
  198. requst.setPay_ver("100");
  199. requst.setPay_type("010");
  200. requst.setService_id("015");
  201. requst.setMerchant_no(staPayChannelInfo.get("merchantNo")); //商户号 845104816000034
  202. requst.setTerminal_id(staPayChannelInfo.get("terminalId")); //终端号 18241101
  203. requst.setTerminal_trace(payOrder.getOrderNo()); //订单号 202003252204310000 6683315853083916109905
  204. requst.setTerminal_time(new SimpleDateFormat("yyyyMMddhhmmss").format(new Date())); //"20200325220431"
  205. //云闪付单位为分
  206. BigDecimal totalFee = new BigDecimal(payOrder.getAmt().toString()).multiply(new BigDecimal("100")).setScale(0, BigDecimal.ROUND_DOWN);
  207. logger.info("该订单金额:" + payOrder.getAmt().toString()+"; 拉起云闪付上送金额(单位:分):" + totalFee.toString());
  208. requst.setTotal_fee(totalFee.toString());
  209. String openId = payInfoRequest.getOpenId();
  210. requst.setOpen_id(openId); // oRwjv4iHjSUgxNxOJOQ_60Ln7cno obnG9jhDLvom5fGwuhYysmQTW4qQ
  211. //订单内容
  212. String orderBody = payOrder.getOilName()+ " - " + payOrder.getOilGun() + "号枪 - " +payOrder.getStationName();
  213. requst.setOrder_body(orderBody);
  214. //回调地址
  215. String notifyUrl = "https://" + this.domainName + "/" + this.globalPrefix + "/getYunPayCallback";
  216. logger.info("回调地址:" + notifyUrl);
  217. requst.setNotify_url(notifyUrl);
  218. //小程序appId
  219. requst.setSub_appid(staPayChannelInfo.get("appId")); // wxe1135cd390b38a54 wxe568c727d466aef9 智慧易加公众号:wxc8189d3b3a7283e0
  220. System.out.println("请求报文:" + JSON.toJSONString(requst));
  221. SaobeiMiniPayResponse response = (SaobeiMiniPayResponse) defaultSaobeiApiClient.execute(requst);
  222. System.out.println("返回报文:" + JSON.toJSONString(response));
  223. // {
  224. // 'timeStamp': timeStamp,
  225. // 'nonceStr': nonceStr,
  226. // 'package': payPackage,
  227. // 'signType': signType,
  228. // 'paySign': paySign,
  229. // }
  230. resultData = ResultData.success(response);
  231. }else {
  232. resultData = ResultData.error(CodeMsg.STATION_NULL_INFO);
  233. }
  234. }else {
  235. resultData = ResultData.error(CodeMsg.ALREADY_PAY);
  236. }
  237. }else {
  238. resultData = ResultData.error(CodeMsg.NO_ORDER);
  239. }
  240. return gson.toJson(resultData);
  241. }
  242. // /***
  243. // * 小程序云闪付扫呗回调
  244. // * @param jsonObject
  245. // * @return
  246. // */
  247. // @RequestMapping(value = "/getYunPayCallback", consumes = "application/json", method = RequestMethod.POST)
  248. // @ResponseBody
  249. // @Transactional
  250. // public JSONObject getYunPayCallback(@RequestBody JSONObject jsonObject){
  251. // JSONObject result = new JSONObject(); //返回给扫呗状态码
  252. // logger.info("扫呗调用回调接口返回参数:" + jsonObject);
  253. // if(jsonObject.containsKey("result_code") && jsonObject.get("result_code").toString().equals("01")){
  254. //
  255. // //业务逻辑
  256. //
  257. // //返给扫呗状态码
  258. // result.put("return_code", "01");
  259. // result.put("return_msg", "success");
  260. // }else {
  261. // result.put("return_code", "02");
  262. // result.put("return_msg", "fail");
  263. // }
  264. // return result;
  265. // }
  266. //=========================================================== 以下为测试接口 =================================================================================//
  267. /***
  268. * 小程序云闪付拉起支付
  269. * @param payInfoRequest
  270. * @return
  271. * @throws Exception
  272. */
  273. @RequestMapping(value = {"/yunPayTest"}, consumes = {"application/json"}, method = {RequestMethod.POST})
  274. @ResponseBody
  275. public String yunPayTest(@RequestBody PayInfoRequest payInfoRequest) throws Exception {
  276. // 智慧易加
  277. // 商户号码:845104816000034
  278. // 终端号:18241101
  279. // 密钥:23570b46a955484d92038f6a18d2b9d6
  280. Gson gson = new Gson();
  281. ResultData resultData = null;
  282. DefaultSaobeiApiClient defaultSaobeiApiClient = new DefaultSaobeiApiClient("23570b46a955484d92038f6a18d2b9d6"); //2ef428f4f76c414282e831baea9e4b0e
  283. SaobeiMiniPayRequest requst = new SaobeiMiniPayRequest();
  284. requst.setPay_ver("110");
  285. requst.setPay_type("010");
  286. requst.setService_id("015");
  287. requst.setMerchant_no("845104816000034"); //852105942000011
  288. requst.setTerminal_id("18241101"); //18237172
  289. Random random = new Random();
  290. String result = "";
  291. for (int i = 0; i < 6; i++) {
  292. result += random.nextInt(10);
  293. }
  294. String ordNo_1 = System.nanoTime() + result;
  295. requst.setTerminal_trace(ordNo_1); //202003252204310000
  296. requst.setTerminal_time(new SimpleDateFormat("yyyyMMddhhmmss").format(new Date())); //"20200325220431"
  297. String amt = payInfoRequest.getAmt();
  298. requst.setTotal_fee("1");
  299. String openId = payInfoRequest.getOpenId();
  300. requst.setOpen_id("oRwjv4iHjSUgxNxOJOQ_60Ln7cno"); // oRwjv4iHjSUgxNxOJOQ_60Ln7cno obnG9jhDLvom5fGwuhYysmQTW4qQ
  301. requst.setOrder_body("sdk测试");
  302. String notifyUrl = "https://" + this.domainName + "/" + this.globalPrefix + "/getYunPayCallback";
  303. logger.info("回调地址"+ notifyUrl);
  304. requst.setNotify_url(notifyUrl);
  305. requst.setSub_appid("wxe1135cd390b38a54"); // 智慧易加小程序: wxe1135cd390b38a54 wxe568c727d466aef9 智慧易加公众号:wxc8189d3b3a7283e0
  306. System.out.println("请求报文"+ JSON.toJSONString(requst));
  307. SaobeiMiniPayResponse response = (SaobeiMiniPayResponse)defaultSaobeiApiClient.execute(requst);
  308. System.out.println("返回报文"+ JSON.toJSONString(response));
  309. resultData = ResultData.success(response);
  310. return gson.toJson(resultData);
  311. }
  312. /***
  313. * 测试
  314. * 公众号云闪付拉起支付
  315. * @param payInfoRequest
  316. * @return
  317. * @throws Exception
  318. */
  319. @RequestMapping(value = {"/yunPayGzhTest"}, consumes = {"application/json"}, method = {RequestMethod.POST})
  320. @ResponseBody
  321. public String yunPayGzhTest(@RequestBody PayInfoRequest payInfoRequest) throws Exception {
  322. //智慧易加
  323. // 商户号码:845104816000034
  324. // 终端号:18241101
  325. // 密钥:23570b46a955484d92038f6a18d2b9d6
  326. Gson gson = new Gson();
  327. ResultData resultData = null;
  328. //创建client
  329. SaobeiApiClient<SaobeiJsPayRequest, SaobeiJsPayResponse> client = new DefaultSaobeiApiClient<>("23570b46a955484d92038f6a18d2b9d6");
  330. //创建requst
  331. SaobeiJsPayRequest requst = new SaobeiJsPayRequest();
  332. requst.setPay_ver("110");
  333. requst.setPay_type("010");
  334. requst.setService_id("012");
  335. requst.setMerchant_no("845104816000034");
  336. requst.setTerminal_id("18241101");
  337. Random random = new Random();
  338. String result = "";
  339. for (int i = 0; i < 6; i++) {
  340. result += random.nextInt(10);
  341. }
  342. String ordNo_1 = System.nanoTime() + result;
  343. requst.setTerminal_trace(ordNo_1); //202003252204310000
  344. requst.setTerminal_time(new SimpleDateFormat("yyyyMMddhhmmss").format(new Date()));
  345. requst.setTotal_fee("1");
  346. requst.setSub_appid("wxc8189d3b3a7283e0");
  347. requst.setOpen_id("oJR5R6r4EJhaORFcPap70r_mtFZo"); //oJR5R6r4EJhaORFcPap70r_mtFZo //oRwjv4iHjSUgxNxOJOQ_60Ln7cno
  348. requst.setOrder_body("sdk测试");
  349. String notifyUrl = "https://" + this.domainName + "/" + this.globalPrefix + "/getYunPayGzhCallback";
  350. logger.info("回调地址:"+ notifyUrl);
  351. requst.setNotify_url(notifyUrl);
  352. //发送请求
  353. System.out.println("请求报文:"+JSON.toJSONString(requst));
  354. SaobeiJsPayResponse response = client.execute(requst);
  355. System.out.println("返回报文:"+JSON.toJSONString(response));
  356. resultData = ResultData.success(response);
  357. return gson.toJson(resultData);
  358. }
  359. }