자바 위 챗 과 알 리 페 이 결제 기능 실현

전기 준비
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;
 ```
자바 가 위 챗 과 알 리 페 이 결제 기능 을 실현 하 는 것 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 위 챗 과 알 리 페 이 결제 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기