申请好支付宝商户号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;
三、依赖引入
- "1.0" encoding="UTF-8"?>
-
"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">
-
-
-
org.springframework.boot -
spring-boot-starter-parent -
2.1.3.RELEASE -
-- lookup parent from repository --> -
-
-
4.0.0 -
com.pay -
qc-payment -
2.3 - <name>qc-paymentname>
- -- FIXME change it to the project's website -->
-
http://www.example.com -
-
-
UTF-8 -
1.7 -
1.7 -
Greenwich.SR1 -
-
-
-
-
org.springframework.boot -
spring-boot-starter-data-redis -
-
-
org.springframework.boot -
spring-boot-starter-web -
-
-
org.springframework.cloud -
spring-cloud-starter-netflix-eureka-client -
-
-
org.springframework.cloud -
spring-cloud-starter-netflix-zuul -
-
-
- --z支付宝-->
-
-
com.alipay.sdk -
alipay-sdk-java -
3.3.4.ALL -
-
-
-
-
org.springframework.boot -
spring-boot-starter-test -
test -
-
- --导入重试机制的坐标-->
-
-
org.springframework.retry -
spring-retry -
-
- --引入Hystrix依赖-->
-
-
org.springframework.cloud -
spring-cloud-starter-netflix-hystrix -
-
- --导入jwt相关依赖-->
-
-
com.auth0 -
java-jwt -
3.4.1 -
-
- -- StringUtil 类-->
-
-
org.apache.commons -
commons-lang3 -
3.3.2 -
-
- -- ali 连接池 -->
-
-
com.alibaba -
druid -
1.1.12 -
-
- -- mybatis -->
-
-
org.mybatis.spring.boot -
mybatis-spring-boot-starter -
2.0.0 -
-
- -- mysql -->
-
-
mysql -
mysql-connector-java -
-
-
javax.persistence -
persistence-api -
1.0.2 -
- -- https://mvnrepository.com/artifact/tk.mybatis/mapper -->
-
-
tk.mybatis -
mapper -
4.0.3 -
-
- -- import lombok 可以省去getter setter toString等方法 -->
-
-
org.projectlombok -
lombok -
provided -
-
- -- commons-io -->
-
-
commons-io -
commons-io -
2.4 -
-
- -- 引入easyqinyu-tools项目 -->
-
-
com.pay -
easyqinyu-tools -
0.0.1-SNAPSHOT -
-
- -- pagehelper分页插件 -->
-
-
com.github.pagehelper -
pagehelper -
5.1.2 -
-
-
-
com.github.pagehelper -
pagehelper-spring-boot-autoconfigure -
1.2.3 -
-
-
com.github.pagehelper -
pagehelper-spring-boot-starter -
1.2.3 -
-
-
com.qcsoft -
qc-swagger-ui -
0.0.1-SNAPSHOT -
compile -
-
-
com.google.zxing -
core -
3.3.0 -
-
-
-
com.alibaba -
fastjson -
RELEASE -
compile -
-
-
-
org.apache.httpcomponents -
httpclient -
${httpclient.version} -
-
-
-
-
com.google.code.gson -
gson -
2.8.2 -
-
-
- --阿里云信息发送-->
-
-
com.aliyun -
aliyun-java-sdk-core -
3.3.1 -
-
-
com.github.1991wangliang -
aliyun-java-sdk-dysmsapi -
1.0.0 -
-
-
-
org.springframework.kafka -
spring-kafka -
-
- -- xml解析-->
-
-
com.thoughtworks.xstream -
xstream -
1.4.10 -
-
- -- dom4j -->
-
-
org.dom4j -
dom4j -
2.1.1 -
-
-
-
com.github.binarywang -
weixin-java-common -
3.3.4.B -
-
-
-
-
org.jodd -
jodd-http -
compile -
-
-
-
org.apache.commons -
commons-lang3 -
-
-
- -- xml解析-->
-
-
commons-beanutils -
commons-beanutils -
1.9.3 -
-
-
-
jdom -
jdom -
1.0 -
-
-
-
-
org.bouncycastle -
bcpkix-jdk15on -
1.59 -
-
-
org.jodd -
jodd-http -
3.7.1 -
- --二维码工具-->
-
-
com.google.zxing -
core -
3.2.1 -
-
-
-
com.qcsoft -
qc-commonbean -
0.0.1-SNAPSHOT -
-
-
-
org.springframework.cloud -
spring-cloud-starter-openfeign -
- -- xxl-job-core -->
-
-
com.xuxueli -
xxl-job-core -
2.0.1 -
- --线路跟踪-->
-
-
org.springframework.cloud -
spring-cloud-starter-netflix-hystrix-dashboard -
-
-
-
org.springframework.boot -
spring-boot-starter-actuator -
-
-
-
-
-
-
-
org.springframework.cloud -
spring-cloud-dependencies -
${spring-cloud.version} -
pom -
import -
-
-
-
-
qc-payment -
-
-
org.springframework.boot -
spring-boot-maven-plugin -
-
-
org.apache.maven.plugins -
maven-compiler-plugin -
-
-
8 -
-
-
-
-
四、程序实现
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
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
paypackageParams = new TreeMap(); - 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
params = new HashMap(); - // 签名验证(对支付宝返回的数据验证,确定是支付宝返回的)
- boolean result = false;
- try {
- // 从支付宝回调的request域中取值
- Map
requestParams = request.getParameterMap(); - for (Iterator
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
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;