Pārlūkot izejas kodu

添加支付接口

M墨鱼—_mo 5 gadi atpakaļ
vecāks
revīzija
37c74ad4e0

+ 18 - 0
pom.xml

@@ -163,6 +163,24 @@
 			<version>1.1.10</version>
 		</dependency>
 		<!-- 数据库相关 end-->
+
+		<!--支付相关 start-->
+		<dependency>
+			<groupId>com.github.javen205</groupId>
+			<artifactId>IJPay-All</artifactId>
+			<version>2.3.2</version>
+		</dependency>
+		<dependency>
+			<groupId>com.jfinal</groupId>
+			<artifactId>jfinal</artifactId>
+			<version>3.5</version>
+		</dependency>
+		<dependency>
+			<groupId>com.alipay.sdk</groupId>
+			<artifactId>alipay-sdk-java</artifactId>
+			<version>3.3.4.ALL</version>
+		</dependency>
+		<!--支付相关 end-->
 	</dependencies>
 	<build>
 		<plugins>

+ 12 - 6
src/main/java/com/jpsoft/epay/config/WebMvcConfig.java

@@ -44,11 +44,17 @@ public class WebMvcConfig implements WebMvcConfigurer {
 	public void addInterceptors(InterceptorRegistry registry) {
 		registry.addInterceptor(loginInterceptor)
 				.addPathPatterns("/**")
-				.excludePathPatterns("/login",
-						"/swagger-resources/**",
-						"/webjars/**",
-						"/swagger-ui.html",
-						"/v2/**",
-						"/mobileApi/**");
+                .excludePathPatterns("/login",
+                        "/swagger-resources/**",
+                        "/webjars/**",
+                        "/swagger-ui.html",
+                        "/v2/**",
+                        "/mobileApi/**")
+				.excludePathPatterns("/wxPay/webPay")
+				.excludePathPatterns("/aliPay/tradePrecreatePay")
+				.excludePathPatterns("/aliPay/payNotify")
+				.excludePathPatterns("/wxPay/payNotify");
+
+
 	}
 }

+ 183 - 0
src/main/java/com/jpsoft/epay/modules/pay/alipay/AlipayController.java

@@ -0,0 +1,183 @@
+package com.jpsoft.epay.modules.pay.alipay;
+
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.alipay.api.AlipayApiException;
+import com.alipay.api.AlipayClient;
+import com.alipay.api.DefaultAlipayClient;
+import com.alipay.api.internal.util.AlipaySignature;
+import com.alipay.api.request.AlipayTradePrecreateRequest;
+import com.alipay.api.response.AlipayTradePrecreateResponse;
+import com.ijpay.alipay.AliPayApi;
+import com.jpsoft.epay.modules.base.entity.RechargeRecord;
+import com.jpsoft.epay.modules.base.service.RechargeRecordService;
+import com.jpsoft.epay.modules.business.controller.DemoController;
+import com.jpsoft.epay.modules.business.service.RechargeService;
+import com.jpsoft.epay.modules.common.dto.MessageResult;
+import com.jpsoft.epay.modules.communication.server.protocol.MeterReceivePacket;
+import com.jpsoft.epay.modules.pay.properties.AliPayProperties;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.print.DocFlavor;
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author 墨鱼_mo
+ * @date 2019-11-26 9:48
+ */
+
+@Slf4j
+@RequestMapping("/aliPay")
+@RestController
+public class AlipayController {
+
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+
+    @Autowired
+    private AliPayProperties aliPayProperties;
+
+    @Autowired
+    private RechargeRecordService rechargeRecordService;
+
+    @Autowired
+    private RechargeService rechargeService;
+
+
+    @ApiOperation(value = "支付宝扫码支付")
+    @GetMapping("/tradePrecreatePay")
+    public MessageResult tradePrecreatePay(@RequestParam("rechargeRecordId") String rechargeRecordId) {
+
+        MessageResult result = new MessageResult();
+        try {
+
+
+            AlipayClient alipayClient = new DefaultAlipayClient(aliPayProperties.getServiceUrl(), aliPayProperties.getAppId(), aliPayProperties.getPrivateKey(), "json", aliPayProperties.getInputCharset(), aliPayProperties.getZfbPublicKey(), aliPayProperties.getSignType());
+            AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
+            request.setNotifyUrl(aliPayProperties.getNotifyUrl());
+
+            RechargeRecord rechargeRecord = rechargeRecordService.get(rechargeRecordId);
+
+            if (rechargeRecord == null) {
+                throw new Exception("订单不存在");
+            }
+            if (rechargeRecord.getBuyAmount().compareTo(BigDecimal.ZERO) != 1) {
+                throw new Exception("金额有误");
+            }
+            if (rechargeRecord.getPaymentStatus().equals("20")) {
+                throw new Exception("订单已支付");
+            }
+
+
+            Map<String, Object> maps = new HashMap<>();
+            maps.put("out_trade_no", rechargeRecord.getSerialNumber());
+            maps.put("total_amount", String.valueOf(rechargeRecord.getBuyAmount()));
+            maps.put("subject", rechargeRecord.getProductTheme());
+            maps.put("timeout_express", "5m");
+
+           /* JSONObject extendParams = new JSONObject();
+
+            extendParams.put("sys_service_provider_id", aliPayProperties.getMchId());
+            maps.put("extend_params", extendParams);
+            request.putOtherTextParam("app_auth_token", aliPayProperties.getAppAuthToken());*/
+            //把订单信息转换为json对象的字符串
+
+            String postdata = JSONObject.toJSONString(maps);
+            request.setBizContent(postdata);
+            AlipayTradePrecreateResponse response = alipayClient.execute(request);
+            String body = response.getBody();
+            JSONObject jsonObject = JSONObject.parseObject(body);
+            String alipayTradePrecreateResponse = jsonObject.getString("alipay_trade_precreate_response");
+            JSONObject jsonResponse = JSONObject.parseObject(alipayTradePrecreateResponse);
+            if (!jsonResponse.getString("code").equals("10000")) {
+                throw new Exception(jsonResponse.getString("sub_msg"));
+            }
+            String qr_code = jsonObject.getJSONObject("alipay_trade_precreate_response").getString("qr_code");
+            result.setResult(true);
+            result.setData(qr_code);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            logger.error(e.getMessage(), e);
+            result.setResult(false);
+            result.setMessage(e.getMessage());
+        }
+        return result;
+
+    }
+
+    @RequestMapping("/payNotify")
+    @ResponseBody
+    public String notifyUrl(HttpServletRequest request) {
+        try {
+            // 获取支付宝POST过来反馈信息
+            Map<String, String> params = AliPayApi.toMap(request);
+
+            for (Map.Entry<String, String> entry : params.entrySet()) {
+                System.out.println(entry.getKey() + " = " + entry.getValue());
+            }
+
+            boolean verifyResult = AlipaySignature.rsaCheckV1(params, aliPayProperties.getZfbPublicKey(), "UTF-8", "RSA2");
+
+            if (verifyResult) {
+
+                RechargeRecord rechargeRecord = rechargeRecordService.getBySerialNum(params.get("out_trade_no"));
+                if (rechargeRecord == null) {
+                    throw new Exception("支付已完成,但未找到此订单号的流水");
+                }
+                if (!rechargeRecord.getBuyAmount().toString().equals(params.get("buyer_pay_amount"))) {
+                    throw new Exception("支付金额与系统金额不一致");
+                }
+                rechargeRecord.setUpdateTime(new Date());
+                rechargeRecord.setUpdateBy(params.get("buyer_logon_id"));
+                rechargeRecord.setBuyType("alipay");
+                rechargeRecord.setPaymentStatus("20");
+                rechargeRecord.setTransactionNumber(params.get("trade_no"));
+                rechargeRecord.setPaymentTime(DateUtil.parse(params.get("gmt_payment")));
+
+                try {
+                    MeterReceivePacket mp = rechargeService.recharge(rechargeRecord.getRoomId(), rechargeRecord.getBuyElectricity(), 3, TimeUnit.SECONDS);
+                    if (mp == null){
+                        rechargeRecord.setErrorLog("相应超时");
+                    }else {
+                        if (!mp.isValidateResult()){
+                            rechargeRecord.setErrorLog("校验失败");
+                        }else {
+                            rechargeRecord.setChargingStatus("20");
+                        }
+                    }
+
+
+                } catch (Exception e) {
+                    rechargeRecord.setErrorLog(e.getMessage());
+                    e.printStackTrace();
+                    logger.error(e.getMessage(), e);
+                }
+                rechargeRecordService.update(rechargeRecord);
+
+
+                return "success";
+            } else {
+                logger.error("notify_url 验证失败");
+                return "failure";
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            logger.error(e.getMessage(), e);
+            return "failure";
+        }
+    }
+
+}

+ 67 - 0
src/main/java/com/jpsoft/epay/modules/pay/properties/AliPayProperties.java

@@ -0,0 +1,67 @@
+package com.jpsoft.epay.modules.pay.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author 墨鱼_mo
+ * @date 2019-11-26 9:37
+ */
+
+@Data
+@ConfigurationProperties(prefix = "alipay")
+@Component
+public class AliPayProperties {
+
+
+    /**
+     * 支付宝网关
+     */
+    private String serviceUrl;
+
+    /**
+     * 应用appid
+     */
+    private String appId;
+
+    /**
+     * 应用私钥
+     */
+    private String privateKey;
+
+    /**
+     * 支付宝公钥
+     */
+    private String zfbPublicKey;
+
+    /**
+     * 编码
+     */
+    private String inputCharset;
+
+    /**
+     * 服务商id
+     */
+    private String mchId;
+
+    /**
+     * 授权token
+     */
+    private String appAuthToken;
+
+    /**
+     * 加密方式
+     */
+    private String signType;
+
+    /**
+     * 支付回调地址
+     */
+    private String notifyUrl;
+
+    /**
+     * 商品描述
+     */
+    private String body;
+}

+ 61 - 0
src/main/java/com/jpsoft/epay/modules/pay/properties/WxPayProperties.java

@@ -0,0 +1,61 @@
+package com.jpsoft.epay.modules.pay.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author 墨鱼_mo
+ * @date 2019-11-26 9:35
+ */
+
+@Data
+@ConfigurationProperties(prefix = "wx.pay")
+@Component
+public class WxPayProperties {
+
+    /**
+     * 设置微信公众号或者小程序等的appid
+     */
+    private String appId;
+
+    /**
+     * 微信支付商户号
+     */
+    private String mchId;
+
+    /**
+     * 微信支付商户密钥
+     */
+    private String mchKey;
+
+    /**
+     * 服务商模式下的子商户公众账号ID,普通模式请不要配置,请在配置文件中将对应项删除
+     */
+    private String subAppId;
+
+    /**
+     * 服务商模式下的子商户号,普通模式请不要配置,最好是请在配置文件中将对应项删除
+     */
+    private String subMchId;
+
+    /**
+     * apiclient_cert.p12文件的绝对路径,或者如果放在项目中,请以classpath:开头指定
+     */
+    private String keyPath;
+
+    /**
+     * 回调地址
+     */
+    private String notifyUrl;
+
+    /**
+     * 发起ip
+     */
+    private String ip;
+
+    /**
+     * 商品描述
+     */
+    private String body;
+}

+ 208 - 0
src/main/java/com/jpsoft/epay/modules/pay/weixin/WxPayController.java

@@ -0,0 +1,208 @@
+package com.jpsoft.epay.modules.pay.weixin;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.ijpay.core.enums.SignType;
+import com.ijpay.core.enums.TradeType;
+import com.ijpay.core.kit.HttpKit;
+import com.ijpay.core.kit.WxPayKit;
+import com.ijpay.wxpay.WxPayApi;
+import com.ijpay.wxpay.WxPayApiConfigKit;
+import com.ijpay.wxpay.model.UnifiedOrderModel;
+import com.jpsoft.epay.modules.base.entity.RechargeRecord;
+import com.jpsoft.epay.modules.base.service.ElectricMeterInfoService;
+import com.jpsoft.epay.modules.base.service.RechargeRecordService;
+import com.jpsoft.epay.modules.business.controller.DemoController;
+import com.jpsoft.epay.modules.business.service.RechargeService;
+import com.jpsoft.epay.modules.common.dto.MessageResult;
+import com.jpsoft.epay.modules.communication.server.protocol.MeterReceivePacket;
+import com.jpsoft.epay.modules.pay.properties.WxPayProperties;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author 墨鱼_mo
+ * @date 2019-11-26 10:35
+ */
+
+@RequestMapping("/wxPay")
+@RestController
+public class WxPayController {
+
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Autowired
+    private WxPayProperties wxPayProperties;
+
+    @Autowired
+    private RechargeRecordService rechargeRecordService;
+
+    @Autowired
+    private RechargeService rechargeService;
+
+
+    @ApiOperation(value = "微信JSAPI支付")
+    @GetMapping("/webPay")
+    public MessageResult webPay(@RequestParam("rechargeRecordId") String rechargeRecordId) {
+
+
+        MessageResult msgResult = new MessageResult<>();
+        try {
+
+            RechargeRecord rechargeRecord = rechargeRecordService.get(rechargeRecordId);
+            if (rechargeRecord == null) {
+                throw new Exception("订单不存在");
+            }
+            if (StrUtil.isBlank(rechargeRecord.getOpenId())) {
+                throw new Exception("openId不存在");
+            }
+            if (rechargeRecord.getBuyAmount().compareTo(BigDecimal.ZERO) != 1) {
+                throw new Exception("金额有误");
+            }
+            if (rechargeRecord.getPaymentStatus().equals("20")) {
+                throw new Exception("订单已支付");
+            }
+
+
+            //金额处理
+            int wxTotalTee = rechargeRecord.getBuyAmount().multiply(new BigDecimal(100)).intValue();
+            Map<String, String> params = UnifiedOrderModel
+                    .builder()
+                    .appid(wxPayProperties.getAppId())
+                    .mch_id(wxPayProperties.getMchId())
+                    .sub_mch_id(wxPayProperties.getSubMchId())
+                    .nonce_str(WxPayKit.generateStr())
+                    .body(rechargeRecord.getProductTheme())
+                    .out_trade_no(rechargeRecord.getSerialNumber())
+                    .total_fee(String.valueOf(wxTotalTee))
+                    .spbill_create_ip(wxPayProperties.getIp())
+                    .notify_url(wxPayProperties.getNotifyUrl())
+                    .trade_type(TradeType.JSAPI.getTradeType())
+                    .openid(rechargeRecord.getOpenId())
+                    .build()
+                    .createSign(wxPayProperties.getMchKey(), SignType.HMACSHA256);
+
+            String xmlResult = WxPayApi.pushOrder(false, params);
+            logger.info(xmlResult);
+
+            Map<String, String> resultMap = WxPayKit.xmlToMap(xmlResult);
+            String returnCode = resultMap.get("return_code");
+            String returnMsg = resultMap.get("return_msg");
+            if (!WxPayKit.codeIsOk(returnCode)) {
+                logger.error(returnCode);
+                throw new Exception(returnMsg);
+            }
+            String resultCode = resultMap.get("result_code");
+            if (!WxPayKit.codeIsOk(resultCode)) {
+                String errCode = resultMap.get("err_code_des");
+                logger.error(errCode);
+                throw new Exception(errCode);
+            }
+
+            // 以下字段在 return_code 和 result_code 都为 SUCCESS 的时候有返回
+
+            String prepayId = resultMap.get("prepay_id");
+
+            Map<String, String> packageParams = WxPayKit.prepayIdCreateSign(prepayId, wxPayProperties.getAppId(),
+                    wxPayProperties.getMchKey(), SignType.HMACSHA256);
+
+            msgResult.setData(packageParams);
+            msgResult.setResult(true);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            logger.error(e.getMessage(), e);
+            msgResult.setResult(false);
+            msgResult.setMessage(e.getMessage());
+        }
+        return msgResult;
+    }
+
+    @RequestMapping(value = "/payNotify", method = {RequestMethod.POST, RequestMethod.GET})
+    @ResponseBody
+    public String payNotify(HttpServletRequest request) {
+        String xmlMsg = HttpKit.readData(request);
+        logger.info("支付通知=" + xmlMsg);
+        Map<String, String> params = WxPayKit.xmlToMap(xmlMsg);
+
+        String returnCode = params.get("return_code");
+        String outTradeNo = params.get("out_trade_no");
+        String payTimeStr = params.get("time_end");
+        Date payTime = DateUtil.parse(payTimeStr);
+
+
+
+
+        // 注意此处签名方式需与统一下单的签名类型一致
+        if (WxPayKit.verifyNotify(params, WxPayApiConfigKit.getWxPayApiConfig().getPartnerKey(), SignType.HMACSHA256)) {
+            if (WxPayKit.codeIsOk(returnCode)) {
+                // 更新订单信息
+
+                try {
+                    RechargeRecord rechargeRecord = rechargeRecordService.getBySerialNum(outTradeNo);
+                    if (rechargeRecord == null) {
+                        throw new Exception("支付已完成,但未找到此订单号的流水");
+                    }
+                    if (rechargeRecord.getBuyAmount().multiply(new BigDecimal(100)).compareTo(new BigDecimal(params.get("total_fee"))) !=0) {
+                        throw new Exception("支付金额与系统金额不一致");
+                    }
+
+                    rechargeRecord.setUpdateTime(new Date());
+                    rechargeRecord.setUpdateBy(params.get("openid"));
+                    rechargeRecord.setBuyType("wechat");
+                    rechargeRecord.setPaymentStatus("20");
+                    rechargeRecord.setTransactionNumber(params.get("transaction_id"));
+                    rechargeRecord.setPaymentTime(payTime);
+
+
+                    try {
+                        MeterReceivePacket mp = rechargeService.recharge(rechargeRecord.getRoomId(), rechargeRecord.getBuyElectricity(), 3, TimeUnit.SECONDS);
+                        if (mp == null){
+                            rechargeRecord.setErrorLog("相应超时");
+                        }else {
+                            if (!mp.isValidateResult()){
+                                rechargeRecord.setErrorLog("校验失败");
+                            }else {
+                                rechargeRecord.setChargingStatus("20");
+                            }
+                        }
+
+
+                    } catch (Exception e) {
+                        rechargeRecord.setErrorLog(e.getMessage());
+                        logger.error(e.getMessage(), e);
+                        e.printStackTrace();
+                    }
+                    rechargeRecordService.update(rechargeRecord);
+
+
+                    // 发送通知等
+                    Map<String, String> xml = new HashMap<String, String>(2);
+                    xml.put("return_code", "SUCCESS");
+                    xml.put("return_msg", "OK");
+                    return WxPayKit.toXml(xml);
+
+
+                } catch (Exception e) {
+                    logger.error(e.getMessage(), e);
+                    e.printStackTrace();
+                }
+            }
+        }
+
+
+        return null;
+    }
+
+
+}

+ 38 - 0
src/main/resources/application.yml

@@ -73,3 +73,41 @@ pagehelper:
   reasonable: true
   supportMethodsArguments: true
   params: count=countSql
+
+#测试环境
+#alipay:
+  serviceUrl: https://openapi.alipay.com/gateway.do
+  appId: 2018080860921471
+  privateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDNILPaO4vo6SW+PesgNwiS2K1sXpPiBJChKgozQyaDwPWktDNJCHgqEAgHyHpry+de8lbr4vZA7HAO3mR7YTrckHJptJWiR7JlrO8f9stBFVNS5ZwQJiaxAITg6ODYk0GF5ppbR70A6tMQxIN5y0nYl+edIN+QDVU66rvHRp88ik2A083UmlnKJHYM8E1d4KXKxcqyRhkIyt9lLX4ZxwptcmtcP6SfYfbiwV2RoPW1Ymighxw6WI221oLcY0nZhfSTY+jmZoaPxYhnTfpurUaB+gKqRSW+F6rolcURaZA3bh3rlQcJ1vJWY0dsELjakfvbwltKCAp2ANh5HbJWnHWlAgMBAAECggEAA2iUtH6iz4b4QpYCzzE66j3Be/iCWpIa2SK6sqld/Xh6XHdGFuOWI5TKnV5+ckYcHR7HxPmrf96t6gFWCBrQgJPB4vHGPsEUPM5H1u8h5330OX9pPXd00yIgEyCrg83Gm/P+AqBJirdcNH4fdSmkm33CsoC2Vk1yah02a5RH1xiplKK+L+xCUR2bV+z3mx1ALugyarrxSD/o9faVTSW5K/oZZAs02oUkzA+eRLeNza9eyCKzHThdRxJhfLniQYFNFl1vaJkZ68iBX16CAAYEWiCAq5kxmiblTidf1iOEoI1L4LUfq+23yespxWIRricclUzUI2R4KyAwSg45Z5JvIQKBgQD7838ukANLR+Xzwi3YX4+/X3ysv7UO8aY99KEIfBLf70Rehs1jDjKXdjbaWH6s+r83dzb3MEfpwLC+cvfDctKiQUhlGFG+k/hNdEY01NjIoV9l8GIjdLjtE+lJyBspga0sCxZYJYJYIu6i1kI/sGclxObTp95uNHivloUFuhpELQKBgQDQbJQihSGyRSROr0zLA0lOwbR4tGvk5yRYmGJRejOA1kU8hWEemtLpmgxu7XsFcMg5gVqqHMI+EfePfn1lKetdrtcpDpuYDgmb1LvBPp2hVx4RiUHu7c7EKo10HQc6Q4YTBaMH+WVb/aJSLfCLctr4yLb9Wwav3NWjTavXrbUKWQKBgHoJd5EWMIJGURvA8nPb1cTce4cxVIHoip134Ig7kOjm/DbNFK7mMZsrp2Ybd0BSNEypcfZJbIvMyc914IzLETuGY4qUPQQSqDLcHyV384k6oPq/dMm3v9sVyenzAzUXmsm6lRgdEwWd5fj5zx0KVOv2c9gRd6vpvotOXSBpBFABAoGBAIArpVUtJbGpT1CMAN9/X99sw3zPBuK3OeS5oQyV54I9Qkqbg0P81eMN9sNoixSnbJngcE7YbKMbDXBSyu4hPzpXQL1g3FI/n60Sv3tw9CK5niYOkFtMJrD/sglLqJwt1g9wkfdfaPOPH/kFgz1eHkaLt+xJw+z2EvLf2uNBUWnRAoGATydp5cEKbNSbF3XhFhzqZZjVzywdpQjSLfKj9+h9f9bX7kfdp5SeLQgfzxfxXn/GSaUipizHl2SOnhnMLgpxN9YAwm5Gj6PXjLTcQqxhdvNppy1z8a/4UzbDXeO6aHmsjlYAT8ikQAGCG0PxUD8/dUOFpdXbQZFrzSIw0aQb1Zk=
+  zfbPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAo3gaIrAD47mfSBmye1c8GLIRF4H3sl0MhT1OHIO0FqwtDqyxpHkrpOQADQggEzgv1nO82V+ChQxHUeaQ7W987+s1cnwtm7ZVML8DxVtji1va1ahBKL62dBommOoIt4fRIO2upbnF6r3NjB/3MCTZUIE03xIqc+aUeNdRO7eAMpm6sHjBfSimFwXlyTaEsAsnTK4hkOzdvoldHry6A3375kE3msj8Z48Nko7AFedOToPfJNolap+i7qWv3VOhnWLrAZH/Jgq/uHQmx8r29BeBl9AT4EwxDN5mVVKDOYsWW1efmrhKXO3wvzInhB6qQ8L1uBCWKhw1eGHCvlCjTHxBYQIDAQAB
+  inputCharset: UTF-8
+  mchId: 2088132815112480
+  appAuthToken: 201906BBbc7d6558596f4bbc9f056c01b8aebX48
+  signType: RSA2
+  notifyUrl: http://18891j25i6.iok.la:40309/epay-server/aliPay/payNotify
+  body: 测试
+
+
+#沙箱环境
+alipay:
+  serviceUrl: https://openapi.alipaydev.com/gateway.do
+  appId: 2016091800539045
+  privateKey: MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCZqJjnubeHgd6MVyCa+X/1Jxbxr60S3Avl6cR+x6rCQpnOEVNH6UsVm31cGp2W/rPlfJd7Kil9a0WAS2mdFhW9XDouo2jp6s+1hbtW52kwbQWjszq4WebIs97IWHxmkM3vEO3lVUd6y/Wo23sfL1d0ahEPLqkahM36zSBXaEmGzgX+8hgV25zk1tsyzwu/BAnQvOtCDYW+fP/ozz63mJ7/ScQn4Ucm3UwX92d3w+zqjUD0BjvNVQcOZwJm7FKrdsib1UVglyykaGG6M1KZj08q2ANYq+M+o//jX71JDXTpd+Uo6D+heUAKMDECXH2QzmQ2ZfSqR+eQ6t6sgH+69o2LAgMBAAECggEAWjynpxXqkNqUrkgQbtJs8bRGBiML+dJd7mQtL+LkBfcEyf5ksQtxO7w3j1pWB7GGRhO4Be2JtgzEIQaofEbW94Bs7qyqVQy/dDOYA/4cSQMNV8hOiKrLHDx9bZyBWd5aAbYobxB4zMVwe/yAvpyXuFb9s7PMPTWWnV3PS2WEIHR5jC1G9yqkaSTHkPCpd+S9spaHkCJdrwmGuscbElBS6C44QqDZK1aqtjq6JlHTibOLiN+WYKePPxgQkJLJwN7RWIFf3PTFH5aT3joRPP3ymOLv0cRRU0tUDqzF+o1rxMHjitVWWfXEw2p4b+NbYCEKx/3HyNmAQC23bskMP4X8kQKBgQDxvO2ob57gnWQahyDsElD66w87XF7QFqcMVcrKQmSBYxqluywSyq0uNKAogacSNsufg7kJOwTmtpGKMl//8tJ88u+T8x5BmLcbEhT1eWpCF9SJ951DzVHAIgAH/w2yH+PcJBQvDX9WV93Amoim4JRqvx6t8v3nShdys7eVlzA/eQKBgQCiuV47UzAiLSPR7vI9cYaD4h5MMSbmBEWG4prXhGt4AjLhdrlzGMMGCT7OMlEEXvRhd61nkeGNBOm51sc6PS8xWAkfqY8DpBG6Ty/rv6syUVJ6I66SujY3hUqGbtwL3FTWH2ixhlU/bzZnUS4gKlO5MPsJgPhg8JaP7wRffXTgIwKBgDoitoEIfwwDrfxXPQqpCQKfHyWmfELM/9WOmFt2Bhe7zr/GuL24MlfnXhD/xT8zIFs3YXufzvjxNSUoIkA6lHZqMkXBdShPYtHG0nWKgoxskLexbgfNS/jJ9Hn308JfuvvJTXVXaKVKMlFMmMqRPgBCAE3TH07NWcBDCkaWeor5AoGAArLuZC+CCd8TzASZkflTENbsR7k8+u2xNYaGqPJyUeA/dcvhUY5klbILj6H4BAmLJh61CpW51vvw4Hs2fLnNEZVzOUo3rAjJnnx3wAJC1afRpWL4H0jlY1BbpxUpoyy5X3/P3bnrqgyvK1GGYVQyZUzxrPutovX6mVKOkQLksF8CgYB7LBZyzLBWWmVt51DHELXkvIiXzftqpe6TFcEJ0gfkS/CU0rgMDlOoI5gJW39mEvObVTvCdG98lF2QqLfVxJ5o2pNQOHtGDTPDp30OOjRdz26Bk8o+D7Brr6V0weF6MLV2Vsa+Yr0FGeObHbTC94SJzEWobkvAqVR2luhdtagBYg==
+  zfbPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx+8b2IWa7X+crooIYaT9ZEhyZYuhlaGlpxBXjmchWIrtRIp2sOGlm7nH8oY5CAgVmZ9x8ETz5Sd+p6Z7BhPNu+uc4CmrNOEzgfUDmWp8xriNfQR1Jw+J9AhGfjgQGT2/z9aD/BdKed40VM8P3iAtg++6TnBAEKBNbWuk4tOtP3aZ2XDZyIo1K3rW+KEufQBgZvo1j5x5asj2m+/5xBLdTLxsKb5agUM4HlTaQKuoF7Z+jPnHFzQEsITzgAyc0nd26QRTfWo+bCnFKG8GHjdZrJ1wjcXdw056+jUOUyRfDE/Set72FGlVTswhETo6ayAdNRRUX/3x0EI9dx3PxkC27QIDAQAB
+  inputCharset: UTF-8
+  mchId: 2088102176166099
+ # appAuthToken: 201906BBbc7d6558596f4bbc9f056c01b8aebX48
+  signType: RSA2
+  notifyUrl: http://18891j25i6.iok.la:40309/epay-server/aliPay/payNotify
+
+
+wx:
+  pay:
+    appId: wxe598c699aa68cffe
+    mchId: 1500160622
+    subMchId: 1505070291
+    mchKey: jpsoft11111111111111111111111111
+    notifyUrl: http://18891j25i6.iok.la:40309/epay-server/wxPay/payNotify
+    ip: 101.37.31.116
+
+