1、实现申请好微信商户号appid,微信拿到商户id和商户秘钥,和支退款的付宝附代话需要商户证书 2、申请好支付宝商户号appid,支付商户公钥和秘钥(需要用支付宝工具自己生成),没想码支付宝退款不需要证书 AliPayServiceImpl WxPayServiceImpl一、没想码前期准备
二、实现数据库表设计
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 projects 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; /** * @Description: 支付控制中心 * @Author: * @Date: */ @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(); /** * 统一预支付接口(统一下单) * * @param orderParam { dh:订单号,payType:支付方式(WXPAY、ALIPAY、MEMBER_CARD、ACCOUNT),appCode:商家编码, * tradeType:支付方式类型(NATIVE、JSAPI、APP、MWEB),openId:支付方式为JSAPI必传,reqId:请求的真实IP地址 * ,redirectUrl:支付成功返回地址,appCode:商家编码,outTradeNo:商务订单号,timeExpire,订单到期时间 * ,totalAmount:订单金额,body:商品简单描述,香港云服务器subject:订单标题,quitUrl:中途退出} * @param token token * @return (微信公众号 / 小程序返回一串json字符串 : { appId :, timeStamp :, nonceStr : , info_package :, paySign :, signType : }, 前端使用微信sdk调用微信支付) * (微信扫码支付返回一个连接,前端需要把连接生成一个二维码使用,连接如:weixin://123.123.com/***) * (微信H5--返回一个连接,前端需要把连接生成一个连接前端直接跳转该连接使用,使用如:location.href=weixin://123.123.com/***) * (支付宝扫码支付--返回一个连接,前端直接跳转到该连接使用,使用如:location.href=weixin://123.123.com/***) * (支付宝扫码H5--返回一个页面form表单,前端需要把这个form表单渲染到h5页面上,使用如:$("#view).html(alipayForm)) * (支付宝app支付--返回一个参数包,如sdk-version=**&service=**&&service=**&&body=**&&out_trade_no=**&,前端使用支付宝sdk调用app支付) * { * wxNativeUrl:微信扫码地址 * wxAppPackage:app支付sdk参数包 * wxJsapiPackage:公众号支付包 * wxH5Url:h5支付url * wxScanUrl:wxScanUrl * alipayScanUrl:支付宝扫码支付url * alipayH5Form:支付宝h5支付表单 * alipayAppParamStr:支付宝app支付参数支付串 * } * @throws WxPayException */ @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()); } /** * 生成支付二维码 * * @param url 二维码地址 * @throws IOException */ @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 { /** * * @param alipayClient * @param orderParam * @param * @return */ 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); /** * 支付宝退款接口 * @param aliPayRefundParam * @return */ ReturnMsg aliPayRefund(AliPayRefundParam aliPayRefundParam); } 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; /** * 微信预支付 * @param appId 应用ID(微信公众号) * @param mchId 商务号ID * @param mchKey 商务号密钥 * @param notifyUrl 异步通知地址 * @param signType 签名类型 * @param body 描述 * @param totalFee 金额 * @param spbillCreateIp app和h5支付需要用户的真实请求地址 * @param tradeType * @param outTradeNo * @return */ public interface WxPayService { /** * * @param config { appId:应用ID,mchId:商务号ID,mchKey:商务号密钥,notifyUrl:异步通知地址,signType:签名类型} * @param request { body:订单描述,totalFee:金额, * spbillCreateIp:app和h5支付需要用户的真实请求地址Native支付填调用微信支付API的机器IP, * tradeType:SAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付,统一下单接口trade_type的传参可参考这里, * outTradeNo:商户订单号,productId:商品Id(扫码支付必传,其他选填),openid:公众号openId} * @return */ WxPayUnifiedOrderResult wxPrePay(WxPayConfig config, WxPayUnifiedOrderRequest request); /** * 根据appCode获取商家微信支付配置 * @param appCode * @return */ WxPayConfig getWxPayConfigByAppCode(String appCode,String bmCode); WxPayConfig getWxMinPayConfigByAppCode(String appCode,String sysSoftwareCode); /** * 封装预下单参数实体 * @param orderParam 预支付接口参数实体 * @param order 点单 * @return */ WxPayUnifiedOrderRequest packRequestParam(PreOrderParam orderParam); /** * 查询订单 * @param appCode 商家编码 * @param dh 订单号 * @param sysSoftwareCode */ WxPayOrderQueryResult wxPayOrderQuery(String appCode, String bmCode, String dh, Integer type, String sysSoftwareCode); /** * 企业支付 * @param params * @return: * @Author: * @date: */ BaseWxPayResult entPay(EntPayParam params) throws WxPayException; } 5、这些类是和数据库交互的增删查该类
@Autowired private WxConfigService wxConfigService; @Autowired private WxMinConfigService wxMinConfigService; @Autowired private PayLogService payLogService; @Autowired private AlipayConfigService alipayConfigService;