CashController.java 38 KB

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