CashController.java 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766
  1. package com.sqx.modules.pay.controller;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import com.alibaba.fastjson.JSON;
  4. import com.alipay.api.AlipayApiException;
  5. import com.alipay.api.AlipayClient;
  6. import com.alipay.api.CertAlipayRequest;
  7. import com.alipay.api.DefaultAlipayClient;
  8. import com.alipay.api.request.AlipayFundTransToaccountTransferRequest;
  9. import com.alipay.api.request.AlipayFundTransUniTransferRequest;
  10. import com.alipay.api.response.AlipayFundTransToaccountTransferResponse;
  11. import com.alipay.api.response.AlipayFundTransUniTransferResponse;
  12. import com.sqx.common.utils.PageUtils;
  13. import com.sqx.common.utils.Result;
  14. import com.sqx.modules.app.dao.UserCashOutDao;
  15. import com.sqx.modules.app.entity.UserEntity;
  16. import com.sqx.modules.app.entity.UserMoneyDetails;
  17. import com.sqx.modules.app.service.UserMoneyDetailsService;
  18. import com.sqx.modules.app.service.UserMoneyService;
  19. import com.sqx.modules.app.service.UserService;
  20. import com.sqx.modules.common.entity.CommonInfo;
  21. import com.sqx.modules.common.service.CommonInfoService;
  22. import com.sqx.modules.message.entity.MessageInfo;
  23. import com.sqx.modules.message.service.MessageService;
  24. import com.sqx.modules.pay.config.AliPayConstants;
  25. import com.sqx.modules.pay.dao.CashOutDao;
  26. import com.sqx.modules.pay.entity.AliPayWithdrawModel;
  27. import com.sqx.modules.pay.entity.CashOut;
  28. import com.sqx.modules.pay.service.CashOutService;
  29. import com.sqx.modules.pay.service.PayDetailsService;
  30. import com.sqx.modules.utils.*;
  31. import com.sqx.modules.utils.excel.ExcelData;
  32. import com.sqx.modules.utils.excel.ExportExcelUtils;
  33. import io.swagger.annotations.Api;
  34. import io.swagger.annotations.ApiOperation;
  35. import io.swagger.annotations.ApiParam;
  36. import lombok.extern.slf4j.Slf4j;
  37. import lombok.val;
  38. import org.apache.commons.lang.StringUtils;
  39. import org.apache.commons.lang.exception.ExceptionUtils;
  40. import org.springframework.beans.factory.annotation.Autowired;
  41. import org.springframework.web.bind.annotation.*;
  42. import com.sqx.modules.sys.controller.AbstractController;
  43. import javax.servlet.http.HttpServletResponse;
  44. import java.math.BigDecimal;
  45. import java.text.SimpleDateFormat;
  46. import java.util.Date;
  47. import java.util.HashMap;
  48. import java.util.List;
  49. import java.util.Map;
  50. import java.util.concurrent.locks.ReentrantReadWriteLock;
  51. /**
  52. * @author fang
  53. * @date 2020/5/15
  54. */
  55. @Slf4j
  56. @RestController
  57. @Api(value = "管理平台", tags = {"管理平台"})
  58. @RequestMapping(value = "/cash")
  59. public class CashController {
  60. /** 充值记录 */
  61. @Autowired
  62. private PayDetailsService payDetailsService;
  63. /** 提现记录 */
  64. @Autowired
  65. private CashOutService cashOutService;
  66. /** app用户 */
  67. @Autowired
  68. private UserService userService;
  69. /** 通用配置 */
  70. @Autowired
  71. private CommonInfoService commonInfoService;
  72. @Autowired
  73. private UserMoneyDetailsService userMoneyDetailsService;
  74. @Autowired
  75. private MessageService messageService;
  76. @Autowired
  77. private UserCashOutDao userCashOutDao;
  78. @Autowired
  79. private CashOutDao cashOutDao;
  80. @Autowired
  81. private UserMoneyService userMoneyService;
  82. private ReentrantReadWriteLock reentrantReadWriteLock=new ReentrantReadWriteLock(true);
  83. @RequestMapping(value = "/sendMsgByUserId", method = RequestMethod.GET)
  84. @ApiOperation("管理平台主动推送消息(指定用户)")
  85. @ResponseBody
  86. public Result sendMsgByUserId(String title, String content, Long userId){
  87. UserEntity user = userService.queryByUserId(userId);
  88. send(user,title,content);
  89. return Result.success();
  90. }
  91. @RequestMapping(value = "/sendMsg", method = RequestMethod.GET)
  92. @ApiOperation("管理平台主动推送消息")
  93. @ResponseBody
  94. public Result sendMsg(String title, String content, String phone, Integer flag){
  95. if(flag==1){
  96. //根据手机号推送
  97. UserEntity userByPhone = userService.queryByPhone(phone);
  98. if(null==userByPhone){
  99. return Result.error(-100,"手机号不存在!");
  100. }
  101. send(userByPhone,title,content);
  102. }else{
  103. //所有人推送
  104. List<UserEntity> userInfos = userService.list();
  105. //用户数量较大 使用多线程推送 根据用户数量进行拆分 同时按照3个线程进行推送
  106. int count = userInfos.size() / 3;
  107. new Thread(() -> {
  108. for(int i=0 ;i<count;i++){
  109. send(userInfos.get(i),title,content);
  110. }
  111. }).start();
  112. new Thread(() -> {
  113. for(int i=count ;i<count*2;i++){
  114. send(userInfos.get(i),title,content);
  115. }
  116. }).start();
  117. new Thread(() -> {
  118. for(int i=count*2 ;i<userInfos.size();i++){
  119. send(userInfos.get(i),title,content);
  120. }
  121. }).start();
  122. /* for(UserInfo userByPhone:userInfos){
  123. }*/
  124. }
  125. return Result.success();
  126. }
  127. private void send(UserEntity userByPhone, String title, String content){
  128. if (userByPhone.getClientid() != null) {
  129. userService.pushToSingle(title, content, userByPhone.getClientid());
  130. }
  131. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  132. MessageInfo messageInfo = new MessageInfo();
  133. messageInfo.setContent(content);
  134. messageInfo.setTitle(title);
  135. messageInfo.setState(String.valueOf(5));
  136. messageInfo.setUserName(userByPhone.getUserName());
  137. messageInfo.setUserId(String.valueOf(userByPhone.getUserId()));
  138. messageInfo.setCreateAt(simpleDateFormat.format(new Date()));
  139. messageInfo.setIsSee("0");
  140. messageService.saveBody(messageInfo);
  141. }
  142. @RequestMapping(value = "/selectCashOut", method = RequestMethod.GET)
  143. @ApiOperation("获取最新的提现信息")
  144. @ResponseBody
  145. public Result selectCashOut(){
  146. return Result.success().put("data",cashOutService.selectCashOutLimit3());
  147. }
  148. @RequestMapping(value = "/selectSumPay", method = RequestMethod.GET)
  149. @ApiOperation("查询用户充值金额")
  150. @ResponseBody
  151. public Result selectSumPay(String createTime, String endTime, Long userId){
  152. return Result.success().put("data",payDetailsService.selectSumPay(createTime,endTime,userId));
  153. }
  154. @RequestMapping(value = "/selectUserRecharge", method = RequestMethod.GET)
  155. @ApiOperation("查询所有用户充值信息列表")
  156. @ResponseBody
  157. public Result selectUserRecharge(int page, int limit, String startTime, String endTime, Integer state){
  158. return Result.success().put("data",payDetailsService.selectPayDetails(page,limit,startTime,endTime,null,state));
  159. }
  160. @RequestMapping(value = "/selectUserRechargeByUserId", method = RequestMethod.GET)
  161. @ApiOperation("查询某个用户充值信息列表")
  162. @ResponseBody
  163. public Result selectUserRechargeByUserId(int page, int limit, String startTime, String endTime, Long userId, Integer state){
  164. return Result.success().put("data",payDetailsService.selectPayDetails(page,limit,startTime,endTime,userId,state));
  165. }
  166. @RequestMapping(value = "/selectUserRechargeByUserIdApp", method = RequestMethod.GET)
  167. @ApiOperation("查询某个用户充值信息列表")
  168. @ResponseBody
  169. public Result selectUserRechargeByUserIdApp(int page, int limit, String startTime, String endTime, Long userId){
  170. return Result.success().put("data",payDetailsService.selectPayDetails(page,limit,startTime,endTime,userId,1));
  171. }
  172. @RequestMapping(value = "/selectPayDetails", method = RequestMethod.GET)
  173. @ApiOperation("查询提现记录列表")
  174. @ResponseBody
  175. public Result selectHelpProfit(@ApiParam("页码") int page,
  176. @ApiParam("大小") int limit,
  177. @ApiParam("支付宝名称") String zhifubaoName,
  178. @ApiParam("支付宝账号") String zhifubao,
  179. @ApiParam("用户id") String userId,
  180. @ApiParam("提现状态") Integer state,
  181. @ApiParam("用户手机号") String phone,
  182. @ApiParam("店铺名称") String shopName,
  183. @ApiParam("分类 1用户提现 2退保障金") String type,
  184. Integer classify,
  185. String startTime, String endTime){
  186. Map<String,Object> map=new HashMap<>();
  187. map.put("page",page);
  188. map.put("limit",limit);
  189. map.put("zhifubaoName",zhifubaoName);
  190. map.put("zhifubao",zhifubao);
  191. map.put("userId",userId);
  192. map.put("type",type);
  193. map.put("state",state);
  194. map.put("phone",phone);
  195. map.put("shopName", shopName);
  196. map.put("classify",classify);
  197. map.put("startTime",startTime);
  198. map.put("endTime",endTime);
  199. PageUtils pageUtils = cashOutService.selectCashOutList(map);
  200. return Result.success().put("data",pageUtils);
  201. }
  202. @RequestMapping(value = "/selectPayTotal", method = RequestMethod.GET)
  203. @ApiOperation("查询提现记录总金额")
  204. @ResponseBody
  205. public Result selectPayTotal(Map<String, Object> map){
  206. Double total = cashOutService.selectCashOutTotal(map);
  207. return Result.success().put("data", total);
  208. }
  209. @RequestMapping(value = "/excelPayDetails", method = RequestMethod.GET)
  210. @ApiOperation("查询提现记录列表")
  211. @ResponseBody
  212. public void excelPayDetails(@ApiParam("支付宝名称") String zhifubaoName,
  213. @ApiParam("支付宝账号") String zhifubao,
  214. @ApiParam("用户id") String userId,
  215. @ApiParam("提现状态") Integer state,
  216. @ApiParam("用户手机号") String phone,
  217. @ApiParam("分类 1用户提现 2退保障金") String type,
  218. Integer classify,
  219. String startTime, String endTime, HttpServletResponse response)throws Exception {
  220. Map<String,Object> map=new HashMap<>();
  221. map.put("zhifubaoName",zhifubaoName);
  222. map.put("zhifubao",zhifubao);
  223. map.put("userId",userId);
  224. map.put("type",type);
  225. map.put("state",state);
  226. map.put("phone",phone);
  227. map.put("classify",classify);
  228. map.put("startTime",startTime);
  229. map.put("endTime",endTime);
  230. ExcelData data = cashOutService.excelPayDetails(map);
  231. ExportExcelUtils.exportExcel(response,"财务列表.xlsx",data);
  232. }
  233. /*@ApiOperation("财务提现统计")
  234. @GetMapping("/statisticsCashMoney")
  235. public Result statisticsMoney(String time, Integer flag){
  236. Double sumMoney = cashOutService.sumMoney(time, flag);
  237. Integer countMoney = cashOutService.countMoney(time, flag);
  238. Integer stayMoney = cashOutService.stayMoney(time, flag);
  239. Map<String,Object> map=new HashMap<>();
  240. map.put("sumMoney",sumMoney==null?0.00:sumMoney);
  241. map.put("countMoney",countMoney==null?0:countMoney);
  242. map.put("stayMoney",stayMoney==null?0:stayMoney);
  243. return Result.success().put("data",map);
  244. }*/
  245. @ApiOperation("新财务提现统计")
  246. @GetMapping(value = "statisticsMoney")
  247. public Result statisticsMoney(String date, String dateType, Integer type){
  248. return cashOutService.statisticsMoney(date, dateType, type);
  249. }
  250. @ApiOperation("平台收入统计")
  251. @GetMapping(value = "incomeStatistics")
  252. public Result incomeStatistics(String date, String dateType){
  253. return cashOutService.incomeStatistics(date, dateType);
  254. }
  255. @ApiOperation("充值统计")
  256. @GetMapping("/payMember")
  257. public Result payMember(String time, Integer flag, Integer payClassify){
  258. Double sumMoney = payDetailsService.selectSumPayByClassify(time, flag, null,payClassify);
  259. Double weiXinGZHMoney = payDetailsService.selectSumPayByClassify(time, flag, 2,payClassify);
  260. Double weiXinXCXMoney = payDetailsService.selectSumPayByClassify(time, flag, 3,payClassify);
  261. Map<String,Object> map=new HashMap<>();
  262. map.put("sumMoney",sumMoney==null?0.00:sumMoney);
  263. map.put("weiXinGZHMoney",weiXinGZHMoney==null?0.00:weiXinGZHMoney);
  264. map.put("weiXinXCXMoney",weiXinXCXMoney==null?0.00:weiXinXCXMoney);
  265. return Result.success().put("data",map);
  266. }
  267. /*
  268. @ApiOperation("收入统计")
  269. @GetMapping("/statisticsIncomeMoney")
  270. public Result statisticsIncomeMoney(String time, Integer flag){
  271. Double sumMoney = ordersService.statisticsIncomeMoney(time, flag, null);
  272. Double courseMoney = ordersService.statisticsIncomeMoney(time, flag, 1);
  273. Double vipMoney = ordersService.statisticsIncomeMoney(time, flag, 2);
  274. Map<String,Object> map=new HashMap<>();
  275. map.put("sumMoney",sumMoney==null?0.00:sumMoney);
  276. map.put("courseMoney",courseMoney==null?0.00:courseMoney);
  277. map.put("vipMoney",vipMoney==null?0.00:vipMoney);
  278. return Result.success().put("data",map);
  279. }
  280. */
  281. @RequestMapping(value = "/alipay/{cashId}", method = RequestMethod.POST)
  282. @ApiOperation("管理平台确认提现")
  283. @ResponseBody
  284. public Result alipayPay(@PathVariable Long cashId) {
  285. CashOut one = cashOutService.selectById(cashId);
  286. if (one == null) {
  287. return Result.error("提现记录不存在!");
  288. }
  289. if (one.getState()!=0) {
  290. return Result.error(9999, one.getZhifubaoName() + "转账失败!原因是用户已转账");
  291. }
  292. if(one.getClassify()==null || one.getClassify()==1){
  293. //支付宝
  294. return aliPay(one);
  295. }else{
  296. //微信
  297. return wxPay(one);
  298. }
  299. }
  300. private Result wxPay(CashOut one){
  301. reentrantReadWriteLock.writeLock().lock();
  302. try{
  303. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  304. UserEntity userEntity = userService.getById(one.getUserId());
  305. if(StringUtils.isEmpty(one.getOrderNumber())){
  306. one.setOrderNumber(String.valueOf(System.currentTimeMillis()));
  307. }
  308. String value = commonInfoService.findOne(290).getValue();
  309. if("1".equals(value)){
  310. WxPay wxPay=new WxPay();
  311. CommonInfo mchId = commonInfoService.findOne(250);
  312. CommonInfo key = commonInfoService.findOne(251);
  313. //小程序或公众号appid
  314. if(one.getClassify()==2){
  315. CommonInfo mchAppId = commonInfoService.findOne(248);
  316. wxPay.setMch_appid(mchAppId.getValue());
  317. wxPay.setOpenid(userEntity.getOpenId());
  318. }else if(one.getClassify()==3){
  319. CommonInfo mchAppId = commonInfoService.findOne(262);
  320. wxPay.setMch_appid(mchAppId.getValue());
  321. wxPay.setOpenid(userEntity.getWxOpenId());
  322. }
  323. //商户号id
  324. wxPay.setMchid(mchId.getValue());
  325. //随机字符
  326. wxPay.setNonce_str(WxPayUtils.generateNonceStr());
  327. //商户订单号 需保持唯一
  328. wxPay.setPartner_trade_no(one.getOrderNumber());
  329. //用户openId
  330. //NO_CHECK:不校验真实姓名
  331. //FORCE_CHECK:强校验真实姓名
  332. wxPay.setCheck_name("NO_CHECK");
  333. //转账金额 微信为分
  334. double v = Double.parseDouble(one.getMoney());
  335. Double mul = AmountCalUtils.mul(v, 100);
  336. Integer amount=mul.intValue();
  337. wxPay.setAmount(amount);
  338. //备注
  339. CommonInfo one1 = commonInfoService.findOne(12);
  340. wxPay.setDesc(one1.getValue()+"提现金额到账");
  341. wxPay.setSign(WxPayUtils.createSign(BeanUtil.beanToMap(wxPay), key.getValue()));
  342. String xmlParam = XmlUtil.beanToXml(wxPay,WxPay.class);
  343. WeChatPayRequest weChatPayRequest = new WeChatPayRequest();
  344. String returnXml = null;
  345. try {
  346. CommonInfo zsUlr = commonInfoService.findOne(291);
  347. returnXml = weChatPayRequest.request(zsUlr.getValue(),WxPayUtils.WX_COM_DO_TRANS_URL,xmlParam,true,mchId.getValue());
  348. WxResult wxResult = XmlUtil.xmlToBean(returnXml, WxResult.class);
  349. if(wxResult.getReturn_code().equals("SUCCESS")){
  350. if(one.getOrderNumber().equals(wxResult.getPartner_trade_no())){
  351. one.setState(1);
  352. one.setOutAt(sdf.format(new Date()));
  353. cashOutService.update(one);
  354. UserEntity userInfo=userService.getById(one.getUserId());
  355. MessageInfo messageInfo = new MessageInfo();
  356. messageInfo.setContent(one.getMoney()+"提现已到账");
  357. messageInfo.setTitle("提现到账");
  358. messageInfo.setState(String.valueOf(5));
  359. messageInfo.setUserName(userInfo.getUserName());
  360. messageInfo.setUserId(String.valueOf(userInfo.getUserId()));
  361. messageInfo.setCreateAt(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
  362. messageService.saveBody(messageInfo);
  363. return Result.success(one.getZhifubaoName() + "转账成功");
  364. }else{
  365. return Result.error("转账失败!原因:"+wxResult.getErr_code_des());
  366. }
  367. }else{
  368. return Result.error("转账失败!状态码:"+wxResult.getErr_code_des());
  369. }
  370. } catch (Exception e) {
  371. log.error("转账异常:"+e.getMessage(),e);
  372. log.error("postWxTransfers 微信处理异常 ==>{}", ExceptionUtils.getStackTrace(e));
  373. }
  374. }else {
  375. Date now = new Date();
  376. one.setState(1);
  377. one.setOutAt(sdf.format(now));
  378. cashOutService.update(one);
  379. UserEntity userInfo=userService.queryByUserId(one.getUserId());
  380. cashOutService.cashOutSuccess(userInfo, one.getOutAt(), one.getMoney(), one.getZhifubao(),commonInfoService.findOne(19).getValue());
  381. return Result.success(one.getZhifubaoName() + "转账成功");
  382. }
  383. }catch (Exception e){
  384. e.printStackTrace();
  385. log.error("转账出错了!!!"+e.getMessage(),e);
  386. }finally {
  387. reentrantReadWriteLock.writeLock().unlock();
  388. }
  389. return Result.error("转账失败!");
  390. }
  391. private Result aliPay(CashOut one) {
  392. reentrantReadWriteLock.writeLock().lock();
  393. try {
  394. log.error("进来了!!!");
  395. if (one == null) {
  396. return Result.error("提现记录不存在!");
  397. }
  398. if (one.getState()!=0) {
  399. return Result.error(9999, one.getZhifubaoName() + "转账失败!原因是用户已转账");
  400. }
  401. if(StringUtils.isEmpty(one.getOrderNumber())){
  402. one.setOrderNumber(String.valueOf(System.currentTimeMillis()));
  403. }
  404. CommonInfo commonInfo = commonInfoService.findOne(98);
  405. CommonInfo name = commonInfoService.findOne(12);
  406. if (commonInfo.getValue() != null && commonInfo.getValue().equals("1")) {
  407. AlipayClient alipayClient = new DefaultAlipayClient(AliPayConstants.REQUEST_URL,
  408. commonInfoService.findOne(63).getValue(), commonInfoService.findOne(65).getValue(), AliPayConstants.FORMAT,
  409. AliPayConstants.CHARSET, commonInfoService.findOne(64).getValue(), AliPayConstants.SIGNTYPE);
  410. val aliPayWithdrawModel = AliPayWithdrawModel.builder()
  411. .out_biz_no(one.getOrderNumber())
  412. .amount(new BigDecimal(one.getMoney()))
  413. .payee_account(one.getZhifubao())
  414. .payee_real_name(one.getZhifubaoName())
  415. .payee_type(AliPayConstants.PAY_TYPE)
  416. .remark(name.getValue())
  417. .build();
  418. String json = JSON.toJSONString(aliPayWithdrawModel);
  419. //实例化连接对象
  420. AlipayFundTransToaccountTransferRequest withdrawRequest = new AlipayFundTransToaccountTransferRequest();
  421. withdrawRequest.setBizContent(json);
  422. try {
  423. AlipayFundTransToaccountTransferResponse response = alipayClient.execute(withdrawRequest);
  424. if (AliPayConstants.SUCCESS_CODE.equalsIgnoreCase(response.getCode())) {
  425. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  426. one.setState(1);
  427. one.setOutAt(sdf.format(new Date()));
  428. cashOutService.update(one);
  429. UserEntity userInfo=userService.getById(one.getUserId());
  430. MessageInfo messageInfo = new MessageInfo();
  431. messageInfo.setCreateAt(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
  432. messageInfo.setContent(one.getMoney()+"提现已到账");
  433. messageInfo.setTitle("提现到账");
  434. messageInfo.setState(String.valueOf(5));
  435. messageInfo.setUserName(userInfo.getUserName());
  436. messageInfo.setUserId(String.valueOf(userInfo.getUserId()));
  437. messageService.saveBody(messageInfo);
  438. return Result.success(one.getZhifubaoName() + "转账成功");
  439. } else {
  440. return Result.error(9999, one.getZhifubaoName() + "转账失败!" + response.getSubMsg());
  441. }
  442. } catch (AlipayApiException e) {
  443. log.error("零钱提现异常原因:" + e.getMessage());
  444. e.printStackTrace();
  445. return Result.error(9999, one.getZhifubaoName() + "转账失败!" + e.getMessage());
  446. }
  447. }else if(commonInfo.getValue() != null && commonInfo.getValue().equals("2")){
  448. try {
  449. CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
  450. certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do"); //gateway:支付宝网关(固定)https://openapi.alipay.com/gateway.do
  451. certAlipayRequest.setAppId(commonInfoService.findOne(329).getValue()); //APPID 即创建应用后生成,详情见创建应用并获取 APPID
  452. certAlipayRequest.setPrivateKey(commonInfoService.findOne(330).getValue()); //开发者应用私钥,由开发者自己生成
  453. certAlipayRequest.setFormat("json"); //参数返回格式,只支持 json 格式
  454. certAlipayRequest.setCharset(AliPayConstants.CHARSET); //请求和签名使用的字符编码格式,支持 GBK和 UTF-8
  455. certAlipayRequest.setSignType(AliPayConstants.SIGNTYPE); //商户生成签名字符串所使用的签名算法类型,目前支持 RSA2 和 RSA,推荐商家使用 RSA2。
  456. /*String cerPath=this.getClass().getClassLoader().getResource("zhifubao/appCertPublicKey.crt").getPath();
  457. String alipayPublicCertPath=this.getClass().getClassLoader().getResource("zhifubao/alipayCertPublicKey_RSA2.crt").getPath();
  458. String rootCertPath=this.getClass().getClassLoader().getResource("zhifubao/alipayRootCert.crt").getPath();
  459. //获取的文件路径前缀会携带斜杠 所以截取掉*/
  460. CommonInfo url = commonInfoService.findOne(328);
  461. certAlipayRequest.setCertPath(url.getValue()+"/appCertPublicKey.crt"); //应用公钥证书路径(app_cert_path 文件绝对路径)
  462. certAlipayRequest.setAlipayPublicCertPath(url.getValue()+"/alipayCertPublicKey_RSA2.crt"); //支付宝公钥证书文件路径(alipay_cert_path 文件绝对路径)
  463. certAlipayRequest.setRootCertPath(url.getValue()+"/alipayRootCert.crt"); //支付宝CA根证书文件路径(alipay_root_cert_path 文件绝对路径)
  464. AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);
  465. AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
  466. request.setBizContent("{" +
  467. "\"out_biz_no\":\""+one.getOrderNumber()+"\"," +
  468. "\"trans_amount\":"+new BigDecimal(one.getMoney())+"," +
  469. "\"product_code\":\"TRANS_ACCOUNT_NO_PWD\"," +
  470. "\"biz_scene\":\"DIRECT_TRANSFER\"," +
  471. "\"order_title\":\""+name.getValue() + "佣金结算"+"\"," +
  472. "\"payee_info\":{" +
  473. "\"identity\":\""+one.getZhifubao()+"\"," +
  474. "\"identity_type\":\"ALIPAY_LOGON_ID\"," +
  475. "\"name\":\""+one.getZhifubaoName()+"\"," +
  476. "}," +
  477. "\"remark\":\""+name.getValue() + "佣金结算"+"\"" +
  478. "}");
  479. AlipayFundTransUniTransferResponse response = null;
  480. response = alipayClient.certificateExecute(request);
  481. log.error("支付宝转账返回值:"+response.getBody());
  482. if (AliPayConstants.SUCCESS_CODE.equalsIgnoreCase(response.getCode())) {
  483. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  484. one.setState(1);
  485. one.setOutAt(sdf.format(new Date()));
  486. cashOutService.update(one);
  487. UserEntity userInfo=userService.getById(one.getUserId());
  488. MessageInfo messageInfo = new MessageInfo();
  489. messageInfo.setCreateAt(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
  490. messageInfo.setContent(one.getMoney()+"提现已到账");
  491. messageInfo.setTitle("提现到账");
  492. messageInfo.setState(String.valueOf(5));
  493. messageInfo.setUserName(userInfo.getUserName());
  494. messageInfo.setUserId(String.valueOf(userInfo.getUserId()));
  495. messageService.saveBody(messageInfo);
  496. return Result.success(one.getZhifubaoName() + "转账成功");
  497. } else {
  498. return Result.error(9999, one.getZhifubaoName() + "转账失败!" + response.getSubMsg());
  499. }
  500. } catch (AlipayApiException e) {
  501. log.error("零钱提现异常原因:" + e.getMessage());
  502. e.printStackTrace();
  503. return Result.error(9999, one.getZhifubaoName() + "转账失败!" + e.getMessage());
  504. }
  505. } else{
  506. //人工转账后改变状态的
  507. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  508. Date now = new Date();
  509. one.setState(1);
  510. one.setOutAt(sdf.format(now));
  511. cashOutService.update(one);
  512. UserEntity userInfo=userService.getById(one.getUserId());
  513. MessageInfo messageInfo = new MessageInfo();
  514. messageInfo.setCreateAt(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
  515. messageInfo.setContent(one.getMoney()+"提现已到账");
  516. messageInfo.setTitle("提现到账");
  517. messageInfo.setState(String.valueOf(5));
  518. messageInfo.setUserName(userInfo.getUserName());
  519. messageInfo.setUserId(String.valueOf(userInfo.getUserId()));
  520. messageService.saveBody(messageInfo);
  521. return Result.success(one.getZhifubaoName() + "转账成功");
  522. }
  523. }catch (Exception e){
  524. e.printStackTrace();
  525. log.error("转账异常"+e.getMessage());
  526. }finally {
  527. reentrantReadWriteLock.writeLock().unlock();
  528. }
  529. return Result.error("系统繁忙,请稍后再试!");
  530. }
  531. /*@RequestMapping(value = "/alipay/{cashId}", method = RequestMethod.POST)
  532. @ApiOperation("管理平台确认提现")
  533. @ResponseBody
  534. public Result alipayPay(@PathVariable Long cashId) {
  535. reentrantReadWriteLock.writeLock().lock();
  536. try {
  537. //提现订单
  538. CashOut one = cashOutService.selectById(cashId);
  539. log.error("进来了!!!");
  540. //订单记录不为空
  541. if (one == null) {
  542. return Result.error("提现记录不存在!");
  543. }
  544. //订单状态不是待转帐
  545. if (one.getState()!=0) {
  546. return Result.error(9999, one.getZhifubaoName() + "转账失败!原因是用户已转账");
  547. }
  548. //订单编号为空
  549. if(StringUtils.isEmpty(one.getOrderNumber())){
  550. one.setOrderNumber(String.valueOf(System.currentTimeMillis()));
  551. }
  552. //配置文件对象
  553. CommonInfo commonInfo = commonInfoService.findOne(98);
  554. CommonInfo name = commonInfoService.findOne(12);
  555. if (commonInfo.getValue() != null && commonInfo.getValue().equals("1")) {
  556. try {
  557. CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
  558. certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do"); //gateway:支付宝网关(固定)https://openapi.alipay.com/gateway.do
  559. certAlipayRequest.setAppId(commonInfoService.findOne(63).getValue()); //APPID 即创建应用后生成,详情见创建应用并获取 APPID
  560. certAlipayRequest.setPrivateKey(commonInfoService.findOne(65).getValue()); //开发者应用私钥,由开发者自己生成
  561. certAlipayRequest.setFormat("json"); //参数返回格式,只支持 json 格式
  562. certAlipayRequest.setCharset(AliPayConstants.CHARSET); //请求和签名使用的字符编码格式,支持 GBK和 UTF-8
  563. certAlipayRequest.setSignType(AliPayConstants.SIGNTYPE); //商户生成签名字符串所使用的签名算法类型,目前支持 RSA2 和 RSA,推荐商家使用 RSA2。
  564. CommonInfo url = commonInfoService.findOne(200);
  565. certAlipayRequest.setCertPath(url.getValue()+"/appCertPublicKey.crt"); //应用公钥证书路径(app_cert_path 文件绝对路径)
  566. certAlipayRequest.setAlipayPublicCertPath(url.getValue()+"/alipayCertPublicKey_RSA2.crt"); //支付宝公钥证书文件路径(alipay_cert_path 文件绝对路径)
  567. certAlipayRequest.setRootCertPath(url.getValue()+"/alipayRootCert.crt"); //支付宝CA根证书文件路径(alipay_root_cert_path 文件绝对路径)
  568. AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);
  569. AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
  570. request.setBizContent("{" +
  571. "\"out_biz_no\":\""+one.getOrderNumber()+"\"," + //订单编号
  572. "\"trans_amount\":"+new BigDecimal(one.getMoney())+"," + //转账金额
  573. "\"product_code\":\"TRANS_ACCOUNT_NO_PWD\"," +
  574. "\"biz_scene\":\"DIRECT_TRANSFER\"," +
  575. "\"order_title\":\""+name.getValue() + "佣金结算"+"\"," +
  576. "\"payee_info\":{" +
  577. "\"identity\":\""+one.getZhifubao()+"\"," + //支付宝账号
  578. "\"identity_type\":\"ALIPAY_LOGON_ID\"," +
  579. "\"name\":\""+one.getZhifubaoName()+"\"," + //支付宝名称
  580. "}," +
  581. "\"remark\":\""+name.getValue() + "佣金结算"+"\"" +
  582. "}");
  583. AlipayFundTransUniTransferResponse response = null;
  584. response = alipayClient.certificateExecute(request);
  585. log.error("支付宝转账返回值:"+response.getBody());
  586. //如果转账成功
  587. if (AliPayConstants.SUCCESS_CODE.equalsIgnoreCase(response.getCode())) {
  588. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  589. //修改状态为转账成功
  590. one.setState(1);
  591. //设置转账时间
  592. one.setOutAt(sdf.format(new Date()));
  593. //更新转账订单
  594. cashOutService.update(one);
  595. //查询用户
  596. UserEntity userInfo=userService.queryByUserId(one.getUserId());
  597. cashOutService.cashOutSuccess(userInfo, one.getOutAt(), one.getMoney(), one.getZhifubao(), commonInfoService.findOne(19).getValue());
  598. return Result.success(one.getZhifubaoName() + "转账成功");
  599. } else {
  600. return Result.error(9999, one.getZhifubaoName() + "转账失败!" + response.getSubMsg());
  601. }
  602. } catch (AlipayApiException e) {
  603. log.error("零钱提现异常原因:" + e.getMessage());
  604. e.printStackTrace();
  605. return Result.error(9999, one.getZhifubaoName() + "转账失败!" + e.getMessage());
  606. }
  607. }else if (commonInfo.getValue() != null && commonInfo.getValue().equals("2")) {
  608. AlipayClient alipayClient = new DefaultAlipayClient(AliPayConstants.REQUEST_URL,
  609. commonInfoService.findOne(63).getValue(), commonInfoService.findOne(65).getValue(), AliPayConstants.FORMAT,
  610. AliPayConstants.CHARSET, commonInfoService.findOne(64).getValue(), AliPayConstants.SIGNTYPE);
  611. val aliPayWithdrawModel = AliPayWithdrawModel.builder()
  612. .out_biz_no(one.getOrderNumber())
  613. .amount(new BigDecimal(one.getMoney()))
  614. .payee_account(one.getZhifubao())
  615. .payee_real_name(one.getZhifubaoName())
  616. .payee_type(AliPayConstants.PAY_TYPE)
  617. .remark(name.getValue())
  618. .build();
  619. String json = JSON.toJSONString(aliPayWithdrawModel);
  620. //实例化连接对象
  621. AlipayFundTransToaccountTransferRequest withdrawRequest = new AlipayFundTransToaccountTransferRequest();
  622. withdrawRequest.setBizContent(json);
  623. try {
  624. AlipayFundTransToaccountTransferResponse response = alipayClient.execute(withdrawRequest);
  625. if (AliPayConstants.SUCCESS_CODE.equalsIgnoreCase(response.getCode())) {
  626. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  627. //修改状态为转账成功
  628. one.setState(1);
  629. //设置转账时间
  630. one.setOutAt(sdf.format(new Date()));
  631. //更新转账订单
  632. cashOutService.update(one);
  633. //查询用户
  634. UserEntity userInfo=userService.queryByUserId(one.getUserId());
  635. cashOutService.cashOutSuccess(userInfo, one.getOutAt(), one.getMoney(), one.getZhifubao(), commonInfoService.findOne(19).getValue());
  636. return Result.success(one.getZhifubaoName() + "转账成功");
  637. } else {
  638. return Result.error(9999, one.getZhifubaoName() + "转账失败!" + response.getSubMsg());
  639. }
  640. } catch (AlipayApiException e) {
  641. log.error("零钱提现异常原因:" + e.getMessage());
  642. e.printStackTrace();
  643. return Result.error(9999, one.getZhifubaoName() + "转账失败!" + e.getMessage());
  644. }
  645. }else{
  646. //人工转账后改变状态的
  647. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  648. Date now = new Date();
  649. one.setState(1);
  650. one.setOutAt(sdf.format(now));
  651. cashOutService.update(one);
  652. UserEntity userInfo=userService.queryByUserId(one.getUserId());
  653. cashOutService.cashOutSuccess(userInfo, one.getOutAt(), one.getMoney(), one.getZhifubao(),commonInfoService.findOne(19).getValue());
  654. return Result.success(one.getZhifubaoName() + "转账成功");
  655. }
  656. }catch (Exception e){
  657. e.printStackTrace();
  658. log.error("转账异常"+e.getMessage());
  659. }finally {
  660. reentrantReadWriteLock.writeLock().unlock();
  661. }
  662. return Result.error("系统繁忙,请稍后再试!");
  663. }
  664. */
  665. @RequestMapping(value = "/refund", method = RequestMethod.POST)
  666. @ApiOperation("管理平台退款")
  667. @ResponseBody
  668. public Result refund(Long cashId,String content) {
  669. CashOut one = cashOutService.selectById(cashId);
  670. if (one == null) {
  671. return Result.error("提现信息不存在");
  672. }
  673. //将状态为待提现的退款
  674. if(one.getState()!=0){
  675. return Result.error(-100,"状态错误,已经转账或退款!");
  676. }
  677. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  678. Date now = new Date();
  679. //修改提现订单状态
  680. one.setState(-1);
  681. one.setRefund(content);
  682. one.setOutAt(sdf.format(now));
  683. cashOutService.update(one);
  684. BigDecimal rate = BigDecimal.valueOf(one.getRate());
  685. BigDecimal money = new BigDecimal(one.getMoney());
  686. BigDecimal sumMoney = rate.add(money);
  687. Long userId = one.getUserId();
  688. UserEntity userInfo = userService.queryByUserId(userId);
  689. if(userInfo!=null){
  690. //用户提现 退款到钱包
  691. //将金额退还
  692. UserMoneyDetails userMoneyDetails=new UserMoneyDetails();
  693. userMoneyDetails.setUserId(userInfo.getUserId());
  694. userMoneyDetails.setShopId(one.getShopId());
  695. userMoneyDetails.setTitle("[退款提醒]退款:"+sumMoney);
  696. userMoneyDetails.setContent("退款原因:"+content);
  697. userMoneyDetails.setType(1);
  698. userMoneyDetails.setState(2);
  699. userMoneyDetails.setClassify(3);
  700. userMoneyDetails.setMoney(sumMoney);
  701. userMoneyDetails.setCreateTime(sdf.format(now));
  702. userMoneyDetailsService.save(userMoneyDetails);
  703. userCashOutDao.updateRetreatMoney(userId,sumMoney);
  704. cashOutService.refundSuccess(userInfo, one.getOutAt(), one.getMoney(), commonInfoService.findOne(19).getValue(),content);
  705. }
  706. return Result.success();
  707. }
  708. }