广告
返回顶部
首页 > 资讯 > 前端开发 > html >怎么用Java也实现微信和支付宝支付功能
  • 470
分享到

怎么用Java也实现微信和支付宝支付功能

2024-04-02 19:04:59 470人浏览 独家记忆
摘要

这篇文章主要介绍“怎么用Java也实现微信和支付宝支付功能”,在日常操作中,相信很多人在怎么用Java也实现微信和支付宝支付功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”

这篇文章主要介绍“怎么用Java也实现微信和支付宝支付功能”,在日常操作中,相信很多人在怎么用Java也实现微信和支付宝支付功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用Java也实现微信和支付宝支付功能”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、前期准备

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

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

二、数据库表设计

1、微信支付配置表

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

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

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

3、支付宝支付配置表

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

4、支付流水记录表

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

5、支付失败记录表

CREATE TABLE `pay_fail_log` (  `pay_id` varchar(18) NOT NULL,  `json_date` varchar(500) DEFAULT NULL,  `create_id` varchar(18) DEFAULT NULL,  `create_time` datetime DEFAULT NULL,  `update_id` varchar(18) DEFAULT NULL,  `update_time` datetime DEFAULT NULL,  `app_code` varchar(18) NOT NULL,  `delete_flag` tinyint(1) DEFAULT '0' COMMENT '是否删除:0-否;1-是',  PRIMARY KEY (`pay_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT;

三、依赖引入

<?xml version="1.0" encoding="UTF-8"?>  <project xmlns="Http://Maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">   <parent>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-parent</artifactId>   <version>2.1.3.RELEASE</version>   <relativePath/> <!-- lookup parent from repository -->  </parent>   <modelVersion>4.0.0</modelVersion>  <groupId>com.pay</groupId>  <artifactId>qc-payment</artifactId>  <version>2.3</version>  <name>qc-payment</name>  <!-- FIXME change it to the project's WEBsite -->  <url>http://www.example.com</url>   <properties>   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>   <maven.compiler.source>1.7</maven.compiler.source>   <maven.compiler.target>1.7</maven.compiler.target>   <spring-cloud.version>Greenwich.SR1</spring-cloud.version>  </properties>   <dependencies>   <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-data-Redis</artifactId>   </dependency>   <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId>   </dependency>   <dependency>    <groupId>org.springframework.cloud</groupId>    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>   </dependency>   <dependency>    <groupId>org.springframework.cloud</groupId>    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>   </dependency>     <!--z支付宝-->   <dependency>    <groupId>com.alipay.sdk</groupId>    <artifactId>alipay-sdk-java</artifactId>    <version>3.3.4.ALL</version>   </dependency>     <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-test</artifactId>    <scope>test</scope>   </dependency>    <!--导入重试机制的坐标-->   <dependency>    <groupId>org.springframework.retry</groupId>    <artifactId>spring-retry</artifactId>   </dependency>    <!--引入Hystrix依赖-->   <dependency>    <groupId>org.springframework.cloud</groupId>    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>   </dependency>    <!--导入Jwt相关依赖-->   <dependency>    <groupId>com.auth0</groupId>    <artifactId>java-jwt</artifactId>    <version>3.4.1</version>   </dependency>    <!-- StringUtil 类-->   <dependency>    <groupId>org.apache.commons</groupId>    <artifactId>commons-lang3</artifactId>    <version>3.3.2</version>   </dependency>    <!-- ali 连接池 -->   <dependency>    <groupId>com.alibaba</groupId>    <artifactId>druid</artifactId>    <version>1.1.12</version>   </dependency>    <!-- mybatis -->   <dependency>    <groupId>org.mybatis.spring.boot</groupId>    <artifactId>mybatis-spring-boot-starter</artifactId>    <version>2.0.0</version>   </dependency>    <!-- Mysql -->   <dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId>   </dependency>   <dependency>    <groupId>javax.persistence</groupId>    <artifactId>persistence-api</artifactId>    <version>1.0.2</version>   </dependency>   <!-- https://mvnrepository.com/artifact/tk.mybatis/mapper -->   <dependency>    <groupId>tk.mybatis</groupId>    <artifactId>mapper</artifactId>    <version>4.0.3</version>   </dependency>    <!-- import lombok 可以省去getter setter toString等方法 -->   <dependency>    <groupId>org.projectlombok</groupId>    <artifactId>lombok</artifactId>    <scope>provided</scope>   </dependency>    <!-- commons-io -->   <dependency>    <groupId>commons-io</groupId>    <artifactId>commons-io</artifactId>    <version>2.4</version>   </dependency>    <!-- 引入easyqinyu-tools项目 -->   <dependency>    <groupId>com.pay</groupId>    <artifactId>easyqinyu-tools</artifactId>    <version>0.0.1-SNAPSHOT</version>   </dependency>    <!-- pagehelper分页插件 -->   <dependency>    <groupId>com.GitHub.pagehelper</groupId>    <artifactId>pagehelper</artifactId>    <version>5.1.2</version>   </dependency>    <dependency>    <groupId>com.github.pagehelper</groupId>    <artifactId>pagehelper-spring-boot-autoconfigure</artifactId>    <version>1.2.3</version>   </dependency>   <dependency>    <groupId>com.github.pagehelper</groupId>    <artifactId>pagehelper-spring-boot-starter</artifactId>    <version>1.2.3</version>   </dependency>   <dependency>    <groupId>com.qcsoft</groupId>    <artifactId>qc-swagger-ui</artifactId>    <version>0.0.1-SNAPSHOT</version>    <scope>compile</scope>   </dependency>   <dependency>    <groupId>com.Google.zxing</groupId>    <artifactId>core</artifactId>    <version>3.3.0</version>   </dependency>    <dependency>    <groupId>com.alibaba</groupId>    <artifactId>fastjson</artifactId>    <version>RELEASE</version>    <scope>compile</scope>   </dependency>    <dependency>    <groupId>org.apache.httpcomponents</groupId>    <artifactId>httpclient</artifactId>    <version>${httpclient.version}</version>   </dependency>     <dependency>    <groupId>com.google.code.gson</groupId>    <artifactId>gson</artifactId>    <version>2.8.2</version>   </dependency>     <!--阿里云信息发送-->   <dependency>    <groupId>com.aliyun</groupId>    <artifactId>aliyun-java-sdk-core</artifactId>    <version>3.3.1</version>   </dependency>   <dependency>    <groupId>com.github.1991wangliang</groupId>    <artifactId>aliyun-java-sdk-dysmsapi</artifactId>    <version>1.0.0</version>   </dependency>    <dependency>    <groupId>org.springframework.kafka</groupId>    <artifactId>spring-kafka</artifactId>   </dependency>    <!-- xml解析-->   <dependency>    <groupId>com.thoughtworks.xstream</groupId>    <artifactId>xstream</artifactId>    <version>1.4.10</version>   </dependency>    <!-- dom4j -->   <dependency>    <groupId>org.dom4j</groupId>    <artifactId>dom4j</artifactId>    <version>2.1.1</version>   </dependency>     <dependency>    <groupId>com.github.binarywang</groupId>    <artifactId>weixin-java-common</artifactId>    <version>3.3.4.B</version>   </dependency>     <dependency>    <groupId>org.jodd</groupId>    <artifactId>jodd-http</artifactId>    <scope>compile</scope>   </dependency>    <dependency>    <groupId>org.apache.commons</groupId>    <artifactId>commons-lang3</artifactId>   </dependency>     <!-- xml解析-->   <dependency>    <groupId>commons-beanutils</groupId>    <artifactId>commons-beanutils</artifactId>    <version>1.9.3</version>   </dependency>    <dependency>    <groupId>jdom</groupId>    <artifactId>jdom</artifactId>    <version>1.0</version>   </dependency>     <dependency>    <groupId>org.bouncycastle</groupId>    <artifactId>bcpkix-jdk15on</artifactId>    <version>1.59</version>   </dependency>   <dependency>    <groupId>org.jodd</groupId>    <artifactId>jodd-http</artifactId>    <version>3.7.1</version>   </dependency>   <!--二维码工具-->   <dependency>    <groupId>com.google.zxing</groupId>    <artifactId>core</artifactId>    <version>3.2.1</version>   </dependency>    <dependency>    <groupId>com.qcsoft</groupId>    <artifactId>qc-commonbean</artifactId>    <version>0.0.1-SNAPSHOT</version>   </dependency>    <dependency>    <groupId>org.springframework.cloud</groupId>    <artifactId>spring-cloud-starter-openfeign</artifactId>   </dependency>   <!-- xxl-job-core -->   <dependency>    <groupId>com.xuxueli</groupId>    <artifactId>xxl-job-core</artifactId>    <version>2.0.1</version>   </dependency>   <!--线路跟踪-->   <dependency>    <groupId>org.springframework.cloud</groupId>    <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>   </dependency>    <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-actuator</artifactId>   </dependency>  </dependencies>    <dependencyManagement>   <dependencies>    <dependency>     <groupId>org.springframework.cloud</groupId>     <artifactId>spring-cloud-dependencies</artifactId>     <version>${spring-cloud.version}</version>     <type>pom</type>     <scope>import</scope>    </dependency>   </dependencies>  </dependencyManagement>  <build>   <finalName>qc-payment</finalName>   <plugins>    <plugin>     <groupId>org.springframework.boot</groupId>     <artifactId>spring-boot-maven-plugin</artifactId>    </plugin>    <plugin>     <groupId>org.apache.maven.plugins</groupId>     <artifactId>maven-compiler-plugin</artifactId>     <configuration>      <source>8</source>      <target>8</target>     </configuration>    </plugin>   </plugins>  </build> </project>

四、程序实现

1、Controller

package com.qcsoft.payment.controller;  import com.alibaba.fastjson.JSON; import com.qcsoft.commonbean.bean.common.SwaggerConstant; import com.qcsoft.commonbean.bean.payment.common.PrePayResult; import com.qcsoft.commonbean.bean.payment.wx.bean.PreOrderParam; import com.qcsoft.commonbean.bean.payment.wx.exception.WxPayException; import com.qcsoft.commonbean.bean.payment.wx.util.QrcodeUtils; import com.qcsoft.easyqinyutools.message.ReturnMsg; import com.qcsoft.payment.controller.commom.BaseController; import com.qcsoft.payment.service.PayService; import com.qcsoft.swaggerui.anno.ApiTag; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*;  import javax.imageio.ImageIO; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.awt.image.BufferedImage; import java.io.IOException;    @RestController @RequestMapping("/v2") public class PayController extends BaseController {  private static final Logger logger = LoggerFactory.getLogger(PayController.class);   @Autowired  private PayService payService;   //private final AtomicInteger tick = new AtomicInteger();     @RequestMapping(value = "/prePayOrder")  @ApiTag(SwaggerConstant.PAYMENT_001)  public ReturnMsg prePayOrder(@RequestBody PreOrderParam orderParam) {   String metadata = JSON.toJSONString(orderParam);   logger.info("PayController.prePayOrder----\n正在请求支付....,参数为>>>>{}", metadata);   ReturnMsg ret = new ReturnMsg();   //预下单   PrePayResult prePayResult = this.payService.payPreOrder(orderParam);   ret.setData(prePayResult);   return ret.success("下单成功,订单有效期为" + orderParam.getTimeExpire());  }     @RequestMapping(value = "/createQrCode/url")  @ApiTag(SwaggerConstant.PAYMENT_001)  public void createQrCode(@PathVariable String url, HttpServletRequest request, HttpServletResponse response) throws IOException {   String queryString = request.getQueryString();   BufferedImage bufferedImage = QrcodeUtils.encode(url+queryString, 500, 500, null, null);   BufferedImage grayImage = QrcodeUtils.grayImage(bufferedImage);   ImageIO.write(grayImage, "png", response.getOutputStream());  }   }

2、PayService

package com.qcsoft.payment.service.impl;  import com.alibaba.fastjson.JSON; import com.alipay.api.AlipayClient; import com.qcsoft.commonbean.bean.common.KafkaConstant; import com.qcsoft.commonbean.bean.payment.ChinaumsConfig; import com.qcsoft.commonbean.bean.payment.PayLog; import com.qcsoft.commonbean.bean.payment.common.PayConstant; import com.qcsoft.commonbean.bean.payment.common.PrePayResult; import com.qcsoft.commonbean.bean.payment.common.WxPrePayResultPackage; import com.qcsoft.commonbean.bean.payment.wx.bean.PreOrderParam; import com.qcsoft.commonbean.bean.payment.wx.bean.request.WxPayUnifiedOrderRequest; import com.qcsoft.commonbean.bean.payment.wx.bean.result.WxPayUnifiedOrderResult; import com.qcsoft.commonbean.bean.payment.wx.config.WxPayConfig; import com.qcsoft.easyqinyutools.utils.JsonUtil; import com.qcsoft.payment.commns.exception.BaseException; import com.qcsoft.payment.commns.exception.QYError; import com.qcsoft.payment.commns.utils.UserUtil; import com.qcsoft.payment.commns.utils.weixin.PackageUtil; import com.qcsoft.payment.service.*; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;  import java.util.SortedMap; import java.util.TreeMap;  @Service public class PayServiceImpl implements PayService {  public Logger logger = LoggerFactory.getLogger(getClass());  @Autowired  private AliPayService aliPayService;  @Autowired  private WxPayService wxPayService;  @Autowired  private ChinaumsPayService chinaumsPayService;   @Autowired  private UserUtil userUtil;  @Autowired  private PayLogService payLogService;    @Override  public PrePayResult payPreOrder(PreOrderParam orderParam) throws BaseException {   logger.info("PayServiceImpl.payPreOrder---->>>>\n准备下单.....,当前用户订单号[{}]", orderParam.getDh());   String temp = "";   PrePayResult payResult = new PrePayResult();   //校验支付方式   String payType = orderParam.getPayType();   if (!StringUtils.isNotBlank(payType))    throw new BaseException(QYError.msg("请选择支付方式!"));   if (PayConstant.WXPAY.toString().equals(payType)) {    //查询商家配置信息    WxPayConfig config;    if (orderParam.getTradeType().equals(PayConstant.WECHATAPP.toString())) {     config = wxPayService.getWxMinPayConfigByAppCode(orderParam.getAppCode(), orderParam.getSysSoftwareCode());    } else {     config = wxPayService.getWxPayConfigByAppCode(orderParam.getAppCode(), orderParam.getBmCode());    }    //设置预支付请求参数    if (orderParam.getTradeType().equals(PayConstant.WECHATAPP.toString())) {     orderParam.setTradeType(PayConstant.JSAPI.toString());    }    WxPayUnifiedOrderRequest requestParam = wxPayService.packRequestParam(orderParam);    //开始请求预支付接口    WxPayUnifiedOrderResult result = wxPayService.wxPrePay(config, requestParam);    //根据支付类型设置值    WxPrePayResultPackage resultPackage = null;    if (orderParam.getTradeType().equals(PayConstant.APP.toString()) || orderParam.getTradeType().equals(PayConstant.JSAPI.toString()) || orderParam.getTradeType().equals(PayConstant.WECHATAPP.toString())) {     resultPackage = new WxPrePayResultPackage();     String timeMillis = PackageUtil.getTimeStamp();     String nonceString = PackageUtil.getNonceStr();     resultPackage.setAppId(result.getAppid());     resultPackage.setNonceStr(nonceString);     resultPackage.setTimeStamp(timeMillis);     resultPackage.setPrePayId(result.getPrepayId());     resultPackage.setInfoPackage("prepay_id=" + result.getPrepayId());     resultPackage.setSignType(requestParam.getSignType());     if (orderParam.getTradeType().equals(PayConstant.APP.toString())) {      SortedMap<String, String> returnData = PackageUtil.getReturnData(resultPackage, config.getMchId());      String paysign = PackageUtil.createSign(returnData, config.getMchKey());      resultPackage.setPaySign(paysign);      resultPackage.setInfoPackage(returnData.get("package"));      payResult.setWxAppPackage(resultPackage);     } else {      SortedMap<String, String> paypackageParams = new TreeMap<String, String>();      paypackageParams.put("appId", result.getAppid()); // appid      paypackageParams.put("timeStamp", timeMillis); //      paypackageParams.put("nonceStr", nonceString); //      paypackageParams.put("package", resultPackage.getInfoPackage()); //      paypackageParams.put("signType", resultPackage.getSignType());      String paysign = PackageUtil.createSign(paypackageParams, config.getMchKey());      resultPackage.setPaySign(paysign);      payResult.setWxJsapiPackage(resultPackage);     }    } else if (orderParam.getTradeType().equals(PayConstant.MWEB.toString())) {     payResult.setWxH5Url(result.getMwebUrl() + " &redirect_url=" + orderParam.getRedirectUrl());    } else if (orderParam.getTradeType().equals(PayConstant.NATIVE.toString())) {     payResult.setWxNativeUrl(result.getCodeURL());    }    //添加支付日志    insertPayLog(orderParam, KafkaConstant.PAYMENT_NOTIFY_001.getTopic(), "0", resultPackage, JSON.toJSONString(config));    return payResult;   } else if (PayConstant.ALIPAY.toString().equals(payType)) {    AlipayClient client = aliPayService.getAlipayClientByAppCode(orderParam.getAppCode());    if (orderParam.getTradeType().equals(PayConstant.APP.toString())) {     temp = aliPayService.aliAppPay(client, orderParam);     payResult.setAlipayAppParamStr(temp);    } else if (orderParam.getTradeType().equals(PayConstant.MWEB.toString())) {     temp = aliPayService.aliH5Pay(client, orderParam);     payResult.setAlipayH5Form(temp);    } else if (orderParam.getTradeType().equals(PayConstant.NATIVE.toString())) {     temp = aliPayService.aliScanPay(client, orderParam);     payResult.setAlipayScanUrl(temp);    }    //添加支付日志    insertPayLog(orderParam, KafkaConstant.PAYMENT_NOTIFY_001.getTopic(), "1", orderParam, JSON.toJSONString(aliPayService.getConfigByAppCode(orderParam.getAppCode())));    return payResult;   } else if (PayConstant.WECHATAPP.toString().equals(payType)) {    } else if (PayConstant.CHINAUMS.toString().equals(payType)) { //银联pos支付    //查询商家配置信息    ChinaumsConfig config;    config = chinaumsPayService.getPayConfigByAppCode(orderParam.getAppCode(), orderParam.getBmCode());    if (orderParam.getTradeType().equals(PayConstant.CODE_SCAN.toString())) {     chinaumsPayService.codeScanPay(config, orderParam);    }    //添加支付日志    insertPayLog(orderParam, KafkaConstant.PAYMENT_NOTIFY_001.getTopic(), "3", orderParam, JSON.toJSONString(config));    return payResult;   }   logger.warn("用户未选择正确的支付方式");   throw new BaseException(QYError.msg("请选择正确的支付方式!"));   }   public void insertPayLog(PreOrderParam orderParam, String topic, String moneyType, Object obj, String payConfigJsonStr) {   PayLog payLog = new PayLog();   payLog.setAppCode(orderParam.getAppCode());   payLog.setPayLogId(orderParam.getDh());   payLog.setMoneyType(moneyType);   payLog.setMQtopic(topic);   payLog.setMqStatus(0);   payLog.setPayNo(orderParam.getDh());   payLog.setRequest(JsonUtil.toJSon(obj));   payLog.setFee(orderParam.getTotalAmount());   payLog.setPayConfigJsonStr(payConfigJsonStr);   payLogService.saveOrUpdate(payLog);  } }

3、AliPayService

package com.qcsoft.payment.service;  import com.alipay.api.AlipayClient; import com.alipay.api.request.AlipayTradeRefundRequest; import com.alipay.api.response.AlipayTradeQueryResponse; import com.alipay.api.response.AlipayTradeRefundResponse; import com.qcsoft.commonbean.bean.payment.AlipayConfig; import com.qcsoft.commonbean.bean.payment.alipay.AliPayRefundParam; import com.qcsoft.commonbean.bean.payment.common.PayNotify; import com.qcsoft.commonbean.bean.payment.wx.bean.PreOrderParam; import com.qcsoft.easyqinyutools.message.ReturnMsg;  import javax.servlet.http.HttpServletRequest; import java.util.Map;  public interface AliPayService {    String aliAppPay(AlipayClient alipayClient,PreOrderParam orderParam);    String aliScanPay(AlipayClient alipayClient, PreOrderParam orderParam);   String aliH5Pay(AlipayClient alipayClient, PreOrderParam orderParam);   void aliPayNotify(PayNotify params);   boolean rsaCheckV1(HttpServletRequest request,String appCode);   AlipayTradeQueryResponse aliPayOrderQuery(AlipayClient alipayClient, String out_trade_no);   AlipayClient getAlipayClientByAppCode(String appCode);   AlipayConfig getConfigByAppCode(String appCode);     ReturnMsg aliPayRefund(AliPayRefundParam aliPayRefundParam);  }

AliPayServiceImpl

package com.qcsoft.payment.service.impl;  import com.alibaba.fastjson.JSON; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.domain.AlipayTradeAppPayModel; import com.alipay.api.domain.AlipayTradePrecreateModel; import com.alipay.api.domain.AlipayTradeRefundModel; import com.alipay.api.domain.AlipayTradeWapPayModel; import com.alipay.api.internal.util.AlipaySignature; import com.alipay.api.request.*; import com.alipay.api.response.*; import com.qcsoft.commonbean.bean.payment.AlipayConfig; import com.qcsoft.commonbean.bean.payment.alipay.AliPayRefundParam; import com.qcsoft.commonbean.bean.payment.common.PayConstant; import com.qcsoft.commonbean.bean.payment.common.PayNotify; import com.qcsoft.commonbean.bean.payment.wx.bean.PreOrderParam; import com.qcsoft.easyqinyutools.message.ReturnMsg; import com.qcsoft.payment.commns.exception.BaseException; import com.qcsoft.payment.commns.exception.QYError; import com.qcsoft.payment.commns.utils.DateUtils; import com.qcsoft.payment.commns.utils.RedisUtil; import com.qcsoft.payment.service.AliPayService; import com.qcsoft.payment.service.AlipayConfigService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service;  import javax.servlet.http.HttpServletRequest; import java.net.URLEncoder; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.Map;   @Service public class AliPayServiceImpl implements AliPayService {  private static final Logger logger = LoggerFactory.getLogger(AliPayServiceImpl.class);  @Autowired  private AlipayConfigService alipayConfigService;  @Autowired  private RedisUtil redisUtil;  @Value("${payNotifyUrl}")  private String notifyUrl;     @Override  public String aliAppPay(AlipayClient alipayClient, PreOrderParam orderParam) {   logger.info("AliPayServiceImpl.aliAppPay--->>>\n支付宝预支付开始,\n支付类型为:APP支付,\n订单号为:{}", orderParam.getDh());   Date date = new Date();   AlipayTradeAppPayResponse response = null;   // 发起App支付请求   AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();   // 订单描述   model.setBody(orderParam.getBody());   // 订单标题   model.setSubject(orderParam.getSubject());   // 商户订单号 就是商户后台生成的订单号   model.setOutTradeNo(orderParam.getOutTradeNo());   // 该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天 (屁股后面的字母一定要带,不然报错)   model.setTimeoutExpress(DateUtils.toString(date, orderParam.getTimeExpire()));   // 订单总金额 ,默认单位为元,精确到小数点后两位,取值范围[0.01,100000000]   model.setTotalAmount(orderParam.getTotalAmount().toString());   // 销售产品码   model.setProductCode(PayConstant.ALIPAY_QUICK_WAP_WAY.geTKEy());   AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();   request.setBizModel(model);   // request.setNotifyUrl("商户外网可以访问的异步地址,不写就是不回调");   request.setNotifyUrl(notifyUrl + PayConstant.ALIPAY_05.getKey() + "/" + orderParam.getAppCode() + "/" + orderParam.getDh());   //支付成功返回地址   request.setReturnUrl(orderParam.getRedirectUrl());   // 通过api的方法请求阿里接口获得反馈   logger.info("AliPayServiceImpl.aliAppPay----->\n支付宝预支付接口请求信息:{}", JSON.toJSONString(request));   try {    response = alipayClient.sdkExecute(request);   } catch (AlipayApiException e) {    logger.info("AliPayServiceImpl.aliAppPay----->\n支付宝预下单失败,\n本次下单的订单号为:{},\n相关报错信息为:{}", orderParam.getDh(), response, e);    throw new BaseException(QYError.msg("调用支付宝预下单接口失败![" + e.getMessage() + "]"));   }    logger.info("AliPayServiceImpl.aliAppPay----->\n支付宝预支付接口返回信息:{}", JSON.toJSONString(response));   if (response.isSuccess()) {    logger.info("AliPayServiceImpl.aliAppPay----->\n支付宝预下单成功,\n本次下单的订单号为:{},商户订单号为:{}", orderParam.getDh(), orderParam.getOutTradeNo());   } else {    logger.error("AliPayServiceImpl.aliAppPay----->\n调用支付宝预下单接口失败!\n具体信息为:\n{}", response.getBody());    throw new BaseException(QYError.msg("调用支付宝预下单接口失败![" + response.getMsg() + "]"));   }   return response.getBody();  }      @Override  public String aliScanPay(AlipayClient alipayClient, PreOrderParam orderParam) {   logger.info("AliPayServiceImpl.aliScanPay--->>>\n支付宝预支付开始,\n支付类型为:扫码支付,\n订单号:{}", orderParam.getDh());      AlipayTradePrecreateResponse response = null;   Date date = new Date();      AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();   // 订单描述   model.setBody(orderParam.getBody());   // 订单标题   model.setSubject(orderParam.getBody());   // 商户订单号 就是商户后台生成的订单号   model.setOutTradeNo(orderParam.getOutTradeNo());   // 该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天 (屁股后面的字母一定要带,不然报错)   model.setTimeoutExpress(orderParam.getTimeExpire());   //model.setSellerId(DateUtils.toString(date, "yyyyMMddHHmmssSSS"));   // 订单总金额 ,默认单位为元,精确到小数点后两位,取值范围[0.01,100000000]   model.setTotalAmount(orderParam.getTotalAmount().toString());   //model.setProductCode(PayConstant.ALIPAY_FAST_INSTANT_TRADE_PAY.getKey());   // 选填      AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();   request.setBizModel(model);   // request.setNotifyUrl("商户外网可以访问的异步地址,不写就是不回调");   request.setNotifyUrl(notifyUrl + PayConstant.ALIPAY_05.getKey() + "/" + orderParam.getAppCode() + "/" + orderParam.getDh());    //支付成功返回地址   request.setReturnUrl(orderParam.getRedirectUrl());   // 通过api的方法请求阿里接口获得反馈 alipayClient.pageExecute(request)   try {    logger.info("支付宝扫码付请求报文:{}",JSON.toJSONString(request));    response = alipayClient.execute(request);   } catch (AlipayApiException e) {    logger.info("AliPayServiceImpl.aliScanPay----->\n支付宝预下单失败,\n本次下单的订单号:{},\n相关报错信息为:{}", orderParam.getDh(), response, e);    throw new BaseException(QYError.msg("调用支付宝预下单接口失败![" + e.getMessage() + "]"));   }catch (Exception e){    e.printStackTrace();    throw new BaseException(QYError.msg("调用支付宝预下单接口失败![" + e.getMessage() + "]"));   }    //打印返回信息   logger.info("AliPayServiceImpl.aliScanPay----->\n支付宝预支付接口返回信息:{}", JSON.toJSONString(response));   //判断预下单返回状态   if (response.isSuccess()) {    logger.info("AliPayServiceImpl.aliScanPay----->\n支付宝预下单成功,\n本次下单的订单号:{},商务订单号为", orderParam.getDh(), orderParam.getOutTradeNo());   } else {    logger.error("AliPayServiceImpl.aliScanPay----->\n调用支付宝预下单接口失败!\n具体信息:\n{}", response.getBody());    throw new BaseException(QYError.msg("调用支付宝预下单接口失败![" + response.getMsg() + "]"));   }    return response.getQrCode();  }      @Override  public String aliH5Pay(AlipayClient alipayClient, PreOrderParam orderParam) {   logger.info("AliPayServiceImpl.aliH5Pay--->>>\n支付宝预支付开始,\n支付类型为:H5支付,\n订单号:{}", orderParam.getDh());   String form = "";   AlipayTradeWapPayResponse response = null;      AlipayTradeWapPayModel payModel = new AlipayTradeWapPayModel();   payModel.setOutTradeNo(orderParam.getOutTradeNo());   payModel.setSubject(orderParam.getBody());   payModel.setTotalAmount(orderParam.getTotalAmount().toString());   payModel.setBody(orderParam.getBody());   payModel.setTimeoutExpress(orderParam.getTimeExpire());   payModel.setProductCode(PayConstant.ALIPAY_QUICK_WAP_WAY.getKey());   payModel.setQuitUrl(URLEncoder.encode(orderParam.getQuitUrl()));      AlipayTradeWapPayRequest alipay_request = new AlipayTradeWapPayRequest();   alipay_request.setBizModel(payModel);   // 设置异步通知地址   logger.info("通知地址{}", notifyUrl + PayConstant.ALIPAY_05.getKey() + "/" + orderParam.getAppCode() + "/" + orderParam.getDh());   alipay_request.setNotifyUrl(notifyUrl + PayConstant.ALIPAY_05.getKey() + "/" + orderParam.getAppCode() + "/" + orderParam.getDh());   // 设置同步地址   alipay_request.setReturnUrl(URLEncoder.encode(orderParam.getRedirectUrl()));   // 调用SDK生成表单   try {    response = alipayClient.pageExecute(alipay_request);    if (response.isSuccess()) {     form = response.getBody();     logger.info("AliPayServiceImpl.aliH5Pay----->>>>\n支付宝预支付接口返回信息:{}", JSON.toJSONString(response));    } else {     logger.info("AliPayServiceImpl.aliH5Pay----->>>>\n支付宝预支付接口返回信息:{}", JSON.toJSONString(response));     throw new BaseException(QYError.msg("支付宝"));    }    } catch (AlipayApiException e) {    logger.info("AliPayServiceImpl.aliH5Pay----->>>>\n支付宝预支付接口返回信息:{}", JSON.toJSONString(response));    throw new BaseException(QYError.msg("调用支付宝预下单接口失败![" + e.getMessage() + "]"));   }   logger.info("AliPayServiceImpl.aliH5Pay----->>>>\n支付宝预支付接口返回信息:{}", JSON.toJSONString(response));      return form;  }     @Override  public void aliPayNotify(PayNotify params) {   logger.info("AliPayServiceImpl.appAliPayNotify-\n阿里服务器消费手机回调参数获取和参数判断-------》》》");      //校验支付金额         if (params.getTradeStatus().equals("TRADE_SUCCESS")) {    logger.info("AliPayServiceImpl.appAliPayNotify----\n支付宝支付成功!商务订单号[{}]----->>", params.getOutTradeNo(), JSON.toJSONString(params));   } else {    logger.error("AliPayServiceImpl.appAliPayNotify---\n支付宝支付失败!商务订单号[{}]---->>", params.getOutTradeNo());    throw new BaseException(QYError.msg("支付宝支付失败!商务订单号[" + params.getOutTradeNo() + "]"));   }  }   @Override  public boolean rsaCheckV1(HttpServletRequest request, String appCode) {   //获取支付宝GET过来反馈信息   Map<String, String> params = new HashMap<String, String>();   // 签名验证(对支付宝返回的数据验证,确定是支付宝返回的)   boolean result = false;   try {    // 从支付宝回调的request域中取值    Map<String, String[]> requestParams = request.getParameterMap();    for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext(); ) {     String name = iter.next();     String[] values = (String[]) requestParams.get(name);     String valueStr = "";     for (int i = 0; i < values.length; i++) {      valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";     }     params.put(name, valueStr);    }    logger.info("AliPayServiceImpl.appAliPayNotify--\n支付宝通知数据包----->>>>>>>>>>>>>>>{}", JSON.toJSONString(params));    // 商家编码     AlipayConfig alipayConfig = getConfigByAppCode(appCode);    result = AlipaySignature.rsaCheckV1(params, alipayConfig.getAliPublicKey(),      PayConstant.ALIPAY_CHARSET.getKey(), PayConstant.ALIPAY_SIGN_TYPE_RSA2.getKey());   } catch (Exception e) {    logger.error("AliPayServiceImpl.appAliPayNotify---\n校验签名失败!商务订单号[{}]---->>", JSON.toJSONString(request), e);    throw new BaseException(QYError.msg("支付宝支付校验签名失败!"));   }   return result;  }     @Override  public AlipayTradeQueryResponse aliPayOrderQuery(AlipayClient alipayClient, String out_trade_no) {   logger.info("AliPayServiceImpl.aliPayOrderQuery----\n根据商务订单号查询支付宝订单信息,\n商务订单号:[{}]----》》》", out_trade_no);   AlipayTradeQueryResponse response = null;   AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();   //设置查询参数   Map<String, String> bizModel = new HashMap<>();   bizModel.put("out_trade_no", out_trade_no);   request.setBizContent(JSON.toJSONString(bizModel));   //开始查询   try {    response = alipayClient.execute(request);   } catch (AlipayApiException e) {    logger.error("AliPayServiceImpl.aliPayOrderQuery--->>\n支付宝订单查询失败,\n商务订单号:[{}]", out_trade_no);    throw new BaseException(QYError.msg("订单号[" + out_trade_no + "],订单支付失败,状态码为[" + response.getTradeStatus() + "]"));   }    logger.info("AliPayServiceImpl.aliPayOrderQuery---->>\n查询支付宝订单信息,\n商务订单号:[{}],\n返回信息:{}", out_trade_no, JSON.toJSONString(response));   //查询状态处理   if (response.isSuccess()) {    logger.info("AliPayServiceImpl.aliPayOrderQuery--->>\n支付宝订单查询成功,\n商务订单号:[{}]", out_trade_no);   } else {    logger.error("AliPayServiceImpl.aliPayOrderQuery--->>\n支付宝订单查询失败,\n商务订单号:[{}]", out_trade_no);    throw new BaseException(QYError.msg("订单号[" + out_trade_no + "],订单支付失败,状态码为[" + response.getTradeStatus() + "]"));   }    return response;  }      @Override  public AlipayClient getAlipayClientByAppCode(String appCode) {   logger.info("AliPayServiceImpl.getAlipayClientByAppCode--->>\n获取支付宝配置信息:[{}]", appCode);   AlipayConfig alipayConfig = null;      try {    alipayConfig = getConfigByAppCode(appCode);    if (alipayConfig == null) {     logger.info("AliPayServiceImpl.getAlipayClientByAppCode--->>\n获取支付宝支付配置信息失败:[{}]", appCode);     logger.info("AliPayServiceImpl.getAlipayClientByAppCode--->>\n获取支付宝支付配置信息失败:[{}{}]", appCode,alipayConfig);     throw new BaseException(QYError.msg("获取支付宝支付配置信息失败!"));    }   } catch (Exception e) {    logger.error("AliPayServiceImpl.getAlipayClientByAppCode--->>\n获取支付宝配置信息失败:[{}]", e);    throw new BaseException(QYError.msg("获取支付宝配置信息失败!"));   }   AlipayClient alipayClient = new DefaultAlipayClient(     PayConstant.ALIPAY_01.getKey(),     alipayConfig.getAliAppid(),     alipayConfig.getAliPrivateKey(),     PayConstant.ALIPAY_FORMAT.getKey(),     PayConstant.ALIPAY_CHARSET.getKey(),     alipayConfig.getAliPublicKey(),     PayConstant.ALIPAY_SIGN_TYPE_RSA2.getKey());   return alipayClient;  }   //获取商家支付宝的配置信息  public AlipayConfig getConfigByAppCode(String appCode) {   AlipayConfig alipayConfig = alipayConfigService.selectByAppCode(appCode);   return alipayConfig;  }      public ReturnMsg aliPayRefund(AliPayRefundParam aliPayRefundParam){   ReturnMsg returnMsg=new ReturnMsg();    String appCode=aliPayRefundParam.getAppCode();   AlipayClient alipayClient = getAlipayClientByAppCode(appCode);    AlipayTradeRefundResponse response = null;   AlipayTradeRefundModel model = new AlipayTradeRefundModel();   //订单支付时传入的商户订单号,不能和 trade_no同时为空。   model.setOutTradeNo(aliPayRefundParam.getOutTradeNo());   //支付宝交易号,和商户订单号不能同时为空   //model.setTradeNo(aliPayRefundParam.getTradeNo());   //标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传。   model.setOutRequestNo(aliPayRefundParam.getOutRequestNo());   //    需要退款的金额,该金额不能大于订单金额,单位为元,支持两位小数   model.setRefundAmount(aliPayRefundParam.getRefundAmount());   //退款的原因说明   model.setRefundReason(aliPayRefundParam.getRefundReason());       AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();   request.setBizModel(model);   //商户外网可以访问的异步地址,不写就是不回调   request.setNotifyUrl(notifyUrl + PayConstant.ALIPAY_05.getKey() + "/" + aliPayRefundParam.getAppCode() + "/" + aliPayRefundParam.getDh());   //支付成功返回地址   request.setReturnUrl(aliPayRefundParam.getRedirectUrl());    // 通过api的方法请求阿里接口获得反馈 alipayClient.pageExecute(request)   try {    logger.info("支付宝退款请求完整报文:{}",JSON.toJSONString(request));    response = alipayClient.execute(request);   } catch (AlipayApiException e) {    logger.info("支付宝退款失败,\n本次下单的订单号:{},\n相关报错信息为:{}", aliPayRefundParam.getDh(), response, e);    throw new BaseException(QYError.msg("调用支付宝预退款失败![" + e.getMessage() + "]"));   }catch (Exception e){    e.printStackTrace();    throw new BaseException(QYError.msg("支付宝预退款失败![" + e.getMessage() + "]"));   }    //打印返回信息   logger.info("支付宝退款失败:{}", JSON.toJSONString(response));   //判断预下单返回状态   if (response.isSuccess()&&"Y".equals(response.getFundChange())) {    logger.info("AliPayServiceImpl.aliScanPay----->\n支付宝退款成功,\n本次下单的订单号:{},商务订单号为,{}", aliPayRefundParam.getDh(), aliPayRefundParam.getOutTradeNo());    return returnMsg.setData("退款成功");    } else {    logger.error("AliPayServiceImpl.aliScanPay----->\n调用支付宝退款接口失败!\n具体信息:\n{}", response.getBody());    throw new BaseException(QYError.msg("调用支付宝退款接口失败![" + response.getBody() + "]"));   }  }  }

4、WxPayService

package com.qcsoft.payment.service;  import com.qcsoft.commonbean.bean.payment.WxMinConfig; import com.qcsoft.commonbean.bean.payment.wx.bean.PreOrderParam; import com.qcsoft.commonbean.bean.payment.wx.bean.WxRefund; import com.qcsoft.commonbean.bean.payment.wx.bean.entpay.EntPayParam; import com.qcsoft.commonbean.bean.payment.wx.bean.entpay.EntPayResult; import com.qcsoft.commonbean.bean.payment.wx.bean.request.WxPayUnifiedOrderRequest; import com.qcsoft.commonbean.bean.payment.wx.bean.result.BaseWxPayResult; import com.qcsoft.commonbean.bean.payment.wx.bean.result.WxPayOrderQueryResult; import com.qcsoft.commonbean.bean.payment.wx.bean.result.WxPayUnifiedOrderResult; import com.qcsoft.commonbean.bean.payment.wx.config.WxPayConfig; import com.qcsoft.commonbean.bean.payment.wx.exception.WxPayException;    public interface WxPayService {    WxPayUnifiedOrderResult wxPrePay(WxPayConfig config, WxPayUnifiedOrderRequest request);     WxPayConfig getWxPayConfigByAppCode(String appCode,String bmCode);   WxPayConfig getWxMinPayConfigByAppCode(String appCode,String sysSoftwareCode);     WxPayUnifiedOrderRequest packRequestParam(PreOrderParam orderParam);      WxPayOrderQueryResult wxPayOrderQuery(String appCode, String bmCode, String dh, Integer type, String sysSoftwareCode);      BaseWxPayResult entPay(EntPayParam params) throws WxPayException; }

WxPayServiceImpl

package com.qcsoft.payment.service.impl;  import com.alibaba.fastjson.JSON; import com.qcsoft.commonbean.bean.payment.PayLog; import com.qcsoft.commonbean.bean.payment.WxConfig; import com.qcsoft.commonbean.bean.payment.WxMinConfig; import com.qcsoft.commonbean.bean.payment.common.PayConstant; import com.qcsoft.commonbean.bean.payment.common.PayNotify; import com.qcsoft.commonbean.bean.payment.wx.bean.PreOrderParam; import com.qcsoft.commonbean.bean.payment.wx.bean.entpay.*; import com.qcsoft.commonbean.bean.payment.wx.bean.request.WxPayOrderQueryRequest; import com.qcsoft.commonbean.bean.payment.wx.bean.request.WxPayUnifiedOrderRequest; import com.qcsoft.commonbean.bean.payment.wx.bean.result.BaseWxPayResult; import com.qcsoft.commonbean.bean.payment.wx.bean.result.WxPayOrderQueryResult; import com.qcsoft.commonbean.bean.payment.wx.bean.result.WxPayUnifiedOrderResult; import com.qcsoft.commonbean.bean.payment.wx.config.WxPayConfig; import com.qcsoft.commonbean.bean.payment.wx.exception.WxPayException; import com.qcsoft.commonbean.bean.payment.wx.handler.EntPayHandler; import com.qcsoft.commonbean.bean.payment.wx.handler.WxPayHandler; import com.qcsoft.commonbean.bean.payment.wx.handler.impl.EntPayHandlerImpl; import com.qcsoft.commonbean.bean.payment.wx.handler.impl.WxPayHandlerApacheHttpImpl; import com.qcsoft.payment.commns.exception.BaseException; import com.qcsoft.payment.commns.exception.QYError; import com.qcsoft.payment.commns.utils.DateUtils; import com.qcsoft.payment.commns.utils.RedisUtil; import com.qcsoft.payment.service.PayLogService; import com.qcsoft.payment.service.WxConfigService; import com.qcsoft.payment.service.WxMinConfigService; import com.qcsoft.payment.service.WxPayService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service;  import java.math.BigDecimal; import java.util.Date;  @Service @Slf4j public class WxPayServiceImpl implements WxPayService {  private static final Logger logger = LoggerFactory.getLogger(WxPayServiceImpl.class);   @Value("${payNotifyUrl}")  private String notifyUrl;  @Autowired  private RedisUtil redisUtil;  @Autowired  private WxConfigService wxConfigService;  @Autowired  private WxMinConfigService wxMinConfigService;  @Autowired  private PayLogService payLogService;     @Override  public WxPayUnifiedOrderResult wxPrePay(WxPayConfig config, WxPayUnifiedOrderRequest request) {   logger.info("WxPayServiceImpl.wxPrePay--->>\n微信预支付,\n商务订单号:[{}]", request.getOutTradeNo());   WxPayHandler wx = new WxPayHandlerApacheHttpImpl();   WxPayUnifiedOrderResult orderResult = null;   wx.setConfig(config);   log.info("WxPayUnifiedOrderResult ={}", config.getNotifyUrl());   try {    orderResult = wx.unifiedOrder(request);   } catch (WxPayException e) {    logger.error("WxPayServiceImpl.wxPrePay--->>\n微信预支付失败,\n商务订单号:[{}]", request.getOutTradeNo(), orderResult);    logger.error("异常信息{}", e.getMessage());    throw new BaseException(QYError.msg("订单号[" + request.getOutTradeNo() + "]预支付失败!"));   }   return orderResult;  }      @Override  public WxPayConfig getWxPayConfigByAppCode(String appCode, String bmCode) {   logger.info("WxPayServiceImpl.getWxPayConfigByAppCode--->>\n获取微信支付配置信息:appCode[{}],bmCode[{}]", appCode, bmCode);   WxConfig config = null;   WxPayConfig wxPayConfig = new WxPayConfig();      try {    //2、mysql    if (config == null) {     if (StringUtils.isNotBlank(bmCode)) {      config = wxConfigService.selectByBmCode(bmCode, appCode);      //如果部门取不到,则去商家的配置      if (config == null)       config = wxConfigService.selectByAppCode(appCode);     } else {      config = wxConfigService.selectByAppCode(appCode);     }    }    if (config == null) {     logger.warn("WxPayServiceImpl.getWxPayConfigByAppCode--->>\n获取微信支付配置信息失败:[{}]", appCode);     throw new BaseException(QYError.msg("获取微信支付配置信息失败!"));    }   } catch (Exception e) {    logger.error("WxPayServiceImpl.getWxPayConfigByAppCode--->>\n获取微信支付配置信息失败:[{}]", e);    throw new BaseException(QYError.msg("获取微信支付配置信息失败!"));   }   //根据appCode查询商家微信配置信息   wxPayConfig.setAppId(config.getAppid());   wxPayConfig.setMchId(config.getMchId());   wxPayConfig.setMchKey(config.getMchKeySecret());   wxPayConfig.setSignType(PayConstant.WXPAY_SIGNTYPE_MD5.getKey());   wxPayConfig.setKeyUrl(config.getCrtPath());   wxPayConfig.setKeyPath(config.getCrtPath());   log.info("获取微信公众号配置为 [{}],转为微信支付实体为 [{}]",config,wxPayConfig);   return wxPayConfig;  }    @Override  public WxPayConfig getWxMinPayConfigByAppCode(String appCode, String sysSoftwareCode) {   logger.error("WxPayServiceImpl.getWxMinPayConfigByAppCode--->>\n获取微信小程序支付配置信息:[{}]", appCode);   if (StringUtils.isBlank(sysSoftwareCode)) {    sysSoftwareCode = "store-service";   }   WxMinConfig config = null;   WxPayConfig wxPayConfig = new WxPayConfig();      try {    if (config == null) {     //config = wxMinConfigService.selectByAppCode(appCode);     config = wxMinConfigService.selectBySysSoftwareCode(appCode,sysSoftwareCode);    }    if (config == null) {     logger.warn("WxPayServiceImpl.getWxMinPayConfigByAppCode--->>\n获取微信小程序支付配置信息失败:[{}]", appCode);     throw new BaseException(QYError.msg("获取微信支付配置信息失败!"));    }   } catch (Exception e) {    logger.error("WxPayServiceImpl.getWxMinPayConfigByAppCode--->>\n获取微信小程序支付配置信息失败:[{}]", e);    throw new BaseException(QYError.msg("获取微信小程序支付配置信息失败!"));   }   //根据appCode查询商家微信配置信息   wxPayConfig.setAppId(config.getAppid());   wxPayConfig.setMchId(config.getMchId());   wxPayConfig.setMchKey(config.getMchKeySecret());   wxPayConfig.setSignType(PayConstant.WXPAY_SIGNTYPE_MD5.getKey());   wxPayConfig.setKeyUrl(config.getCrtPath());   wxPayConfig.setKeyPath(config.getCrtPath());   log.info("获取微信小程序退款配置为 [{}],转为微信支付实体为 [{}]",config,wxPayConfig);   return wxPayConfig;  }     @Override  public WxPayUnifiedOrderRequest packRequestParam(PreOrderParam orderParam) {   Date date = new Date();   BigDecimal paramAmount = new BigDecimal(orderParam.getTotalAmount().toString());   BigDecimal multiplyNum = new BigDecimal("100");   WxPayUnifiedOrderRequest request = WxPayUnifiedOrderRequest.newBuilder()     .body(orderParam.getBody())     .totalFee(paramAmount.multiply(multiplyNum).intValue())     .spbillCreateIp(orderParam.getReqId())     .notifyUrl(notifyUrl + PayConstant.WXPAY_09.getKey())     .tradeType(orderParam.getTradeType())     .outTradeNo(orderParam.getOutTradeNo())     .build();   log.info("WxPayUnifiedOrderRequest = {}", PayConstant.WXPAY_09.getKey());    request.setProductId(orderParam.getDh());   request.setDetail(orderParam.getSubject());   PayNotify payNotify = new PayNotify();   payNotify.setAppCode(orderParam.getAppCode());   payNotify.setCode(orderParam.getBmCode());   payNotify.setDh(orderParam.getDh());   request.setAttach(JSON.toJSONString(payNotify));   if (orderParam.getTradeType().equals(PayConstant.JSAPI.toString())) {    request.setOpenid(orderParam.getOpenId());   }   //开始时间   request.setTimeStart(DateUtils.getLastMinute(date, 0));   //有效期   request.setTimeExpire(orderParam.getTimeExpire());   return request;  }     @Override  public WxPayOrderQueryResult wxPayOrderQuery(String appCode, String bmCode, String dh, Integer type, String sysSoftwareCode) {   logger.info("WxPayServiceImpl.wxPayOrderQuery--->>\n微信订单查询,\n本次查询的商家编码为:[{}],商务订单号:[{}]", appCode, dh);   WxPayHandler handler = new WxPayHandlerApacheHttpImpl();   WxPayOrderQueryRequest request = new WxPayOrderQueryRequest();   WxPayOrderQueryResult queryResult = null;   WxPayConfig config = null;     try {    PayLog payLog = payLogService.selectByDh(dh);    if (payLog==null) {     //商家的微信支付     if (type == null || type == 1) {      bmCode = null;      config = this.getWxPayConfigByAppCode(appCode, bmCode);      //部门的微信支付支付     } else if (type == 2) {      config = this.getWxPayConfigByAppCode(appCode, bmCode);      //商家小程序支付     } else if (type == 3) {      config = this.getWxMinPayConfigByAppCode(appCode,sysSoftwareCode);     }    }else{     config = JSON.parseObject(payLog.getPayConfigJsonStr(), WxPayConfig.class);    }    request.setOutTradeNo(dh);    handler.setConfig(config);    queryResult = handler.queryOrder(request);    logger.info("WxPayServiceImpl.wxPayOrderQuery--->>\n微信订单查询成功,\n返回包信息:[{}]", JSON.toJSONString(queryResult));   } catch (WxPayException e) {    logger.error("WxPayServiceImpl.wxPayOrderQuery--->>\n微信订单查询失败,\n商务订单号:[{}]", dh);    throw new BaseException(QYError.msg("微信订单查询失败,商务订单号:[{}]" + dh + ""));   }   return queryResult;  }    @Override  public BaseWxPayResult entPay(EntPayParam params) throws WxPayException {   WxPayHandler wxPayHandler = new WxPayHandlerApacheHttpImpl();   WxPayConfig config = null;   EntPayResult result = null;   EntPayBankResult bankResult = null;   if (params.getTradeType() != null && params.getTradeType() == 3) {    config = this.getWxMinPayConfigByAppCode(params.getAppCode(),params.getSysSoftwareCode());   } else {    config = this.getWxPayConfigByAppCode(params.getAppCode(), params.getBmCode());   }   config.setUseKey(true);   wxPayHandler.setConfig(config);   if (params.getTradeType()==1) {    EntPayRequest request = packEntPayRequest(params,config);    EntPayHandler entPayHandler = new EntPayHandlerImpl(wxPayHandler);     result = entPayHandler.entPay(request);    return result;   }else{    EntPayBankRequest request = packEntPayBankRequest(params);    EntPayHandler entPayHandler = new EntPayHandlerImpl(wxPayHandler);    bankResult = entPayHandler.payBank(request);    return bankResult;   }  }    public EntPayRequest packEntPayRequest(EntPayParam params,WxPayConfig config) {   EntPayRequest request = new EntPayRequest();   request.setAmount(params.getAmount().multiply(new BigDecimal("10")).intValue());   request.setCheckName("NO_CHECK");   request.setOpenid(params.getOpenid());   request.setSpbillCreateIp(params.getSpbillCreateIp());   request.setPartnerTradeNo(params.getPartnerTradeNo());   request.setMchAppid(config.getAppId());   request.setMchId(config.getMchId());   request.setDescription(params.getDesc());   return request;  }      public EntPayBankRequest packEntPayBankRequest(EntPayParam params) {   EntPayBankRequest request = new EntPayBankRequest();   request.setAmount(params.getAmount().multiply(new BigDecimal("10")).intValue());   request.setBankCode(params.getBankCode());   request.setEncTrueName(params.getEncTrueName());   request.setPartnerTradeNo(params.getPartnerTradeNo());   request.setDescription(params.getDesc());   return request;  } }

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

@Autowired private WxConfigService wxConfigService; @Autowired private WxMinConfigService wxMinConfigService; @Autowired private PayLogService payLogService; @Autowired private AlipayConfigService alipayConfigService;

到此,关于“怎么用Java也实现微信和支付宝支付功能”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 怎么用Java也实现微信和支付宝支付功能

本文链接: https://www.lsjlt.com/news/83344.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么用Java也实现微信和支付宝支付功能
    这篇文章主要介绍“怎么用Java也实现微信和支付宝支付功能”,在日常操作中,相信很多人在怎么用Java也实现微信和支付宝支付功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2022-10-19
  • vue项目中的支付功能实现(微信支付和支付宝支付)
    目录项目中常见的支付方式    支付宝支付微信支付项目中常见的支付方式     支付宝支付  &nbs...
    99+
    2022-11-12
  • 如何进行vue项目中的支付功能实现(微信支付和支付宝支付)
    如何进行vue项目中的支付功能实现(微信支付和支付宝支付),针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。项目中常见的支付方式    支付宝支付...
    99+
    2023-06-22
  • 怎么用PHP实现支付宝和微信扫码在线支付的功能
    本篇内容介绍了“怎么用PHP实现支付宝和微信扫码在线支付的功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成...
    99+
    2022-10-18
  • UniApp + SpringBoot 实现支付宝支付和退款功能
    目录开发准备支付宝支付开发后端部分前端部分支付宝退款开发后端部分上篇介绍了UniApp + SpringBoot 实现微信支付和退款功能,喜欢的朋友可以点击查看。 开发准备 一台用于...
    99+
    2022-11-13
  • Android中怎么接入支付宝实现支付功能
    本篇文章为大家展示了Android中怎么接入支付宝实现支付功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.登录官网他的官网就是蚂蚁金服的开放平台了,我们可以访问 蚂蚁金服开放平台 ,并且注册账...
    99+
    2023-05-31
    android
  • 怎么用php实现支付宝支付
    本文操作环境:Windows7系统、PHP7.4版、DELL G3电脑怎么用php实现支付宝支付?PHP实现支付宝支付:提示:这里的demo使用的时沙箱支付 需要先注册沙箱账号等注册沙箱账号:首先扫码登录支付宝开放平台注册 地址:https...
    99+
    2021-05-21
    PHP 支付宝支付
  • php实现微信支付功能
    一、生成预支付订单并获取预支付ID(prepay_id): ...
    99+
    2023-09-11
    php
  • Android中怎么实现微信支付功能
    Android中怎么实现微信支付功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 去微信开放平台申请微信支付服务,绑定自己的应用这里具体不多讲,但是一定要申请完成,将会得到是...
    99+
    2023-05-31
    android
  • java对接支付宝支付项目怎么实现
    本篇内容主要讲解“java对接支付宝支付项目怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java对接支付宝支付项目怎么实现”吧!java对接支付宝支付演示现在有不少的项目都需要对接支付...
    99+
    2023-07-02
  • 快手快币h5支付实现:支付宝微信双端h5调用-易支付插件
          最近由于工作涉及到了一个小项目,需要研究到快手,斗音等段视频支付接口api,经过研究和测试终于实现了完美调用,既然实现了完美调用,索性一次性做出了成品,以彩虹易支付为框架,做出了快手快币的支付宝与威信双h5调用,自动回调,支付宝...
    99+
    2023-09-10
    php
  • 微信小程序支付功能怎么实现
    实现微信小程序支付功能,需要以下步骤:1. 首先,在微信公众平台申请开通支付功能,并获取到支付相关的配置信息,包括 appID、商户...
    99+
    2023-08-16
    微信小程序
  • PHP实现 APP端微信支付功能
    一丶 PHP后台生成预支付交易单,返回正确的预支付交易回话标识后 调起支付,根据文档拼接微信需要的参数,这里将需要的几个方法进行示例; 传输给微信的参数要组装成xml格式发送,传如参数数组! publ...
    99+
    2023-10-18
    php 微信 android
  • UniApp + SpringBoot 实现微信支付和退款功能
    目录开发准备微信支付开发后端部分前端部分开发准备 一台用于支付的测试机,必须得是一个安卓机因为需要打支付基座才能使用。用于编写的后端框架接口的 IDE (IDEA 或者 Eclips...
    99+
    2022-11-13
  • 利用golang怎么实现一个微信支付功能
    本文章向大家介绍利用golang怎么实现一个微信支付功能的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。golang的优点有哪些golang是一种编译语言,可以将代码编译为机器代码,编译后的二进制文件可以直接部署...
    99+
    2023-06-06
  • 小程序发起微信支付功能怎么实现
    这篇文章主要讲解了“小程序发起微信支付功能怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“小程序发起微信支付功能怎么实现”吧!wx.requestPayment(OBJECT)发起微信...
    99+
    2023-06-26
  • 使用java如何实现一个微信H5支付功能
    这篇文章将为大家详细讲解有关使用java如何实现一个微信H5支付功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。前面做了app微信支付的回调处理,现在需要做微信公众号的支付,花了一天多时间...
    99+
    2023-05-31
    h5支付 java
  • ASP.Net项目中实现微信APP支付功能
    最近挺忙的,没时间写东西。然后在弄微信APP支付,网上的搜索一趟,都比较凌乱,我也遇到一些坑,不过也算弄好了,记录分享一下。 1、准备各种调用接口需要的参数,配置app.config...
    99+
    2022-11-13
  • 微信小程序支付功能如何实现
    这篇文章主要介绍了微信小程序支付功能如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇微信小程序支付功能如何实现文章都会有所收获,下面我们一起来看看吧。微信小程序支付功能开发文档如下:小程序端,保留大部分的...
    99+
    2023-06-26
  • Vue怎么实现支付功能
    这篇“Vue怎么实现支付功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue怎么实现支付功能”文章吧。 代码如...
    99+
    2023-07-04
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作