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

开发 前端 移动开发
申请好微信商户号appid,拿到商户id和商户秘钥,退款的话需要商户证书;2、申请好支付宝商户号appid,商户公钥和秘钥(需要用支付宝工具自己生成),支付宝退款不需要证书。

一、前期准备

1、申请好微信商户号appid,拿到商户id和商户秘钥,退款的话需要商户证书

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

四、程序实现

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.  * @Description: 支付控制中心 
  27.  * @Author:  
  28.  * @Date:  
  29.  */ 
  30. @RestController 
  31. @RequestMapping("/v2"
  32. public class PayController extends BaseController { 
  33.  private static final Logger logger = LoggerFactory.getLogger(PayController.class); 
  34.  
  35.  @Autowired 
  36.  private PayService payService; 
  37.  
  38.  //private final AtomicInteger tick = new AtomicInteger(); 
  39.  
  40.  /** 
  41.   * 统一预支付接口(统一下单) 
  42.   * 
  43.   * @param orderParam {dh:订单号,payType:支付方式(WXPAY、ALIPAY、MEMBER_CARD、ACCOUNT),appCode:商家编码, 
  44.   *     tradeType:支付方式类型(NATIVE、JSAPI、APP、MWEB),openId:支付方式为JSAPI必传,reqId:请求的真实IP地址 
  45.   *     ,redirectUrl:支付成功返回地址,appCode:商家编码,outTradeNo:商务订单号,timeExpire,订单到期时间 
  46.   *     ,totalAmount:订单金额,body:商品简单描述,subject:订单标题,quitUrl:中途退出} 
  47.   * @param token  token 
  48.   * @return (微信公众号 / 小程序返回一串json字符串 : { appId :, timeStamp :, nonceStr : , info_package :, paySign :, signType : }, 前端使用微信sdk调用微信支付) 
  49.   * (微信扫码支付返回一个连接,前端需要把连接生成一个二维码使用,连接如:weixin://123.123.com/***) 
  50.   * (微信H5--返回一个连接,前端需要把连接生成一个连接前端直接跳转该连接使用,使用如:location.href='weixin://123.123.com/***') 
  51.   * (支付宝扫码支付--返回一个连接,前端直接跳转到该连接使用,使用如:location.href='weixin://123.123.com/***') 
  52.   * (支付宝扫码H5--返回一个页面form表单,前端需要把这个form表单渲染到h5页面上,使用如:$("#view).html(alipayForm)') 
  53.   * (支付宝app支付--返回一个参数包,如sdk-version=**&service=**&&service=**&&body=**&&out_trade_no=**&,前端使用支付宝sdk调用app支付') 
  54.   * { 
  55.   * wxNativeUrl:微信扫码地址 
  56.   * wxAppPackage:app支付sdk参数包 
  57.   * wxJsapiPackage:公众号支付包 
  58.   * wxH5Url:h5支付url 
  59.   * wxScanUrl:wxScanUrl 
  60.   * alipayScanUrl:支付宝扫码支付url 
  61.   * alipayH5Form:支付宝h5支付表单 
  62.   * alipayAppParamStr:支付宝app支付参数支付串 
  63.   * } 
  64.   * @throws WxPayException 
  65.   */ 
  66.  @RequestMapping(value = "/prePayOrder"
  67.  @ApiTag(SwaggerConstant.PAYMENT_001) 
  68.  public ReturnMsg prePayOrder(@RequestBody PreOrderParam orderParam) { 
  69.   String metadata = JSON.toJSONString(orderParam); 
  70.   logger.info("PayController.prePayOrder----\n正在请求支付....,参数为>>>>{}", metadata); 
  71.   ReturnMsg ret = new ReturnMsg(); 
  72.   //预下单 
  73.   PrePayResult prePayResult = this.payService.payPreOrder(orderParam); 
  74.   ret.setData(prePayResult); 
  75.   return ret.success("下单成功,订单有效期为" + orderParam.getTimeExpire()); 
  76.  } 
  77.  
  78.  /** 
  79.   * 生成支付二维码 
  80.   * 
  81.   * @param url 二维码地址 
  82.   * @throws IOException 
  83.   */ 
  84.  @RequestMapping(value = "/createQrCode/url"
  85.  @ApiTag(SwaggerConstant.PAYMENT_001) 
  86.  public void createQrCode(@PathVariable String url, HttpServletRequest request, HttpServletResponse response) throws IOException { 
  87.   String queryString = request.getQueryString(); 
  88.   BufferedImage bufferedImage = QrcodeUtils.encode(url+queryString, 500, 500, nullnull); 
  89.   BufferedImage grayImage = QrcodeUtils.grayImage(bufferedImage); 
  90.   ImageIO.write(grayImage, "png", response.getOutputStream()); 
  91.  } 
  92.  
  93.  

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<String, String> 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<String, String> paypackageParams = new TreeMap<String, String>(); 
  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.   * 
  19.   * @param alipayClient 
  20.   * @param orderParam 
  21.   * @param 
  22.   * @return 
  23.   */ 
  24.  String aliAppPay(AlipayClient alipayClient,PreOrderParam orderParam); 
  25.  
  26.  
  27.  String aliScanPay(AlipayClient alipayClient, PreOrderParam orderParam); 
  28.  
  29.  String aliH5Pay(AlipayClient alipayClient, PreOrderParam orderParam); 
  30.  
  31.  void aliPayNotify(PayNotify params); 
  32.  
  33.  boolean rsaCheckV1(HttpServletRequest request,String appCode); 
  34.  
  35.  AlipayTradeQueryResponse aliPayOrderQuery(AlipayClient alipayClient, String out_trade_no); 
  36.  
  37.  AlipayClient getAlipayClientByAppCode(String appCode); 
  38.  
  39.  AlipayConfig getConfigByAppCode(String appCode); 
  40.  
  41.  /** 
  42.   * 支付宝退款接口 
  43.   * @param aliPayRefundParam 
  44.   * @return 
  45.   */ 
  46.  ReturnMsg aliPayRefund(AliPayRefundParam aliPayRefundParam); 
  47.  

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

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.  * 微信预支付 
  18.  * @param appId 应用ID(微信公众号) 
  19.  * @param mchId 商务号ID 
  20.  * @param mchKey 商务号密钥 
  21.  * @param notifyUrl 异步通知地址 
  22.  * @param signType 签名类型 
  23.  * @param body 描述 
  24.  * @param totalFee 金额 
  25.  * @param spbillCreateIp app和h5支付需要用户的真实请求地址 
  26.  * @param tradeType 
  27.  * @param outTradeNo 
  28.  * @return 
  29.  */ 
  30. public interface WxPayService { 
  31.  /** 
  32.   * 
  33.   * @param config {appId:应用ID,mchId:商务号ID,mchKey:商务号密钥,notifyUrl:异步通知地址,signType:签名类型} 
  34.   * @param request {body:订单描述,totalFee:金额, 
  35.   *    spbillCreateIp:app和h5支付需要用户的真实请求地址Native支付填调用微信支付API的机器IP, 
  36.   *    tradeType:SAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付,统一下单接口trade_type的传参可参考这里, 
  37.   *    outTradeNo:商户订单号,productId:商品Id(扫码支付必传,其他选填),openid:公众号openId} 
  38.   * @return 
  39.   */ 
  40.  WxPayUnifiedOrderResult wxPrePay(WxPayConfig config, WxPayUnifiedOrderRequest request); 
  41.  
  42.  /** 
  43.   * 根据appCode获取商家微信支付配置 
  44.   * @param appCode 
  45.   * @return 
  46.   */ 
  47.  WxPayConfig getWxPayConfigByAppCode(String appCode,String bmCode); 
  48.  
  49.  WxPayConfig getWxMinPayConfigByAppCode(String appCode,String sysSoftwareCode); 
  50.  
  51.  /** 
  52.   * 封装预下单参数实体 
  53.   * @param orderParam 预支付接口参数实体 
  54.   * @param order 点单 
  55.   * @return 
  56.   */ 
  57.  WxPayUnifiedOrderRequest packRequestParam(PreOrderParam orderParam); 
  58.  
  59.  
  60.  /** 
  61.   * 查询订单 
  62.   * @param appCode 商家编码 
  63.   * @param dh 订单号 
  64.   * @param sysSoftwareCode 
  65.   */ 
  66.  WxPayOrderQueryResult wxPayOrderQuery(String appCode, String bmCode, String dh, Integer type, String sysSoftwareCode); 
  67.  
  68.  
  69.  /** 
  70.   * 企业支付 
  71.   * @param params 
  72.   * @return
  73.   * @Author:  
  74.   * @date:  
  75.   */ 
  76.  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.   * @param config {appId:应用ID,mchId:商务号ID,mchKey:商务号密钥,notifyUrl:异步通知地址,signType:签名类型} 
  59.   * @param request {body:订单描述,totalFee:金额, 
  60.   *    spbillCreateIp:app和h5支付需要用户的真实请求地址Native支付填调用微信支付API的机器IP, 
  61.   *    tradeType:SAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付,统一下单接口trade_type的传参可参考这里, 
  62.   *    outTradeNo:商户订单号,productId:商品Id(扫码支付必传,其他选填),openid:公众号openId} 还有很多参数选填 
  63.   * @return 
  64.   * @throws WxPayException 
  65.   */ 
  66.  @Override 
  67.  public WxPayUnifiedOrderResult wxPrePay(WxPayConfig config, WxPayUnifiedOrderRequest request) { 
  68.   logger.info("WxPayServiceImpl.wxPrePay--->>\n微信预支付,\n商务订单号:[{}]", request.getOutTradeNo()); 
  69.   WxPayHandler wx = new WxPayHandlerApacheHttpImpl(); 
  70.   WxPayUnifiedOrderResult orderResult = null
  71.   wx.setConfig(config); 
  72.   log.info("WxPayUnifiedOrderResult ={}", config.getNotifyUrl()); 
  73.   try { 
  74.    orderResult = wx.unifiedOrder(request); 
  75.   } catch (WxPayException e) { 
  76.    logger.error("WxPayServiceImpl.wxPrePay--->>\n微信预支付失败,\n商务订单号:[{}]", request.getOutTradeNo(), orderResult); 
  77.    logger.error("异常信息{}", e.getMessage()); 
  78.    throw new BaseException(QYError.msg("订单号[" + request.getOutTradeNo() + "]预支付失败!")); 
  79.   } 
  80.   return orderResult; 
  81.  } 
  82.  
  83.  
  84.  /** 
  85.   * 根据商家编码获取微信商户配置信息 
  86.   * 
  87.   * @param appCode 
  88.   * @return 
  89.   */ 
  90.  @Override 
  91.  public WxPayConfig getWxPayConfigByAppCode(String appCode, String bmCode) { 
  92.   logger.info("WxPayServiceImpl.getWxPayConfigByAppCode--->>\n获取微信支付配置信息:appCode[{}],bmCode[{}]", appCode, bmCode); 
  93.   WxConfig config = null
  94.   WxPayConfig wxPayConfig = new WxPayConfig(); 
  95.   /** 
  96.    * 获取商家支付宝配置信息(优先级:1-redis,2-mysql,3-用户系统) 
  97.    */ 
  98.   try { 
  99.    //2、mysql 
  100.    if (config == null) { 
  101.     if (StringUtils.isNotBlank(bmCode)) { 
  102.      config = wxConfigService.selectByBmCode(bmCode, appCode); 
  103.      //如果部门取不到,则去商家的配置 
  104.      if (config == null
  105.       config = wxConfigService.selectByAppCode(appCode); 
  106.     } else { 
  107.      config = wxConfigService.selectByAppCode(appCode); 
  108.     } 
  109.    } 
  110.    if (config == null) { 
  111.     logger.warn("WxPayServiceImpl.getWxPayConfigByAppCode--->>\n获取微信支付配置信息失败:[{}]", appCode); 
  112.     throw new BaseException(QYError.msg("获取微信支付配置信息失败!")); 
  113.    } 
  114.   } catch (Exception e) { 
  115.    logger.error("WxPayServiceImpl.getWxPayConfigByAppCode--->>\n获取微信支付配置信息失败:[{}]", e); 
  116.    throw new BaseException(QYError.msg("获取微信支付配置信息失败!")); 
  117.   } 
  118.   //根据appCode查询商家微信配置信息 
  119.   wxPayConfig.setAppId(config.getAppid()); 
  120.   wxPayConfig.setMchId(config.getMchId()); 
  121.   wxPayConfig.setMchKey(config.getMchKeySecret()); 
  122.   wxPayConfig.setSignType(PayConstant.WXPAY_SIGNTYPE_MD5.getKey()); 
  123.   wxPayConfig.setKeyUrl(config.getCrtPath()); 
  124.   wxPayConfig.setKeyPath(config.getCrtPath()); 
  125.   log.info("获取微信公众号配置为 [{}],转为微信支付实体为 [{}]",config,wxPayConfig); 
  126.   return wxPayConfig; 
  127.  } 
  128.  
  129.  
  130.  @Override 
  131.  public WxPayConfig getWxMinPayConfigByAppCode(String appCode, String sysSoftwareCode) { 
  132.   logger.error("WxPayServiceImpl.getWxMinPayConfigByAppCode--->>\n获取微信小程序支付配置信息:[{}]", appCode); 
  133.   if (StringUtils.isBlank(sysSoftwareCode)) { 
  134.    sysSoftwareCode = "store-service"
  135.   } 
  136.   WxMinConfig config = null
  137.   WxPayConfig wxPayConfig = new WxPayConfig(); 
  138.   /** 
  139.    * 获取商家支付宝配置信息(优先级:1-redis,2-mysql,3-用户系统) 
  140.    */ 
  141.   try { 
  142.    if (config == null) { 
  143.     //config = wxMinConfigService.selectByAppCode(appCode); 
  144.     config = wxMinConfigService.selectBySysSoftwareCode(appCode,sysSoftwareCode); 
  145.    } 
  146.    if (config == null) { 
  147.     logger.warn("WxPayServiceImpl.getWxMinPayConfigByAppCode--->>\n获取微信小程序支付配置信息失败:[{}]", appCode); 
  148.     throw new BaseException(QYError.msg("获取微信支付配置信息失败!")); 
  149.    } 
  150.   } catch (Exception e) { 
  151.    logger.error("WxPayServiceImpl.getWxMinPayConfigByAppCode--->>\n获取微信小程序支付配置信息失败:[{}]", e); 
  152.    throw new BaseException(QYError.msg("获取微信小程序支付配置信息失败!")); 
  153.   } 
  154.   //根据appCode查询商家微信配置信息 
  155.   wxPayConfig.setAppId(config.getAppid()); 
  156.   wxPayConfig.setMchId(config.getMchId()); 
  157.   wxPayConfig.setMchKey(config.getMchKeySecret()); 
  158.   wxPayConfig.setSignType(PayConstant.WXPAY_SIGNTYPE_MD5.getKey()); 
  159.   wxPayConfig.setKeyUrl(config.getCrtPath()); 
  160.   wxPayConfig.setKeyPath(config.getCrtPath()); 
  161.   log.info("获取微信小程序退款配置为 [{}],转为微信支付实体为 [{}]",config,wxPayConfig); 
  162.   return wxPayConfig; 
  163.  } 
  164.  
  165.  /** 
  166.   * 封装预下单参数实体 
  167.   * 
  168.   * @param orderParam 预支付接口参数实体 
  169.   * @param order  点单 
  170.   * @return 
  171.   */ 
  172.  @Override 
  173.  public WxPayUnifiedOrderRequest packRequestParam(PreOrderParam orderParam) { 
  174.   Date date = new Date(); 
  175.   BigDecimal paramAmount = new BigDecimal(orderParam.getTotalAmount().toString()); 
  176.   BigDecimal multiplyNum = new BigDecimal("100"); 
  177.   WxPayUnifiedOrderRequest request = WxPayUnifiedOrderRequest.newBuilder() 
  178.     .body(orderParam.getBody()) 
  179.     .totalFee(paramAmount.multiply(multiplyNum).intValue()) 
  180.     .spbillCreateIp(orderParam.getReqId()) 
  181.     .notifyUrl(notifyUrl + PayConstant.WXPAY_09.getKey()) 
  182.     .tradeType(orderParam.getTradeType()) 
  183.     .outTradeNo(orderParam.getOutTradeNo()) 
  184.     .build(); 
  185.   log.info("WxPayUnifiedOrderRequest = {}", PayConstant.WXPAY_09.getKey()); 
  186.  
  187.   request.setProductId(orderParam.getDh()); 
  188.   request.setDetail(orderParam.getSubject()); 
  189.   PayNotify payNotify = new PayNotify(); 
  190.   payNotify.setAppCode(orderParam.getAppCode()); 
  191.   payNotify.setCode(orderParam.getBmCode()); 
  192.   payNotify.setDh(orderParam.getDh()); 
  193.   request.setAttach(JSON.toJSONString(payNotify)); 
  194.   if (orderParam.getTradeType().equals(PayConstant.JSAPI.toString())) { 
  195.    request.setOpenid(orderParam.getOpenId()); 
  196.   } 
  197.   //开始时间 
  198.   request.setTimeStart(DateUtils.getLastMinute(date, 0)); 
  199.   //有效期 
  200.   request.setTimeExpire(orderParam.getTimeExpire()); 
  201.   return request; 
  202.  } 
  203.  
  204.  /** 
  205.   * 订单查询 
  206.   * 
  207.   * @param appCode 商家编码 
  208.   * @param dh  订单号 
  209.   * @param sysSoftwareCode 
  210.   * @return 
  211.   */ 
  212.  @Override 
  213.  public WxPayOrderQueryResult wxPayOrderQuery(String appCode, String bmCode, String dh, Integer type, String sysSoftwareCode) { 
  214.   logger.info("WxPayServiceImpl.wxPayOrderQuery--->>\n微信订单查询,\n本次查询的商家编码为:[{}],商务订单号:[{}]", appCode, dh); 
  215.   WxPayHandler handler = new WxPayHandlerApacheHttpImpl(); 
  216.   WxPayOrderQueryRequest request = new WxPayOrderQueryRequest(); 
  217.   WxPayOrderQueryResult queryResult = null
  218.   WxPayConfig config = null
  219.  
  220.  
  221.   try { 
  222.    PayLog payLog = payLogService.selectByDh(dh); 
  223.    if (payLog==null) { 
  224.     //商家的微信支付 
  225.     if (type == null || type == 1) { 
  226.      bmCode = null
  227.      config = this.getWxPayConfigByAppCode(appCode, bmCode); 
  228.      //部门的微信支付支付 
  229.     } else if (type == 2) { 
  230.      config = this.getWxPayConfigByAppCode(appCode, bmCode); 
  231.      //商家小程序支付 
  232.     } else if (type == 3) { 
  233.      config = this.getWxMinPayConfigByAppCode(appCode,sysSoftwareCode); 
  234.     } 
  235.    }else
  236.     config = JSON.parseObject(payLog.getPayConfigJsonStr(), WxPayConfig.class); 
  237.    } 
  238.    request.setOutTradeNo(dh); 
  239.    handler.setConfig(config); 
  240.    queryResult = handler.queryOrder(request); 
  241.    logger.info("WxPayServiceImpl.wxPayOrderQuery--->>\n微信订单查询成功,\n返回包信息:[{}]", JSON.toJSONString(queryResult)); 
  242.   } catch (WxPayException e) { 
  243.    logger.error("WxPayServiceImpl.wxPayOrderQuery--->>\n微信订单查询失败,\n商务订单号:[{}]", dh); 
  244.    throw new BaseException(QYError.msg("微信订单查询失败,商务订单号:[{}]" + dh + "")); 
  245.   } 
  246.   return queryResult; 
  247.  } 
  248.  /** 
  249.   * 企业支付 
  250.   * @param params 
  251.   * @return: com.qcsoft.commonbean.bean.payment.wx.bean.result.BaseWxPayResult 
  252.   * @Author:  
  253.   * @date
  254.   */ 
  255.  @Override 
  256.  public BaseWxPayResult entPay(EntPayParam params) throws WxPayException { 
  257.   WxPayHandler wxPayHandler = new WxPayHandlerApacheHttpImpl(); 
  258.   WxPayConfig config = null
  259.   EntPayResult result = null
  260.   EntPayBankResult bankResult = null
  261.   if (params.getTradeType() != null && params.getTradeType() == 3) { 
  262.    config = this.getWxMinPayConfigByAppCode(params.getAppCode(),params.getSysSoftwareCode()); 
  263.   } else { 
  264.    config = this.getWxPayConfigByAppCode(params.getAppCode(), params.getBmCode()); 
  265.   } 
  266.   config.setUseKey(true); 
  267.   wxPayHandler.setConfig(config); 
  268.   if (params.getTradeType()==1) { 
  269.    EntPayRequest request = packEntPayRequest(params,config); 
  270.    EntPayHandler entPayHandler = new EntPayHandlerImpl(wxPayHandler); 
  271.  
  272.    result = entPayHandler.entPay(request); 
  273.    return result; 
  274.   }else
  275.    EntPayBankRequest request = packEntPayBankRequest(params); 
  276.    EntPayHandler entPayHandler = new EntPayHandlerImpl(wxPayHandler); 
  277.    bankResult = entPayHandler.payBank(request); 
  278.    return bankResult; 
  279.   } 
  280.  } 
  281.  /** 
  282.   * 封装微信企业支付请求参数 
  283.   * @param params 
  284.   * @return: com.qcsoft.commonbean.bean.payment.wx.bean.entpay.EntPayRequest 
  285.   * @Author:  
  286.   * @date:  
  287.   */ 
  288.  public EntPayRequest packEntPayRequest(EntPayParam params,WxPayConfig config) { 
  289.   EntPayRequest request = new EntPayRequest(); 
  290.   request.setAmount(params.getAmount().multiply(new BigDecimal("10")).intValue()); 
  291.   request.setCheckName("NO_CHECK"); 
  292.   request.setOpenid(params.getOpenid()); 
  293.   request.setSpbillCreateIp(params.getSpbillCreateIp()); 
  294.   request.setPartnerTradeNo(params.getPartnerTradeNo()); 
  295.   request.setMchAppid(config.getAppId()); 
  296.   request.setMchId(config.getMchId()); 
  297.   request.setDescription(params.getDesc()); 
  298.   return request; 
  299.  } 
  300.  
  301.  
  302.  /** 
  303.   * 封装银行卡企业支付参数 
  304.   * @param params 
  305.   * @return: com.qcsoft.commonbean.bean.payment.wx.bean.entpay.EntPayBankRequest 
  306.   * @Author:  
  307.   * @date:  
  308.   */ 
  309.  public EntPayBankRequest packEntPayBankRequest(EntPayParam params) { 
  310.   EntPayBankRequest request = new EntPayBankRequest(); 
  311.   request.setAmount(params.getAmount().multiply(new BigDecimal("10")).intValue()); 
  312.   request.setBankCode(params.getBankCode()); 
  313.   request.setEncTrueName(params.getEncTrueName()); 
  314.   request.setPartnerTradeNo(params.getPartnerTradeNo()); 
  315.   request.setDescription(params.getDesc()); 
  316.   return request; 
  317.  } 

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; 

 

责任编辑:未丽燕 来源: 今日头条
相关推荐

2018-02-25 11:22:14

SDK代码接口

2015-07-15 10:09:43

2013-11-28 11:15:43

微信支付宝支付战争

2021-12-29 21:36:12

微信支付宝移动支付

2021-01-19 16:24:08

抖音支付宝微信

2020-11-06 07:35:09

微信支付支付宝

2018-03-21 06:27:16

支付宝微信银联

2018-07-01 15:40:51

微信支付宝央行

2019-11-01 09:36:58

微信支付支付宝

2016-12-29 13:28:13

2015-08-04 17:03:52

支付宝微信

2021-03-26 14:56:30

数字人民币支付宝微信

2019-03-27 15:03:42

微信支付宝刷脸支付

2011-04-21 11:27:42

Firefox支付宝

2023-08-10 08:00:00

2018-01-08 14:10:48

2017-08-04 15:16:55

2019-08-12 11:28:25

2018-07-10 15:41:37

2020-08-05 15:04:13

微信支付宝移动应用
点赞
收藏

51CTO技术栈公众号