CashController.java 38 KB

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