Commit f42c1fca authored by shiyu's avatar shiyu

预支付接口

parent d9b574a0
package com.wwdz.ch.core.api.wxpay; package com.wwdz.ch.core.api.wxpay;
import com.wechat.pay.java.core.RSAAutoCertificateConfig; import com.wechat.pay.java.core.RSAAutoCertificateConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.core.io.ClassPathResource;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
@Configuration @Configuration
public class WxPayAutoCertificateConfig { public class WxPayAutoCertificateConfig {
private static final Logger logger = LoggerFactory.getLogger(WxPayAutoCertificateConfig.class);
@Autowired @Autowired
WxPayParamConfig wxPayParamConfig; WxPayParamConfig wxPayParamConfig;
...@@ -21,10 +31,28 @@ public class WxPayAutoCertificateConfig { ...@@ -21,10 +31,28 @@ public class WxPayAutoCertificateConfig {
public RSAAutoCertificateConfig rsaAutoCertificateConfig() { public RSAAutoCertificateConfig rsaAutoCertificateConfig() {
RSAAutoCertificateConfig config = new RSAAutoCertificateConfig.Builder() RSAAutoCertificateConfig config = new RSAAutoCertificateConfig.Builder()
.merchantId(wxPayParamConfig.getMerchantId()) .merchantId(wxPayParamConfig.getMerchantId())
.privateKey(wxPayParamConfig.getPrivateKey()) .privateKey(getPrivateKey())
.merchantSerialNumber(wxPayParamConfig.getMerchantSerialNumber()) .merchantSerialNumber(wxPayParamConfig.getMerchantSerialNumber())
.apiV3Key(wxPayParamConfig.getApiV3Key()) .apiV3Key(wxPayParamConfig.getApiV3Key())
.build(); .build();
return config; return config;
} }
public String getPrivateKey() {
try {
String path = this.getClass().getResource("/apiclient_key.pem").getPath();
String fileContent = new String(Files.readAllBytes(Paths.get(path)), "utf-8");
String privateKey = fileContent.replace("-----BEGIN PRIVATE KEY-----", "")
.replace("-----END PRIVATE KEY-----", "")
.replaceAll("\\s+", "");
return privateKey;
} catch (Exception e) {
logger.error("加载私钥错误 error :{}", e);
}
return null;
}
public static void main(String[] args) throws IOException {
new WxPayAutoCertificateConfig().getPrivateKey();
}
} }
\ No newline at end of file
...@@ -47,7 +47,6 @@ public class WxPayServiceApi { ...@@ -47,7 +47,6 @@ public class WxPayServiceApi {
.config(rsaAutoCertificateConfig) .config(rsaAutoCertificateConfig)
.signType("RSA") // 不填默认为RSA .signType("RSA") // 不填默认为RSA
.build(); .build();
PrepayWithRequestPaymentResponse response = new PrepayWithRequestPaymentResponse();
try { try {
PrepayRequest request = new PrepayRequest(); PrepayRequest request = new PrepayRequest();
request.setAppid(wxPayParamConfig.getAppId()); request.setAppid(wxPayParamConfig.getAppId());
...@@ -67,9 +66,13 @@ public class WxPayServiceApi { ...@@ -67,9 +66,13 @@ public class WxPayServiceApi {
request.setPayer(payer); request.setPayer(payer);
logger.info("请求预支付下单,请求参数:{}", JsonUtils.from(request)); logger.info("请求预支付下单,请求参数:{}", JsonUtils.from(request));
// 调用预下单接口 // 调用预下单接口
response = service.prepayWithRequestPayment(request); PrepayWithRequestPaymentResponse response = service.prepayWithRequestPayment(request);
logger.info("订单【{}】发起预支付成功,返回信息:{}", dto.getDistributionOrderId(), response); logger.info("订单【{}】发起预支付成功,返回信息:{}", dto.getDistributionOrderId(), response);
return Result.success(); String prepayStr = response.getPackageVal();
if (StringUtils.hasLength(prepayStr)) {
String prepayId = prepayStr.split("=")[1];
return Result.success(prepayId);
}
} catch (HttpException e) { // 发送HTTP请求失败 } catch (HttpException e) { // 发送HTTP请求失败
logger.error("微信下单发送HTTP请求失败,错误信息:{}", e.getHttpRequest()); logger.error("微信下单发送HTTP请求失败,错误信息:{}", e.getHttpRequest());
} catch (ServiceException e) { // 服务返回状态小于200或大于等于300,例如500 } catch (ServiceException e) { // 服务返回状态小于200或大于等于300,例如500
......
...@@ -21,17 +21,24 @@ public class PriceUtil { ...@@ -21,17 +21,24 @@ public class PriceUtil {
public static Long convertPriceFromStr(String price){ public static Long convertPriceFromStr(String price){
BigDecimal bigDecimal = new BigDecimal(price); BigDecimal bigDecimal = new BigDecimal(price);
bigDecimal = bigDecimal.multiply(new BigDecimal(100)); bigDecimal = bigDecimal.multiply(new BigDecimal(100));
return bigDecimal.longValue(); return bigDecimal.longValue();
}
public static String convertDoubleToString(Double price){
BigDecimal bigDecimal = new BigDecimal(String.valueOf( price / 100));
DecimalFormat df = new DecimalFormat("#0.00");
return df.format(bigDecimal);
} }
public static Long convertPriceUnit(Long price){ public static Long convertPriceUnit(Long price){
BigDecimal bigDecimal = new BigDecimal(price); BigDecimal bigDecimal = new BigDecimal(price);
bigDecimal = bigDecimal.multiply(new BigDecimal(100)); bigDecimal = bigDecimal.multiply(new BigDecimal(100));
return bigDecimal.longValue(); return bigDecimal.longValue();
} }
public static void main(String[] args) { public static void main(String[] args) {
System.out.println(convertPrice(3980L)); System.out.println(convertPrice(3980L));
System.out.println(UUID.fastUUID().toString(true));
} }
} }
-----BEGIN CERTIFICATE-----
MIIEITCCAwmgAwIBAgIUQRaLhu3MJgsR0rDd6GhN8Uj7FvIwDQYJKoZIhvcNAQEL
BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
Q0EwHhcNMjQwMTMwMDYxMjQwWhcNMjkwMTI4MDYxMjQwWjB7MRMwEQYDVQQDDAox
NjU5NzAxOTU3MRswGQYDVQQKDBLlvq7kv6HllYbmiLfns7vnu58xJzAlBgNVBAsM
HuadreW3nuiXj+iChuaLjeWNluaciemZkOWFrOWPuDELMAkGA1UEBhMCQ04xETAP
BgNVBAcMCFNoZW5aaGVuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
uBKMPOC+Ljm4hH+s3T3SB4W30fJua4+xX2OvQPY8wRA1gA6iAnlSWzh1cUj6jxlK
8+oSAKWypj8OkNN31pi2w+1TIAYiUGpvtEwgQGnymEijbCVA1rnuB8iKMKlIECB7
Z9GT7JbHkSoDO2K2tIw6RIqs4/gT0ZqKMB57AirVNlPzsf+y19Mz5unrpGHE9bOa
Vw58K8g0eQ9/yf+To5ELhbv489CUb0ODonyoRhPBe62zQZwpVqsubE1vTLgsJXuS
XIsQDKt2JMj6hoVJAf5GF6G/+RVjgJHh2SKTiEeC6WM4n6Skl/bAnJBCVfjXogFJ
ZmjkzJa2bCL2g5E7raUMUwIDAQABo4G5MIG2MAkGA1UdEwQCMAAwCwYDVR0PBAQD
AgP4MIGbBgNVHR8EgZMwgZAwgY2ggYqggYeGgYRodHRwOi8vZXZjYS5pdHJ1cy5j
b20uY24vcHVibGljL2l0cnVzY3JsP0NBPTFCRDQyMjBFNTBEQkMwNEIwNkFEMzk3
NTQ5ODQ2QzAxQzNFOEVCRDImc2c9SEFDQzQ3MUI2NTQyMkUxMkIyN0E5RDMzQTg3
QUQxQ0RGNTkyNkUxNDAzNzEwDQYJKoZIhvcNAQELBQADggEBADGjHznO6I4X+dmI
K54jke/22oGcwExZBldONO9+RJZh4Yq6yFTI+MsdETAVudiSdo5OyUrgXKCH+0wb
4QGKY/R9slzdCfjHIbcF2AfjRr/qM3bMcFWWd73bektTbXq+SBAp7iwoaWOE4OUO
PEdTVocdfiaQSuY7iGXwKuJB3EepQEF0zCDx5wcVpmYzvqfKpBpPxI6fMtyNd9OM
1XUTB9daDzp7E5wz8RNNpNwxF5JW6svs0fuxZATSI0YqCEY0Gp12GaM6u8sYWA4h
YWqsAK001ILisGMi0GDGDkLcbE8ZC++wyMOuQDelrGFce9iAHojqdX2ciZy5gtev
FSe2n3o=
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC4Eow84L4uObiE
f6zdPdIHhbfR8m5rj7FfY69A9jzBEDWADqICeVJbOHVxSPqPGUrz6hIApbKmPw6Q
03fWmLbD7VMgBiJQam+0TCBAafKYSKNsJUDWue4HyIowqUgQIHtn0ZPslseRKgM7
Yra0jDpEiqzj+BPRmoowHnsCKtU2U/Ox/7LX0zPm6eukYcT1s5pXDnwryDR5D3/J
/5OjkQuFu/jz0JRvQ4OifKhGE8F7rbNBnClWqy5sTW9MuCwle5JcixAMq3YkyPqG
hUkB/kYXob/5FWOAkeHZIpOIR4LpYzifpKSX9sCckEJV+NeiAUlmaOTMlrZsIvaD
kTutpQxTAgMBAAECggEBAIgnUAwHwSS4FUAMoHTVsXFW+20UAZEWLID+XzeR68Zy
kuAx8qwZyU0oKdatwIfwkXxx+vb3mXlW0xNVGCNnumiaNw5M+zy4PgAC/ygmNgdm
U1s/AwLRbLvdHjp4PJGRNTbJ0r0BmoRJqzJWBgbuYnsoiFHnweEcinKlWR91R1hy
5jfoKBGgFRveI8q87oWovKn70KUoQX+r++K+mCZXtCq+eTp28MzT18fauF4JrRxW
NDp7CpCUEk0+y5hxrbKXaNIQTyEvYK5yEaPHdzwxm8wTPs6crQRz2/8ox1j28Azf
Coirks3HZMy4paRyus+7zrBGokN+C7DGnqLFCYpMvkECgYEA7Voc1Oy092l5uHvL
GsynYcUb3Aa0kTIA8XVQ+qD0slP6PqLe50iS6T6G8F5qbZuppJCj17q9NQ+RsPXJ
a4zViAdTkhYnpjTgFHA8dMoZ6YP5FNWcqxIt2YTluyjhNQFLbvnPLEfy4/JaiQUF
OVfZl6erQfbuYU9RXpX1uP06shkCgYEAxojRUCWWkH/0u5Jfe4a8ZxzbDv9oenIO
pI9PCgn71gtnK4OTuKo0HfORVi6VpQsctLie5V9ag6yeNTqJEmhVHjPgmnN90whg
tnw47YwxYRahvuv7X5l1KV83zfMLFg5fx+rKyLlTt7f5l8lwrOpdnFie/jnuTIri
B+tkJKubt0sCgYBserAMvPbk0Uc5gxLL99dUfyMBh+sFJWZ69RSCyAeubWVFNWlN
KcVDZzmDKJPZ7rg1J4pKseWCF9CNoXhieGarmjWe4hNTCn2TucxX0HrRWGkCFbNa
GJ/t96iLxt5PPH0+hlwir+uaNQ0d7LZ7g+RGRPKn3nUK8paM9VruJoaqGQKBgDcx
2l9Z094gdL2hGAKTltVj5FLrFvTTuNZvMR4tYGJFkU07q1nvl8Wr7X/0O45C5Jwp
p6NFOzjYSLOrrmf7sY5QBeVqrlR5Q8n4Byujiibfz9/wY1ZUp4n0+uK66x4aqO4/
jFj5jRjKgQ1952FrVtMcoDc1i9aj1es1ugWn4Aa5AoGBALwKTuNr6/K9ExqpuN+o
xcNhC8LnXKBHQsRiaJ8ii0OLwa1M7itrF04iDNwiZEI/fXUWcTQUYhA2ogp2o0ZS
bQVSxQU2orOrRZ3TSY9FPwUo78YQkvBPHHxkh8HcLpu5xLDZvf8HaFfVjFcXUurU
GUtYgM4km/PmiGNEdsw+MIu9
-----END PRIVATE KEY-----
...@@ -33,12 +33,12 @@ dts: ...@@ -33,12 +33,12 @@ dts:
#微信支付配置 #微信支付配置
wx-pay: wx-pay:
appId: wx5b4409448bf2c72b appId: wx5b4409448bf2c72b
merchantId: 123 merchantId: 1659701957
privatekey: 123 privatekey: 123
merchantSerialNumber: 123 merchantSerialNumber: 41168B86EDCC260B11D2B0DDE8684DF148FB16F2
apiV3Key: 123123 apiV3Key: 7e9504fd8a5c458ab7466b8aaae462a9
payNotifyUrl: 123 payNotifyUrl: https://cjxc-applet-dev.wanwudezhi.com/wxPayCallback/getPayNotify
privateKeyPath: 123 privateKeyPath: apiclient_key.pem
#腾讯IM配置 #腾讯IM配置
......
...@@ -22,6 +22,15 @@ dts: ...@@ -22,6 +22,15 @@ dts:
get-officialaccount-accesstoken-url: https://api.weixin.qq.com/cgi-bin/stable_token get-officialaccount-accesstoken-url: https://api.weixin.qq.com/cgi-bin/stable_token
officialaccount-templetId: WJkhzyY0_7AYqh19_ujK9yZhj4HohF8ETJvG5NYA9A8 officialaccount-templetId: WJkhzyY0_7AYqh19_ujK9yZhj4HohF8ETJvG5NYA9A8
#微信支付配置
wx-pay:
appId: wx5b4409448bf2c72b
merchantId: 1659701957
privatekey: 123
merchantSerialNumber: 41168B86EDCC260B11D2B0DDE8684DF148FB16F2
apiV3Key: 7e9504fd8a5c458ab7466b8aaae462a9
payNotifyUrl: https://cjxc-applet.wanwudezhi.com/wxPayCallback/getPayNotify
privateKeyPath: apiclient_key.pem
#腾讯IM配置 #腾讯IM配置
im: im:
......
package com.wwdz.ch.db.domain.distribution; package com.wwdz.ch.db.domain.distribution;
import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Date; import java.util.Date;
import com.xxdxxs.entity.Entity; import com.xxdxxs.entity.Entity;
import lombok.Data; import lombok.Data;
/** /**
* @author shiyu * @author shiyu
* @date 2024/01/26 * @date 2024/01/30
*/ */
@Data @Data
public class DistributionOrder implements Entity { public class DistributionOrder implements Entity {
private Integer id; private Integer id;
/** /**
...@@ -21,6 +20,16 @@ public class DistributionOrder implements Entity { ...@@ -21,6 +20,16 @@ public class DistributionOrder implements Entity {
*/ */
private String distributionOrderId; private String distributionOrderId;
/**
* 预支付id
*/
private String prepayId;
/**
* 微信支付订单号
*/
private String transactionId;
/** /**
* 商品id * 商品id
*/ */
...@@ -36,6 +45,11 @@ public class DistributionOrder implements Entity { ...@@ -36,6 +45,11 @@ public class DistributionOrder implements Entity {
*/ */
private Long buyerId; private Long buyerId;
/**
* 买方openid
*/
private String buyerOpenid;
/** /**
* 店铺id * 店铺id
*/ */
...@@ -116,9 +130,12 @@ public class DistributionOrder implements Entity { ...@@ -116,9 +130,12 @@ public class DistributionOrder implements Entity {
sb.append("Hash = ").append(hashCode()); sb.append("Hash = ").append(hashCode());
sb.append(", id=").append(id); sb.append(", id=").append(id);
sb.append(", distributionOrderId=").append(distributionOrderId); sb.append(", distributionOrderId=").append(distributionOrderId);
sb.append(", prepayId=").append(prepayId);
sb.append(", transactionId=").append(transactionId);
sb.append(", itemId=").append(itemId); sb.append(", itemId=").append(itemId);
sb.append(", itemNum=").append(itemNum); sb.append(", itemNum=").append(itemNum);
sb.append(", buyerId=").append(buyerId); sb.append(", buyerId=").append(buyerId);
sb.append(", buyerOpenid=").append(buyerOpenid);
sb.append(", shopId=").append(shopId); sb.append(", shopId=").append(shopId);
sb.append(", sellerId=").append(sellerId); sb.append(", sellerId=").append(sellerId);
sb.append(", amount=").append(amount); sb.append(", amount=").append(amount);
...@@ -152,9 +169,12 @@ public class DistributionOrder implements Entity { ...@@ -152,9 +169,12 @@ public class DistributionOrder implements Entity {
DistributionOrder other = (DistributionOrder) that; DistributionOrder other = (DistributionOrder) that;
return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId())) return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
&& (this.getDistributionOrderId() == null ? other.getDistributionOrderId() == null : this.getDistributionOrderId().equals(other.getDistributionOrderId())) && (this.getDistributionOrderId() == null ? other.getDistributionOrderId() == null : this.getDistributionOrderId().equals(other.getDistributionOrderId()))
&& (this.getPrepayId() == null ? other.getPrepayId() == null : this.getPrepayId().equals(other.getPrepayId()))
&& (this.getTransactionId() == null ? other.getTransactionId() == null : this.getTransactionId().equals(other.getTransactionId()))
&& (this.getItemId() == null ? other.getItemId() == null : this.getItemId().equals(other.getItemId())) && (this.getItemId() == null ? other.getItemId() == null : this.getItemId().equals(other.getItemId()))
&& (this.getItemNum() == null ? other.getItemNum() == null : this.getItemNum().equals(other.getItemNum())) && (this.getItemNum() == null ? other.getItemNum() == null : this.getItemNum().equals(other.getItemNum()))
&& (this.getBuyerId() == null ? other.getBuyerId() == null : this.getBuyerId().equals(other.getBuyerId())) && (this.getBuyerId() == null ? other.getBuyerId() == null : this.getBuyerId().equals(other.getBuyerId()))
&& (this.getBuyerOpenid() == null ? other.getBuyerOpenid() == null : this.getBuyerOpenid().equals(other.getBuyerOpenid()))
&& (this.getShopId() == null ? other.getShopId() == null : this.getShopId().equals(other.getShopId())) && (this.getShopId() == null ? other.getShopId() == null : this.getShopId().equals(other.getShopId()))
&& (this.getSellerId() == null ? other.getSellerId() == null : this.getSellerId().equals(other.getSellerId())) && (this.getSellerId() == null ? other.getSellerId() == null : this.getSellerId().equals(other.getSellerId()))
&& (this.getAmount() == null ? other.getAmount() == null : this.getAmount().equals(other.getAmount())) && (this.getAmount() == null ? other.getAmount() == null : this.getAmount().equals(other.getAmount()))
...@@ -177,9 +197,12 @@ public class DistributionOrder implements Entity { ...@@ -177,9 +197,12 @@ public class DistributionOrder implements Entity {
int result = 1; int result = 1;
result = prime * result + ((getId() == null) ? 0 : getId().hashCode()); result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
result = prime * result + ((getDistributionOrderId() == null) ? 0 : getDistributionOrderId().hashCode()); result = prime * result + ((getDistributionOrderId() == null) ? 0 : getDistributionOrderId().hashCode());
result = prime * result + ((getPrepayId() == null) ? 0 : getPrepayId().hashCode());
result = prime * result + ((getTransactionId() == null) ? 0 : getTransactionId().hashCode());
result = prime * result + ((getItemId() == null) ? 0 : getItemId().hashCode()); result = prime * result + ((getItemId() == null) ? 0 : getItemId().hashCode());
result = prime * result + ((getItemNum() == null) ? 0 : getItemNum().hashCode()); result = prime * result + ((getItemNum() == null) ? 0 : getItemNum().hashCode());
result = prime * result + ((getBuyerId() == null) ? 0 : getBuyerId().hashCode()); result = prime * result + ((getBuyerId() == null) ? 0 : getBuyerId().hashCode());
result = prime * result + ((getBuyerOpenid() == null) ? 0 : getBuyerOpenid().hashCode());
result = prime * result + ((getShopId() == null) ? 0 : getShopId().hashCode()); result = prime * result + ((getShopId() == null) ? 0 : getShopId().hashCode());
result = prime * result + ((getSellerId() == null) ? 0 : getSellerId().hashCode()); result = prime * result + ((getSellerId() == null) ? 0 : getSellerId().hashCode());
result = prime * result + ((getAmount() == null) ? 0 : getAmount().hashCode()); result = prime * result + ((getAmount() == null) ? 0 : getAmount().hashCode());
...@@ -207,9 +230,12 @@ public class DistributionOrder implements Entity { ...@@ -207,9 +230,12 @@ public class DistributionOrder implements Entity {
public enum Column { public enum Column {
id("id", "id", "INTEGER", false), id("id", "id", "INTEGER", false),
distributionOrderId("distribution_order_id", "distributionOrderId", "VARCHAR", false), distributionOrderId("distribution_order_id", "distributionOrderId", "VARCHAR", false),
prepayId("prepay_id", "prepayId", "VARCHAR", false),
transactionId("transaction_id", "transactionId", "VARCHAR", false),
itemId("item_id", "itemId", "BIGINT", false), itemId("item_id", "itemId", "BIGINT", false),
itemNum("item_num", "itemNum", "INTEGER", false), itemNum("item_num", "itemNum", "INTEGER", false),
buyerId("buyer_id", "buyerId", "BIGINT", false), buyerId("buyer_id", "buyerId", "BIGINT", false),
buyerOpenid("buyer_openid", "buyerOpenid", "VARCHAR", false),
shopId("shop_id", "shopId", "BIGINT", false), shopId("shop_id", "shopId", "BIGINT", false),
sellerId("seller_id", "sellerId", "BIGINT", false), sellerId("seller_id", "sellerId", "BIGINT", false),
amount("amount", "amount", "BIGINT", false), amount("amount", "amount", "BIGINT", false),
......
...@@ -4,9 +4,12 @@ ...@@ -4,9 +4,12 @@
<resultMap id="BaseResultMap" type="com.wwdz.ch.db.domain.distribution.DistributionOrder"> <resultMap id="BaseResultMap" type="com.wwdz.ch.db.domain.distribution.DistributionOrder">
<id column="id" jdbcType="INTEGER" property="id" /> <id column="id" jdbcType="INTEGER" property="id" />
<result column="distribution_order_id" jdbcType="VARCHAR" property="distributionOrderId" /> <result column="distribution_order_id" jdbcType="VARCHAR" property="distributionOrderId" />
<result column="prepay_id" jdbcType="VARCHAR" property="prepayId" />
<result column="transaction_id" jdbcType="VARCHAR" property="transactionId" />
<result column="item_id" jdbcType="BIGINT" property="itemId" /> <result column="item_id" jdbcType="BIGINT" property="itemId" />
<result column="item_num" jdbcType="INTEGER" property="itemNum" /> <result column="item_num" jdbcType="INTEGER" property="itemNum" />
<result column="buyer_id" jdbcType="BIGINT" property="buyerId" /> <result column="buyer_id" jdbcType="BIGINT" property="buyerId" />
<result column="buyer_openid" jdbcType="VARCHAR" property="buyerOpenid" />
<result column="shop_id" jdbcType="BIGINT" property="shopId" /> <result column="shop_id" jdbcType="BIGINT" property="shopId" />
<result column="seller_id" jdbcType="BIGINT" property="sellerId" /> <result column="seller_id" jdbcType="BIGINT" property="sellerId" />
<result column="amount" jdbcType="BIGINT" property="amount" /> <result column="amount" jdbcType="BIGINT" property="amount" />
...@@ -81,9 +84,10 @@ ...@@ -81,9 +84,10 @@
</where> </where>
</sql> </sql>
<sql id="Base_Column_List"> <sql id="Base_Column_List">
id, distribution_order_id, item_id, item_num, buyer_id, shop_id, seller_id, amount, id, distribution_order_id, prepay_id, transaction_id, item_id, item_num, buyer_id,
address_id, address, logistics_code, waybill, create_time, pay_time, delivery_time, buyer_openid, shop_id, seller_id, amount, address_id, address, logistics_code, waybill,
finish_time, update_time, share_record_id, `state` create_time, pay_time, delivery_time, finish_time, update_time, share_record_id,
`state`
</sql> </sql>
<select id="selectByExample" parameterType="com.wwdz.ch.db.domain.distribution.DistributionOrderExample" resultMap="BaseResultMap"> <select id="selectByExample" parameterType="com.wwdz.ch.db.domain.distribution.DistributionOrderExample" resultMap="BaseResultMap">
select select
...@@ -118,9 +122,10 @@ ...@@ -118,9 +122,10 @@
</foreach> </foreach>
</when> </when>
<otherwise> <otherwise>
id, distribution_order_id, item_id, item_num, buyer_id, shop_id, seller_id, amount, id, distribution_order_id, prepay_id, transaction_id, item_id, item_num, buyer_id,
address_id, address, logistics_code, waybill, create_time, pay_time, delivery_time, buyer_openid, shop_id, seller_id, amount, address_id, address, logistics_code,
finish_time, update_time, share_record_id, `state` waybill, create_time, pay_time, delivery_time, finish_time, update_time, share_record_id,
`state`
</otherwise> </otherwise>
</choose> </choose>
from distribution_order from distribution_order
...@@ -151,9 +156,10 @@ ...@@ -151,9 +156,10 @@
</foreach> </foreach>
</when> </when>
<otherwise> <otherwise>
id, distribution_order_id, item_id, item_num, buyer_id, shop_id, seller_id, amount, id, distribution_order_id, prepay_id, transaction_id, item_id, item_num, buyer_id,
address_id, address, logistics_code, waybill, create_time, pay_time, delivery_time, buyer_openid, shop_id, seller_id, amount, address_id, address, logistics_code,
finish_time, update_time, share_record_id, `state` waybill, create_time, pay_time, delivery_time, finish_time, update_time, share_record_id,
`state`
</otherwise> </otherwise>
</choose> </choose>
from distribution_order from distribution_order
...@@ -173,15 +179,17 @@ ...@@ -173,15 +179,17 @@
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID() SELECT LAST_INSERT_ID()
</selectKey> </selectKey>
insert into distribution_order (distribution_order_id, item_id, item_num, insert into distribution_order (distribution_order_id, prepay_id, transaction_id,
buyer_id, shop_id, seller_id, item_id, item_num, buyer_id,
buyer_openid, shop_id, seller_id,
amount, address_id, address, amount, address_id, address,
logistics_code, waybill, create_time, logistics_code, waybill, create_time,
pay_time, delivery_time, finish_time, pay_time, delivery_time, finish_time,
update_time, share_record_id, `state` update_time, share_record_id, `state`
) )
values (#{distributionOrderId,jdbcType=VARCHAR}, #{itemId,jdbcType=BIGINT}, #{itemNum,jdbcType=INTEGER}, values (#{distributionOrderId,jdbcType=VARCHAR}, #{prepayId,jdbcType=VARCHAR}, #{transactionId,jdbcType=VARCHAR},
#{buyerId,jdbcType=BIGINT}, #{shopId,jdbcType=BIGINT}, #{sellerId,jdbcType=BIGINT}, #{itemId,jdbcType=BIGINT}, #{itemNum,jdbcType=INTEGER}, #{buyerId,jdbcType=BIGINT},
#{buyerOpenid,jdbcType=VARCHAR}, #{shopId,jdbcType=BIGINT}, #{sellerId,jdbcType=BIGINT},
#{amount,jdbcType=BIGINT}, #{addressId,jdbcType=BIGINT}, #{address,jdbcType=VARCHAR}, #{amount,jdbcType=BIGINT}, #{addressId,jdbcType=BIGINT}, #{address,jdbcType=VARCHAR},
#{logisticsCode,jdbcType=VARCHAR}, #{waybill,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{logisticsCode,jdbcType=VARCHAR}, #{waybill,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP},
#{payTime,jdbcType=TIMESTAMP}, #{deliveryTime,jdbcType=TIMESTAMP}, #{finishTime,jdbcType=TIMESTAMP}, #{payTime,jdbcType=TIMESTAMP}, #{deliveryTime,jdbcType=TIMESTAMP}, #{finishTime,jdbcType=TIMESTAMP},
...@@ -197,6 +205,12 @@ ...@@ -197,6 +205,12 @@
<if test="distributionOrderId != null"> <if test="distributionOrderId != null">
distribution_order_id, distribution_order_id,
</if> </if>
<if test="prepayId != null">
prepay_id,
</if>
<if test="transactionId != null">
transaction_id,
</if>
<if test="itemId != null"> <if test="itemId != null">
item_id, item_id,
</if> </if>
...@@ -206,6 +220,9 @@ ...@@ -206,6 +220,9 @@
<if test="buyerId != null"> <if test="buyerId != null">
buyer_id, buyer_id,
</if> </if>
<if test="buyerOpenid != null">
buyer_openid,
</if>
<if test="shopId != null"> <if test="shopId != null">
shop_id, shop_id,
</if> </if>
...@@ -253,6 +270,12 @@ ...@@ -253,6 +270,12 @@
<if test="distributionOrderId != null"> <if test="distributionOrderId != null">
#{distributionOrderId,jdbcType=VARCHAR}, #{distributionOrderId,jdbcType=VARCHAR},
</if> </if>
<if test="prepayId != null">
#{prepayId,jdbcType=VARCHAR},
</if>
<if test="transactionId != null">
#{transactionId,jdbcType=VARCHAR},
</if>
<if test="itemId != null"> <if test="itemId != null">
#{itemId,jdbcType=BIGINT}, #{itemId,jdbcType=BIGINT},
</if> </if>
...@@ -262,6 +285,9 @@ ...@@ -262,6 +285,9 @@
<if test="buyerId != null"> <if test="buyerId != null">
#{buyerId,jdbcType=BIGINT}, #{buyerId,jdbcType=BIGINT},
</if> </if>
<if test="buyerOpenid != null">
#{buyerOpenid,jdbcType=VARCHAR},
</if>
<if test="shopId != null"> <if test="shopId != null">
#{shopId,jdbcType=BIGINT}, #{shopId,jdbcType=BIGINT},
</if> </if>
...@@ -321,6 +347,12 @@ ...@@ -321,6 +347,12 @@
<if test="record.distributionOrderId != null"> <if test="record.distributionOrderId != null">
distribution_order_id = #{record.distributionOrderId,jdbcType=VARCHAR}, distribution_order_id = #{record.distributionOrderId,jdbcType=VARCHAR},
</if> </if>
<if test="record.prepayId != null">
prepay_id = #{record.prepayId,jdbcType=VARCHAR},
</if>
<if test="record.transactionId != null">
transaction_id = #{record.transactionId,jdbcType=VARCHAR},
</if>
<if test="record.itemId != null"> <if test="record.itemId != null">
item_id = #{record.itemId,jdbcType=BIGINT}, item_id = #{record.itemId,jdbcType=BIGINT},
</if> </if>
...@@ -330,6 +362,9 @@ ...@@ -330,6 +362,9 @@
<if test="record.buyerId != null"> <if test="record.buyerId != null">
buyer_id = #{record.buyerId,jdbcType=BIGINT}, buyer_id = #{record.buyerId,jdbcType=BIGINT},
</if> </if>
<if test="record.buyerOpenid != null">
buyer_openid = #{record.buyerOpenid,jdbcType=VARCHAR},
</if>
<if test="record.shopId != null"> <if test="record.shopId != null">
shop_id = #{record.shopId,jdbcType=BIGINT}, shop_id = #{record.shopId,jdbcType=BIGINT},
</if> </if>
...@@ -381,9 +416,12 @@ ...@@ -381,9 +416,12 @@
update distribution_order update distribution_order
set id = #{record.id,jdbcType=INTEGER}, set id = #{record.id,jdbcType=INTEGER},
distribution_order_id = #{record.distributionOrderId,jdbcType=VARCHAR}, distribution_order_id = #{record.distributionOrderId,jdbcType=VARCHAR},
prepay_id = #{record.prepayId,jdbcType=VARCHAR},
transaction_id = #{record.transactionId,jdbcType=VARCHAR},
item_id = #{record.itemId,jdbcType=BIGINT}, item_id = #{record.itemId,jdbcType=BIGINT},
item_num = #{record.itemNum,jdbcType=INTEGER}, item_num = #{record.itemNum,jdbcType=INTEGER},
buyer_id = #{record.buyerId,jdbcType=BIGINT}, buyer_id = #{record.buyerId,jdbcType=BIGINT},
buyer_openid = #{record.buyerOpenid,jdbcType=VARCHAR},
shop_id = #{record.shopId,jdbcType=BIGINT}, shop_id = #{record.shopId,jdbcType=BIGINT},
seller_id = #{record.sellerId,jdbcType=BIGINT}, seller_id = #{record.sellerId,jdbcType=BIGINT},
amount = #{record.amount,jdbcType=BIGINT}, amount = #{record.amount,jdbcType=BIGINT},
...@@ -408,6 +446,12 @@ ...@@ -408,6 +446,12 @@
<if test="distributionOrderId != null"> <if test="distributionOrderId != null">
distribution_order_id = #{distributionOrderId,jdbcType=VARCHAR}, distribution_order_id = #{distributionOrderId,jdbcType=VARCHAR},
</if> </if>
<if test="prepayId != null">
prepay_id = #{prepayId,jdbcType=VARCHAR},
</if>
<if test="transactionId != null">
transaction_id = #{transactionId,jdbcType=VARCHAR},
</if>
<if test="itemId != null"> <if test="itemId != null">
item_id = #{itemId,jdbcType=BIGINT}, item_id = #{itemId,jdbcType=BIGINT},
</if> </if>
...@@ -417,6 +461,9 @@ ...@@ -417,6 +461,9 @@
<if test="buyerId != null"> <if test="buyerId != null">
buyer_id = #{buyerId,jdbcType=BIGINT}, buyer_id = #{buyerId,jdbcType=BIGINT},
</if> </if>
<if test="buyerOpenid != null">
buyer_openid = #{buyerOpenid,jdbcType=VARCHAR},
</if>
<if test="shopId != null"> <if test="shopId != null">
shop_id = #{shopId,jdbcType=BIGINT}, shop_id = #{shopId,jdbcType=BIGINT},
</if> </if>
...@@ -465,9 +512,12 @@ ...@@ -465,9 +512,12 @@
<update id="updateByPrimaryKey" parameterType="com.wwdz.ch.db.domain.distribution.DistributionOrder"> <update id="updateByPrimaryKey" parameterType="com.wwdz.ch.db.domain.distribution.DistributionOrder">
update distribution_order update distribution_order
set distribution_order_id = #{distributionOrderId,jdbcType=VARCHAR}, set distribution_order_id = #{distributionOrderId,jdbcType=VARCHAR},
prepay_id = #{prepayId,jdbcType=VARCHAR},
transaction_id = #{transactionId,jdbcType=VARCHAR},
item_id = #{itemId,jdbcType=BIGINT}, item_id = #{itemId,jdbcType=BIGINT},
item_num = #{itemNum,jdbcType=INTEGER}, item_num = #{itemNum,jdbcType=INTEGER},
buyer_id = #{buyerId,jdbcType=BIGINT}, buyer_id = #{buyerId,jdbcType=BIGINT},
buyer_openid = #{buyerOpenid,jdbcType=VARCHAR},
shop_id = #{shopId,jdbcType=BIGINT}, shop_id = #{shopId,jdbcType=BIGINT},
seller_id = #{sellerId,jdbcType=BIGINT}, seller_id = #{sellerId,jdbcType=BIGINT},
amount = #{amount,jdbcType=BIGINT}, amount = #{amount,jdbcType=BIGINT},
...@@ -517,9 +567,10 @@ ...@@ -517,9 +567,10 @@
</foreach> </foreach>
</when> </when>
<otherwise> <otherwise>
id, distribution_order_id, item_id, item_num, buyer_id, shop_id, seller_id, amount, id, distribution_order_id, prepay_id, transaction_id, item_id, item_num, buyer_id,
address_id, address, logistics_code, waybill, create_time, pay_time, delivery_time, buyer_openid, shop_id, seller_id, amount, address_id, address, logistics_code,
finish_time, update_time, share_record_id, `state` waybill, create_time, pay_time, delivery_time, finish_time, update_time, share_record_id,
`state`
</otherwise> </otherwise>
</choose> </choose>
from distribution_order from distribution_order
......
...@@ -63,16 +63,16 @@ ...@@ -63,16 +63,16 @@
<!--生成Model类存放位置--> <!--生成Model类存放位置-->
<javaModelGenerator targetPackage="com.wwdz.ch.db.domain" targetProject="ch-dao/src/main/java"> <javaModelGenerator targetPackage="com.wwdz.ch.db.domain.distribution" targetProject="ch-dao/src/main/java">
<property name="enableSubPackages" value="true"/> <property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/> <property name="trimStrings" value="true"/>
</javaModelGenerator> </javaModelGenerator>
<sqlMapGenerator targetPackage="com.wwdz.ch.db.mapper" targetProject="ch-dao/src/main/resources"/> <sqlMapGenerator targetPackage="com.wwdz.ch.db.mapper.distribution" targetProject="ch-dao/src/main/resources"/>
<javaClientGenerator type="XMLMAPPER" targetPackage="com.wwdz.ch.db.mapper" <javaClientGenerator type="XMLMAPPER" targetPackage="com.wwdz.ch.db.mapper.distribution"
targetProject="ch-dao/src/main/java"/> targetProject="ch-dao/src/main/java"/>
<table tableName="return_order" enableCountByExample="true" enableUpdateByExample="true" enableDeleteByExample="true" enableSelectByExample="true" selectByExampleQueryId="true"> <table tableName="distribution_order" enableCountByExample="true" enableUpdateByExample="true" enableDeleteByExample="true" enableSelectByExample="true" selectByExampleQueryId="true">
<generatedKey column="id" sqlStatement="Mysql" identity="true" /> <generatedKey column="id" sqlStatement="Mysql" identity="true" />
</table> </table>
......
...@@ -5,6 +5,7 @@ import com.wechat.pay.java.core.notification.NotificationParser; ...@@ -5,6 +5,7 @@ import com.wechat.pay.java.core.notification.NotificationParser;
import com.wechat.pay.java.core.notification.RequestParam; import com.wechat.pay.java.core.notification.RequestParam;
import com.wechat.pay.java.service.payments.model.Transaction; import com.wechat.pay.java.service.payments.model.Transaction;
import com.wwdz.ch.core.util.RedisUtils; import com.wwdz.ch.core.util.RedisUtils;
import com.wwdz.ch.db.dao.distribution.DistributionOrderDao;
import com.xxdxxs.utils.JsonUtils; import com.xxdxxs.utils.JsonUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -35,6 +36,9 @@ public class WxPayCallbackController { ...@@ -35,6 +36,9 @@ public class WxPayCallbackController {
@Autowired @Autowired
RSAAutoCertificateConfig rsaAutoCertificateConfig; RSAAutoCertificateConfig rsaAutoCertificateConfig;
@Autowired
DistributionOrderDao distributionOrderDao;
@RequestMapping(value ="/getPayNotify") @RequestMapping(value ="/getPayNotify")
public synchronized String payNotify(HttpServletRequest request) throws IOException { public synchronized String payNotify(HttpServletRequest request) throws IOException {
logger.info("------------------ 收到微信支付回调通知 ------------------"); logger.info("------------------ 收到微信支付回调通知 ------------------");
......
...@@ -2,6 +2,7 @@ package com.wwdz.ch.wx.impl.distribution; ...@@ -2,6 +2,7 @@ package com.wwdz.ch.wx.impl.distribution;
import com.alibaba.dubbo.config.annotation.Reference; import com.alibaba.dubbo.config.annotation.Reference;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.wwdz.ch.core.api.wxpay.WxPayServiceApi;
import com.wwdz.ch.core.consts.ConsignSaleEnum; import com.wwdz.ch.core.consts.ConsignSaleEnum;
import com.wwdz.ch.core.consts.DistributionEnum; import com.wwdz.ch.core.consts.DistributionEnum;
import com.wwdz.ch.core.consts.LogisticsEnum; import com.wwdz.ch.core.consts.LogisticsEnum;
...@@ -53,18 +54,35 @@ public class DistributionOrderServiceImpl implements DistributionOrderService { ...@@ -53,18 +54,35 @@ public class DistributionOrderServiceImpl implements DistributionOrderService {
@Autowired @Autowired
SupplierItemDao supplierItemDao; SupplierItemDao supplierItemDao;
@Autowired
WxPayServiceApi wxPayServiceApi;
@Override @Override
public Result createDistributionOrder(DistributionOrderRequestDto dto) { public Result createDistributionOrder(DistributionOrderRequestDto dto) {
try { try {
//调用微信接口,预支付下单,获取预付单号
String shareRecordId = dto.getShareRecordId(); String shareRecordId = dto.getShareRecordId();
//查询分享记录详细信息 //查询分享记录详细信息
DistributorShareRecord distributorShareRecord = distributorShareRecordDao.findById(shareRecordId); DistributorShareRecord distributorShareRecord = distributorShareRecordDao.findById(shareRecordId);
DistributionOrder distributionOrder = new DistributionOrder();
String distributionOrderId = IdUtils.getOrderNumber(DISTRIBUTION_ORDER_PREFIX); String distributionOrderId = IdUtils.getOrderNumber(DISTRIBUTION_ORDER_PREFIX);
DistributionOrderRequestDto prePayDto = new DistributionOrderRequestDto();
prePayDto.setDistributionOrderId(distributionOrderId);
prePayDto.setAmount(String.valueOf(distributorShareRecord.getPrice() * dto.getItemNum()));
prePayDto.setBuyerOpenid(dto.getBuyerOpenid());
//查询商品信息
SupplierItem supplierItem = supplierItemDao.findById(distributorShareRecord.getItemId());
prePayDto.setItemName(supplierItem.getName());
Result prePayResult = wxPayServiceApi.createPrepareOrder(prePayDto);
if (!prePayResult.getSuccess()) {
return Result.failed("预下单失败");
}
String prepayId = (String) prePayResult.getData();
DistributionOrder distributionOrder = new DistributionOrder();
distributionOrder.setItemId(distributorShareRecord.getItemId()); distributionOrder.setItemId(distributorShareRecord.getItemId());
distributionOrder.setItemNum(dto.getItemNum()); distributionOrder.setItemNum(dto.getItemNum());
distributionOrder.setShareRecordId(distributorShareRecord.getShareId()); distributionOrder.setShareRecordId(distributorShareRecord.getShareId());
distributionOrder.setDistributionOrderId(distributionOrderId); distributionOrder.setDistributionOrderId(distributionOrderId);
distributionOrder.setPrepayId(prepayId);
distributionOrder.setBuyerId(dto.getBuyerId()); distributionOrder.setBuyerId(dto.getBuyerId());
distributionOrder.setShopId(distributorShareRecord.getShopId()); distributionOrder.setShopId(distributorShareRecord.getShopId());
distributionOrder.setSellerId(distributorShareRecord.getDistributorId()); distributionOrder.setSellerId(distributorShareRecord.getDistributorId());
...@@ -79,7 +97,7 @@ public class DistributionOrderServiceImpl implements DistributionOrderService { ...@@ -79,7 +97,7 @@ public class DistributionOrderServiceImpl implements DistributionOrderService {
} catch (Exception e) { } catch (Exception e) {
logger.error("创建分销订单失败 error : {}", e); logger.error("创建分销订单失败 error : {}", e);
} }
return Result.failed(); return Result.failed("分销订单下单失败");
} }
@Override @Override
...@@ -88,11 +106,6 @@ public class DistributionOrderServiceImpl implements DistributionOrderService { ...@@ -88,11 +106,6 @@ public class DistributionOrderServiceImpl implements DistributionOrderService {
} }
@Override
public Result getParamForPay(DistributionOrderRequestDto dto) {
return null;
}
@Override @Override
public Result cancel(DistributionOrderRequestDto dto) { public Result cancel(DistributionOrderRequestDto dto) {
try { try {
...@@ -161,16 +174,16 @@ public class DistributionOrderServiceImpl implements DistributionOrderService { ...@@ -161,16 +174,16 @@ public class DistributionOrderServiceImpl implements DistributionOrderService {
//供货价 //供货价
Long distributionTotalPrice = supplierItem.getDistributionPrice() * distributionOrder.getItemNum(); Long distributionTotalPrice = supplierItem.getDistributionPrice() * distributionOrder.getItemNum();
distributionOrderDetailVo.setDistributionPrice(PriceUtil.convertPrice(distributionTotalPrice)); distributionOrderDetailVo.setDistributionPrice(PriceUtil.convertPrice(distributionTotalPrice));
distributionOrderDetailVo.setChannelCost("千分之6"); distributionOrderDetailVo.setChannelCost("6‰");
//通道费 //通道费
double channelCost = distributionOrder.getAmount().doubleValue() * 0.006; double channelCost = distributionOrder.getAmount().doubleValue() * 0.006;
if (channelCost < 1) { if (channelCost < 1) {
channelCost = 0; channelCost = 0;
} }
distributionOrderDetailVo.setChannelCost(String.valueOf(channelCost)); distributionOrderDetailVo.setChannelCost(PriceUtil.convertDoubleToString(channelCost));
//利润 //利润
Double profit = distributionOrder.getAmount().doubleValue() - distributionTotalPrice.doubleValue() - channelCost; Double profit = distributionOrder.getAmount().doubleValue() - distributionTotalPrice.doubleValue() - channelCost;
distributionOrderDetailVo.setProfit(PriceUtil.convertPriceFromStr(profit.toString()).toString()); distributionOrderDetailVo.setProfit(PriceUtil.convertDoubleToString(profit));
return Result.success(distributionOrderDetailVo); return Result.success(distributionOrderDetailVo);
} catch (Exception e) { } catch (Exception e) {
logger.error("查询分销商订单详情失败 error : {}", e); logger.error("查询分销商订单详情失败 error : {}", e);
......
...@@ -13,14 +13,6 @@ public interface DistributionOrderService { ...@@ -13,14 +13,6 @@ public interface DistributionOrderService {
Result createDistributionOrder(DistributionOrderRequestDto dto); Result createDistributionOrder(DistributionOrderRequestDto dto);
/**
* 支付接口需要的参数:签名等
* @param dto
* @return
*/
Result getParamForPay(DistributionOrderRequestDto dto);
/** /**
* 完成支付后修改订单状态 * 完成支付后修改订单状态
* @param dto * @param dto
......
...@@ -38,8 +38,7 @@ public class DistributionOrderController { ...@@ -38,8 +38,7 @@ public class DistributionOrderController {
Validator validator = new Validator(FormHandler.ofEntity(dto)); Validator validator = new Validator(FormHandler.ofEntity(dto));
validator.set("shareRecordId", "分销分享记录id").must().string() validator.set("shareRecordId", "分销分享记录id").must().string()
.set("buyerId", "买方id").must().number() .set("buyerId", "买方id").must().number()
.set("distributorId", "分销商id").must().number() .set("buyerOpenId", "买方微信openid").must().number()
.set("shopId", "分销商店铺id").must().number()
.end(); .end();
if (!validator.isValid()) { if (!validator.isValid()) {
return Result.failed(validator.getErrorInfo()); return Result.failed(validator.getErrorInfo());
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment