AliPay01Controller.java 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885
  1. package org.springblade.modules.api.controller;
  2. import cn.hutool.core.util.NumberUtil;
  3. import cn.hutool.core.util.ObjectUtil;
  4. import cn.hutool.json.JSONUtil;
  5. import com.alibaba.fastjson.JSONObject;
  6. import com.alipay.api.*;
  7. import com.alipay.api.domain.AlipayFundTransUniTransferModel;
  8. import com.alipay.api.domain.AlipayTradeAppPayModel;
  9. import com.alipay.api.domain.Participant;
  10. import com.alipay.api.internal.util.AlipaySignature;
  11. import com.alipay.api.request.*;
  12. import com.alipay.api.response.*;
  13. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  14. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  15. import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
  16. import io.swagger.annotations.Api;
  17. import io.swagger.annotations.ApiOperation;
  18. import io.swagger.annotations.ApiParam;
  19. import lombok.AllArgsConstructor;
  20. import org.slf4j.Logger;
  21. import org.slf4j.LoggerFactory;
  22. import org.springblade.common.cache.ParamCache;
  23. import org.springblade.common.constant.CommonConstant;
  24. import org.springblade.common.utils.CommonUtil;
  25. import org.springblade.common.utils.NotifyUtils;
  26. import org.springblade.core.boot.ctrl.BladeController;
  27. import org.springblade.core.log.annotation.ApiLog;
  28. import org.springblade.core.log.exception.ServiceException;
  29. import org.springblade.core.log.logger.BladeLogger;
  30. import org.springblade.core.tool.api.R;
  31. import org.springblade.core.tool.utils.DateUtil;
  32. import org.springblade.core.tool.utils.StringUtil;
  33. import org.springblade.modules.finance.entity.Order;
  34. import org.springblade.modules.finance.entity.OrderConsign;
  35. import org.springblade.modules.finance.entity.OrderGrant;
  36. import org.springblade.modules.finance.entity.PlatformAuthorization;
  37. import org.springblade.modules.finance.mapper.PlatformAuthorizationMapper;
  38. import org.springblade.modules.finance.pay.entity.AlipayProperties;
  39. import org.springblade.modules.finance.service.IOrderConsignService;
  40. import org.springblade.modules.finance.service.IOrderGrantService;
  41. import org.springblade.modules.finance.service.IOrderService;
  42. import org.springblade.modules.platform.wrapper.UserAppWrapper;
  43. import org.springblade.modules.shopping.entity.Consign;
  44. import org.springblade.modules.shopping.service.IConsignService;
  45. import org.springblade.modules.system.entity.User;
  46. import org.springblade.modules.system.entity.UserApp;
  47. import org.springblade.modules.system.service.IUserService;
  48. import org.springframework.beans.factory.annotation.Autowired;
  49. import org.springframework.transaction.annotation.Transactional;
  50. import org.springframework.web.bind.annotation.*;
  51. import javax.annotation.Resource;
  52. import javax.servlet.http.HttpServletRequest;
  53. import java.io.UnsupportedEncodingException;
  54. import java.math.BigDecimal;
  55. import java.net.URLEncoder;
  56. import java.util.*;
  57. @RestController
  58. @AllArgsConstructor
  59. @RequestMapping(CommonConstant.API_URL + "/aliPay/sdk")
  60. @Api(value = "支付宝SDK", tags = "95.支付宝SDK")
  61. public class AliPay01Controller extends BladeController {
  62. private static final Logger log = LoggerFactory.getLogger(AliPay01Controller.class);
  63. //渠道
  64. private static final String PAY_CODE = "aliPay";
  65. //预授权
  66. private static final String NOTIFY_URL = "/api/v1/aliPay/sdk/auth_notify_url";
  67. //平台付款预授权
  68. private static final String PLATFORM_URL = "/api/v1/aliPay/sdk/platform_authorization_notify_url";
  69. //抢购
  70. private static final String TRADE_URL = "/api/v1/aliPay/sdk/trade_notify_url";
  71. //购买
  72. private static final String ORDER_URL = "/api/v1/aliPay/sdk/order_notify_url";
  73. @Autowired
  74. private AlipayClient client;//支付宝请求sdk客户端
  75. @Autowired
  76. private AlipayProperties properties;//支付宝sdk配置
  77. private final IOrderService orderService;
  78. private final IOrderGrantService orderGrantService;
  79. private final IUserService userService;
  80. private final IOrderConsignService orderConsignService;
  81. private final IConsignService consignService;
  82. @Resource
  83. private PlatformAuthorizationMapper paMapper;
  84. @Autowired
  85. private BladeLogger logger;
  86. @ApiLog("发起交易-证书")
  87. @PostMapping("/pay_001")
  88. @ApiOperation(value = "统一收单线下交易查询", notes = "当面付")
  89. @ApiOperationSupport(order = 1)
  90. public R pay001(@ApiParam(value = "订单号", required = true) @RequestParam String outTradeNo,
  91. @ApiParam(value = "支付渠道:aliPay支付宝,wechatPay微信支付,unionPay银联 ", required = true) @RequestParam String payFor) {
  92. Order order = orderService.getOne(Wrappers.<Order>lambdaQuery().eq(Order::getOutTradeNo, outTradeNo));
  93. if (order == null){
  94. return R.fail("请求参数错误!");
  95. }
  96. if(StringUtil.isEmpty(payFor)){
  97. return R.fail("请选择支付方式!");
  98. }
  99. if(order.getOrderType() == 3){
  100. //寄售订单而且寄售方式为寄售
  101. OrderConsign orderConsign = orderConsignService.getOne(Wrappers.<OrderConsign>lambdaQuery()
  102. .eq(OrderConsign::getOutTradeNo, outTradeNo));
  103. if (orderConsign != null){
  104. Consign consign = consignService.getById(orderConsign.getConsignId());
  105. if (consign != null && consign.getConsignType() == 2){
  106. return R.fail("该订单为抢购单,不能发起交易!");
  107. }
  108. }
  109. }
  110. if("aliPay".equals(payFor)){
  111. AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest ();
  112. AlipayTradeAppPayModel model = new AlipayTradeAppPayModel ();
  113. model.setBody("中宏商城" );
  114. model.setSubject("中宏商城");
  115. model.setOutTradeNo(outTradeNo);
  116. model.setTimeoutExpress("30m");
  117. model.setTotalAmount(order.getPayFee().toString());
  118. model.setProductCode("QUICK_MSECURITY_PAY");
  119. request.setBizModel(model);
  120. request.setNotifyUrl(properties.getDomain() + ORDER_URL);
  121. try {
  122. // 这里和普通的接口调用不同,使用的是sdkExecute
  123. // 普通模式 使用 execute
  124. // 证书使用 使用 sdkExecute
  125. AlipayTradeAppPayResponse response = client.sdkExecute(request);
  126. return R.data(response.getBody());
  127. } catch (AlipayApiException e ) {
  128. e.printStackTrace();
  129. return R.fail("发起支付失败!");
  130. }
  131. }
  132. return R.fail("该支付方式暂不支持!");
  133. }
  134. @ApiLog("绑定订单-预授权")
  135. @PostMapping("/pay_002")
  136. @ApiOperation(value = "统一收单交易支付接口", notes = "预授权")
  137. @ApiOperationSupport(order = 2)
  138. @Transactional(rollbackFor = Exception.class)
  139. public R pay002(@ApiParam(value = "抢购订单号", required = true) @RequestParam String outTradeNo,
  140. @ApiParam(value = "预授权订单号", required = true) @RequestParam String orderNo) {
  141. Order order = orderService.getOne(Wrappers.<Order>lambdaQuery().eq(Order::getOutTradeNo, outTradeNo));
  142. if (order == null){
  143. return R.fail("请求参数错误!");
  144. }
  145. OrderGrant orderGrant = orderGrantService.getOne(Wrappers.<OrderGrant>lambdaQuery().eq(OrderGrant::getOrderNo, orderNo));
  146. if (orderGrant == null) {
  147. return R.fail("请求参数错误!");
  148. }
  149. //获取数量
  150. Integer nowNum = orderGrant.getNowNum();
  151. UserApp userApp = new UserApp();
  152. UserApp query = userApp.selectOne(Wrappers.<UserApp>lambdaQuery().eq(UserApp::getUserId, orderGrant.getUserId()));
  153. if (query == null) {
  154. return R.fail("用户信息错误!");
  155. }
  156. if (StringUtil.isEmpty(query.getAlipayUserId())) {
  157. return R.fail("请绑定支付宝打款账号");
  158. }
  159. JSONObject data = new JSONObject();
  160. data.put("out_trade_no", outTradeNo);
  161. data.put("total_amount", orderGrant.getPrice());
  162. data.put("subject", "中宏酒业");
  163. data.put("product_code", "PRE_AUTH_ONLINE");
  164. data.put("auth_no", orderGrant.getAuthNo());
  165. data.put("body", orderGrant.getAuthNo());
  166. if (nowNum == 1){
  167. data.put("auth_confirm_mode", "COMPLETE"); //解冻
  168. }else{
  169. data.put("auth_confirm_mode", "NOT_COMPLETE");//不解冻
  170. }
  171. data.put("seller_id", properties.getPayeeUserId()); //收款方
  172. data.put("buyer_id", query.getAlipayUserId()); //买家ID //2088012801069195
  173. //APP支付
  174. AlipayTradePayRequest request = new AlipayTradePayRequest();
  175. request.setNotifyUrl(properties.getDomain() + TRADE_URL); //异步通知地址
  176. request.setBizContent(data.toJSONString()); //业务参数
  177. //APP支付
  178. try {
  179. Order update = new Order();
  180. update.setId(order.getId());
  181. update.setGrantNo(orderGrant.getAuthNo());
  182. boolean flg = orderService.updateById(update);
  183. if (!flg){
  184. logger.info("订单绑定失败",update.toString());
  185. }
  186. //普通模式 使用 execute
  187. //证书使用 使用 certificateExecute
  188. AlipayTradePayResponse response = client.certificateExecute(request);
  189. if (response.isSuccess()){
  190. return R.data(response.getBody());
  191. }else{
  192. orderGrantService.remove(Wrappers.<OrderGrant>lambdaQuery()
  193. .eq(OrderGrant::getId,orderGrant.getId())
  194. .eq(OrderGrant::getStatus, 0));
  195. logger.info("订单绑定失败","删除预授权数据");
  196. }
  197. } catch (AlipayApiException e) {
  198. e.printStackTrace();
  199. }
  200. return R.fail("发起支付失败!");
  201. }
  202. /**
  203. * 发起支付宝预授权
  204. *
  205. * 1、判断用户是否能抢购
  206. * 2、查询是否有寄售/进货单
  207. * 3、发起支付宝预支付
  208. * 4、请求成功 创建预支付订单 默认为未授权
  209. * @param userId 用户id
  210. * @param batNo 批次ID
  211. * @param price 金额
  212. * @param num 预授数量
  213. * @return R
  214. * @throws AlipayApiException
  215. */
  216. @ApiLog("发起支付宝预授权")
  217. @PostMapping("/pay_003")
  218. @ApiOperation(value = "线上资金授权冻结接口-调用支付宝预授权", notes = "支付请求")
  219. @ApiOperationSupport(order = 3)
  220. public R<String> pay003(@ApiParam(value = "用户号", required = true) @RequestParam Long userId,
  221. @ApiParam(value = "批次ID", required = true) @RequestParam Long batNo,
  222. @ApiParam(value = "金额", required = true) @RequestParam Double price,
  223. @ApiParam(value = "数量", required = true) @RequestParam Integer num) throws AlipayApiException {
  224. UserApp userApp = new UserApp();
  225. UserApp query = userApp.selectOne(Wrappers.<UserApp>lambdaQuery().eq(UserApp::getUserId,userId));
  226. if (ObjectUtil.isNull(query)){
  227. return R.fail("该用户不存在!");
  228. }
  229. boolean flg = UserAppWrapper.build().isTicket(query.getTicket(), price);
  230. if (!flg){
  231. return R.fail("您的绿色积分不足!");
  232. }
  233. if (query.getEnableAuth() != 2){
  234. double k = (double)query.getCreditScore() / 100;
  235. int scoreCount = NumberUtil.roundDown(k, 2).intValue();
  236. int consignCount = Integer.parseInt(ParamCache.getValue(CommonConstant.DEFAULT_CONDIGN_COUNT));
  237. if (scoreCount > consignCount){
  238. scoreCount = consignCount;
  239. }
  240. if (scoreCount < num){
  241. return R.fail("预授数量不能大于单场可抢次数!");
  242. }
  243. }
  244. if(query.getState() != 1 ){
  245. return R.fail("该账号已冻结!");
  246. }
  247. Consign consign = consignService.queryConsign(batNo, userId);
  248. if (ObjectUtil.isNull(consign)){
  249. return R.fail("亲,好物已抢完欢迎再来!");
  250. }
  251. //判断用户是否在该场次下有预授权
  252. OrderGrant orderGrant = orderGrantService.getOne(Wrappers.<OrderGrant>lambdaQuery()
  253. .eq(OrderGrant::getBatNo, batNo)
  254. .eq(OrderGrant::getUserId, userId)
  255. .eq(OrderGrant::getStatus,1)
  256. );
  257. if(ObjectUtil.isNotNull(orderGrant)){
  258. return R.fail("您已发起预授权,无需再次发起!");
  259. }
  260. // if (!ObjectUtil.isNull(orderGrant)){
  261. // return R.fail("您已发起预授权,无需再次发起!");
  262. // }
  263. JSONObject data = new JSONObject();
  264. String orderNo = CommonUtil.genTimeID();
  265. data.put("out_order_no", orderNo);
  266. data.put("out_request_no", orderNo);
  267. data.put("order_title","预授权冻结");
  268. data.put("amount", NumberUtil.mul(price, num));
  269. data.put("product_code","PRE_AUTH_ONLINE"); //销售产品码。支付宝预授权产品固定为 PRE_AUTH_ONLINE
  270. data.put("payee_user_id", properties.getPayeeUserId());
  271. data.put("timeout_express","30m");
  272. //APP支付
  273. AlipayFundAuthOrderAppFreezeRequest request = new AlipayFundAuthOrderAppFreezeRequest();
  274. request.setNotifyUrl(properties.getDomain() + NOTIFY_URL); //异步通知地址
  275. request.setBizContent(data.toJSONString()); //业务参数
  276. //APP支付
  277. //必须使用 sdkExecute
  278. AlipayFundAuthOrderAppFreezeResponse response = client.sdkExecute(request);
  279. if(response.isSuccess()){
  280. String dataDate = DateUtil.format(DateUtil.now(), DateUtil.PATTERN_DATE);
  281. OrderGrant grant = new OrderGrant();
  282. grant.setBatNo(batNo);
  283. grant.setUserId(userId);
  284. grant.setStatus(0);//未授权
  285. grant.setOrderNo(orderNo);
  286. grant.setNum(num);
  287. grant.setNowNum(num);
  288. grant.setPrice(price);
  289. grant.setDataDate(dataDate);
  290. grant.setCreateTime(DateUtil.now());//创建时间
  291. orderGrantService.save(grant);
  292. return R.data(response.getBody());
  293. }
  294. return R.fail("授权失败!");
  295. }
  296. @GetMapping("/pay_004")
  297. @ApiOperation(value = "资金授权操作查询接口", notes = "支付请求")
  298. @ApiOperationSupport(order = 3)
  299. public R pay004(@ApiParam(value = "订单号", required = true) @RequestParam String outTradeNo,
  300. @ApiParam(value = "查询明细,1查询冻结明细,2查询解冻明细,3查询支付明细时", required = true)
  301. @RequestParam Integer type) throws AlipayApiException {
  302. JSONObject data = new JSONObject();
  303. if(type == 1){ //查询冻结明细
  304. data.put("auth_no", outTradeNo);
  305. data.put("out_order_no", outTradeNo);
  306. data.put("operation_type","FREEZE");
  307. }else if(type == 2){ //查询解冻明细
  308. data.put("auth_no", outTradeNo);
  309. data.put("out_order_no", outTradeNo);
  310. data.put("operation_type","UNFREEZE");
  311. }else if(type == 3){ //查询支付明细时
  312. data.put("auth_no", outTradeNo);
  313. data.put("out_order_no", outTradeNo);
  314. data.put("operation_type","PAY");
  315. }else{
  316. return R.fail("参数错误!");
  317. }
  318. // 设置整体请求参数
  319. //APP支付
  320. AlipayFundAuthOperationDetailQueryRequest request = new AlipayFundAuthOperationDetailQueryRequest();
  321. request.setBizContent(data.toString());
  322. //APP支付
  323. AlipayFundAuthOperationDetailQueryResponse response = client.certificateExecute(request);
  324. if(response.isSuccess()){
  325. return R.data(response.getBody());
  326. }
  327. return R.fail("授权失败!");
  328. }
  329. @ApiLog("抢购打款-测试")
  330. @PostMapping("/pay_005")
  331. @ApiOperation(value = "单笔转账到支付宝账户", notes = "单笔转账到支付宝账户")
  332. @ApiOperationSupport(order = 5)
  333. public R pay005() throws AlipayApiException {
  334. String privateKey = "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCU4XTbNjnNOmuEnwBEgUBOVLK5CaUiUFKEkVW1/2sTlijARZzLtzwXfbkvzHEhCSu+E+OA1Futbh5HwNAC06bvqYDS+TXrFuZ0LcDaU92lk5Hp/ed8NhRXtm0gss1TS0vebOq+3kejErIvVCg9kNMrYMrmdf8G0+zKlCp3vrfdM37IeLXp3GoOckNzHh/LT7rLd7/9QcdSCPixPSwusrfCusw3H093cuWkV9WX4Go/zHTL9rAEwJPOn36OhyVc1oG113ZJiVg7KgsZGOCJJyh9BvlKq2vuKxnylQwq9Kh5e+BfP2FSWs7a1XMj/79JsZTxztJ9tFqcSXQh99vq1nd1AgMBAAECggEAVglIT5oxoxEcq0J7lBshf2Lg+Z/CR2clmKioYImfZm1DVYGlD/DvECA+kYnS4qV7GthBg+S0qi/V3d9mFgwcD6nj4YfVCets+Dyskz8d+p6iFxf820IhVWL+A4Rwta7wxDQrIGwx9+JJCKLYsmNsNUg1WSNdYqO71oHzXMnhVTmYJ6sKOrrBucyI4Ydu9UbfN+DRRGD9seL+Nxh1V2PPXs4ftk2kRlG18LaTPgFba1g8QBIpGDR9gFqM+DvBHUxAWsPRnL1+q0c6o5Ndk7W5f7Ob1zxF/lgqHudiG38jItkwc7MLMOYjbV5wiJPZc93nsHS1CKPSEX9/snNLnx2LQQKBgQDMyLBVVasfTMQpMjyi+Jof9JLHPiRP3dEHwZECUgfdWhPoidLjK9y1wszmCLrcg01842WufrpbJ1QXs+g8x6+DhLHvcKum1znsvQKWdy/2V6a2eahNHsYi1Qus+N0dFgotfZwfElfkIU/jAwh6OnYPCXQCVmdvoxzmdk81L04d5QKBgQC6HY6EZ8o4mo4CzDss2qxT2oKuiI0clnbDPC9LJzkRBVbHosx6AO+C3RyfREZxMzNhYW3XnozifDyRw6rlvI6toE3l9ku71dJS1aKZwbH/h0rdHXXqDHARYc9rdwCzOM2t2Kve/PgXxCDQdwY/m0deXM22oKdOlb7miz2YTGLaUQKBgEg8qucPNzPtUmztybH7W/LVxUj/RLPfnTLNNyfIY/nTIp6ur3NvL4X2V2z1u2S59IWPeXjaP0aUUvehgNSf4+vSzSmXZxWNamN2MQl+ta6CMM7Bj3rU1jPHTz0O9ICkG6b8Xiwfvl082v9LPJxRLwAS55dDf21D7pflN/+c1kN5AoGARaRHrt3TeojCuONJBUiyERKDseFgxCC9QeLkY3/Cx86yoTMWxlRRSyuHyUTYAwXApSC65GLsntcUJwsLiLmcvfVtEK6vuhKRh/Nuy5ACFfa/Gawrci/DQ43Q+opmFaoctH+OGHuaLfJywO64xNZKx1F8nGjTEgHQlB3oJ3P1zXECgYBW/GRUU+SevGeLjZTZ9WqG+ztseItnmEwmar9tGhR9TNv3vDiL5/fsAfI8ApMiIzDe6+QfS5Lxx5rD6V4Et/zBpsf8JzqP2eDiTe9UiHxDr2v5NIxelf404VZcdRh83u84lCJTa/ZYanFu94UW6h70MHhDWtiWddtFR3EXt5hD9w==";
  335. String alipayPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhIxPBQL0OKBc6fcU/9PdVTMA7L2s314oU2w1q06ywQSDdhF3RY1Bo0Eqh4Zg8QpPirFeyAc4rhFjyKZRlngQXrybcAhUfswD86QQGodObe3aA9bbWdXiTt10Q5CBk5GImadNiEW6Adh+0bY5ezf1RbxIjbGDfH6x5gatZnpjPswiHMQnskZtg9JSfE2u8WEKuSaH8yhnkllHpIHWnWvFvXwNVNycXdmDrEe7gIB1yCouNK6/DZ7IQH2AajSuvbxmCqO0MzywEfgvLqE0GFVsKKmXvgJebRAnW9RmGhmrxvEIceXCjR3tbxM9gX8lioDlqKnBootTgAbjIJ5VrPvKPwIDAQAB";
  336. AlipayConfig alipayConfig = new AlipayConfig();
  337. alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do");
  338. alipayConfig.setAppId("2021003125657245");
  339. alipayConfig.setPrivateKey(privateKey);
  340. alipayConfig.setFormat("json");
  341. alipayConfig.setAlipayPublicKey(alipayPublicKey);
  342. alipayConfig.setCharset("UTF8");
  343. alipayConfig.setSignType("RSA2");
  344. //设置应用公钥证书路径//appCertPublicKey_2021003125657245
  345. alipayConfig.setAppCertPath("D:\\Blade2.9.0\\bladex-boot\\src\\main\\resources\\alipay\\appCertPublicKey_2021003125657245.crt");
  346. //设置支付宝公钥证书路径//alipayCertPublicKey_RSA2
  347. alipayConfig.setAlipayPublicCertPath("D:\\Blade2.9.0\\bladex-boot\\src\\main\\resources\\alipay\\alipayCertPublicKey_RSA2.crt");
  348. //设置支付宝根证书路径
  349. alipayConfig.setRootCertPath("D:\\Blade2.9.0\\bladex-boot\\src\\main\\resources\\alipay\\alipayRootCert.crt");
  350. AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig);
  351. AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel();
  352. String outBizNo = CommonUtil.genTimeID();
  353. model.setOutBizNo(outBizNo);
  354. model.setRemark("20220410退款");
  355. model.setBusinessParams("{\"payer_show_name_use_alias\":\"true\"}");
  356. model.setBizScene("DIRECT_TRANSFER");
  357. Participant payeeInfo = new Participant();
  358. payeeInfo.setIdentity("2088012801069195");
  359. payeeInfo.setIdentityType("ALIPAY_USER_ID");
  360. payeeInfo.setName("丰元权");
  361. model.setPayeeInfo(payeeInfo);
  362. model.setTransAmount("100");
  363. model.setProductCode("TRANS_ACCOUNT_NO_PWD");
  364. model.setOrderTitle("中宏科技");
  365. AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
  366. request.setBizModel(model);
  367. AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request);
  368. if (response.isSuccess()){
  369. logger.info("打款成功", response.getBody());
  370. JSONUtil.parseObj(response.getBody());
  371. return R.data(response.getBody());
  372. }
  373. logger.info("打款失败", response.getBody());
  374. return R.success("打款成功!");
  375. }
  376. @ApiLog("抢购打款-测试")
  377. @PostMapping("/pay_006")
  378. @ApiOperation(value = "单笔转账到支付宝账户", notes = "单笔转账到支付宝账户")
  379. @ApiOperationSupport(order = 5)
  380. public R pay006(@ApiParam(value = "id", required = true) @RequestParam String id,
  381. @ApiParam(value = "真实姓名", required = true) @RequestParam String name,
  382. @ApiParam(value = "金额", required = true) @RequestParam String amount) {
  383. transfer(id, amount, name);
  384. return R.fail("正在打款...");
  385. }
  386. @ApiLog("资金解冻")
  387. @GetMapping("/pay_unfreeze")
  388. @ApiOperation(value = "资金授权解冻", notes = "支付请求")
  389. @ApiOperationSupport(order = 3)
  390. public R payUnfreeze(@ApiParam(value = "支付宝资金授权订单号", required = true) @RequestParam String authNo,
  391. @ApiParam(value = "解冻金额", required = true) @RequestParam Double amount) throws AlipayApiException {
  392. AlipayFundAuthOrderUnfreezeRequest request = new AlipayFundAuthOrderUnfreezeRequest();
  393. JSONObject bizContent = new JSONObject();
  394. bizContent.put("auth_no", authNo);
  395. bizContent.put("out_request_no","outRequestNo123");
  396. bizContent.put("amount", amount);
  397. bizContent.put("remark","解冻资金");
  398. JSONObject extraParam = new JSONObject();
  399. JSONObject unfreezeBizInfo = new JSONObject();
  400. unfreezeBizInfo.put("bizComplete",true);
  401. extraParam.put("unfreezeBizInfo",unfreezeBizInfo);
  402. bizContent.put("extra_param",extraParam);
  403. // 设置整体请求参数
  404. request.setBizContent(bizContent.toString());
  405. // 使用execute方法发起请求
  406. AlipayFundAuthOrderUnfreezeResponse response = client.certificateExecute(request);
  407. if(response.isSuccess()){
  408. logger.info("解冻资金成功", response.getBody());
  409. return R.fail("解冻资金成功!");
  410. }
  411. logger.info("解冻资金失败", response.getBody());
  412. return R.fail("解冻资金失败!");
  413. }
  414. @GetMapping("/getAlipay_sign")
  415. @ApiOperation(value = "获取签名", notes = "获取签名")
  416. @ApiOperationSupport(order = 97)
  417. public R getAlipaySign() throws AlipayApiException, UnsupportedEncodingException {
  418. String content = "apiname=com.alipay.account.auth" +
  419. "&app_id=" + properties.getAppId() +
  420. "&app_name=mc" +
  421. "&auth_type=AUTHACCOUNT&biz_type=openservice" +
  422. "&method=alipay.open.auth.sdk.code.get" +
  423. "&pid=2088341967443472" +
  424. "&product_id=APP_FAST_LOGIN" +
  425. "&scope=kuaijie" +
  426. "&sign_type=RSA2" +
  427. "&target_id=" + CommonUtil.genTimeID();
  428. String sign = AlipaySignature.rsaSign(content, properties.getPrivateKey(),"utf-8","RSA2");
  429. String urlencoder = URLEncoder.encode(sign,"UTF-8");
  430. return R.data(content + "&sign=" + urlencoder);
  431. }
  432. @ApiLog("获取支付宝用户信息")
  433. @GetMapping("/setAlipay_userInfo")
  434. @ApiOperation(value = "设置用户信息", notes = "设置用户信息")
  435. @ApiOperationSupport(order = 97)
  436. public R getAlipayUserinfo(@ApiParam(value = "用户ID", required = true) @RequestParam String userId,
  437. @ApiParam(value = "支付宝用户ID", required = true) @RequestParam String aliPayUserId) {
  438. UserApp userApp = new UserApp();
  439. UserApp query = userApp.selectOne(Wrappers.<UserApp>lambdaQuery().eq(UserApp::getUserId,userId));
  440. if (query == null){
  441. return R.fail("用户不存在");
  442. }
  443. UserApp param = new UserApp();
  444. param.setId(query.getId());
  445. param.setAlipayUserId(aliPayUserId);
  446. return R.status(param.updateById());
  447. }
  448. @ApiLog("平台付款预授权回调")
  449. @RequestMapping(value = "/platform_authorization_notify_url", method = {RequestMethod.GET, RequestMethod.POST})
  450. @ApiOperation(value = "异步通知相应-预授回调", notes = "异步通知相应")
  451. public void platformAuthorizationNotify(HttpServletRequest request){
  452. String errMsg = "预授回调";
  453. logger.info(errMsg, request.getParameterMap().toString());
  454. if (!NotifyUtils.rsaCheck(properties, request.getParameterMap())) {
  455. //这里处理验签失败
  456. log.info(errMsg + "-处理验签失败");
  457. }
  458. String status = request.getParameter("status");
  459. String auth_no = request.getParameter("auth_no");
  460. if (!"SUCCESS".equals(status)){
  461. log.info(errMsg + "-预授权失败");
  462. }
  463. String out_request_no = request.getParameter("out_request_no");
  464. LambdaQueryWrapper<PlatformAuthorization> query = Wrappers.lambdaQuery(PlatformAuthorization.class);
  465. query.eq(PlatformAuthorization::getOrderNo, out_request_no);
  466. PlatformAuthorization platformAuthorization = paMapper.selectOne(query);
  467. if(ObjectUtil.isNotNull(platformAuthorization)){
  468. platformAuthorization.setAuthNo(auth_no);
  469. platformAuthorization.setState(1);
  470. paMapper.updateById(platformAuthorization);
  471. }
  472. }
  473. /**
  474. * 发起支付宝预授权
  475. *
  476. * 1、判断用户是否能抢购
  477. * 2、查询是否有寄售/进货单
  478. * 3、发起支付宝预支付
  479. * 4、请求成功 创建预支付订单 默认为未授权
  480. * @param userId 用户id
  481. * @param batNo 批次ID
  482. * @param price 金额
  483. * @param num 预授数量
  484. * @return R
  485. * @throws AlipayApiException
  486. */
  487. @ApiLog("发起支付宝预授权")
  488. @PostMapping("/platfromAuth")
  489. @ApiOperation(value = "线上资金授权冻结接口-调用支付宝预授权", notes = "支付请求")
  490. @ApiOperationSupport(order = 3)
  491. public R<String> platfromAuth(@ApiParam(value = "用户号", required = true) @RequestParam Long userId,
  492. @ApiParam(value = "批次ID", required = true) @RequestParam Long batNo,
  493. @ApiParam(value = "金额", required = true) @RequestParam BigDecimal price,
  494. @ApiParam(value = "数量", required = true) @RequestParam Integer num) throws AlipayApiException {
  495. UserApp userApp = new UserApp();
  496. UserApp query = userApp.selectOne(Wrappers.<UserApp>lambdaQuery().eq(UserApp::getUserId,userId));
  497. if (ObjectUtil.isNull(query)){
  498. return R.fail("该用户不存在!");
  499. }
  500. if (query.getEnableAuth() != 2){
  501. double k = (double)query.getCreditScore() / 100;
  502. int scoreCount = NumberUtil.roundDown(k, 2).intValue();
  503. int consignCount = Integer.parseInt(ParamCache.getValue(CommonConstant.DEFAULT_CONDIGN_COUNT));
  504. if (scoreCount > consignCount){
  505. scoreCount = consignCount;
  506. }
  507. if (scoreCount < num){
  508. return R.fail("预授数量不能大于单场可抢次数!");
  509. }
  510. }
  511. if(query.getState() != 1 ){
  512. return R.fail("该账号已冻结!");
  513. }
  514. JSONObject data = new JSONObject();
  515. String orderNo = CommonUtil.genTimeID();
  516. data.put("out_order_no", orderNo);
  517. data.put("out_request_no", orderNo);
  518. data.put("order_title","预授权冻结");
  519. data.put("amount", price.multiply(new BigDecimal(num)));
  520. data.put("product_code","PRE_AUTH_ONLINE"); //销售产品码。支付宝预授权产品固定为 PRE_AUTH_ONLINE
  521. data.put("payee_user_id", properties.getPayeeUserId());
  522. data.put("timeout_express","30m");
  523. //APP支付
  524. AlipayFundAuthOrderAppFreezeRequest request = new AlipayFundAuthOrderAppFreezeRequest();
  525. request.setNotifyUrl(properties.getDomain() + PLATFORM_URL); //异步通知地址
  526. request.setBizContent(data.toJSONString()); //业务参数
  527. //APP支付
  528. //必须使用 sdkExecute
  529. AlipayFundAuthOrderAppFreezeResponse response = client.sdkExecute(request);
  530. if(response.isSuccess()){
  531. PlatformAuthorization platformAuthorization = new PlatformAuthorization();
  532. platformAuthorization.setConsignConfigId(batNo);//场次id
  533. platformAuthorization.setTotalNum(num);//授权数量
  534. platformAuthorization.setCreateUserId(getUser().getUserId());//创建用户id
  535. platformAuthorization.setState(0);//未授权
  536. platformAuthorization.setOrderNo(orderNo);//订单编号
  537. platformAuthorization.setAuthPrice(price.multiply(new BigDecimal(num)).setScale(2, BigDecimal.ROUND_DOWN));//订单金额
  538. platformAuthorization.setCreateTime(new Date());
  539. paMapper.insert(platformAuthorization);
  540. return R.data(response.getBody());
  541. }
  542. return R.fail("授权失败!");
  543. }
  544. @ApiLog("预授回调")
  545. @RequestMapping(value = "/auth_notify_url", method = {RequestMethod.GET, RequestMethod.POST})
  546. @ApiOperation(value = "异步通知相应-预授回调", notes = "异步通知相应")
  547. @ApiOperationSupport(order = 99)
  548. public String authNotify(HttpServletRequest request) {
  549. String errMsg = "预授回调";
  550. logger.info(errMsg, request.getParameterMap().toString());
  551. if (!NotifyUtils.rsaCheck(properties, request.getParameterMap())) {
  552. //这里处理验签失败
  553. log.info(errMsg + "-处理验签失败");
  554. return "error";
  555. }
  556. String status = request.getParameter("status");
  557. String auth_no = request.getParameter("auth_no");
  558. if (!"SUCCESS".equals(status)){
  559. log.info(errMsg + "-预授权失败");
  560. return "error";
  561. }
  562. String out_request_no = request.getParameter("out_request_no");
  563. if (out_request_no == null){
  564. log.info(errMsg + "-无法获取预授订单");
  565. return "error";
  566. }
  567. OrderGrant grant = new OrderGrant();
  568. grant.setOrderNo(out_request_no);
  569. OrderGrant query = orderGrantService.getOne(Wrappers.<OrderGrant>lambdaQuery().eq(OrderGrant::getOrderNo,out_request_no));
  570. if (query == null){
  571. log.info(errMsg + "-查询预授权数据错误");
  572. return "error";
  573. }
  574. OrderGrant grantUpdate = new OrderGrant();
  575. grantUpdate.setId(query.getId());
  576. grantUpdate.setStatus(1);//已授权
  577. grantUpdate.setAuthNo(auth_no);
  578. grantUpdate.setFreezeTime(DateUtil.now());
  579. boolean flg = orderGrantService.updateById(grantUpdate);
  580. if (!flg){
  581. log.info(errMsg + "-更新数据失败");
  582. return "error";
  583. }
  584. return "success";
  585. }
  586. @ApiLog("购买回调")
  587. @RequestMapping(value = "/order_notify_url", method = {RequestMethod.GET, RequestMethod.POST})
  588. @ApiOperation(value = "异步通知相应-购买回调", notes = "异步通知相应")
  589. @ApiOperationSupport(order = 100)
  590. public String orderNotify(HttpServletRequest request) throws AlipayApiException {
  591. String errMsg = "购买回调";
  592. //获取支付宝POST过来反馈信息
  593. Map<String,String> params = new HashMap<>();
  594. Map requestParams = request.getParameterMap();
  595. for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext ();) {
  596. String name = ( String )iter.next();
  597. String[] values = (String[])requestParams.get(name);
  598. String valueStr="";
  599. for(int i = 0;i < values.length; i++){
  600. valueStr = (i== values.length-1)?valueStr+values[i]:valueStr+values[i] + ",";
  601. }
  602. //乱码解决,这段代码在出现乱码时使用。
  603. //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
  604. params.put(name,valueStr);
  605. }
  606. log.info("params === " + params.toString());
  607. //切记alipayPublicCertPath是支付宝公钥证书路径,请去open.alipay.com对应应用下载。
  608. //boolean AlipaySignature.rsaCertCheckV1(Map<String, String> params, String publicKeyCertPath, String charset,String signType)
  609. boolean flag = AlipaySignature.rsaCertCheckV1(params,properties.getAliPayCertPath(), AlipayConstants.CHARSET_UTF8,"RSA2");
  610. log.info("flag === " + flag);
  611. String out_trade_no = request.getParameter("out_trade_no");//获取请求参数中的商户订单号
  612. Order order = orderService.getOne(Wrappers.<Order>lambdaQuery().eq(Order::getOutTradeNo, out_trade_no));
  613. if (order == null){
  614. log.info(errMsg + "-订单无数据");
  615. return "error";
  616. }
  617. //寄售和购买
  618. orderService.payCommonSuccess(order, PAY_CODE);
  619. return "success";
  620. }
  621. @ApiLog("进货回调")
  622. @RequestMapping(value = "/trade_notify_url", method = {RequestMethod.GET, RequestMethod.POST})
  623. @ApiOperation(value = "异步通知相应-进货回调", notes = "异步通知相应")
  624. @ApiOperationSupport(order = 100)
  625. public String tradeNotify(HttpServletRequest request) {
  626. String errMsg = "进货回调";//抢购改为进货
  627. log.info(errMsg, request.getParameterMap().toString());
  628. if (!NotifyUtils.rsaCheck(properties, request.getParameterMap())) {
  629. //这里处理验签失败
  630. log.info(errMsg + "-处理验签失败" + request.getParameterMap());
  631. //打款失败
  632. return "error";
  633. }
  634. String out_trade_no = request.getParameter("out_trade_no");//获取请求参数中的商户订单号
  635. log.info(errMsg, "out_trade_no == " + out_trade_no);
  636. Order order = orderService.getOne(Wrappers.<Order>lambdaQuery().eq(Order::getOutTradeNo, out_trade_no));
  637. if (ObjectUtil.isNull(order)){
  638. log.info(errMsg + "-订单无数据");
  639. return "error";
  640. }
  641. if(order.getOrderType() == 3){
  642. log.info(errMsg, "寄售订单 == " + order.getOrderType());
  643. //查询寄售订单信息
  644. OrderConsign orderConsign = orderConsignService.getOne(Wrappers.<OrderConsign>lambdaQuery().eq(OrderConsign::getOutTradeNo, out_trade_no));
  645. if (ObjectUtil.isNull(orderConsign)){
  646. log.info(errMsg + "-寄售订单无数据");
  647. return "error";
  648. }
  649. //寄售金额
  650. Double price = orderConsign.getConsignPrice();
  651. //查询寄售订单中的寄售人
  652. Consign consign = consignService.getOne(Wrappers.<Consign>lambdaQuery().eq(Consign::getId, orderConsign.getConsignId()));
  653. if (ObjectUtil.isNull(consign)){
  654. log.info(errMsg + "-寄售无数据");
  655. return "error";
  656. }
  657. //授权号
  658. String body = request.getParameter("body");
  659. OrderGrant orderGrant = orderGrantService.getOne(Wrappers.<OrderGrant>lambdaQuery().eq(OrderGrant::getAuthNo, body));
  660. if (orderGrant != null){
  661. logger.info(errMsg + "-授权无数据", orderGrant.toString());
  662. //以单个授权金额为准
  663. if (!Objects.equals(price, orderGrant.getPrice())){
  664. price = orderGrant.getPrice();
  665. }
  666. }
  667. log.info(errMsg + "-body:" + body);
  668. //寄售来源为后台 不打款 订单的打款 2是订单
  669. if (consign.getConsignFor() == 2){
  670. //判断商品抢购价和进货价是否产生收益
  671. if(consign.getObtainPrice() < consign.getConsignPrice()){
  672. //收益金额 收益金额等于抢购价减去取得价
  673. BigDecimal bigDecimal = new BigDecimal(price).subtract(new BigDecimal(consign.getObtainPrice())).setScale(2, BigDecimal.ROUND_HALF_UP);
  674. //获取配置参数
  675. BigDecimal taxRatio = new BigDecimal(ParamCache.getValue(CommonConstant.PLATFORM_TAX_RATIO));
  676. //税费金额
  677. BigDecimal bigDecimal1 = bigDecimal.multiply(taxRatio).setScale(2, BigDecimal.ROUND_HALF_UP);
  678. //收款金额需扣除税费
  679. price = new BigDecimal(consign.getConsignPrice()).subtract(bigDecimal1).setScale(2, BigDecimal.ROUND_DOWN).doubleValue();
  680. }
  681. //获取寄售人信息
  682. UserApp userApp = new UserApp();
  683. UserApp query = userApp.selectOne(Wrappers.<UserApp>lambdaQuery().eq(UserApp::getUserId,consign.getConsignUserId()));
  684. transfer(query, Double.toString(price), orderConsign.getId());
  685. }else{
  686. log.info(errMsg, "寄售来源为后台 == 无需打款" );
  687. OrderConsign updateConsign = new OrderConsign();
  688. updateConsign.setId(orderConsign.getId());
  689. updateConsign.setConfirmTime(DateUtil.now());
  690. updateConsign.setIsConfirm(4);
  691. updateConsign.setBody("平台无需打款");
  692. orderConsignService.updateById(updateConsign);
  693. }
  694. }else{
  695. log.info(errMsg + "-购买订单回调");
  696. }
  697. //修改订单状态
  698. orderService.payCommonSuccess(order,PAY_CODE);
  699. return "success";
  700. }
  701. /**
  702. * 用户仓单收款
  703. * 1、向用户打款
  704. * 2、修改寄售订单金额
  705. * @param name 用户
  706. * @param transAmount 金额
  707. */
  708. public void transfer(String identity, String transAmount, String name){
  709. try {
  710. String privateKey = "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCU4XTbNjnNOmuEnwBEgUBOVLK5CaUiUFKEkVW1/2sTlijARZzLtzwXfbkvzHEhCSu+E+OA1Futbh5HwNAC06bvqYDS+TXrFuZ0LcDaU92lk5Hp/ed8NhRXtm0gss1TS0vebOq+3kejErIvVCg9kNMrYMrmdf8G0+zKlCp3vrfdM37IeLXp3GoOckNzHh/LT7rLd7/9QcdSCPixPSwusrfCusw3H093cuWkV9WX4Go/zHTL9rAEwJPOn36OhyVc1oG113ZJiVg7KgsZGOCJJyh9BvlKq2vuKxnylQwq9Kh5e+BfP2FSWs7a1XMj/79JsZTxztJ9tFqcSXQh99vq1nd1AgMBAAECggEAVglIT5oxoxEcq0J7lBshf2Lg+Z/CR2clmKioYImfZm1DVYGlD/DvECA+kYnS4qV7GthBg+S0qi/V3d9mFgwcD6nj4YfVCets+Dyskz8d+p6iFxf820IhVWL+A4Rwta7wxDQrIGwx9+JJCKLYsmNsNUg1WSNdYqO71oHzXMnhVTmYJ6sKOrrBucyI4Ydu9UbfN+DRRGD9seL+Nxh1V2PPXs4ftk2kRlG18LaTPgFba1g8QBIpGDR9gFqM+DvBHUxAWsPRnL1+q0c6o5Ndk7W5f7Ob1zxF/lgqHudiG38jItkwc7MLMOYjbV5wiJPZc93nsHS1CKPSEX9/snNLnx2LQQKBgQDMyLBVVasfTMQpMjyi+Jof9JLHPiRP3dEHwZECUgfdWhPoidLjK9y1wszmCLrcg01842WufrpbJ1QXs+g8x6+DhLHvcKum1znsvQKWdy/2V6a2eahNHsYi1Qus+N0dFgotfZwfElfkIU/jAwh6OnYPCXQCVmdvoxzmdk81L04d5QKBgQC6HY6EZ8o4mo4CzDss2qxT2oKuiI0clnbDPC9LJzkRBVbHosx6AO+C3RyfREZxMzNhYW3XnozifDyRw6rlvI6toE3l9ku71dJS1aKZwbH/h0rdHXXqDHARYc9rdwCzOM2t2Kve/PgXxCDQdwY/m0deXM22oKdOlb7miz2YTGLaUQKBgEg8qucPNzPtUmztybH7W/LVxUj/RLPfnTLNNyfIY/nTIp6ur3NvL4X2V2z1u2S59IWPeXjaP0aUUvehgNSf4+vSzSmXZxWNamN2MQl+ta6CMM7Bj3rU1jPHTz0O9ICkG6b8Xiwfvl082v9LPJxRLwAS55dDf21D7pflN/+c1kN5AoGARaRHrt3TeojCuONJBUiyERKDseFgxCC9QeLkY3/Cx86yoTMWxlRRSyuHyUTYAwXApSC65GLsntcUJwsLiLmcvfVtEK6vuhKRh/Nuy5ACFfa/Gawrci/DQ43Q+opmFaoctH+OGHuaLfJywO64xNZKx1F8nGjTEgHQlB3oJ3P1zXECgYBW/GRUU+SevGeLjZTZ9WqG+ztseItnmEwmar9tGhR9TNv3vDiL5/fsAfI8ApMiIzDe6+QfS5Lxx5rD6V4Et/zBpsf8JzqP2eDiTe9UiHxDr2v5NIxelf404VZcdRh83u84lCJTa/ZYanFu94UW6h70MHhDWtiWddtFR3EXt5hD9w==";
  711. String alipayPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhIxPBQL0OKBc6fcU/9PdVTMA7L2s314oU2w1q06ywQSDdhF3RY1Bo0Eqh4Zg8QpPirFeyAc4rhFjyKZRlngQXrybcAhUfswD86QQGodObe3aA9bbWdXiTt10Q5CBk5GImadNiEW6Adh+0bY5ezf1RbxIjbGDfH6x5gatZnpjPswiHMQnskZtg9JSfE2u8WEKuSaH8yhnkllHpIHWnWvFvXwNVNycXdmDrEe7gIB1yCouNK6/DZ7IQH2AajSuvbxmCqO0MzywEfgvLqE0GFVsKKmXvgJebRAnW9RmGhmrxvEIceXCjR3tbxM9gX8lioDlqKnBootTgAbjIJ5VrPvKPwIDAQAB";
  712. AlipayConfig alipayConfig = new AlipayConfig();
  713. alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do");
  714. alipayConfig.setAppId("2021003125657245");
  715. alipayConfig.setPrivateKey(privateKey);
  716. alipayConfig.setFormat("json");
  717. alipayConfig.setAlipayPublicKey(alipayPublicKey);
  718. alipayConfig.setCharset("UTF8");
  719. alipayConfig.setSignType("RSA2");
  720. //设置应用公钥证书路径//appCertPublicKey_2021003125657245
  721. alipayConfig.setAppCertPath(properties.getAppCertPath());
  722. //设置支付宝公钥证书路径//alipayCertPublicKey_RSA2
  723. alipayConfig.setAlipayPublicCertPath(properties.getAliPayCertPath());
  724. //设置支付宝根证书路径
  725. alipayConfig.setRootCertPath(properties.getAliPayRootCertPath());
  726. AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig);
  727. AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel();
  728. model.setOutBizNo(CommonUtil.genTimeID());
  729. model.setRemark("贵州中宏科技有限公司进货仓单收款");
  730. model.setBusinessParams("{\"payer_show_name_use_alias\":\"true\"}");
  731. model.setBizScene("DIRECT_TRANSFER");
  732. Participant payeeInfo = new Participant();
  733. payeeInfo.setIdentity(identity);
  734. payeeInfo.setIdentityType("ALIPAY_USER_ID");
  735. payeeInfo.setName(name);
  736. model.setPayeeInfo(payeeInfo);
  737. model.setTransAmount(transAmount);
  738. model.setProductCode("TRANS_ACCOUNT_NO_PWD");
  739. model.setOrderTitle("进货仓单收款");
  740. AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
  741. request.setBizModel(model);
  742. AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request);
  743. if (!response.isSuccess()){
  744. log.info("向用户【" + name +"】打款失败,打款账号:" + identity);
  745. logger.info("打款失败", ",打款人:" + name + "支付宝账号:" + identity);
  746. }else{
  747. log.info("向用户【" + name +"】打款成功,打款账号:" + identity);
  748. logger.info("打款成功", ",打款人:" + name + "支付宝账号:" + identity);
  749. }
  750. } catch (AlipayApiException e) {
  751. e.printStackTrace();
  752. String msg = "打款失败, ,打款人:" + name + "支付宝账号:" + identity;
  753. logger.info(msg, e.getMessage());
  754. logger.info("打款失败", ",打款人:" + name + "支付宝账号:" + identity);
  755. }
  756. }
  757. /**
  758. * 用户仓单收款
  759. * 1、向用户打款
  760. * 2、修改寄售订单金额
  761. * @param user 用户
  762. * @param transAmount 金额
  763. * @param orderConsignId 寄售(进货)Id
  764. */
  765. private void transfer(UserApp user, String transAmount, Long orderConsignId){
  766. OrderConsign orderConsign = new OrderConsign();
  767. orderConsign.setId(orderConsignId);
  768. orderConsign.setConfirmTime(DateUtil.now());
  769. if (user == null){
  770. orderConsign.setIsConfirm(3);//异常
  771. orderConsign.setBody("该用户不存在");
  772. orderConsignService.updateById(orderConsign);
  773. return;
  774. }
  775. if (StringUtil.isEmpty(user.getAlipayUserId())){
  776. orderConsign.setIsConfirm(3);//异常
  777. orderConsign.setBody("用户【" + user.getUserId() +" 】无支付宝账号数据");
  778. orderConsignService.updateById(orderConsign);
  779. return;
  780. }
  781. User u = userService.getById(user.getUserId());
  782. if (u == null){
  783. orderConsign.setIsConfirm(3);//异常
  784. orderConsign.setBody("该用户不存在,可能被删除或者冻结");
  785. orderConsignService.updateById(orderConsign);
  786. return;
  787. }
  788. if (StringUtil.isEmpty(u.getRealName())){
  789. orderConsign.setIsConfirm(3);//异常
  790. orderConsign.setBody("该用户无法获取真实名字");
  791. orderConsignService.updateById(orderConsign);
  792. return;
  793. }
  794. String identity = user.getAlipayUserId();
  795. String name = u.getRealName();
  796. try {
  797. String privateKey = "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCU4XTbNjnNOmuEnwBEgUBOVLK5CaUiUFKEkVW1/2sTlijARZzLtzwXfbkvzHEhCSu+E+OA1Futbh5HwNAC06bvqYDS+TXrFuZ0LcDaU92lk5Hp/ed8NhRXtm0gss1TS0vebOq+3kejErIvVCg9kNMrYMrmdf8G0+zKlCp3vrfdM37IeLXp3GoOckNzHh/LT7rLd7/9QcdSCPixPSwusrfCusw3H093cuWkV9WX4Go/zHTL9rAEwJPOn36OhyVc1oG113ZJiVg7KgsZGOCJJyh9BvlKq2vuKxnylQwq9Kh5e+BfP2FSWs7a1XMj/79JsZTxztJ9tFqcSXQh99vq1nd1AgMBAAECggEAVglIT5oxoxEcq0J7lBshf2Lg+Z/CR2clmKioYImfZm1DVYGlD/DvECA+kYnS4qV7GthBg+S0qi/V3d9mFgwcD6nj4YfVCets+Dyskz8d+p6iFxf820IhVWL+A4Rwta7wxDQrIGwx9+JJCKLYsmNsNUg1WSNdYqO71oHzXMnhVTmYJ6sKOrrBucyI4Ydu9UbfN+DRRGD9seL+Nxh1V2PPXs4ftk2kRlG18LaTPgFba1g8QBIpGDR9gFqM+DvBHUxAWsPRnL1+q0c6o5Ndk7W5f7Ob1zxF/lgqHudiG38jItkwc7MLMOYjbV5wiJPZc93nsHS1CKPSEX9/snNLnx2LQQKBgQDMyLBVVasfTMQpMjyi+Jof9JLHPiRP3dEHwZECUgfdWhPoidLjK9y1wszmCLrcg01842WufrpbJ1QXs+g8x6+DhLHvcKum1znsvQKWdy/2V6a2eahNHsYi1Qus+N0dFgotfZwfElfkIU/jAwh6OnYPCXQCVmdvoxzmdk81L04d5QKBgQC6HY6EZ8o4mo4CzDss2qxT2oKuiI0clnbDPC9LJzkRBVbHosx6AO+C3RyfREZxMzNhYW3XnozifDyRw6rlvI6toE3l9ku71dJS1aKZwbH/h0rdHXXqDHARYc9rdwCzOM2t2Kve/PgXxCDQdwY/m0deXM22oKdOlb7miz2YTGLaUQKBgEg8qucPNzPtUmztybH7W/LVxUj/RLPfnTLNNyfIY/nTIp6ur3NvL4X2V2z1u2S59IWPeXjaP0aUUvehgNSf4+vSzSmXZxWNamN2MQl+ta6CMM7Bj3rU1jPHTz0O9ICkG6b8Xiwfvl082v9LPJxRLwAS55dDf21D7pflN/+c1kN5AoGARaRHrt3TeojCuONJBUiyERKDseFgxCC9QeLkY3/Cx86yoTMWxlRRSyuHyUTYAwXApSC65GLsntcUJwsLiLmcvfVtEK6vuhKRh/Nuy5ACFfa/Gawrci/DQ43Q+opmFaoctH+OGHuaLfJywO64xNZKx1F8nGjTEgHQlB3oJ3P1zXECgYBW/GRUU+SevGeLjZTZ9WqG+ztseItnmEwmar9tGhR9TNv3vDiL5/fsAfI8ApMiIzDe6+QfS5Lxx5rD6V4Et/zBpsf8JzqP2eDiTe9UiHxDr2v5NIxelf404VZcdRh83u84lCJTa/ZYanFu94UW6h70MHhDWtiWddtFR3EXt5hD9w==";
  798. String alipayPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhIxPBQL0OKBc6fcU/9PdVTMA7L2s314oU2w1q06ywQSDdhF3RY1Bo0Eqh4Zg8QpPirFeyAc4rhFjyKZRlngQXrybcAhUfswD86QQGodObe3aA9bbWdXiTt10Q5CBk5GImadNiEW6Adh+0bY5ezf1RbxIjbGDfH6x5gatZnpjPswiHMQnskZtg9JSfE2u8WEKuSaH8yhnkllHpIHWnWvFvXwNVNycXdmDrEe7gIB1yCouNK6/DZ7IQH2AajSuvbxmCqO0MzywEfgvLqE0GFVsKKmXvgJebRAnW9RmGhmrxvEIceXCjR3tbxM9gX8lioDlqKnBootTgAbjIJ5VrPvKPwIDAQAB";
  799. AlipayConfig alipayConfig = new AlipayConfig();
  800. alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do");
  801. alipayConfig.setAppId("2021003125657245");
  802. alipayConfig.setPrivateKey(privateKey);
  803. alipayConfig.setFormat("json");
  804. alipayConfig.setAlipayPublicKey(alipayPublicKey);
  805. alipayConfig.setCharset("UTF8");
  806. alipayConfig.setSignType("RSA2");
  807. //设置应用公钥证书路径//appCertPublicKey_2021003125657245
  808. alipayConfig.setAppCertPath(properties.getAppCertPath());
  809. //设置支付宝公钥证书路径//alipayCertPublicKey_RSA2
  810. alipayConfig.setAlipayPublicCertPath(properties.getAliPayCertPath());
  811. //设置支付宝根证书路径
  812. alipayConfig.setRootCertPath(properties.getAliPayRootCertPath());
  813. AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig);
  814. AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel();
  815. model.setOutBizNo(CommonUtil.genTimeID());
  816. model.setRemark("贵州中宏科技有限公司进货仓单收款");
  817. model.setBusinessParams("{\"payer_show_name_use_alias\":\"true\"}");
  818. model.setBizScene("DIRECT_TRANSFER");
  819. Participant payeeInfo = new Participant();
  820. payeeInfo.setIdentity(identity);
  821. payeeInfo.setIdentityType("ALIPAY_USER_ID");
  822. payeeInfo.setName(name);
  823. model.setPayeeInfo(payeeInfo);
  824. model.setTransAmount(transAmount);
  825. model.setProductCode("TRANS_ACCOUNT_NO_PWD");
  826. model.setOrderTitle("进货仓单收款");
  827. AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
  828. request.setBizModel(model);
  829. AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request);
  830. if (!response.isSuccess()){
  831. log.info("向用户【" + name +" 】打款失败,打款账号:" + identity);
  832. logger.info("打款失败", ",打款人:" + name + "支付宝账号:" + identity);
  833. orderConsign.setBody("向用户【" + name +" 】打款失败,打款账号:" + identity);
  834. orderConsign.setIsConfirm(3);//异常
  835. }else{
  836. log.info("向用户【" + name +" 】打款成功,打款账号:" + identity);
  837. logger.info("打款成功", ",打款人:" + name + "支付宝账号:" + identity);
  838. orderConsign.setBody("向用户【" + name +" 】打款成功,打款账号:" + identity);
  839. orderConsign.setIsConfirm(2);//确认
  840. }
  841. orderConsignService.updateById(orderConsign);
  842. } catch (AlipayApiException e) {
  843. e.printStackTrace();
  844. logger.info("打款失败", ",打款人:" + name + "支付宝账号:" + identity);
  845. orderConsign.setIsConfirm(3);//异常
  846. orderConsign.setBody(e.getMessage());
  847. orderConsignService.updateById(orderConsign);
  848. }
  849. }
  850. }