자바 위 챗 과 알 리 페 이 결제 기능 실현
68472 단어 Java위 챗 페 이 먼 트알 리 페 이
1.위 챗 상점 번호 appid 를 신청 하고 상점 id 와 상점 비밀 키 를 받 습 니 다.환불 하려 면 상점 증서 가 필요 합 니 다.
2.알 리 페 이 상점 번호 appid,상점 공개 키 와 비밀 키(알 리 페 이 도구 로 직접 생 성 해 야 함)를 신청 하고 알 리 페 이 환불 은 인증서 가 필요 하지 않 습 니 다.
2.데이터베이스 시트 디자인
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;
3.도입 에 의존
<?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>
4.절차 실현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----
...., >>>>{}", 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---->>>>
....., [{}]", 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);
}
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;
/**
* APP
*
*/
@Override
public String aliAppPay(AlipayClient alipayClient, PreOrderParam orderParam) {
logger.info("AliPayServiceImpl.aliAppPay--->>>
,
:APP ,
:{}", 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----->
:{}", JSON.toJSONString(request));
try {
response = alipayClient.sdkExecute(request);
} catch (AlipayApiException e) {
logger.info("AliPayServiceImpl.aliAppPay----->
,
:{},
:{}", orderParam.getDh(), response, e);
throw new BaseException(QYError.msg(" ![" + e.getMessage() + "]"));
}
logger.info("AliPayServiceImpl.aliAppPay----->
:{}", JSON.toJSONString(response));
if (response.isSuccess()) {
logger.info("AliPayServiceImpl.aliAppPay----->
,
:{}, :{}", orderParam.getDh(), orderParam.getOutTradeNo());
} else {
logger.error("AliPayServiceImpl.aliAppPay----->
!
:
{}", response.getBody());
throw new BaseException(QYError.msg(" ![" + response.getMsg() + "]"));
}
return response.getBody();
}
/**
*
*
*/
@Override
public String aliScanPay(AlipayClient alipayClient, PreOrderParam orderParam) {
logger.info("AliPayServiceImpl.aliScanPay--->>>
,
: ,
:{}", orderParam.getDh());
/* AlipayTradePagePayResponse response = null;*/
AlipayTradePrecreateResponse response = null;
Date date = new Date();
/**
* model (body、subject、outTradeNo、totalAmount、timeoutExpress; )
*/
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----->
,
:{},
:{}", 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----->
:{}", JSON.toJSONString(response));
//
if (response.isSuccess()) {
logger.info("AliPayServiceImpl.aliScanPay----->
,
:{}, ", orderParam.getDh(), orderParam.getOutTradeNo());
} else {
logger.error("AliPayServiceImpl.aliScanPay----->
!
:
{}", response.getBody());
throw new BaseException(QYError.msg(" ![" + response.getMsg() + "]"));
}
return response.getQrCode();
}
/**
* H5
*
*/
@Override
public String aliH5Pay(AlipayClient alipayClient, PreOrderParam orderParam) {
logger.info("AliPayServiceImpl.aliH5Pay--->>>
,
:H5 ,
:{}", 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()));
/**
* H5 , ,
*/
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----->>>>
:{}", JSON.toJSONString(response));
} else {
logger.info("AliPayServiceImpl.aliH5Pay----->>>>
:{}", JSON.toJSONString(response));
throw new BaseException(QYError.msg(" "));
}
} catch (AlipayApiException e) {
logger.info("AliPayServiceImpl.aliH5Pay----->>>>
:{}", JSON.toJSONString(response));
throw new BaseException(QYError.msg(" ![" + e.getMessage() + "]"));
}
logger.info("AliPayServiceImpl.aliH5Pay----->>>>
:{}", JSON.toJSONString(response));
/**
* ,
*/
return form;
}
/**
*
*
* @param params
*/
@Override
public void aliPayNotify(PayNotify params) {
logger.info("AliPayServiceImpl.appAliPayNotify-
-------》》》");
/**
*
*/
//
/*ReturnMsg returnMsg = restTemplate.postForEntity(params.getNoOrderAmountUrl(), params, ReturnMsg.class).getBody();
if (!returnMsg.isSuccess()) {
logger.info("WxPayController.wxPayNotify-->
, :{}", params);
throw new BaseException(QYError.msg(" ! [" + params.getOutTradeNo() + "]"));
}*/
/**
*
*/
if (params.getTradeStatus().equals("TRADE_SUCCESS")) {
logger.info("AliPayServiceImpl.appAliPayNotify----
! [{}]----->>", params.getOutTradeNo(), JSON.toJSONString(params));
} else {
logger.error("AliPayServiceImpl.appAliPayNotify---
! [{}]---->>", 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--
----->>>>>>>>>>>>>>>{}", 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---
! [{}]---->>", JSON.toJSONString(request), e);
throw new BaseException(QYError.msg(" !"));
}
return result;
}
/**
*
*
* @param alipayClient
* @param out_trade_no
* @return
*/
@Override
public AlipayTradeQueryResponse aliPayOrderQuery(AlipayClient alipayClient, String out_trade_no) {
logger.info("AliPayServiceImpl.aliPayOrderQuery----
,
:[{}]----》》》", 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--->>
,
:[{}]", out_trade_no);
throw new BaseException(QYError.msg(" [" + out_trade_no + "], , [" + response.getTradeStatus() + "]"));
}
logger.info("AliPayServiceImpl.aliPayOrderQuery---->>
,
:[{}],
:{}", out_trade_no, JSON.toJSONString(response));
//
if (response.isSuccess()) {
logger.info("AliPayServiceImpl.aliPayOrderQuery--->>
,
:[{}]", out_trade_no);
} else {
logger.error("AliPayServiceImpl.aliPayOrderQuery--->>
,
:[{}]", out_trade_no);
throw new BaseException(QYError.msg(" [" + out_trade_no + "], , [" + response.getTradeStatus() + "]"));
}
return response;
}
/**
* alipay
*
* @param appCode
* @return
*/
@Override
public AlipayClient getAlipayClientByAppCode(String appCode) {
logger.info("AliPayServiceImpl.getAlipayClientByAppCode--->>
:[{}]", appCode);
AlipayConfig alipayConfig = null;
/**
* ( :1-redis,2-mysql,3- )
*/
try {
alipayConfig = getConfigByAppCode(appCode);
if (alipayConfig == null) {
logger.info("AliPayServiceImpl.getAlipayClientByAppCode--->>
:[{}]", appCode);
logger.info("AliPayServiceImpl.getAlipayClientByAppCode--->>
:[{}{}]", appCode,alipayConfig);
throw new BaseException(QYError.msg(" !"));
}
} catch (Exception e) {
logger.error("AliPayServiceImpl.getAlipayClientByAppCode--->>
:[{}]", 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;
}
/**
*
* @param aliPayRefundParam
* @return
*/
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(" ,
:{},
:{}", 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----->
,
:{}, ,{}", aliPayRefundParam.getDh(), aliPayRefundParam.getOutTradeNo());
return returnMsg.setData(" ");
} else {
logger.error("AliPayServiceImpl.aliScanPay----->
!
:
{}", 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;
/**
*
* @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;
}
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;
/**
* @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
* @throws WxPayException
*/
@Override
public WxPayUnifiedOrderResult wxPrePay(WxPayConfig config, WxPayUnifiedOrderRequest request) {
logger.info("WxPayServiceImpl.wxPrePay--->>
,
:[{}]", 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--->>
,
:[{}]", request.getOutTradeNo(), orderResult);
logger.error(" {}", e.getMessage());
throw new BaseException(QYError.msg(" [" + request.getOutTradeNo() + "] !"));
}
return orderResult;
}
/**
*
*
* @param appCode
* @return
*/
@Override
public WxPayConfig getWxPayConfigByAppCode(String appCode, String bmCode) {
logger.info("WxPayServiceImpl.getWxPayConfigByAppCode--->>
:appCode[{}],bmCode[{}]", appCode, bmCode);
WxConfig config = null;
WxPayConfig wxPayConfig = new WxPayConfig();
/**
* ( :1-redis,2-mysql,3- )
*/
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--->>
:[{}]", appCode);
throw new BaseException(QYError.msg(" !"));
}
} catch (Exception e) {
logger.error("WxPayServiceImpl.getWxPayConfigByAppCode--->>
:[{}]", 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--->>
:[{}]", appCode);
if (StringUtils.isBlank(sysSoftwareCode)) {
sysSoftwareCode = "store-service";
}
WxMinConfig config = null;
WxPayConfig wxPayConfig = new WxPayConfig();
/**
* ( :1-redis,2-mysql,3- )
*/
try {
if (config == null) {
//config = wxMinConfigService.selectByAppCode(appCode);
config = wxMinConfigService.selectBySysSoftwareCode(appCode,sysSoftwareCode);
}
if (config == null) {
logger.warn("WxPayServiceImpl.getWxMinPayConfigByAppCode--->>
:[{}]", appCode);
throw new BaseException(QYError.msg(" !"));
}
} catch (Exception e) {
logger.error("WxPayServiceImpl.getWxMinPayConfigByAppCode--->>
:[{}]", 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;
}
/**
*
*
* @param orderParam
* @param order
* @return
*/
@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;
}
/**
*
*
* @param appCode
* @param dh
* @param sysSoftwareCode
* @return
*/
@Override
public WxPayOrderQueryResult wxPayOrderQuery(String appCode, String bmCode, String dh, Integer type, String sysSoftwareCode) {
logger.info("WxPayServiceImpl.wxPayOrderQuery--->>
,
:[{}], :[{}]", 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--->>
,
:[{}]", JSON.toJSONString(queryResult));
} catch (WxPayException e) {
logger.error("WxPayServiceImpl.wxPayOrderQuery--->>
,
:[{}]", dh);
throw new BaseException(QYError.msg(" , :[{}]" + dh + ""));
}
return queryResult;
}
/**
*
* @param params
* @return: com.qcsoft.commonbean.bean.payment.wx.bean.result.BaseWxPayResult
* @Author:
* @date:
*/
@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;
}
}
/**
*
* @param params
* @return: com.qcsoft.commonbean.bean.payment.wx.bean.entpay.EntPayRequest
* @Author:
* @date:
*/
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;
}
/**
*
* @param params
* @return: com.qcsoft.commonbean.bean.payment.wx.bean.entpay.EntPayBankRequest
* @Author:
* @date:
*/
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;
```
자바 가 위 챗 과 알 리 페 이 결제 기능 을 실현 하 는 것 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 위 챗 과 알 리 페 이 결제 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.