文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

没想到吧!Java也可以实现微信和支付宝支付功能(附代码)

2024-12-03 08:55

关注

申请好支付宝商户号appid,商户公钥和秘钥(需要用支付宝工具自己生成),支付宝退款不需要证书

二、数据库表设计

[[388523]]

1、微信支付配置表

 

  1. CREATE TABLE `py_wx_config` ( 
  2.  `wx_config_id` varchar(18) NOT NULL COMMENT '微信支付配置ID'
  3.  `appid` varchar(128) DEFAULT NULL COMMENT '微信公众号ID'
  4.  `mch_id` varchar(128) DEFAULT NULL COMMENT '商户号ID'
  5.  `mch_key_secret` varchar(2200) DEFAULT NULL COMMENT '商户安全密钥'
  6.  `crt_path` varchar(200) DEFAULT NULL COMMENT '商户证书存放路径'
  7.  `app_secret` varchar(2200) DEFAULT NULL COMMENT '公众号安全密钥'
  8.  `create_id` varchar(18) DEFAULT NULL COMMENT '创建人'
  9.  `create_time` datetime DEFAULT NULL COMMENT '创建时间'
  10.  `upd_id` varchar(18) DEFAULT NULL COMMENT '修改人'
  11.  `upd_time` datetime DEFAULT NULL COMMENT '修改时间'
  12.  `delete_flag` tinyint(1) NOT NULL DEFAULT '0' COMMENT '删除标志'
  13.  `app_code` varchar(18) NOT NULL COMMENT '商家编码'
  14.  `bm_code` varchar(20) DEFAULT NULL COMMENT '部门编码'
  15.  PRIMARY KEY (`wx_config_id`) USING BTREE 
  16. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='微信支付配置'

2、微信小程序支付配置表

 

  1. CREATE TABLE `py_wx_min_config` ( 
  2.  `wx_min_config_id` varchar(18) NOT NULL COMMENT '微信支付配置ID'
  3.  `appid` varchar(128) DEFAULT NULL COMMENT '微信公众号ID'
  4.  `mch_id` varchar(128) DEFAULT NULL COMMENT '商户号ID'
  5.  `mch_key_secret` varchar(2200) DEFAULT NULL COMMENT '商户安全密钥'
  6.  `crt_path` varchar(200) DEFAULT NULL COMMENT '商户证书存放路径'
  7.  `app_secret` varchar(2200) DEFAULT NULL COMMENT '公众号安全密钥'
  8.  `create_id` varchar(18) DEFAULT NULL COMMENT '创建人'
  9.  `create_time` datetime DEFAULT NULL COMMENT '创建时间'
  10.  `upd_id` varchar(18) DEFAULT NULL COMMENT '修改人'
  11.  `upd_time` datetime DEFAULT NULL COMMENT '修改时间'
  12.  `delete_flag` tinyint(1) NOT NULL DEFAULT '0' COMMENT '删除标志'
  13.  `app_code` varchar(18) NOT NULL COMMENT '商家编码'
  14.  `sys_software_code` varchar(18) DEFAULT NULL COMMENT '系统编码'
  15.  PRIMARY KEY (`wx_min_config_id`) USING BTREE 
  16. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='微信支付配置'

3、支付宝支付配置表

 

  1. CREATE TABLE `py_alipay_config` ( 
  2.  `alipay_config_id` varchar(18) NOT NULL COMMENT '支付宝支付配置ID'
  3.  `ali_private_key` varchar(2200) DEFAULT NULL COMMENT '支付宝密钥'
  4.  `ali_public_key` varchar(2200) DEFAULT NULL COMMENT '支付宝公钥'
  5.  `ali_appid` varchar(128) DEFAULT NULL COMMENT '支付宝appid'
  6.  `create_id` varchar(18) DEFAULT NULL COMMENT '创建人'
  7.  `create_time` datetime DEFAULT NULL COMMENT '创建时间'
  8.  `upd_id` varchar(18) DEFAULT NULL COMMENT '修改人'
  9.  `upd_time` datetime DEFAULT NULL COMMENT '修改时间'
  10.  `delete_flag` tinyint(1) NOT NULL DEFAULT '0' COMMENT '删除标志'
  11.  `app_code` varchar(18) NOT NULL COMMENT '商家编码'
  12.  PRIMARY KEY (`alipay_config_id`) USING BTREE 
  13. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='支付宝支付配置'

4、支付流水记录表

 

  1. CREATE TABLE `py_pay_log` ( 
  2.  `pay_log_id` varchar(18) NOT NULL COMMENT '支付流水ID'
  3.  `pay_no` varchar(20) DEFAULT NULL COMMENT '支付订单号'
  4.  `third_id` varchar(64) DEFAULT NULL COMMENT '微信支付宝订单ID'
  5.  `money_type` varchar(20) DEFAULT NULL COMMENT '支付类型 0-微信 1-支付宝 2-会员卡 3-银联'
  6.  `mq_topic` varchar(100) DEFAULT NULL COMMENT 'MQ主题'
  7.  `mq_status` tinyint(3) DEFAULT NULL COMMENT 'MQ发送状态 0-待发送 1-已发送 2-发送失败'
  8.  `mq_remark` varchar(100) DEFAULT NULL COMMENT 'MQ发送备注'
  9.  `request` text COMMENT '发送数据'
  10.  `response` text COMMENT '返回数据'
  11.  `fee` decimal(14,2) DEFAULT NULL COMMENT '订单金额'
  12.  `create_id` varchar(18) DEFAULT NULL COMMENT '创建人'
  13.  `create_time` datetime DEFAULT NULL COMMENT '创建时间'
  14.  `upd_id` varchar(18) DEFAULT NULL COMMENT '修改人'
  15.  `upd_time` datetime DEFAULT NULL COMMENT '修改时间'
  16.  `delete_flag` tinyint(1) NOT NULL DEFAULT '0' COMMENT '删除标志'
  17.  `app_code` varchar(18) NOT NULL COMMENT '商家编码'
  18.  `pay_config_json_str` longtext COMMENT '支付配置'
  19.  PRIMARY KEY (`pay_log_id`) USING BTREE 
  20. ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='支付流水'

5、支付失败记录表

 

  1. CREATE TABLE `pay_fail_log` ( 
  2.  `pay_id` varchar(18) NOT NULL
  3.  `json_date` varchar(500) DEFAULT NULL
  4.  `create_id` varchar(18) DEFAULT NULL
  5.  `create_time` datetime DEFAULT NULL
  6.  `update_id` varchar(18) DEFAULT NULL
  7.  `update_time` datetime DEFAULT NULL
  8.  `app_code` varchar(18) NOT NULL
  9.  `delete_flag` tinyint(1) DEFAULT '0' COMMENT '是否删除:0-否;1-是'
  10.  PRIMARY KEY (`pay_id`) USING BTREE 
  11. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT; 

三、依赖引入

 

 

  1. "1.0" encoding="UTF-8"?> 
  2.  
  3. "http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  4.    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
  5.  
  6.   
  7.   org.springframework.boot 
  8.   spring-boot-starter-parent 
  9.   2.1.3.RELEASE 
  10.    -- lookup parent from repository --> 
  11.   
  12.  
  13.  4.0.0 
  14.  com.pay 
  15.  qc-payment 
  16.  2.3 
  17.  <name>qc-paymentname
  18.  -- FIXME change it to the project's website --> 
  19.  http://www.example.com 
  20.  
  21.   
  22.   UTF-8 
  23.   1.7 
  24.   1.7 
  25.   Greenwich.SR1 
  26.   
  27.  
  28.   
  29.    
  30.    org.springframework.boot 
  31.    spring-boot-starter-data-redis 
  32.    
  33.    
  34.    org.springframework.boot 
  35.    spring-boot-starter-web 
  36.    
  37.    
  38.    org.springframework.cloud 
  39.    spring-cloud-starter-netflix-eureka-client 
  40.    
  41.    
  42.    org.springframework.cloud 
  43.    spring-cloud-starter-netflix-zuul 
  44.    
  45.  
  46.  
  47.   --z支付宝--> 
  48.    
  49.    com.alipay.sdk 
  50.    alipay-sdk-java 
  51.    3.3.4.ALL 
  52.    
  53.  
  54.  
  55.    
  56.    org.springframework.boot 
  57.    spring-boot-starter-test 
  58.    test 
  59.    
  60.  
  61.   --导入重试机制的坐标--> 
  62.    
  63.    org.springframework.retry 
  64.    spring-retry 
  65.    
  66.  
  67.   --引入Hystrix依赖--> 
  68.    
  69.    org.springframework.cloud 
  70.    spring-cloud-starter-netflix-hystrix 
  71.    
  72.  
  73.   --导入jwt相关依赖--> 
  74.    
  75.    com.auth0 
  76.    java-jwt 
  77.    3.4.1 
  78.    
  79.  
  80.   -- StringUtil 类--> 
  81.    
  82.    org.apache.commons 
  83.    commons-lang3 
  84.    3.3.2 
  85.    
  86.  
  87.   -- ali 连接池 --> 
  88.    
  89.    com.alibaba 
  90.    druid 
  91.    1.1.12 
  92.    
  93.  
  94.   -- mybatis --> 
  95.    
  96.    org.mybatis.spring.boot 
  97.    mybatis-spring-boot-starter 
  98.    2.0.0 
  99.    
  100.  
  101.   -- mysql --> 
  102.    
  103.    mysql 
  104.    mysql-connector-java 
  105.    
  106.    
  107.    javax.persistence 
  108.    persistence-api 
  109.    1.0.2 
  110.    
  111.   -- https://mvnrepository.com/artifact/tk.mybatis/mapper --> 
  112.    
  113.    tk.mybatis 
  114.    mapper 
  115.    4.0.3 
  116.    
  117.  
  118.   -- import lombok 可以省去getter setter toString等方法 --> 
  119.    
  120.    org.projectlombok 
  121.    lombok 
  122.    provided 
  123.    
  124.  
  125.   -- commons-io --> 
  126.    
  127.    commons-io 
  128.    commons-io 
  129.    2.4 
  130.    
  131.  
  132.   -- 引入easyqinyu-tools项目 --> 
  133.    
  134.    com.pay 
  135.    easyqinyu-tools 
  136.    0.0.1-SNAPSHOT 
  137.    
  138.  
  139.   -- pagehelper分页插件 --> 
  140.    
  141.    com.github.pagehelper 
  142.    pagehelper 
  143.    5.1.2 
  144.    
  145.  
  146.    
  147.    com.github.pagehelper 
  148.    pagehelper-spring-boot-autoconfigure 
  149.    1.2.3 
  150.    
  151.    
  152.    com.github.pagehelper 
  153.    pagehelper-spring-boot-starter 
  154.    1.2.3 
  155.    
  156.    
  157.    com.qcsoft 
  158.    qc-swagger-ui 
  159.    0.0.1-SNAPSHOT 
  160.    compile 
  161.    
  162.    
  163.    com.google.zxing 
  164.    core 
  165.    3.3.0 
  166.    
  167.  
  168.    
  169.    com.alibaba 
  170.    fastjson 
  171.    RELEASE 
  172.    compile 
  173.    
  174.  
  175.    
  176.    org.apache.httpcomponents 
  177.    httpclient 
  178.    ${httpclient.version} 
  179.    
  180.  
  181.  
  182.    
  183.    com.google.code.gson 
  184.    gson 
  185.    2.8.2 
  186.    
  187.  
  188.  
  189.   --阿里云信息发送--> 
  190.    
  191.    com.aliyun 
  192.    aliyun-java-sdk-core 
  193.    3.3.1 
  194.    
  195.    
  196.    com.github.1991wangliang 
  197.    aliyun-java-sdk-dysmsapi 
  198.    1.0.0 
  199.    
  200.  
  201.    
  202.    org.springframework.kafka 
  203.    spring-kafka 
  204.    
  205.  
  206.   -- xml解析--> 
  207.    
  208.    com.thoughtworks.xstream 
  209.    xstream 
  210.    1.4.10 
  211.    
  212.  
  213.   -- dom4j --> 
  214.    
  215.    org.dom4j 
  216.    dom4j 
  217.    2.1.1 
  218.    
  219.  
  220.     
  221.    com.github.binarywang 
  222.    weixin-java-common 
  223.    3.3.4.B 
  224.    
  225.  
  226.  
  227.    
  228.    org.jodd 
  229.    jodd-http 
  230.    compile 
  231.    
  232.  
  233.    
  234.    org.apache.commons 
  235.    commons-lang3 
  236.    
  237.  
  238.  
  239.   -- xml解析--> 
  240.    
  241.    commons-beanutils 
  242.    commons-beanutils 
  243.    1.9.3 
  244.    
  245.  
  246.    
  247.    jdom 
  248.    jdom 
  249.    1.0 
  250.    
  251.  
  252.  
  253.    
  254.    org.bouncycastle 
  255.    bcpkix-jdk15on 
  256.    1.59 
  257.    
  258.    
  259.    org.jodd 
  260.    jodd-http 
  261.    3.7.1 
  262.    
  263.   --二维码工具--> 
  264.    
  265.    com.google.zxing 
  266.    core 
  267.    3.2.1 
  268.    
  269.  
  270.    
  271.    com.qcsoft 
  272.    qc-commonbean 
  273.    0.0.1-SNAPSHOT 
  274.    
  275.  
  276.    
  277.    org.springframework.cloud 
  278.    spring-cloud-starter-openfeign 
  279.    
  280.   -- xxl-job-core --> 
  281.    
  282.    com.xuxueli 
  283.    xxl-job-core 
  284.    2.0.1 
  285.    
  286.   --线路跟踪--> 
  287.    
  288.    org.springframework.cloud 
  289.    spring-cloud-starter-netflix-hystrix-dashboard 
  290.    
  291.  
  292.    
  293.    org.springframework.boot 
  294.    spring-boot-starter-actuator 
  295.    
  296.   
  297.  
  298.  
  299.   
  300.    
  301.     
  302.     org.springframework.cloud 
  303.     spring-cloud-dependencies 
  304.     ${spring-cloud.version} 
  305.     pom 
  306.     import 
  307.     
  308.    
  309.   
  310.   
  311.   qc-payment 
  312.    
  313.     
  314.     org.springframework.boot 
  315.     spring-boot-maven-plugin 
  316.     
  317.     
  318.     org.apache.maven.plugins 
  319.     maven-compiler-plugin 
  320.      
  321.      
  322.      8 
  323.      
  324.     
  325.    
  326.   
  327.  

四、程序实现

1、Controller

 

  1. package com.qcsoft.payment.controller; 
  2.  
  3. import com.alibaba.fastjson.JSON; 
  4. import com.qcsoft.commonbean.bean.common.SwaggerConstant; 
  5. import com.qcsoft.commonbean.bean.payment.common.PrePayResult; 
  6. import com.qcsoft.commonbean.bean.payment.wx.bean.PreOrderParam; 
  7. import com.qcsoft.commonbean.bean.payment.wx.exception.WxPayException; 
  8. import com.qcsoft.commonbean.bean.payment.wx.util.QrcodeUtils; 
  9. import com.qcsoft.easyqinyutools.message.ReturnMsg; 
  10. import com.qcsoft.payment.controller.commom.BaseController; 
  11. import com.qcsoft.payment.service.PayService; 
  12. import com.qcsoft.swaggerui.anno.ApiTag; 
  13. import org.slf4j.Logger; 
  14. import org.slf4j.LoggerFactory; 
  15. import org.springframework.beans.factory.annotation.Autowired; 
  16. import org.springframework.web.bind.annotation.*; 
  17.  
  18. import javax.imageio.ImageIO; 
  19. import javax.servlet.http.HttpServletRequest; 
  20. import javax.servlet.http.HttpServletResponse; 
  21. import java.awt.image.BufferedImage; 
  22. import java.io.IOException; 
  23.  
  24.  
  25.  
  26. @RestController 
  27. @RequestMapping("/v2"
  28. public class PayController extends BaseController { 
  29.  private static final Logger logger = LoggerFactory.getLogger(PayController.class); 
  30.  
  31.  @Autowired 
  32.  private PayService payService; 
  33.  
  34.  //private final AtomicInteger tick = new AtomicInteger(); 
  35.  
  36.   
  37.  @RequestMapping(value = "/prePayOrder"
  38.  @ApiTag(SwaggerConstant.PAYMENT_001) 
  39.  public ReturnMsg prePayOrder(@RequestBody PreOrderParam orderParam) { 
  40.   String metadata = JSON.toJSONString(orderParam); 
  41.   logger.info("PayController.prePayOrder----\n正在请求支付....,参数为>>>>{}", metadata); 
  42.   ReturnMsg ret = new ReturnMsg(); 
  43.   //预下单 
  44.   PrePayResult prePayResult = this.payService.payPreOrder(orderParam); 
  45.   ret.setData(prePayResult); 
  46.   return ret.success("下单成功,订单有效期为" + orderParam.getTimeExpire()); 
  47.  } 
  48.  
  49.   
  50.  @RequestMapping(value = "/createQrCode/url"
  51.  @ApiTag(SwaggerConstant.PAYMENT_001) 
  52.  public void createQrCode(@PathVariable String url, HttpServletRequest request, HttpServletResponse response) throws IOException { 
  53.   String queryString = request.getQueryString(); 
  54.   BufferedImage bufferedImage = QrcodeUtils.encode(url+queryString, 500, 500, nullnull); 
  55.   BufferedImage grayImage = QrcodeUtils.grayImage(bufferedImage); 
  56.   ImageIO.write(grayImage, "png", response.getOutputStream()); 
  57.  } 
  58.  
  59.  

2、PayService

 

  1. package com.qcsoft.payment.service.impl; 
  2.  
  3. import com.alibaba.fastjson.JSON; 
  4. import com.alipay.api.AlipayClient; 
  5. import com.qcsoft.commonbean.bean.common.KafkaConstant; 
  6. import com.qcsoft.commonbean.bean.payment.ChinaumsConfig; 
  7. import com.qcsoft.commonbean.bean.payment.PayLog; 
  8. import com.qcsoft.commonbean.bean.payment.common.PayConstant; 
  9. import com.qcsoft.commonbean.bean.payment.common.PrePayResult; 
  10. import com.qcsoft.commonbean.bean.payment.common.WxPrePayResultPackage; 
  11. import com.qcsoft.commonbean.bean.payment.wx.bean.PreOrderParam; 
  12. import com.qcsoft.commonbean.bean.payment.wx.bean.request.WxPayUnifiedOrderRequest; 
  13. import com.qcsoft.commonbean.bean.payment.wx.bean.result.WxPayUnifiedOrderResult; 
  14. import com.qcsoft.commonbean.bean.payment.wx.config.WxPayConfig; 
  15. import com.qcsoft.easyqinyutools.utils.JsonUtil; 
  16. import com.qcsoft.payment.commns.exception.BaseException; 
  17. import com.qcsoft.payment.commns.exception.QYError; 
  18. import com.qcsoft.payment.commns.utils.UserUtil; 
  19. import com.qcsoft.payment.commns.utils.weixin.PackageUtil; 
  20. import com.qcsoft.payment.service.*; 
  21. import org.apache.commons.lang3.StringUtils; 
  22. import org.slf4j.Logger; 
  23. import org.slf4j.LoggerFactory; 
  24. import org.springframework.beans.factory.annotation.Autowired; 
  25. import org.springframework.stereotype.Service; 
  26.  
  27. import java.util.SortedMap; 
  28. import java.util.TreeMap; 
  29.  
  30. @Service 
  31. public class PayServiceImpl implements PayService { 
  32.  public Logger logger = LoggerFactory.getLogger(getClass()); 
  33.  @Autowired 
  34.  private AliPayService aliPayService; 
  35.  @Autowired 
  36.  private WxPayService wxPayService; 
  37.  @Autowired 
  38.  private ChinaumsPayService chinaumsPayService; 
  39.  
  40.  @Autowired 
  41.  private UserUtil userUtil; 
  42.  @Autowired 
  43.  private PayLogService payLogService; 
  44.  
  45.  
  46.  @Override 
  47.  public PrePayResult payPreOrder(PreOrderParam orderParam) throws BaseException { 
  48.   logger.info("PayServiceImpl.payPreOrder---->>>>\n准备下单.....,当前用户订单号[{}]", orderParam.getDh()); 
  49.   String temp = ""
  50.   PrePayResult payResult = new PrePayResult(); 
  51.   //校验支付方式 
  52.   String payType = orderParam.getPayType(); 
  53.   if (!StringUtils.isNotBlank(payType)) 
  54.    throw new BaseException(QYError.msg("请选择支付方式!")); 
  55.   if (PayConstant.WXPAY.toString().equals(payType)) { 
  56.    //查询商家配置信息 
  57.    WxPayConfig config; 
  58.    if (orderParam.getTradeType().equals(PayConstant.WECHATAPP.toString())) { 
  59.     config = wxPayService.getWxMinPayConfigByAppCode(orderParam.getAppCode(), orderParam.getSysSoftwareCode()); 
  60.    } else { 
  61.     config = wxPayService.getWxPayConfigByAppCode(orderParam.getAppCode(), orderParam.getBmCode()); 
  62.    } 
  63.    //设置预支付请求参数 
  64.    if (orderParam.getTradeType().equals(PayConstant.WECHATAPP.toString())) { 
  65.     orderParam.setTradeType(PayConstant.JSAPI.toString()); 
  66.    } 
  67.    WxPayUnifiedOrderRequest requestParam = wxPayService.packRequestParam(orderParam); 
  68.    //开始请求预支付接口 
  69.    WxPayUnifiedOrderResult result = wxPayService.wxPrePay(config, requestParam); 
  70.    //根据支付类型设置值 
  71.    WxPrePayResultPackage resultPackage = null
  72.    if (orderParam.getTradeType().equals(PayConstant.APP.toString()) || orderParam.getTradeType().equals(PayConstant.JSAPI.toString()) || orderParam.getTradeType().equals(PayConstant.WECHATAPP.toString())) { 
  73.     resultPackage = new WxPrePayResultPackage(); 
  74.     String timeMillis = PackageUtil.getTimeStamp(); 
  75.     String nonceString = PackageUtil.getNonceStr(); 
  76.     resultPackage.setAppId(result.getAppid()); 
  77.     resultPackage.setNonceStr(nonceString); 
  78.     resultPackage.setTimeStamp(timeMillis); 
  79.     resultPackage.setPrePayId(result.getPrepayId()); 
  80.     resultPackage.setInfoPackage("prepay_id=" + result.getPrepayId()); 
  81.     resultPackage.setSignType(requestParam.getSignType()); 
  82.     if (orderParam.getTradeType().equals(PayConstant.APP.toString())) { 
  83.      SortedMap returnData = PackageUtil.getReturnData(resultPackage, config.getMchId()); 
  84.      String paysign = PackageUtil.createSign(returnData, config.getMchKey()); 
  85.      resultPackage.setPaySign(paysign); 
  86.      resultPackage.setInfoPackage(returnData.get("package")); 
  87.      payResult.setWxAppPackage(resultPackage); 
  88.     } else { 
  89.      SortedMap paypackageParams = new TreeMap(); 
  90.      paypackageParams.put("appId", result.getAppid()); // appid 
  91.      paypackageParams.put("timeStamp", timeMillis); // 
  92.      paypackageParams.put("nonceStr", nonceString); // 
  93.      paypackageParams.put("package", resultPackage.getInfoPackage()); // 
  94.      paypackageParams.put("signType", resultPackage.getSignType()); 
  95.      String paysign = PackageUtil.createSign(paypackageParams, config.getMchKey()); 
  96.      resultPackage.setPaySign(paysign); 
  97.      payResult.setWxJsapiPackage(resultPackage); 
  98.     } 
  99.    } else if (orderParam.getTradeType().equals(PayConstant.MWEB.toString())) { 
  100.     payResult.setWxH5Url(result.getMwebUrl() + " &redirect_url=" + orderParam.getRedirectUrl()); 
  101.    } else if (orderParam.getTradeType().equals(PayConstant.NATIVE.toString())) { 
  102.     payResult.setWxNativeUrl(result.getCodeURL()); 
  103.    } 
  104.    //添加支付日志 
  105.    insertPayLog(orderParam, KafkaConstant.PAYMENT_NOTIFY_001.getTopic(), "0", resultPackage, JSON.toJSONString(config)); 
  106.    return payResult; 
  107.   } else if (PayConstant.ALIPAY.toString().equals(payType)) { 
  108.    AlipayClient client = aliPayService.getAlipayClientByAppCode(orderParam.getAppCode()); 
  109.    if (orderParam.getTradeType().equals(PayConstant.APP.toString())) { 
  110.     temp = aliPayService.aliAppPay(client, orderParam); 
  111.     payResult.setAlipayAppParamStr(temp); 
  112.    } else if (orderParam.getTradeType().equals(PayConstant.MWEB.toString())) { 
  113.     temp = aliPayService.aliH5Pay(client, orderParam); 
  114.     payResult.setAlipayH5Form(temp); 
  115.    } else if (orderParam.getTradeType().equals(PayConstant.NATIVE.toString())) { 
  116.     temp = aliPayService.aliScanPay(client, orderParam); 
  117.     payResult.setAlipayScanUrl(temp); 
  118.    } 
  119.    //添加支付日志 
  120.    insertPayLog(orderParam, KafkaConstant.PAYMENT_NOTIFY_001.getTopic(), "1", orderParam, JSON.toJSONString(aliPayService.getConfigByAppCode(orderParam.getAppCode()))); 
  121.    return payResult; 
  122.   } else if (PayConstant.WECHATAPP.toString().equals(payType)) { 
  123.  
  124.   } else if (PayConstant.CHINAUMS.toString().equals(payType)) { //银联pos支付 
  125.    //查询商家配置信息 
  126.    ChinaumsConfig config; 
  127.    config = chinaumsPayService.getPayConfigByAppCode(orderParam.getAppCode(), orderParam.getBmCode()); 
  128.    if (orderParam.getTradeType().equals(PayConstant.CODE_SCAN.toString())) { 
  129.     chinaumsPayService.codeScanPay(config, orderParam); 
  130.    } 
  131.    //添加支付日志 
  132.    insertPayLog(orderParam, KafkaConstant.PAYMENT_NOTIFY_001.getTopic(), "3", orderParam, JSON.toJSONString(config)); 
  133.    return payResult; 
  134.   } 
  135.   logger.warn("用户未选择正确的支付方式"); 
  136.   throw new BaseException(QYError.msg("请选择正确的支付方式!")); 
  137.  
  138.  } 
  139.  
  140.  public void insertPayLog(PreOrderParam orderParam, String topic, String moneyType, Object obj, String payConfigJsonStr) { 
  141.   PayLog payLog = new PayLog(); 
  142.   payLog.setAppCode(orderParam.getAppCode()); 
  143.   payLog.setPayLogId(orderParam.getDh()); 
  144.   payLog.setMoneyType(moneyType); 
  145.   payLog.setMqTopic(topic); 
  146.   payLog.setMqStatus(0); 
  147.   payLog.setPayNo(orderParam.getDh()); 
  148.   payLog.setRequest(JsonUtil.toJSon(obj)); 
  149.   payLog.setFee(orderParam.getTotalAmount()); 
  150.   payLog.setPayConfigJsonStr(payConfigJsonStr); 
  151.   payLogService.saveOrUpdate(payLog); 
  152.  } 

3、AliPayService

 

  1. package com.qcsoft.payment.service; 
  2.  
  3. import com.alipay.api.AlipayClient; 
  4. import com.alipay.api.request.AlipayTradeRefundRequest; 
  5. import com.alipay.api.response.AlipayTradeQueryResponse; 
  6. import com.alipay.api.response.AlipayTradeRefundResponse; 
  7. import com.qcsoft.commonbean.bean.payment.AlipayConfig; 
  8. import com.qcsoft.commonbean.bean.payment.alipay.AliPayRefundParam; 
  9. import com.qcsoft.commonbean.bean.payment.common.PayNotify; 
  10. import com.qcsoft.commonbean.bean.payment.wx.bean.PreOrderParam; 
  11. import com.qcsoft.easyqinyutools.message.ReturnMsg; 
  12.  
  13. import javax.servlet.http.HttpServletRequest; 
  14. import java.util.Map; 
  15.  
  16. public interface AliPayService { 
  17.   
  18.  String aliAppPay(AlipayClient alipayClient,PreOrderParam orderParam); 
  19.  
  20.  
  21.  String aliScanPay(AlipayClient alipayClient, PreOrderParam orderParam); 
  22.  
  23.  String aliH5Pay(AlipayClient alipayClient, PreOrderParam orderParam); 
  24.  
  25.  void aliPayNotify(PayNotify params); 
  26.  
  27.  boolean rsaCheckV1(HttpServletRequest request,String appCode); 
  28.  
  29.  AlipayTradeQueryResponse aliPayOrderQuery(AlipayClient alipayClient, String out_trade_no); 
  30.  
  31.  AlipayClient getAlipayClientByAppCode(String appCode); 
  32.  
  33.  AlipayConfig getConfigByAppCode(String appCode); 
  34.  
  35.   
  36.  ReturnMsg aliPayRefund(AliPayRefundParam aliPayRefundParam); 
  37.  

AliPayServiceImpl

 

  1. package com.qcsoft.payment.service.impl; 
  2.  
  3. import com.alibaba.fastjson.JSON; 
  4. import com.alipay.api.AlipayApiException; 
  5. import com.alipay.api.AlipayClient; 
  6. import com.alipay.api.DefaultAlipayClient; 
  7. import com.alipay.api.domain.AlipayTradeAppPayModel; 
  8. import com.alipay.api.domain.AlipayTradePrecreateModel; 
  9. import com.alipay.api.domain.AlipayTradeRefundModel; 
  10. import com.alipay.api.domain.AlipayTradeWapPayModel; 
  11. import com.alipay.api.internal.util.AlipaySignature; 
  12. import com.alipay.api.request.*; 
  13. import com.alipay.api.response.*; 
  14. import com.qcsoft.commonbean.bean.payment.AlipayConfig; 
  15. import com.qcsoft.commonbean.bean.payment.alipay.AliPayRefundParam; 
  16. import com.qcsoft.commonbean.bean.payment.common.PayConstant; 
  17. import com.qcsoft.commonbean.bean.payment.common.PayNotify; 
  18. import com.qcsoft.commonbean.bean.payment.wx.bean.PreOrderParam; 
  19. import com.qcsoft.easyqinyutools.message.ReturnMsg; 
  20. import com.qcsoft.payment.commns.exception.BaseException; 
  21. import com.qcsoft.payment.commns.exception.QYError; 
  22. import com.qcsoft.payment.commns.utils.DateUtils; 
  23. import com.qcsoft.payment.commns.utils.RedisUtil; 
  24. import com.qcsoft.payment.service.AliPayService; 
  25. import com.qcsoft.payment.service.AlipayConfigService; 
  26. import org.slf4j.Logger; 
  27. import org.slf4j.LoggerFactory; 
  28. import org.springframework.beans.factory.annotation.Autowired; 
  29. import org.springframework.beans.factory.annotation.Value; 
  30. import org.springframework.stereotype.Service; 
  31.  
  32. import javax.servlet.http.HttpServletRequest; 
  33. import java.net.URLEncoder; 
  34. import java.util.Date
  35. import java.util.HashMap; 
  36. import java.util.Iterator; 
  37. import java.util.Map; 
  38.  
  39.  
  40. @Service 
  41. public class AliPayServiceImpl implements AliPayService { 
  42.  private static final Logger logger = LoggerFactory.getLogger(AliPayServiceImpl.class); 
  43.  @Autowired 
  44.  private AlipayConfigService alipayConfigService; 
  45.  @Autowired 
  46.  private RedisUtil redisUtil; 
  47.  @Value("${payNotifyUrl}"
  48.  private String notifyUrl; 
  49.  
  50.   
  51.  @Override 
  52.  public String aliAppPay(AlipayClient alipayClient, PreOrderParam orderParam) { 
  53.   logger.info("AliPayServiceImpl.aliAppPay--->>>\n支付宝预支付开始,\n支付类型为:APP支付,\n订单号为:{}", orderParam.getDh()); 
  54.   Date date = new Date(); 
  55.   AlipayTradeAppPayResponse response = null
  56.   // 发起App支付请求 
  57.   AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); 
  58.   // 订单描述 
  59.   model.setBody(orderParam.getBody()); 
  60.   // 订单 
  61.   model.setSubject(orderParam.getSubject()); 
  62.   // 商户订单号 就是商户后台生成的订单号 
  63.   model.setOutTradeNo(orderParam.getOutTradeNo()); 
  64.   // 该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天 (屁股后面的字母一定要带,不然报错) 
  65.   model.setTimeoutExpress(DateUtils.toString(date, orderParam.getTimeExpire())); 
  66.   // 订单总金额 ,默认单位为元,精确到小数点后两位,取值范围[0.01,100000000] 
  67.   model.setTotalAmount(orderParam.getTotalAmount().toString()); 
  68.   // 销售产品码 
  69.   model.setProductCode(PayConstant.ALIPAY_QUICK_WAP_WAY.getKey()); 
  70.   AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest(); 
  71.   request.setBizModel(model); 
  72.   // request.setNotifyUrl("商户外网可以访问的异步地址,不写就是不回调"); 
  73.   request.setNotifyUrl(notifyUrl + PayConstant.ALIPAY_05.getKey() + "/" + orderParam.getAppCode() + "/" + orderParam.getDh()); 
  74.   //支付成功返回地址 
  75.   request.setReturnUrl(orderParam.getRedirectUrl()); 
  76.   // 通过api的方法请求阿里接口获得反馈 
  77.   logger.info("AliPayServiceImpl.aliAppPay----->\n支付宝预支付接口请求信息:{}", JSON.toJSONString(request)); 
  78.   try { 
  79.    response = alipayClient.sdkExecute(request); 
  80.   } catch (AlipayApiException e) { 
  81.    logger.info("AliPayServiceImpl.aliAppPay----->\n支付宝预下单失败,\n本次下单的订单号为:{},\n相关报错信息为:{}", orderParam.getDh(), response, e); 
  82.    throw new BaseException(QYError.msg("调用支付宝预下单接口失败![" + e.getMessage() + "]")); 
  83.   } 
  84.  
  85.   logger.info("AliPayServiceImpl.aliAppPay----->\n支付宝预支付接口返回信息:{}", JSON.toJSONString(response)); 
  86.   if (response.isSuccess()) { 
  87.    logger.info("AliPayServiceImpl.aliAppPay----->\n支付宝预下单成功,\n本次下单的订单号为:{},商户订单号为:{}", orderParam.getDh(), orderParam.getOutTradeNo()); 
  88.   } else { 
  89.    logger.error("AliPayServiceImpl.aliAppPay----->\n调用支付宝预下单接口失败!\n具体信息为:\n{}", response.getBody()); 
  90.    throw new BaseException(QYError.msg("调用支付宝预下单接口失败![" + response.getMsg() + "]")); 
  91.   } 
  92.   return response.getBody(); 
  93.  } 
  94.  
  95.  
  96.   
  97.  @Override 
  98.  public String aliScanPay(AlipayClient alipayClient, PreOrderParam orderParam) { 
  99.   logger.info("AliPayServiceImpl.aliScanPay--->>>\n支付宝预支付开始,\n支付类型为:扫码支付,\n订单号:{}", orderParam.getDh()); 
  100.    
  101.   AlipayTradePrecreateResponse response = null
  102.   Date date = new Date(); 
  103.    
  104.   AlipayTradePrecreateModel model = new AlipayTradePrecreateModel(); 
  105.   // 订单描述 
  106.   model.setBody(orderParam.getBody()); 
  107.   // 订单 
  108.   model.setSubject(orderParam.getBody()); 
  109.   // 商户订单号 就是商户后台生成的订单号 
  110.   model.setOutTradeNo(orderParam.getOutTradeNo()); 
  111.   // 该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天 (屁股后面的字母一定要带,不然报错) 
  112.   model.setTimeoutExpress(orderParam.getTimeExpire()); 
  113.   //model.setSellerId(DateUtils.toString(date"yyyyMMddHHmmssSSS")); 
  114.   // 订单总金额 ,默认单位为元,精确到小数点后两位,取值范围[0.01,100000000] 
  115.   model.setTotalAmount(orderParam.getTotalAmount().toString()); 
  116.   //model.setProductCode(PayConstant.ALIPAY_FAST_INSTANT_TRADE_PAY.getKey()); 
  117.   // 选填 
  118.    
  119.   AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest(); 
  120.   request.setBizModel(model); 
  121.   // request.setNotifyUrl("商户外网可以访问的异步地址,不写就是不回调"); 
  122.   request.setNotifyUrl(notifyUrl + PayConstant.ALIPAY_05.getKey() + "/" + orderParam.getAppCode() + "/" + orderParam.getDh()); 
  123.  
  124.   //支付成功返回地址 
  125.   request.setReturnUrl(orderParam.getRedirectUrl()); 
  126.   // 通过api的方法请求阿里接口获得反馈 alipayClient.pageExecute(request) 
  127.   try { 
  128.    logger.info("支付宝扫码付请求报文:{}",JSON.toJSONString(request)); 
  129.    response = alipayClient.execute(request); 
  130.   } catch (AlipayApiException e) { 
  131.    logger.info("AliPayServiceImpl.aliScanPay----->\n支付宝预下单失败,\n本次下单的订单号:{},\n相关报错信息为:{}", orderParam.getDh(), response, e); 
  132.    throw new BaseException(QYError.msg("调用支付宝预下单接口失败![" + e.getMessage() + "]")); 
  133.   }catch (Exception e){ 
  134.    e.printStackTrace(); 
  135.    throw new BaseException(QYError.msg("调用支付宝预下单接口失败![" + e.getMessage() + "]")); 
  136.   } 
  137.  
  138.   //打印返回信息 
  139.   logger.info("AliPayServiceImpl.aliScanPay----->\n支付宝预支付接口返回信息:{}", JSON.toJSONString(response)); 
  140.   //判断预下单返回状态 
  141.   if (response.isSuccess()) { 
  142.    logger.info("AliPayServiceImpl.aliScanPay----->\n支付宝预下单成功,\n本次下单的订单号:{},商务订单号为", orderParam.getDh(), orderParam.getOutTradeNo()); 
  143.   } else { 
  144.    logger.error("AliPayServiceImpl.aliScanPay----->\n调用支付宝预下单接口失败!\n具体信息:\n{}", response.getBody()); 
  145.    throw new BaseException(QYError.msg("调用支付宝预下单接口失败![" + response.getMsg() + "]")); 
  146.   } 
  147.  
  148.   return response.getQrCode(); 
  149.  } 
  150.  
  151.  
  152.   
  153.  @Override 
  154.  public String aliH5Pay(AlipayClient alipayClient, PreOrderParam orderParam) { 
  155.   logger.info("AliPayServiceImpl.aliH5Pay--->>>\n支付宝预支付开始,\n支付类型为:H5支付,\n订单号:{}", orderParam.getDh()); 
  156.   String form = ""
  157.   AlipayTradeWapPayResponse response = null
  158.    
  159.   AlipayTradeWapPayModel payModel = new AlipayTradeWapPayModel(); 
  160.   payModel.setOutTradeNo(orderParam.getOutTradeNo()); 
  161.   payModel.setSubject(orderParam.getBody()); 
  162.   payModel.setTotalAmount(orderParam.getTotalAmount().toString()); 
  163.   payModel.setBody(orderParam.getBody()); 
  164.   payModel.setTimeoutExpress(orderParam.getTimeExpire()); 
  165.   payModel.setProductCode(PayConstant.ALIPAY_QUICK_WAP_WAY.getKey()); 
  166.   payModel.setQuitUrl(URLEncoder.encode(orderParam.getQuitUrl())); 
  167.    
  168.   AlipayTradeWapPayRequest alipay_request = new AlipayTradeWapPayRequest(); 
  169.   alipay_request.setBizModel(payModel); 
  170.   // 设置异步通知地址 
  171.   logger.info("通知地址{}", notifyUrl + PayConstant.ALIPAY_05.getKey() + "/" + orderParam.getAppCode() + "/" + orderParam.getDh()); 
  172.   alipay_request.setNotifyUrl(notifyUrl + PayConstant.ALIPAY_05.getKey() + "/" + orderParam.getAppCode() + "/" + orderParam.getDh()); 
  173.   // 设置同步地址 
  174.   alipay_request.setReturnUrl(URLEncoder.encode(orderParam.getRedirectUrl())); 
  175.   // 调用SDK生成表单 
  176.   try { 
  177.    response = alipayClient.pageExecute(alipay_request); 
  178.    if (response.isSuccess()) { 
  179.     form = response.getBody(); 
  180.     logger.info("AliPayServiceImpl.aliH5Pay----->>>>\n支付宝预支付接口返回信息:{}", JSON.toJSONString(response)); 
  181.    } else { 
  182.     logger.info("AliPayServiceImpl.aliH5Pay----->>>>\n支付宝预支付接口返回信息:{}", JSON.toJSONString(response)); 
  183.     throw new BaseException(QYError.msg("支付宝")); 
  184.    } 
  185.  
  186.   } catch (AlipayApiException e) { 
  187.    logger.info("AliPayServiceImpl.aliH5Pay----->>>>\n支付宝预支付接口返回信息:{}", JSON.toJSONString(response)); 
  188.    throw new BaseException(QYError.msg("调用支付宝预下单接口失败![" + e.getMessage() + "]")); 
  189.   } 
  190.   logger.info("AliPayServiceImpl.aliH5Pay----->>>>\n支付宝预支付接口返回信息:{}", JSON.toJSONString(response)); 
  191.    
  192.   return form; 
  193.  } 
  194.  
  195.   
  196.  @Override 
  197.  public void aliPayNotify(PayNotify params) { 
  198.   logger.info("AliPayServiceImpl.appAliPayNotify-\n阿里服务器消费手机回调参数获取和参数判断-------》》》"); 
  199.    
  200.   //校验支付金额 
  201.    
  202.    
  203.   if (params.getTradeStatus().equals("TRADE_SUCCESS")) { 
  204.    logger.info("AliPayServiceImpl.appAliPayNotify----\n支付宝支付成功!商务订单号[{}]----->>", params.getOutTradeNo(), JSON.toJSONString(params)); 
  205.   } else { 
  206.    logger.error("AliPayServiceImpl.appAliPayNotify---\n支付宝支付失败!商务订单号[{}]---->>", params.getOutTradeNo()); 
  207.    throw new BaseException(QYError.msg("支付宝支付失败!商务订单号[" + params.getOutTradeNo() + "]")); 
  208.   } 
  209.  } 
  210.  
  211.  @Override 
  212.  public boolean rsaCheckV1(HttpServletRequest request, String appCode) { 
  213.   //获取支付宝GET过来反馈信息 
  214.   Map params = new HashMap(); 
  215.   // 签名验证(对支付宝返回的数据验证,确定是支付宝返回的) 
  216.   boolean result = false
  217.   try { 
  218.    // 从支付宝回调的request域中取值 
  219.    Map requestParams = request.getParameterMap(); 
  220.    for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) { 
  221.     String name = iter.next(); 
  222.     String[] values = (String[]) requestParams.get(name); 
  223.     String valueStr = ""
  224.     for (int i = 0; i < values.length; i++) { 
  225.      valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ","
  226.     } 
  227.     params.put(name, valueStr); 
  228.    } 
  229.    logger.info("AliPayServiceImpl.appAliPayNotify--\n支付宝通知数据包----->>>>>>>>>>>>>>>{}", JSON.toJSONString(params)); 
  230.    // 商家编码 
  231.  
  232.    AlipayConfig alipayConfig = getConfigByAppCode(appCode); 
  233.    result = AlipaySignature.rsaCheckV1(params, alipayConfig.getAliPublicKey(), 
  234.      PayConstant.ALIPAY_CHARSET.getKey(), PayConstant.ALIPAY_SIGN_TYPE_RSA2.getKey()); 
  235.   } catch (Exception e) { 
  236.    logger.error("AliPayServiceImpl.appAliPayNotify---\n校验签名失败!商务订单号[{}]---->>", JSON.toJSONString(request), e); 
  237.    throw new BaseException(QYError.msg("支付宝支付校验签名失败!")); 
  238.   } 
  239.   return result; 
  240.  } 
  241.  
  242.   
  243.  @Override 
  244.  public AlipayTradeQueryResponse aliPayOrderQuery(AlipayClient alipayClient, String out_trade_no) { 
  245.   logger.info("AliPayServiceImpl.aliPayOrderQuery----\n根据商务订单号查询支付宝订单信息,\n商务订单号:[{}]----》》》", out_trade_no); 
  246.   AlipayTradeQueryResponse response = null
  247.   AlipayTradeQueryRequest request = new AlipayTradeQueryRequest(); 
  248.   //设置查询参数 
  249.   Map bizModel = new HashMap<>(); 
  250.   bizModel.put("out_trade_no", out_trade_no); 
  251.   request.setBizContent(JSON.toJSONString(bizModel)); 
  252.   //开始查询 
  253.   try { 
  254.    response = alipayClient.execute(request); 
  255.   } catch (AlipayApiException e) { 
  256.    logger.error("AliPayServiceImpl.aliPayOrderQuery--->>\n支付宝订单查询失败,\n商务订单号:[{}]", out_trade_no); 
  257.    throw new BaseException(QYError.msg("订单号[" + out_trade_no + "],订单支付失败,状态码为[" + response.getTradeStatus() + "]")); 
  258.   } 
  259.  
  260.   logger.info("AliPayServiceImpl.aliPayOrderQuery---->>\n查询支付宝订单信息,\n商务订单号:[{}],\n返回信息:{}", out_trade_no, JSON.toJSONString(response)); 
  261.   //查询状态处理 
  262.   if (response.isSuccess()) { 
  263.    logger.info("AliPayServiceImpl.aliPayOrderQuery--->>\n支付宝订单查询成功,\n商务订单号:[{}]", out_trade_no); 
  264.   } else { 
  265.    logger.error("AliPayServiceImpl.aliPayOrderQuery--->>\n支付宝订单查询失败,\n商务订单号:[{}]", out_trade_no); 
  266.    throw new BaseException(QYError.msg("订单号[" + out_trade_no + "],订单支付失败,状态码为[" + response.getTradeStatus() + "]")); 
  267.   } 
  268.  
  269.   return response; 
  270.  } 
  271.  
  272.  
  273.   
  274.  @Override 
  275.  public AlipayClient getAlipayClientByAppCode(String appCode) { 
  276.   logger.info("AliPayServiceImpl.getAlipayClientByAppCode--->>\n获取支付宝配置信息:[{}]", appCode); 
  277.   AlipayConfig alipayConfig = null
  278.    
  279.   try { 
  280.    alipayConfig = getConfigByAppCode(appCode); 
  281.    if (alipayConfig == null) { 
  282.     logger.info("AliPayServiceImpl.getAlipayClientByAppCode--->>\n获取支付宝支付配置信息失败:[{}]", appCode); 
  283.     logger.info("AliPayServiceImpl.getAlipayClientByAppCode--->>\n获取支付宝支付配置信息失败:[{}{}]", appCode,alipayConfig); 
  284.     throw new BaseException(QYError.msg("获取支付宝支付配置信息失败!")); 
  285.    } 
  286.   } catch (Exception e) { 
  287.    logger.error("AliPayServiceImpl.getAlipayClientByAppCode--->>\n获取支付宝配置信息失败:[{}]", e); 
  288.    throw new BaseException(QYError.msg("获取支付宝配置信息失败!")); 
  289.   } 
  290.   AlipayClient alipayClient = new DefaultAlipayClient( 
  291.     PayConstant.ALIPAY_01.getKey(), 
  292.     alipayConfig.getAliAppid(), 
  293.     alipayConfig.getAliPrivateKey(), 
  294.     PayConstant.ALIPAY_FORMAT.getKey(), 
  295.     PayConstant.ALIPAY_CHARSET.getKey(), 
  296.     alipayConfig.getAliPublicKey(), 
  297.     PayConstant.ALIPAY_SIGN_TYPE_RSA2.getKey()); 
  298.   return alipayClient; 
  299.  } 
  300.  
  301.  //获取商家支付宝的配置信息 
  302.  public AlipayConfig getConfigByAppCode(String appCode) { 
  303.   AlipayConfig alipayConfig = alipayConfigService.selectByAppCode(appCode); 
  304.   return alipayConfig; 
  305.  } 
  306.  
  307.  
  308.   
  309.  public ReturnMsg aliPayRefund(AliPayRefundParam aliPayRefundParam){ 
  310.   ReturnMsg returnMsg=new ReturnMsg(); 
  311.  
  312.   String appCode=aliPayRefundParam.getAppCode(); 
  313.   AlipayClient alipayClient = getAlipayClientByAppCode(appCode); 
  314.  
  315.   AlipayTradeRefundResponse response = null
  316.   AlipayTradeRefundModel model = new AlipayTradeRefundModel(); 
  317.   //订单支付时传入的商户订单号,不能和 trade_no同时为空。 
  318.   model.setOutTradeNo(aliPayRefundParam.getOutTradeNo()); 
  319.   //支付宝交易号,和商户订单号不能同时为空 
  320.   //model.setTradeNo(aliPayRefundParam.getTradeNo()); 
  321.   //标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传。 
  322.   model.setOutRequestNo(aliPayRefundParam.getOutRequestNo()); 
  323.   //    需要退款的金额,该金额不能大于订单金额,单位为元,支持两位小数 
  324.   model.setRefundAmount(aliPayRefundParam.getRefundAmount()); 
  325.   //退款的原因说明 
  326.   model.setRefundReason(aliPayRefundParam.getRefundReason()); 
  327.  
  328.    
  329.   AlipayTradeRefundRequest request = new AlipayTradeRefundRequest(); 
  330.   request.setBizModel(model); 
  331.   //商户外网可以访问的异步地址,不写就是不回调 
  332.   request.setNotifyUrl(notifyUrl + PayConstant.ALIPAY_05.getKey() + "/" + aliPayRefundParam.getAppCode() + "/" + aliPayRefundParam.getDh()); 
  333.   //支付成功返回地址 
  334.   request.setReturnUrl(aliPayRefundParam.getRedirectUrl()); 
  335.  
  336.   // 通过api的方法请求阿里接口获得反馈 alipayClient.pageExecute(request) 
  337.   try { 
  338.    logger.info("支付宝退款请求完整报文:{}",JSON.toJSONString(request)); 
  339.    response = alipayClient.execute(request); 
  340.   } catch (AlipayApiException e) { 
  341.    logger.info("支付宝退款失败,\n本次下单的订单号:{},\n相关报错信息为:{}", aliPayRefundParam.getDh(), response, e); 
  342.    throw new BaseException(QYError.msg("调用支付宝预退款失败![" + e.getMessage() + "]")); 
  343.   }catch (Exception e){ 
  344.    e.printStackTrace(); 
  345.    throw new BaseException(QYError.msg("支付宝预退款失败![" + e.getMessage() + "]")); 
  346.   } 
  347.  
  348.   //打印返回信息 
  349.   logger.info("支付宝退款失败:{}", JSON.toJSONString(response)); 
  350.   //判断预下单返回状态 
  351.   if (response.isSuccess()&&"Y".equals(response.getFundChange())) { 
  352.    logger.info("AliPayServiceImpl.aliScanPay----->\n支付宝退款成功,\n本次下单的订单号:{},商务订单号为,{}", aliPayRefundParam.getDh(), aliPayRefundParam.getOutTradeNo()); 
  353.    return returnMsg.setData("退款成功"); 
  354.  
  355.   } else { 
  356.    logger.error("AliPayServiceImpl.aliScanPay----->\n调用支付宝退款接口失败!\n具体信息:\n{}", response.getBody()); 
  357.    throw new BaseException(QYError.msg("调用支付宝退款接口失败![" + response.getBody() + "]")); 
  358.   } 
  359.  } 
  360.  

4、WxPayService

 

  1. package com.qcsoft.payment.service; 
  2.  
  3. import com.qcsoft.commonbean.bean.payment.WxMinConfig; 
  4. import com.qcsoft.commonbean.bean.payment.wx.bean.PreOrderParam; 
  5. import com.qcsoft.commonbean.bean.payment.wx.bean.WxRefund; 
  6. import com.qcsoft.commonbean.bean.payment.wx.bean.entpay.EntPayParam; 
  7. import com.qcsoft.commonbean.bean.payment.wx.bean.entpay.EntPayResult; 
  8. import com.qcsoft.commonbean.bean.payment.wx.bean.request.WxPayUnifiedOrderRequest; 
  9. import com.qcsoft.commonbean.bean.payment.wx.bean.result.BaseWxPayResult; 
  10. import com.qcsoft.commonbean.bean.payment.wx.bean.result.WxPayOrderQueryResult; 
  11. import com.qcsoft.commonbean.bean.payment.wx.bean.result.WxPayUnifiedOrderResult; 
  12. import com.qcsoft.commonbean.bean.payment.wx.config.WxPayConfig; 
  13. import com.qcsoft.commonbean.bean.payment.wx.exception.WxPayException; 
  14.  
  15.  
  16.  
  17. public interface WxPayService { 
  18.   
  19.  WxPayUnifiedOrderResult wxPrePay(WxPayConfig config, WxPayUnifiedOrderRequest request); 
  20.  
  21.   
  22.  WxPayConfig getWxPayConfigByAppCode(String appCode,String bmCode); 
  23.  
  24.  WxPayConfig getWxMinPayConfigByAppCode(String appCode,String sysSoftwareCode); 
  25.  
  26.   
  27.  WxPayUnifiedOrderRequest packRequestParam(PreOrderParam orderParam); 
  28.  
  29.  
  30.   
  31.  WxPayOrderQueryResult wxPayOrderQuery(String appCode, String bmCode, String dh, Integer type, String sysSoftwareCode); 
  32.  
  33.  
  34.   
  35.  BaseWxPayResult entPay(EntPayParam params) throws WxPayException; 

WxPayServiceImpl

 

  1. package com.qcsoft.payment.service.impl; 
  2.  
  3. import com.alibaba.fastjson.JSON; 
  4. import com.qcsoft.commonbean.bean.payment.PayLog; 
  5. import com.qcsoft.commonbean.bean.payment.WxConfig; 
  6. import com.qcsoft.commonbean.bean.payment.WxMinConfig; 
  7. import com.qcsoft.commonbean.bean.payment.common.PayConstant; 
  8. import com.qcsoft.commonbean.bean.payment.common.PayNotify; 
  9. import com.qcsoft.commonbean.bean.payment.wx.bean.PreOrderParam; 
  10. import com.qcsoft.commonbean.bean.payment.wx.bean.entpay.*; 
  11. import com.qcsoft.commonbean.bean.payment.wx.bean.request.WxPayOrderQueryRequest; 
  12. import com.qcsoft.commonbean.bean.payment.wx.bean.request.WxPayUnifiedOrderRequest; 
  13. import com.qcsoft.commonbean.bean.payment.wx.bean.result.BaseWxPayResult; 
  14. import com.qcsoft.commonbean.bean.payment.wx.bean.result.WxPayOrderQueryResult; 
  15. import com.qcsoft.commonbean.bean.payment.wx.bean.result.WxPayUnifiedOrderResult; 
  16. import com.qcsoft.commonbean.bean.payment.wx.config.WxPayConfig; 
  17. import com.qcsoft.commonbean.bean.payment.wx.exception.WxPayException; 
  18. import com.qcsoft.commonbean.bean.payment.wx.handler.EntPayHandler; 
  19. import com.qcsoft.commonbean.bean.payment.wx.handler.WxPayHandler; 
  20. import com.qcsoft.commonbean.bean.payment.wx.handler.impl.EntPayHandlerImpl; 
  21. import com.qcsoft.commonbean.bean.payment.wx.handler.impl.WxPayHandlerApacheHttpImpl; 
  22. import com.qcsoft.payment.commns.exception.BaseException; 
  23. import com.qcsoft.payment.commns.exception.QYError; 
  24. import com.qcsoft.payment.commns.utils.DateUtils; 
  25. import com.qcsoft.payment.commns.utils.RedisUtil; 
  26. import com.qcsoft.payment.service.PayLogService; 
  27. import com.qcsoft.payment.service.WxConfigService; 
  28. import com.qcsoft.payment.service.WxMinConfigService; 
  29. import com.qcsoft.payment.service.WxPayService; 
  30. import lombok.extern.slf4j.Slf4j; 
  31. import org.apache.commons.lang3.StringUtils; 
  32. import org.slf4j.Logger; 
  33. import org.slf4j.LoggerFactory; 
  34. import org.springframework.beans.factory.annotation.Autowired; 
  35. import org.springframework.beans.factory.annotation.Value; 
  36. import org.springframework.stereotype.Service; 
  37.  
  38. import java.math.BigDecimal; 
  39. import java.util.Date
  40.  
  41. @Service 
  42. @Slf4j 
  43. public class WxPayServiceImpl implements WxPayService { 
  44.  private static final Logger logger = LoggerFactory.getLogger(WxPayServiceImpl.class); 
  45.  
  46.  @Value("${payNotifyUrl}"
  47.  private String notifyUrl; 
  48.  @Autowired 
  49.  private RedisUtil redisUtil; 
  50.  @Autowired 
  51.  private WxConfigService wxConfigService; 
  52.  @Autowired 
  53.  private WxMinConfigService wxMinConfigService; 
  54.  @Autowired 
  55.  private PayLogService payLogService; 
  56.  
  57.   
  58.  @Override 
  59.  public WxPayUnifiedOrderResult wxPrePay(WxPayConfig config, WxPayUnifiedOrderRequest request) { 
  60.   logger.info("WxPayServiceImpl.wxPrePay--->>\n微信预支付,\n商务订单号:[{}]", request.getOutTradeNo()); 
  61.   WxPayHandler wx = new WxPayHandlerApacheHttpImpl(); 
  62.   WxPayUnifiedOrderResult orderResult = null
  63.   wx.setConfig(config); 
  64.   log.info("WxPayUnifiedOrderResult ={}", config.getNotifyUrl()); 
  65.   try { 
  66.    orderResult = wx.unifiedOrder(request); 
  67.   } catch (WxPayException e) { 
  68.    logger.error("WxPayServiceImpl.wxPrePay--->>\n微信预支付失败,\n商务订单号:[{}]", request.getOutTradeNo(), orderResult); 
  69.    logger.error("异常信息{}", e.getMessage()); 
  70.    throw new BaseException(QYError.msg("订单号[" + request.getOutTradeNo() + "]预支付失败!")); 
  71.   } 
  72.   return orderResult; 
  73.  } 
  74.  
  75.  
  76.   
  77.  @Override 
  78.  public WxPayConfig getWxPayConfigByAppCode(String appCode, String bmCode) { 
  79.   logger.info("WxPayServiceImpl.getWxPayConfigByAppCode--->>\n获取微信支付配置信息:appCode[{}],bmCode[{}]", appCode, bmCode); 
  80.   WxConfig config = null
  81.   WxPayConfig wxPayConfig = new WxPayConfig(); 
  82.    
  83.   try { 
  84.    //2、mysql 
  85.    if (config == null) { 
  86.     if (StringUtils.isNotBlank(bmCode)) { 
  87.      config = wxConfigService.selectByBmCode(bmCode, appCode); 
  88.      //如果部门取不到,则去商家的配置 
  89.      if (config == null
  90.       config = wxConfigService.selectByAppCode(appCode); 
  91.     } else { 
  92.      config = wxConfigService.selectByAppCode(appCode); 
  93.     } 
  94.    } 
  95.    if (config == null) { 
  96.     logger.warn("WxPayServiceImpl.getWxPayConfigByAppCode--->>\n获取微信支付配置信息失败:[{}]", appCode); 
  97.     throw new BaseException(QYError.msg("获取微信支付配置信息失败!")); 
  98.    } 
  99.   } catch (Exception e) { 
  100.    logger.error("WxPayServiceImpl.getWxPayConfigByAppCode--->>\n获取微信支付配置信息失败:[{}]", e); 
  101.    throw new BaseException(QYError.msg("获取微信支付配置信息失败!")); 
  102.   } 
  103.   //根据appCode查询商家微信配置信息 
  104.   wxPayConfig.setAppId(config.getAppid()); 
  105.   wxPayConfig.setMchId(config.getMchId()); 
  106.   wxPayConfig.setMchKey(config.getMchKeySecret()); 
  107.   wxPayConfig.setSignType(PayConstant.WXPAY_SIGNTYPE_MD5.getKey()); 
  108.   wxPayConfig.setKeyUrl(config.getCrtPath()); 
  109.   wxPayConfig.setKeyPath(config.getCrtPath()); 
  110.   log.info("获取微信公众号配置为 [{}],转为微信支付实体为 [{}]",config,wxPayConfig); 
  111.   return wxPayConfig; 
  112.  } 
  113.  
  114.  
  115.  @Override 
  116.  public WxPayConfig getWxMinPayConfigByAppCode(String appCode, String sysSoftwareCode) { 
  117.   logger.error("WxPayServiceImpl.getWxMinPayConfigByAppCode--->>\n获取微信小程序支付配置信息:[{}]", appCode); 
  118.   if (StringUtils.isBlank(sysSoftwareCode)) { 
  119.    sysSoftwareCode = "store-service"
  120.   } 
  121.   WxMinConfig config = null
  122.   WxPayConfig wxPayConfig = new WxPayConfig(); 
  123.    
  124.   try { 
  125.    if (config == null) { 
  126.     //config = wxMinConfigService.selectByAppCode(appCode); 
  127.     config = wxMinConfigService.selectBySysSoftwareCode(appCode,sysSoftwareCode); 
  128.    } 
  129.    if (config == null) { 
  130.     logger.warn("WxPayServiceImpl.getWxMinPayConfigByAppCode--->>\n获取微信小程序支付配置信息失败:[{}]", appCode); 
  131.     throw new BaseException(QYError.msg("获取微信支付配置信息失败!")); 
  132.    } 
  133.   } catch (Exception e) { 
  134.    logger.error("WxPayServiceImpl.getWxMinPayConfigByAppCode--->>\n获取微信小程序支付配置信息失败:[{}]", e); 
  135.    throw new BaseException(QYError.msg("获取微信小程序支付配置信息失败!")); 
  136.   } 
  137.   //根据appCode查询商家微信配置信息 
  138.   wxPayConfig.setAppId(config.getAppid()); 
  139.   wxPayConfig.setMchId(config.getMchId()); 
  140.   wxPayConfig.setMchKey(config.getMchKeySecret()); 
  141.   wxPayConfig.setSignType(PayConstant.WXPAY_SIGNTYPE_MD5.getKey()); 
  142.   wxPayConfig.setKeyUrl(config.getCrtPath()); 
  143.   wxPayConfig.setKeyPath(config.getCrtPath()); 
  144.   log.info("获取微信小程序退款配置为 [{}],转为微信支付实体为 [{}]",config,wxPayConfig); 
  145.   return wxPayConfig; 
  146.  } 
  147.  
  148.   
  149.  @Override 
  150.  public WxPayUnifiedOrderRequest packRequestParam(PreOrderParam orderParam) { 
  151.   Date date = new Date(); 
  152.   BigDecimal paramAmount = new BigDecimal(orderParam.getTotalAmount().toString()); 
  153.   BigDecimal multiplyNum = new BigDecimal("100"); 
  154.   WxPayUnifiedOrderRequest request = WxPayUnifiedOrderRequest.newBuilder() 
  155.     .body(orderParam.getBody()) 
  156.     .totalFee(paramAmount.multiply(multiplyNum).intValue()) 
  157.     .spbillCreateIp(orderParam.getReqId()) 
  158.     .notifyUrl(notifyUrl + PayConstant.WXPAY_09.getKey()) 
  159.     .tradeType(orderParam.getTradeType()) 
  160.     .outTradeNo(orderParam.getOutTradeNo()) 
  161.     .build(); 
  162.   log.info("WxPayUnifiedOrderRequest = {}", PayConstant.WXPAY_09.getKey()); 
  163.  
  164.   request.setProductId(orderParam.getDh()); 
  165.   request.setDetail(orderParam.getSubject()); 
  166.   PayNotify payNotify = new PayNotify(); 
  167.   payNotify.setAppCode(orderParam.getAppCode()); 
  168.   payNotify.setCode(orderParam.getBmCode()); 
  169.   payNotify.setDh(orderParam.getDh()); 
  170.   request.setAttach(JSON.toJSONString(payNotify)); 
  171.   if (orderParam.getTradeType().equals(PayConstant.JSAPI.toString())) { 
  172.    request.setOpenid(orderParam.getOpenId()); 
  173.   } 
  174.   //开始时间 
  175.   request.setTimeStart(DateUtils.getLastMinute(date, 0)); 
  176.   //有效期 
  177.   request.setTimeExpire(orderParam.getTimeExpire()); 
  178.   return request; 
  179.  } 
  180.  
  181.   
  182.  @Override 
  183.  public WxPayOrderQueryResult wxPayOrderQuery(String appCode, String bmCode, String dh, Integer type, String sysSoftwareCode) { 
  184.   logger.info("WxPayServiceImpl.wxPayOrderQuery--->>\n微信订单查询,\n本次查询的商家编码为:[{}],商务订单号:[{}]", appCode, dh); 
  185.   WxPayHandler handler = new WxPayHandlerApacheHttpImpl(); 
  186.   WxPayOrderQueryRequest request = new WxPayOrderQueryRequest(); 
  187.   WxPayOrderQueryResult queryResult = null
  188.   WxPayConfig config = null
  189.  
  190.  
  191.   try { 
  192.    PayLog payLog = payLogService.selectByDh(dh); 
  193.    if (payLog==null) { 
  194.     //商家的微信支付 
  195.     if (type == null || type == 1) { 
  196.      bmCode = null
  197.      config = this.getWxPayConfigByAppCode(appCode, bmCode); 
  198.      //部门的微信支付支付 
  199.     } else if (type == 2) { 
  200.      config = this.getWxPayConfigByAppCode(appCode, bmCode); 
  201.      //商家小程序支付 
  202.     } else if (type == 3) { 
  203.      config = this.getWxMinPayConfigByAppCode(appCode,sysSoftwareCode); 
  204.     } 
  205.    }else
  206.     config = JSON.parseObject(payLog.getPayConfigJsonStr(), WxPayConfig.class); 
  207.    } 
  208.    request.setOutTradeNo(dh); 
  209.    handler.setConfig(config); 
  210.    queryResult = handler.queryOrder(request); 
  211.    logger.info("WxPayServiceImpl.wxPayOrderQuery--->>\n微信订单查询成功,\n返回包信息:[{}]", JSON.toJSONString(queryResult)); 
  212.   } catch (WxPayException e) { 
  213.    logger.error("WxPayServiceImpl.wxPayOrderQuery--->>\n微信订单查询失败,\n商务订单号:[{}]", dh); 
  214.    throw new BaseException(QYError.msg("微信订单查询失败,商务订单号:[{}]" + dh + "")); 
  215.   } 
  216.   return queryResult; 
  217.  } 
  218.   
  219.  @Override 
  220.  public BaseWxPayResult entPay(EntPayParam params) throws WxPayException { 
  221.   WxPayHandler wxPayHandler = new WxPayHandlerApacheHttpImpl(); 
  222.   WxPayConfig config = null
  223.   EntPayResult result = null
  224.   EntPayBankResult bankResult = null
  225.   if (params.getTradeType() != null && params.getTradeType() == 3) { 
  226.    config = this.getWxMinPayConfigByAppCode(params.getAppCode(),params.getSysSoftwareCode()); 
  227.   } else { 
  228.    config = this.getWxPayConfigByAppCode(params.getAppCode(), params.getBmCode()); 
  229.   } 
  230.   config.setUseKey(true); 
  231.   wxPayHandler.setConfig(config); 
  232.   if (params.getTradeType()==1) { 
  233.    EntPayRequest request = packEntPayRequest(params,config); 
  234.    EntPayHandler entPayHandler = new EntPayHandlerImpl(wxPayHandler); 
  235.  
  236.    result = entPayHandler.entPay(request); 
  237.    return result; 
  238.   }else
  239.    EntPayBankRequest request = packEntPayBankRequest(params); 
  240.    EntPayHandler entPayHandler = new EntPayHandlerImpl(wxPayHandler); 
  241.    bankResult = entPayHandler.payBank(request); 
  242.    return bankResult; 
  243.   } 
  244.  } 
  245.   
  246.  public EntPayRequest packEntPayRequest(EntPayParam params,WxPayConfig config) { 
  247.   EntPayRequest request = new EntPayRequest(); 
  248.   request.setAmount(params.getAmount().multiply(new BigDecimal("10")).intValue()); 
  249.   request.setCheckName("NO_CHECK"); 
  250.   request.setOpenid(params.getOpenid()); 
  251.   request.setSpbillCreateIp(params.getSpbillCreateIp()); 
  252.   request.setPartnerTradeNo(params.getPartnerTradeNo()); 
  253.   request.setMchAppid(config.getAppId()); 
  254.   request.setMchId(config.getMchId()); 
  255.   request.setDescription(params.getDesc()); 
  256.   return request; 
  257.  } 
  258.  
  259.  
  260.   
  261.  public EntPayBankRequest packEntPayBankRequest(EntPayParam params) { 
  262.   EntPayBankRequest request = new EntPayBankRequest(); 
  263.   request.setAmount(params.getAmount().multiply(new BigDecimal("10")).intValue()); 
  264.   request.setBankCode(params.getBankCode()); 
  265.   request.setEncTrueName(params.getEncTrueName()); 
  266.   request.setPartnerTradeNo(params.getPartnerTradeNo()); 
  267.   request.setDescription(params.getDesc()); 
  268.   return request; 
  269.  } 

5、这些类是和数据库交互的增删查该类

 

  1. @Autowired 
  2. private WxConfigService wxConfigService; 
  3. @Autowired 
  4. private WxMinConfigService wxMinConfigService; 
  5. @Autowired 
  6. private PayLogService payLogService; 
  7. @Autowired 
  8. private AlipayConfigService alipayConfigService; 

 

来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯