• 对接支付宝


    1.引入依赖 (后期版本可能会更新)

    1. com.alipay.sdk
    2. alipay-sdk-java
    3. 4.23.0.ALL

    2,写配置类

    1. @Configuration
    2. public class AlipayClientConfig{
    3. @Value("${ali-pay.app-id}")
    4. private String appId;
    5. @Value("${ali-pay.merchant-private-key}")
    6. private String merchantPrivateKey;
    7. @Value("${ali-pay.ali-pay-public-key}")
    8. private String aliPayPublicKey;
    9. @Value("${ali-pay.gateway-url}")
    10. private String gatewayUrl;
    11. @Bean
    12. public AlipayClient alipayClient() throws AlipayApiException{
    13. AlipayConfig alipayConfig=new AlipayConfig();
    14. //设置appId
    15. alipayConfig.setAppId(appId);
    16. //设置商户私钥
    17. alipayConfig.setPrivateKey(merchantPrivateKey);
    18. //设置支付宝公钥
    19. alipayConfig.setAlipayPublicKey(aliPayPublicKey);
    20. //设置支付宝网关
    21. alipayConfig.setServerUrl(gatewayUrl);
    22. //设置请求格式,固定值json.
    23. alipayConfig.setFormat(AlipayConstants.FORMAT_JSON);
    24. //设置字符集
    25. alipayConfig.setCharset(AlipayConstants.CHARSET_UTF8);
    26. //设置签名类型
    27. alipayConfig.setSignType(AlipayConstants.SIGN_TYPE_RSA2);
    28. //构造client
    29. AlipayClient alipayClient=new DefaultAlipayClient(alipayConfig);
    30. return alipayClient;
    31. }
    32. }

    3.配置字段说明

    1. ali-pay:
    2. #接下来两个用来标识用户
    3. #商户id
    4. pid: xxxxxxxxxxx
    5. #应用appid(和商户id绑定过)
    6. app-id: xxxxxxxxxxx
    7. #接下来三个用来确保SSL
    8. #商户私钥
    9. merchant-private-key: xxxxxxxxxxx
    10. #支付宝公钥
    11. ali-pay-public-key: xxxxxxxxxxx
    12. #TODO: #对称加密密钥
    13. # content-key:
    14. #接下来三个是相关地址
    15. #支付宝网关
    16. gateway-url: https://openapi.alipaydev.com/gateway.do
    17. #接收结果通知地址
    18. notify-url: xxxxxxxxxxx
    19. #页面跳转同步通知页面路径
    20. return-url: xxxxxxxxxxx

    4.其他

    1. public class AliPayConstant{
    2. public static final String TRADE_STATE_SUCCESS="TRADE_SUCCESS";
    3. public static final String REFUND_STATE_SUCCESS="REFUND_SUCCESS";
    4. }

    5.创建支付功能 小程序文档 - 支付宝文档中心

    1. private String createPay(OrderInfo orderInfo){
    2. //请求
    3. AlipayTradePagePayRequest request=new AlipayTradePagePayRequest();
    4. //数据
    5. AlipayTradePagePayModel bizModel=new AlipayTradePagePayModel();
    6. bizModel.setOutTradeNo(orderInfo.getOrderNo());
    7. //单位是元
    8. bizModel.setTotalAmount(orderInfo.getTotalFee()
    9. .toString());
    10. bizModel.setSubject(orderInfo.getTitle());
    11. //默认的
    12. bizModel.setProductCode("FAST_INSTANT_TRADE_PAY");
    13. request.setBizModel(bizModel);
    14. request.setNotifyUrl(notifyUrl+"/pay/order/pay-signal");
    15. //用户支付后支付宝会以GET方法请求returnUrl,并且携带out_trade_no,trade_no,total_amount等参数.
    16. request.setReturnUrl(returnUrl);
    17. AlipayTradePagePayResponse response=null;
    18. try{
    19. //完成签名并执行请求
    20. response=alipayClient.pageExecute(request);
    21. if(response.isSuccess()){
    22. log.debug("调用成功");
    23. return response.getBody();
    24. }
    25. else{
    26. log.error("调用失败");
    27. log.error(response.getMsg());
    28. return null;
    29. }
    30. }
    31. catch(AlipayApiException e){
    32. log.error("调用异常");
    33. return null;
    34. }
    35. }

    返回的是一个表单 需要前端进行处理,随后可以直接扫码或者使用只用支付号账号登录进行付款

    6.支付回调结果通知  小程序文档 - 支付宝文档中心

    1. @PostMapping("/pay-signal")
    2. public String paySignal(@RequestBody Map data){
    3. log.debug("收到支付宝回调");
    4. //验签
    5. boolean signVerified=false;
    6. try{
    7. signVerified=AlipaySignature.rsaCheckV1(data,aliPayPublicKey,AlipayConstants.CHARSET_UTF8,AlipayConstants.SIGN_TYPE_RSA2);
    8. //验签成功
    9. if(signVerified){
    10. log.debug("验签成功");
    11. //从数据库中查出对应的订单
    12. QueryWrapper queryWrapper=new QueryWrapper<>();
    13. queryWrapper.eq("order_no",data.get("out_trade_no"));
    14. OrderInfo orderInfo=orderInfoService.getOne(queryWrapper);
    15. synchronized(this){
    16. if(orderInfo.getOrderStatus()
    17. .equals(OrderInfo.NOT_PAIED)){
    18. //将订单设置为已支付状态
    19. orderInfo.setOrderStatus(OrderInfo.PAIED);
    20. //更新订单状态
    21. orderInfoService.updateById(orderInfo);
    22. //添加支付记录
    23. PaymentInfo paymentInfo=new PaymentInfo();
    24. paymentInfo.setOrderNo(orderInfo.getOrderNo());
    25. paymentInfo.setCreateTime(new Date());
    26. paymentInfo.setUpdateTime(new Date());
    27. paymentInfo.setPayerTotal(orderInfo.getTotalFee());
    28. paymentInfo.setPaymentType(PaymentInfo.ALI_PAY);
    29. //支付宝支付中的支付编号
    30. paymentInfo.setTransactionId(data.get("trade_no"));
    31. //交易类型(扫码 登录等等)
    32. paymentInfo.setTradeType("扫码/登录支付");
    33. paymentInfo.setTradeState(data.get("trade_status"));
    34. //存放全部数据(json)以备不时之需
    35. paymentInfo.setContent(gson.toJson(data));
    36. paymentInfoService.save(paymentInfo);
    37. log.info("订单{}的支付记录添加成功,支付记录id为{}.",orderInfo.getOrderNo(),paymentInfo.getId());
    38. }
    39. else{
    40. log.debug("订单{}状态为{},回调处理退出.",orderInfo.getOrderNo(),OrderInfo.PAIED);
    41. }
    42. }
    43. //除了success外其他返回均认为是失败
    44. return "success";
    45. }
    46. //验签失败
    47. else{
    48. log.error("验签失败");
    49. return "failure";
    50. }
    51. }
    52. catch(AlipayApiException e){
    53. log.error("验签异常");
    54. return "failure";
    55. }
    56. }

    7.查询支付 小程序文档 - 支付宝文档中心

    1. private Map queryPay(String orderNo){
    2. //请求
    3. AlipayTradeQueryRequest request=new AlipayTradeQueryRequest();
    4. //数据
    5. AlipayTradeQueryModel bizModel=new AlipayTradeQueryModel();
    6. bizModel.setOutTradeNo(orderNo);
    7. request.setBizModel(bizModel);
    8. try{
    9. //完成签名并执行请求
    10. AlipayTradeQueryResponse response=alipayClient.execute(request);
    11. if(response.isSuccess()){
    12. log.debug("查询订单{}成功",orderNo);
    13. HashMap resultMap=gson.fromJson(response.getBody(),HashMap.class);
    14. return resultMap;
    15. }
    16. else{
    17. log.error("查询订单{}失败,响应数据是{}.",orderNo,response.getBody());
    18. return null;
    19. }
    20. }
    21. catch(AlipayApiException e){
    22. log.error("查询订单{}异常",orderNo);
    23. return null;
    24. }
    25. }

    8.取消支付 小程序文档 - 支付宝文档中心

    1. private boolean cancelPay(String orderNo){
    2. //请求
    3. AlipayTradeCloseRequest request=new AlipayTradeCloseRequest();
    4. //数据
    5. AlipayTradeCloseModel bizModel=new AlipayTradeCloseModel();
    6. bizModel.setOutTradeNo(orderNo);
    7. request.setBizModel(bizModel);
    8. try{
    9. //完成签名并执行请求
    10. AlipayTradeCloseResponse response=alipayClient.execute(request);
    11. if(response.isSuccess()){
    12. log.debug("订单{}取消成功",orderNo);
    13. }
    14. else{
    15. log.debug("订单{}未创建,因此也可认为本次取消成功.",orderNo);
    16. }
    17. return true;
    18. }
    19. catch(AlipayApiException e){
    20. log.error("订单{}取消异常",orderNo);
    21. return false;
    22. }
    23. }

    9.创建支付 小程序文档 - 支付宝文档中心

    1. private HashMap createRefund(RefundInfo refundInfo){
    2. //请求
    3. AlipayTradeRefundRequest request=new AlipayTradeRefundRequest();
    4. //数据
    5. AlipayTradeRefundModel bizModel=new AlipayTradeRefundModel();
    6. //订单号
    7. bizModel.setOutTradeNo(refundInfo.getOrderNo());
    8. //退款单号
    9. bizModel.setOutRequestNo(refundInfo.getRefundId());
    10. bizModel.setRefundAmount(refundInfo.getTotalFee().toString());
    11. bizModel.setRefundReason(refundInfo.getReason());
    12. request.setBizModel(bizModel);
    13. HashMap resultMap=new HashMap<>();
    14. try{
    15. //完成签名并执行请求
    16. AlipayTradeRefundResponse response=alipayClient.execute(request);
    17. //成功则说明退款成功了
    18. resultMap.put("data",response.getBody());
    19. if(response.isSuccess()){
    20. resultMap.put("isRefundSuccess",true);
    21. log.debug("订单{}退款成功",refundInfo.getOrderNo());
    22. }
    23. else{
    24. resultMap.put("isRefundSuccess",false);
    25. log.error("订单{}退款失败",refundInfo.getOrderNo());
    26. }
    27. return resultMap;
    28. }
    29. catch(AlipayApiException e){
    30. resultMap.put("isRefundSuccess",false);
    31. log.error("订单{}退款异常",refundInfo.getOrderNo());
    32. return resultMap;
    33. }
    34. }

    10.查询退款 小程序文档 - 支付宝文档中心

    1. private Map queryRefund(RefundInfo refundInfo){
    2. AlipayTradeFastpayRefundQueryRequest request=new AlipayTradeFastpayRefundQueryRequest();
    3. AlipayTradeFastpayRefundQueryModel bizModel=new AlipayTradeFastpayRefundQueryModel();
    4. //订单号
    5. bizModel.setOutTradeNo(refundInfo.getOrderNo());
    6. //退款单号
    7. bizModel.setOutRequestNo(refundInfo.getRefundNo());
    8. //想要额外返回的数据(也就是文档中响应可选的数据)
    9. ArrayList extraResponseDatas=new ArrayList<>();
    10. extraResponseDatas.add("refund_status");
    11. bizModel.setQueryOptions(extraResponseDatas);
    12. request.setBizModel(bizModel);
    13. try{
    14. //完成签名并执行请求
    15. AlipayTradeFastpayRefundQueryResponse response=alipayClient.execute(request);
    16. if(response.isSuccess()){
    17. log.debug("退款{}查询成功",refundInfo.getRefundNo());
    18. return gson.fromJson(response.getBody(),HashMap.class);
    19. }
    20. else{
    21. log.debug("退款{}查询失败",refundInfo.getRefundNo());
    22. return null;
    23. }
    24. }
    25. catch(AlipayApiException e){
    26. log.debug("退款{}查询异常",refundInfo.getRefundNo());
    27. return null;
    28. }
    29. }

    11. 查询账单下载url

    1. /**
    2. * @param billType 账单类型,枚举值为1.trade(交易账单)2.signcustomer(流水账).
    3. * @param billDate 账单日期:
    4. * 日账单:格式:yyyy-MM-dd 5.6日的账单记录的时间为05-06 9:00到05-07 9:00,并且在05-07 9:00后才能查到.
    5. * 月账单:格式:yyyy-MM 8月的账单记录的时间为08-03到09-03,并且在09-03后才能查到.
    6. * @return 账单下载url(30s后则失效)
    7. */
    8. @GetMapping("/query-bill-download-url")
    9. public String queryBillDownloadUrl(String billType,String billDate){
    10. //请求
    11. AlipayDataDataserviceBillDownloadurlQueryRequest request=new AlipayDataDataserviceBillDownloadurlQueryRequest();
    12. //数据
    13. AlipayDataDataserviceBillDownloadurlQueryModel bizModel=new AlipayDataDataserviceBillDownloadurlQueryModel();
    14. bizModel.setBillType(billType);
    15. bizModel.setBillDate(billDate);
    16. request.setBizModel(bizModel);
    17. try{
    18. //完成签名并执行请求
    19. AlipayDataDataserviceBillDownloadurlQueryResponse response=alipayClient.execute(request);
    20. if(response.isSuccess()){
    21. log.debug("获取账单下载url成功");
    22. return response.getBillDownloadUrl();
    23. }
    24. else{
    25. log.error("获取账单下载url失败");
    26. return null;
    27. }
    28. }
    29. catch(AlipayApiException e){
    30. log.error("获取账单下载url异常");
    31. return null;
    32. }
    33. }

     

  • 相关阅读:
    点成分享 | 一文读懂什么是微流控芯片
    python提速N倍的小秘诀——这份工具清单请收好
    护网攻防演练-内网横向移动总结
    Websocket在Java中的实践——自动注册端点
    Java并发编程学习14-任务关闭(上)
    【word技巧】如何在word文件中方框打对勾?
    Go 限流控制《滑动窗口&令牌桶》:time/rate、TokenLimit、PeriodLimit
    1 Supervised Machine Learning Regression and Classification
    6大优势、2种类型,一文吃透动态应用安全测试(DAST)
    无线设备的天线怎么安装最好?
  • 原文地址:https://blog.csdn.net/wmd13164306712/article/details/143411141