记得上下班打卡 | git大法好,push需谨慎
Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
liquidnet-bus-v1
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
董敬伟
liquidnet-bus-v1
Commits
90b5e63c
Commit
90b5e63c
authored
Jul 29, 2024
by
姜秀龙
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'dev_alipay_applet' into 'master'
1.0 支付宝相关功能 See merge request
!363
parents
8ad52480
0a1032f0
Changes
19
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
393 additions
and
41 deletions
+393
-41
DragonConstant.java
...com/liquidnet/service/dragon/constant/DragonConstant.java
+3
-2
DragonPayBaseReqDto.java
...com/liquidnet/service/dragon/dto/DragonPayBaseReqDto.java
+2
-0
DragonPayBaseRespDto.java
...om/liquidnet/service/dragon/dto/DragonPayBaseRespDto.java
+4
-1
PayDataVo.java
.../com/liquidnet/service/kylin/dto/vo/middle/PayDataVo.java
+1
-0
AbstractRedisUtil.java
....liquidnet.common.cache/redis/util/AbstractRedisUtil.java
+1
-3
application-test.yml
liquidnet-bus-config/liquidnet-config/application-test.yml
+5
-1
pom.xml
...uidnet-service-order/liquidnet-service-order-impl/pom.xml
+1
-1
AlipayBiz.java
...iquidnet/service/dragon/channel/alipay/biz/AlipayBiz.java
+65
-11
AlipayTradePayReq.java
.../service/dragon/channel/alipay/req/AlipayTradePayReq.java
+1
-0
AbstractAlipayStrategy.java
.../channel/alipay/strategy/impl/AbstractAlipayStrategy.java
+1
-1
AlipayStrategyAppletImpl.java
...hannel/alipay/strategy/impl/AlipayStrategyAppletImpl.java
+56
-0
PayChannelStrategyAlipayImpl.java
...n/channel/strategy/impl/PayChannelStrategyAlipayImpl.java
+19
-4
DragonOrderRefundsServiceImpl.java
...ce/dragon/service/impl/DragonOrderRefundsServiceImpl.java
+50
-14
DragonOrdersServiceImpl.java
.../service/dragon/service/impl/DragonOrdersServiceImpl.java
+12
-2
PayAlipayUtils.java
...va/com/liquidnet/service/dragon/utils/PayAlipayUtils.java
+29
-0
pom.xml
liquidnet-bus-service/liquidnet-service-sweet/pom.xml
+5
-1
PayAlipayUtils.java
...va/com/liquidnet/service/sweet/config/PayAlipayUtils.java
+45
-0
SweetAppletLoginController.java
.../service/sweet/controller/SweetAppletLoginController.java
+36
-0
SweetAppletServiceImpl.java
...et/service/sweet/service/impl/SweetAppletServiceImpl.java
+57
-0
No files found.
liquidnet-bus-api/liquidnet-service-dragon-api/src/main/java/com/liquidnet/service/dragon/constant/DragonConstant.java
View file @
90b5e63c
...
@@ -20,7 +20,7 @@ public class DragonConstant {
...
@@ -20,7 +20,7 @@ public class DragonConstant {
public
static
final
String
REFUND_TYPE_APPLETB_WEPAY
=
"APPLETBWEPAY"
;
//,"微信小程序B");
public
static
final
String
REFUND_TYPE_APPLETB_WEPAY
=
"APPLETBWEPAY"
;
//,"微信小程序B");
public
static
final
String
REFUND_TYPE_MICROPAY_WEPAY
=
"MICROPAYWEPAY"
;
//,"扫码枪微信支付");
public
static
final
String
REFUND_TYPE_MICROPAY_WEPAY
=
"MICROPAYWEPAY"
;
//,"扫码枪微信支付");
public
static
final
String
REFUND_TYPE_MICROPAY_ALIPAY
=
"MICROPAYALIPAY"
;
//,"扫码枪微信支付");
public
static
final
String
REFUND_TYPE_MICROPAY_ALIPAY
=
"MICROPAYALIPAY"
;
//,"扫码枪微信支付");
public
static
final
String
REFUND_TYPE_APPLET_ALIPAY
=
"APPLETALIPAY"
;
//,"支付宝小程序");
public
static
final
String
REFUND_REDIS_KET
=
"dragon:refund:refundCode:"
;
// 订单号对应回调地址
public
static
final
String
REFUND_REDIS_KET
=
"dragon:refund:refundCode:"
;
// 订单号对应回调地址
public
static
final
String
ORDERCODE_REDIS_KET
=
"dragon:refund:orderCode:"
;
// 退款订单号对应 支付订单号
public
static
final
String
ORDERCODE_REDIS_KET
=
"dragon:refund:orderCode:"
;
// 退款订单号对应 支付订单号
...
@@ -191,7 +191,8 @@ public class DragonConstant {
...
@@ -191,7 +191,8 @@ public class DragonConstant {
PAYMENT_TYPE_MICROPAY_WEPAY
(
"MICROPAYWEPAY"
,
"wepay"
,
"micropay"
,
"微信扫码枪支付"
),
PAYMENT_TYPE_MICROPAY_WEPAY
(
"MICROPAYWEPAY"
,
"wepay"
,
"micropay"
,
"微信扫码枪支付"
),
PAYMENT_TYPE_APPLET_DOUYINPAY
(
"APPLETDOUYINPAY"
,
"douyinpay"
,
"applet"
,
"抖音小程序"
),
PAYMENT_TYPE_APPLET_DOUYINPAY
(
"APPLETDOUYINPAY"
,
"douyinpay"
,
"applet"
,
"抖音小程序"
),
PAYMENT_TYPE_WAP_UNIONPAY
(
"WAPUNIONPAY"
,
"unionpay"
,
"wap"
,
"银联wap支付"
),
PAYMENT_TYPE_WAP_UNIONPAY
(
"WAPUNIONPAY"
,
"unionpay"
,
"wap"
,
"银联wap支付"
),
PAYMENT_TYPE_APP_UNIONPAY
(
"APPUNIONPAY"
,
"unionpay"
,
"wap"
,
"银联wap支付"
);
PAYMENT_TYPE_APP_UNIONPAY
(
"APPUNIONPAY"
,
"unionpay"
,
"wap"
,
"银联wap支付"
),
PAYMENT_TYPE_APPLET_ALIPAY
(
"APPLETALIPAY"
,
"alipay"
,
"applet"
,
"支付宝小程序"
);
private
String
code
;
private
String
code
;
private
String
message
;
private
String
message
;
...
...
liquidnet-bus-api/liquidnet-service-dragon-api/src/main/java/com/liquidnet/service/dragon/dto/DragonPayBaseReqDto.java
View file @
90b5e63c
...
@@ -40,6 +40,8 @@ public class DragonPayBaseReqDto implements Serializable, Cloneable{
...
@@ -40,6 +40,8 @@ public class DragonPayBaseReqDto implements Serializable, Cloneable{
private
String
receiptData
;
private
String
receiptData
;
//苹果的stransactionId
//苹果的stransactionId
private
String
transactionId
;
private
String
transactionId
;
//
private
String
buyerOpenId
;
private
String
appIdType
=
""
;
private
String
appIdType
=
""
;
...
...
liquidnet-bus-api/liquidnet-service-dragon-api/src/main/java/com/liquidnet/service/dragon/dto/DragonPayBaseRespDto.java
View file @
90b5e63c
...
@@ -42,7 +42,8 @@ public class DragonPayBaseRespDto implements Serializable {
...
@@ -42,7 +42,8 @@ public class DragonPayBaseRespDto implements Serializable {
//为了应对扫码支付错误码信息
//为了应对扫码支付错误码信息
private
String
msg
;
private
String
msg
;
//支付宝小程序tradeNo
private
String
tradeNo
;
@Data
@Data
@JsonInclude
(
JsonInclude
.
Include
.
NON_NULL
)
@JsonInclude
(
JsonInclude
.
Include
.
NON_NULL
)
...
@@ -75,5 +76,7 @@ public class DragonPayBaseRespDto implements Serializable {
...
@@ -75,5 +76,7 @@ public class DragonPayBaseRespDto implements Serializable {
private
String
orderId
;
private
String
orderId
;
private
String
orderToken
;
private
String
orderToken
;
private
String
tradeNo
;
}
}
}
}
liquidnet-bus-api/liquidnet-service-kylin-api/src/main/java/com/liquidnet/service/kylin/dto/vo/middle/PayDataVo.java
View file @
90b5e63c
...
@@ -25,6 +25,7 @@ public class PayDataVo implements Serializable {
...
@@ -25,6 +25,7 @@ public class PayDataVo implements Serializable {
private
String
orderStr
;
private
String
orderStr
;
private
String
orderId
;
private
String
orderId
;
private
String
orderToken
;
private
String
orderToken
;
private
String
tradeNo
;
public
String
getOrderToken
()
{
public
String
getOrderToken
()
{
return
orderToken
==
null
?
""
:
orderToken
;
return
orderToken
==
null
?
""
:
orderToken
;
...
...
liquidnet-bus-common/liquidnet-common-cache/liquidnet-common-cache-redis/src/main/java/com.liquidnet.common.cache/redis/util/AbstractRedisUtil.java
View file @
90b5e63c
...
@@ -816,9 +816,7 @@ public abstract class AbstractRedisUtil {
...
@@ -816,9 +816,7 @@ public abstract class AbstractRedisUtil {
public
static
void
main
(
String
[]
args
)
{
public
static
void
main
(
String
[]
args
)
{
String
[]
keys
=
{
String
[]
keys
=
{
"test:goblin:erp:push:order:0"
,
"adam:info:user:2371873704685404165798043"
"test:goblin:erp:push:order:1"
,
"test:goblin:erp:push:order:2"
,
};
};
for
(
String
key
:
keys
)
{
for
(
String
key
:
keys
)
{
long
value
=
key
.
hashCode
();
long
value
=
key
.
hashCode
();
...
...
liquidnet-bus-config/liquidnet-config/application-test.yml
View file @
90b5e63c
...
@@ -245,5 +245,9 @@ liquidnet:
...
@@ -245,5 +245,9 @@ liquidnet:
erp
:
erp
:
wdt
:
wdt
:
url
:
https://sandbox.wangdian.cn/openapi2/
url
:
https://sandbox.wangdian.cn/openapi2/
alipay
:
applet
:
appId
:
2021002131608679
pubKey
:
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAph6mXcV8gPoEE6ZJJiaSk6x6jwWThLuzHDpZ9CMreZrMRUkGrV0WC920Ktp0tGlpo+BNfF+yBrapTAM8Y0Ztz5XcZWnx7gsfcsV48GHJ09qWbkJfXaBY30iX6O6q59jqWJMITQKz6OLL6HL3wxhoXooKHjXamQ983RTsI6wT4nWsTtBp8mTXCY+8XOQ4rw87AeHHetIoAtogk8H2etKgu1nDaQGXaA+ng+khab+b42pZSBX5g6jWlNCZviAoiy7e3upyu/6lqOhuLDEYzxD0i0oZ/46oIsILvEBCYQvXpbEz8KAM8dD5RBylNSpbu2edrrhytCq+0HFA4f1yp2D7WQIDAQAB
privateKey
:
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCR3u0lL7LvLHK0VG8/FXcA6hjLC+oY4ra/zqs7QRg4EVR8GGQ1G3hg5av6LJxBN5lR07ONYojAOgzmxkoPdM4+aTn9XMfk2sAWen7RMMNcdpyx1eNdCFlm1GzT419CXkIS0Z+gUsxF+PasGamjzfB/Lg66DNZ1zHh1YPa/hwt4KKO1YHiReBCO0hLo7/uGTFUdfzB9pCUIzOTQwaYJPqRc0pz0/9MSF65K/Qtc9lqFpsVXmcWQOZZjoDJGIH6XEbyWXzMRPy5MLryvF3s6ZNURuU7j8t16DVkUTx3p+bEm2U3GmL5btltiouduPUBXHZjRUWAAyFVzc9EMQDQDA89rAgMBAAECggEAQPEHkQuoVPTr6D7C/EnZHk4aVaNrSEL+62veLdYwKx4EB+9wBXjCYhk+NHXR5vMSziw6/tIEYdg2UDOtWy48d+qvB45b7BY7eIZ2mTllcG/aGQ5JV+zUqIQgI0FR8qE2N1yd/Wl/ShOp9jrCnIud63Ec21XF0NIEOvW9RM2hnI+G6YLT9j3NbvJvB4zS7U7tejEXfDP1Oxtjk0ba7Qq04yYdeX16TOrs8VTpAzrj+xW/VJDLBoDfgLvE2G/PqhpFOFfH5V6zKTYfk9VQLh1H9dTj1CkFgRHEJfrFc7XcIIb9nxjnV5JXZmcPjmErQUg1t8JLzjJuQIvzCda5Ba9JEQKBgQDL+iSWlSfyJQyx283VIjhIJ3w9ZRAIWsm/Z1205tdnBeFAzsiItLamASf7Y1zMIMYxFyUD41npFUqetjzdxVHiWlOg2/cE7t2SQWbfrbgqwG0z23If4jUdIj3CJq9yLVWAXvvvm/I/Zrj4oGycYkWV0eGZwoAqIIHIOmTPslacUwKBgQC3Eve/jAHkcgCRppwvDvrw9AYKd6rrs9dyCcsj7Zz2sT7CTw89JcjmjwsLx5+v+zSGgkceG21uIusAfWoAbAYadIGP7zCOBWGVdFvt5hqqKtwL7sLdWrauKw5NId8SlVu0Jvy2dVjzyJ3jfYj1tXt/kCNLgf0zL4yZ+q9G+KBdiQKBgQCkNcSu1XVLIziNFv8lzl6w99i1NF8r2qsARB7UO+K9NaaZnd8i7xj7m4Kshtl2HAxyCMfr0WPYmSNxkhR+FRROvZkFrw+2EPaff7dp61iQUkmXrdq6gElyItbFLo+fw49JwS3hQBJNqEzRG5VUcGjErCqKtmKnh3Pz1c7CxjejsQKBgEbJ6cxCGdU4k6m+D7ROiY+z+8X+YbPEFXF+AfOBhGkLPiYqJc1SF+22r+G9La0BaFz+cPteRaEJlW7aD6vcGTwPgq2iIlc4E3STypwhlnvoGK/wgZ7P3cVY1q3ShAwOfqgZTyxKEbwp/YsiVlwT8Y3wsQUYXUx2fVpoyW+a4X9pAoGBAIQSQ/Dig/6kU7yb9F4uFYVGnrArQk9bFC3tXe1rgyw6nUq5txAmc6ovvrmCVMilQ2nfYuzAtuKy6ouf71u+nTDaTV9LxGOxKzSDu+58R8qZrzcnSerfPivocWmlpN5mse45RVRnlw3EvObCwKE3zkDYKk5PgxKsmLrLAgaF4CGg
#application-test-end
#application-test-end
\ No newline at end of file
liquidnet-bus-service/liquidnet-service-order/liquidnet-service-order-impl/pom.xml
View file @
90b5e63c
...
@@ -44,7 +44,7 @@
...
@@ -44,7 +44,7 @@
<dependency>
<dependency>
<groupId>
com.alipay.sdk
</groupId>
<groupId>
com.alipay.sdk
</groupId>
<artifactId>
alipay-sdk-java
</artifactId>
<artifactId>
alipay-sdk-java
</artifactId>
<version>
4.
15.6
.ALL
</version>
<version>
4.
39.52
.ALL
</version>
</dependency>
</dependency>
<dependency>
<dependency>
<groupId>
com.liquidnet
</groupId>
<groupId>
com.liquidnet
</groupId>
...
...
liquidnet-bus-service/liquidnet-service-order/liquidnet-service-order-impl/src/main/java/com/liquidnet/service/dragon/channel/alipay/biz/AlipayBiz.java
View file @
90b5e63c
...
@@ -3,19 +3,15 @@ package com.liquidnet.service.dragon.channel.alipay.biz;
...
@@ -3,19 +3,15 @@ package com.liquidnet.service.dragon.channel.alipay.biz;
import
com.alibaba.fastjson.JSONObject
;
import
com.alibaba.fastjson.JSONObject
;
import
com.alipay.api.AlipayApiException
;
import
com.alipay.api.AlipayApiException
;
import
com.alipay.api.AlipayClient
;
import
com.alipay.api.AlipayClient
;
import
com.alipay.api.request.AlipayTradeAppPayRequest
;
import
com.alipay.api.domain.AlipayTradeCreateModel
;
import
com.alipay.api.request.AlipayTradePayRequest
;
import
com.alipay.api.request.*
;
import
com.alipay.api.request.AlipayTradeQueryRequest
;
import
com.alipay.api.response.*
;
import
com.alipay.api.request.AlipayTradeWapPayRequest
;
import
com.alipay.api.response.AlipayTradeAppPayResponse
;
import
com.alipay.api.response.AlipayTradePayResponse
;
import
com.alipay.api.response.AlipayTradeQueryResponse
;
import
com.alipay.api.response.AlipayTradeWapPayResponse
;
import
com.fasterxml.jackson.core.type.TypeReference
;
import
com.fasterxml.jackson.core.type.TypeReference
;
import
com.liquidnet.commons.lang.util.JsonUtils
;
import
com.liquidnet.commons.lang.util.JsonUtils
;
import
com.liquidnet.commons.lang.util.StringUtil
;
import
com.liquidnet.commons.lang.util.StringUtil
;
import
com.liquidnet.service.dragon.channel.alipay.req.AlipayTradePayReq
;
import
com.liquidnet.service.dragon.channel.alipay.req.AlipayTradePayReq
;
import
com.liquidnet.service.dragon.channel.alipay.sign.MD5
;
import
com.liquidnet.service.dragon.channel.alipay.sign.MD5
;
import
com.liquidnet.service.dragon.constant.DragonConstant
;
import
com.liquidnet.service.dragon.utils.ObjectUtilDragon
;
import
com.liquidnet.service.dragon.utils.ObjectUtilDragon
;
import
com.liquidnet.service.dragon.utils.PayAlipayUtils
;
import
com.liquidnet.service.dragon.utils.PayAlipayUtils
;
import
lombok.extern.slf4j.Slf4j
;
import
lombok.extern.slf4j.Slf4j
;
...
@@ -185,17 +181,75 @@ public class AlipayBiz{
...
@@ -185,17 +181,75 @@ public class AlipayBiz{
return
resultJSON
;
return
resultJSON
;
}
}
}
}
/**
* 支付宝小程序支付
* @author zjp
* @param alipayTradePayReq
* @return: java.util.Map<java.lang.String,java.lang.Object>
* @date 2024/4/26 13:35
*/
public
static
Map
<
String
,
Object
>
tradeAppletPay
(
AlipayTradePayReq
alipayTradePayReq
)
{
log
.
info
(
"AlipayUtil.tradeAppletPay-->> req : {}"
,
alipayTradePayReq
.
toString
());
String
timeExpress
=
"5m"
;
// 支付超时,线下扫码交易定义为5分钟
AlipayClient
httpClientApplet
=
PayAlipayUtils
.
getInstance
().
getHttpClientApplet
();
// 构造请求参数以调用接口
AlipayTradeCreateRequest
request
=
new
AlipayTradeCreateRequest
();
//回调函数
request
.
setNotifyUrl
(
alipayTradePayReq
.
getNotifyUrl
());
AlipayTradeCreateModel
model
=
new
AlipayTradeCreateModel
();
// 设置商户订单号
model
.
setOutTradeNo
(
alipayTradePayReq
.
getOutTradeNo
());
// 设置订单总金额
model
.
setTotalAmount
(
alipayTradePayReq
.
getTotalAmount
().
toString
());
// 设置订单标题
model
.
setSubject
(
alipayTradePayReq
.
getSubject
());
// 设置订单相对超时时间
model
.
setTimeoutExpress
(
timeExpress
);
// uid参数未来计划废弃,存量商户可继续使用,新商户请使用openid。请根据应用-开发配置-openid配置选择支持的字段。
model
.
setBuyerOpenId
(
alipayTradePayReq
.
getOpenId
());
// 设置产品码
model
.
setProductCode
(
alipayTradePayReq
.
getProductCode
());
log
.
info
(
"BizModel :{}"
,
JSONObject
.
toJSONString
(
model
));
request
.
setBizModel
(
model
);
try
{
AlipayTradeCreateResponse
response
=
httpClientApplet
.
execute
(
request
);
log
.
info
(
"AlipayUtil-->tradeAppletPay-->支付宝返回结果:{}"
,
response
.
getBody
());
if
(
response
.
isSuccess
()){
Map
<
String
,
Object
>
responseJSON
=
JsonUtils
.
fromJson
(
JsonUtils
.
toJson
(
response
),
new
TypeReference
<
Map
<
String
,
Object
>>()
{
});
return
responseJSON
;
}
else
{
JSONObject
resultJSON
=
new
JSONObject
();
resultJSON
.
put
(
"outTradeNo"
,
alipayTradePayReq
.
getOutTradeNo
());
resultJSON
.
put
(
"totalAmount"
,
alipayTradePayReq
.
getTotalAmount
().
toString
());
resultJSON
.
put
(
"errorCode"
,
"9999"
);
return
resultJSON
;
}
}
catch
(
AlipayApiException
e
)
{
log
.
error
(
"支付宝小程序支付异常:{}"
,
e
);
JSONObject
resultJSON
=
new
JSONObject
();
resultJSON
.
put
(
"outTradeNo"
,
alipayTradePayReq
.
getOutTradeNo
());
resultJSON
.
put
(
"totalAmount"
,
alipayTradePayReq
.
getTotalAmount
().
toString
());
resultJSON
.
put
(
"errorCode"
,
"9999"
);
return
resultJSON
;
}
}
/**
/**
* 订单查询
* 订单查询
*
*
* @return
* @return
*/
*/
public
static
Map
<
String
,
Object
>
tradeQuery
(
String
outTradeNo
)
{
public
static
Map
<
String
,
Object
>
tradeQuery
(
String
outTradeNo
,
String
paymentType
)
{
log
.
info
(
"AlipayBiz.tradeQuery-->> 支付宝交易查询"
);
log
.
info
(
"AlipayBiz.tradeQuery-->> 支付宝交易查询"
);
AlipayClient
alipayClient
=
PayAlipayUtils
.
getInstance
().
getHttpClient
();
AlipayClient
alipayClient
;
if
(
StringUtil
.
isNotEmpty
(
paymentType
)&&
paymentType
.
equals
(
DragonConstant
.
PayTypeEnum
.
PAYMENT_TYPE_APPLET_ALIPAY
.
getCode
())){
//支付宝小程序
alipayClient
=
PayAlipayUtils
.
getInstance
().
getHttpClientApplet
();
}
else
{
alipayClient
=
PayAlipayUtils
.
getInstance
().
getHttpClient
();
}
SortedMap
<
String
,
Object
>
bizContentMap
=
new
TreeMap
<>();
SortedMap
<
String
,
Object
>
bizContentMap
=
new
TreeMap
<>();
bizContentMap
.
put
(
"out_trade_no"
,
outTradeNo
);
bizContentMap
.
put
(
"out_trade_no"
,
outTradeNo
);
AlipayTradeQueryRequest
request
=
new
AlipayTradeQueryRequest
();
AlipayTradeQueryRequest
request
=
new
AlipayTradeQueryRequest
();
...
...
liquidnet-bus-service/liquidnet-service-order/liquidnet-service-order-impl/src/main/java/com/liquidnet/service/dragon/channel/alipay/req/AlipayTradePayReq.java
View file @
90b5e63c
...
@@ -27,6 +27,7 @@ public class AlipayTradePayReq implements Serializable, Cloneable{
...
@@ -27,6 +27,7 @@ public class AlipayTradePayReq implements Serializable, Cloneable{
private
String
notifyUrl
;
private
String
notifyUrl
;
private
String
timestamp
;
private
String
timestamp
;
private
String
authCode
;
private
String
authCode
;
private
String
openId
;
@Override
@Override
public
String
toString
(){
public
String
toString
(){
return
JSON
.
toJSONString
(
this
);
return
JSON
.
toJSONString
(
this
);
...
...
liquidnet-bus-service/liquidnet-service-order/liquidnet-service-order-impl/src/main/java/com/liquidnet/service/dragon/channel/alipay/strategy/impl/AbstractAlipayStrategy.java
View file @
90b5e63c
...
@@ -52,7 +52,7 @@ public abstract class AbstractAlipayStrategy implements IAlipayStrategy {
...
@@ -52,7 +52,7 @@ public abstract class AbstractAlipayStrategy implements IAlipayStrategy {
alipayTradePayReq
.
setNotifyUrl
(
this
.
getNotifyUrl
());
alipayTradePayReq
.
setNotifyUrl
(
this
.
getNotifyUrl
());
alipayTradePayReq
.
setTimestamp
(
dragonPayBaseReqDto
.
getCreateDate
());
alipayTradePayReq
.
setTimestamp
(
dragonPayBaseReqDto
.
getCreateDate
());
alipayTradePayReq
.
setAuthCode
(
dragonPayBaseReqDto
.
getAuthCode
());
alipayTradePayReq
.
setAuthCode
(
dragonPayBaseReqDto
.
getAuthCode
());
alipayTradePayReq
.
setOpenId
(
dragonPayBaseReqDto
.
getOpenId
());
//调用支付
//调用支付
long
startTime
=
System
.
currentTimeMillis
();
long
startTime
=
System
.
currentTimeMillis
();
Map
<
String
,
Object
>
result
=
this
.
executePay
(
alipayTradePayReq
);
Map
<
String
,
Object
>
result
=
this
.
executePay
(
alipayTradePayReq
);
...
...
liquidnet-bus-service/liquidnet-service-order/liquidnet-service-order-impl/src/main/java/com/liquidnet/service/dragon/channel/alipay/strategy/impl/AlipayStrategyAppletImpl.java
0 → 100644
View file @
90b5e63c
package
com
.
liquidnet
.
service
.
dragon
.
channel
.
alipay
.
strategy
.
impl
;
import
com.liquidnet.service.dragon.channel.alipay.biz.AlipayBiz
;
import
com.liquidnet.service.dragon.channel.alipay.req.AlipayTradePayReq
;
import
com.liquidnet.service.dragon.channel.alipay.strategy.annotation.StrategyAlipayHandler
;
import
com.liquidnet.service.dragon.constant.DragonConstant
;
import
com.liquidnet.service.dragon.dto.DragonPayBaseRespDto
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.data.redis.core.StringRedisTemplate
;
import
org.springframework.stereotype.Component
;
import
java.util.Map
;
/**
* 支付宝小程序
* @author zjp
* @param null
* @return: null
* @date 2024/4/26 13:29
*/
@Slf4j
@Component
@StrategyAlipayHandler
(
DragonConstant
.
DeviceFromEnum
.
APPLET
)
public
class
AlipayStrategyAppletImpl
extends
AbstractAlipayStrategy
{
@Value
(
"${liquidnet.dragon.url}"
)
private
String
notifyUrl
;
@Autowired
StringRedisTemplate
stringRedisTemplate
;
@Autowired
private
AlipayBiz
alipayBiz
;
@Override
protected
Map
<
String
,
Object
>
executePay
(
AlipayTradePayReq
alipayTradePayReq
)
{
return
alipayBiz
.
tradeAppletPay
(
alipayTradePayReq
);
}
protected
void
setProductCode
()
{
this
.
productCode
=
"JSAPI_PAY"
;
}
@Override
protected
String
getNotifyUrl
()
{
return
notifyUrl
+
"/notify/alipay/applet"
;
}
@Override
DragonPayBaseRespDto
buildResponseDto
(
DragonPayBaseRespDto
payBaseRespDto
,
Map
<
String
,
Object
>
respResult
)
{
payBaseRespDto
.
getPayData
().
setTradeNo
(
respResult
.
get
(
"tradeNo"
)!=
null
?
respResult
.
get
(
"tradeNo"
).
toString
():
""
);
return
payBaseRespDto
;
}
}
liquidnet-bus-service/liquidnet-service-order/liquidnet-service-order-impl/src/main/java/com/liquidnet/service/dragon/channel/strategy/impl/PayChannelStrategyAlipayImpl.java
View file @
90b5e63c
...
@@ -72,6 +72,8 @@ public class PayChannelStrategyAlipayImpl extends AbstractPayChannelStrategyImpl
...
@@ -72,6 +72,8 @@ public class PayChannelStrategyAlipayImpl extends AbstractPayChannelStrategyImpl
private
String
signtType
;
private
String
signtType
;
@Value
(
"${liquidnet.dragon.alipay.charset}"
)
@Value
(
"${liquidnet.dragon.alipay.charset}"
)
private
String
charset
;
private
String
charset
;
@Value
(
"${liquidnet.alipay.applet.pubKey}"
)
private
String
appletMerchantPubKey
;
@Override
@Override
public
ResponseDto
<
DragonPayBaseRespDto
>
dragonPay
(
DragonPayBaseReqDto
dragonPayBaseReqDto
)
{
public
ResponseDto
<
DragonPayBaseRespDto
>
dragonPay
(
DragonPayBaseReqDto
dragonPayBaseReqDto
)
{
...
@@ -99,7 +101,12 @@ public class PayChannelStrategyAlipayImpl extends AbstractPayChannelStrategyImpl
...
@@ -99,7 +101,12 @@ public class PayChannelStrategyAlipayImpl extends AbstractPayChannelStrategyImpl
//退款
//退款
if
(
notifyMap
.
containsKey
(
"refund_fee"
)
||
notifyMap
.
containsKey
(
"gmt_refund"
)
||
notifyMap
.
containsKey
(
"out_biz_no"
))
{
if
(
notifyMap
.
containsKey
(
"refund_fee"
)
||
notifyMap
.
containsKey
(
"gmt_refund"
)
||
notifyMap
.
containsKey
(
"out_biz_no"
))
{
returnStr
=
dragonOrderRefundsService
.
aliPayRefundCallBack
(
JSON
.
toJSONString
(
notifyMap
));
//小程序退款不需要退款回调,手动修改退款状态
if
(!(
payType
.
equals
(
DragonConstant
.
PayChannelEnum
.
ALIPAY
.
getCode
())
&&
deviceFrom
.
equals
(
DragonConstant
.
DeviceFromEnum
.
APPLET
.
getCode
()))){
returnStr
=
dragonOrderRefundsService
.
aliPayRefundCallBack
(
JSON
.
toJSONString
(
notifyMap
),
null
);
}
else
{
returnStr
=
"success"
;
}
return
returnStr
;
return
returnStr
;
}
}
...
@@ -114,10 +121,18 @@ public class PayChannelStrategyAlipayImpl extends AbstractPayChannelStrategyImpl
...
@@ -114,10 +121,18 @@ public class PayChannelStrategyAlipayImpl extends AbstractPayChannelStrategyImpl
}
}
try
{
try
{
if
(
AlipaySignature
.
rsaCheckV1
(
notifyMap
,
merchantPubKey
,
"UTF-8"
,
"RSA2"
)){
boolean
signVerified
=
false
;
//支付宝验签
if
(
payType
.
equals
(
DragonConstant
.
PayChannelEnum
.
ALIPAY
.
getCode
())
&&
deviceFrom
.
equals
(
DragonConstant
.
DeviceFromEnum
.
APPLET
.
getCode
())){
//小程序
signVerified
=
AlipaySignature
.
rsaCheckV1
(
notifyMap
,
appletMerchantPubKey
,
"UTF-8"
,
"RSA2"
);
}
else
{
signVerified
=
AlipaySignature
.
rsaCheckV1
(
notifyMap
,
merchantPubKey
,
"UTF-8"
,
"RSA2"
);
}
if
(
signVerified
){
String
tradeStatus
=
notifyMap
.
get
(
"trade_status"
);
String
tradeStatus
=
notifyMap
.
get
(
"trade_status"
);
boolean
notifyResult
=
false
;
boolean
notifyResult
=
false
;
if
(
AlipayConstant
.
AlipayTradeStateEnum
.
TRADE_SUCCESS
.
name
().
equals
(
tradeStatus
)
if
(
AlipayConstant
.
AlipayTradeStateEnum
.
TRADE_SUCCESS
.
name
().
equals
(
tradeStatus
)
||
AlipayConstant
.
AlipayTradeStateEnum
.
TRADE_FINISHED
.
name
().
equals
(
tradeStatus
))
{
||
AlipayConstant
.
AlipayTradeStateEnum
.
TRADE_FINISHED
.
name
().
equals
(
tradeStatus
))
{
...
@@ -153,7 +168,7 @@ public class PayChannelStrategyAlipayImpl extends AbstractPayChannelStrategyImpl
...
@@ -153,7 +168,7 @@ public class PayChannelStrategyAlipayImpl extends AbstractPayChannelStrategyImpl
DragonPayOrderQueryRespDto respDto = alipayStrategyContext.getStrategy(DragonConstant.PayTypeEnum.getEnumByCode(ordersDto.getPaymentType()).getDeviceFrom()).checkOrderStatus(code);
DragonPayOrderQueryRespDto respDto = alipayStrategyContext.getStrategy(DragonConstant.PayTypeEnum.getEnumByCode(ordersDto.getPaymentType()).getDeviceFrom()).checkOrderStatus(code);
*/
*/
DragonOrdersDto
ordersDto
=
dataUtilsDragon
.
getPayOrderByCode
(
code
);
DragonOrdersDto
ordersDto
=
dataUtilsDragon
.
getPayOrderByCode
(
code
);
Map
<
String
,
Object
>
resultMap
=
alipayBiz
.
tradeQuery
(
code
);
Map
<
String
,
Object
>
resultMap
=
alipayBiz
.
tradeQuery
(
code
,
ordersDto
.
getPaymentType
()
);
DragonPayOrderQueryRespDto
respDto
=
dragonPayBiz
.
buildPayOrderQueryRespDto
(
ordersDto
);
DragonPayOrderQueryRespDto
respDto
=
dragonPayBiz
.
buildPayOrderQueryRespDto
(
ordersDto
);
if
(
"10000"
.
equals
(
resultMap
.
get
(
"code"
)))
{
if
(
"10000"
.
equals
(
resultMap
.
get
(
"code"
)))
{
// 当返回状态为“TRADE_FINISHED”交易成功结束和“TRADE_SUCCESS”支付成功时更新交易状态
// 当返回状态为“TRADE_FINISHED”交易成功结束和“TRADE_SUCCESS”支付成功时更新交易状态
...
...
liquidnet-bus-service/liquidnet-service-order/liquidnet-service-order-impl/src/main/java/com/liquidnet/service/dragon/service/impl/DragonOrderRefundsServiceImpl.java
View file @
90b5e63c
This diff is collapsed.
Click to expand it.
liquidnet-bus-service/liquidnet-service-order/liquidnet-service-order-impl/src/main/java/com/liquidnet/service/dragon/service/impl/DragonOrdersServiceImpl.java
View file @
90b5e63c
...
@@ -62,8 +62,9 @@ public class DragonOrdersServiceImpl implements IDragonOrdersService {
...
@@ -62,8 +62,9 @@ public class DragonOrdersServiceImpl implements IDragonOrdersService {
@Override
@Override
public
ResponseDto
<
DragonPayBaseRespDto
>
dragonPay
(
DragonPayBaseReqDto
dragonPayBaseReqDto
)
{
public
ResponseDto
<
DragonPayBaseRespDto
>
dragonPay
(
DragonPayBaseReqDto
dragonPayBaseReqDto
)
{
//service层进行效验
//service层进行效验
if
(!(
boolean
)
validateDragonPay
(
dragonPayBaseReqDto
).
get
(
"resultStatus"
)){
Map
map
=
validateDragonPay
(
dragonPayBaseReqDto
);
return
ResponseDto
.
failure
(
"微信支付openId不能为空!"
);
if
(!(
boolean
)
map
.
get
(
"resultStatus"
)){
return
ResponseDto
.
failure
(
map
.
get
(
"erro"
).
toString
());
}
}
//设置支付编号
//设置支付编号
if
(
dragonPayBaseReqDto
.
getDeviceFrom
().
equals
(
"appletb"
)){
if
(
dragonPayBaseReqDto
.
getDeviceFrom
().
equals
(
"appletb"
)){
...
@@ -87,6 +88,15 @@ public class DragonOrdersServiceImpl implements IDragonOrdersService {
...
@@ -87,6 +88,15 @@ public class DragonOrdersServiceImpl implements IDragonOrdersService {
}
}
}
}
}
}
if
(
dragonPayBaseReqDto
.
getPayType
().
equalsIgnoreCase
(
DragonConstant
.
PayChannelEnum
.
ALIPAY
.
getCode
()))
{
if
(
dragonPayBaseReqDto
.
getDeviceFrom
().
equalsIgnoreCase
(
DragonConstant
.
DeviceFromEnum
.
APPLET
.
getCode
()))
{
if
(
StringUtil
.
isEmpty
(
dragonPayBaseReqDto
.
getOpenId
()))
{
map
.
put
(
"resultStatus"
,
false
);
map
.
put
(
"erro"
,
"支付宝支付openId不能为空!"
);
return
map
;
}
}
}
if
(
StringUtil
.
isNotBlank
(
dragonPayBaseReqDto
.
getName
())&&
dragonPayBaseReqDto
.
getName
().
length
()>=
32
){
if
(
StringUtil
.
isNotBlank
(
dragonPayBaseReqDto
.
getName
())&&
dragonPayBaseReqDto
.
getName
().
length
()>=
32
){
dragonPayBaseReqDto
.
setName
(
dragonPayBaseReqDto
.
getName
().
substring
(
0
,
32
));
dragonPayBaseReqDto
.
setName
(
dragonPayBaseReqDto
.
getName
().
substring
(
0
,
32
));
}
}
...
...
liquidnet-bus-service/liquidnet-service-order/liquidnet-service-order-impl/src/main/java/com/liquidnet/service/dragon/utils/PayAlipayUtils.java
View file @
90b5e63c
...
@@ -2,7 +2,10 @@ package com.liquidnet.service.dragon.utils;
...
@@ -2,7 +2,10 @@ package com.liquidnet.service.dragon.utils;
import
com.alipay.api.AlipayClient
;
import
com.alipay.api.AlipayClient
;
import
com.alipay.api.DefaultAlipayClient
;
import
com.alipay.api.DefaultAlipayClient
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.context.annotation.Configuration
;
@Configuration
public
class
PayAlipayUtils
{
public
class
PayAlipayUtils
{
private
static
PayAlipayUtils
instance
=
new
PayAlipayUtils
();
private
static
PayAlipayUtils
instance
=
new
PayAlipayUtils
();
private
AlipayClient
httpClient
=
null
;
private
AlipayClient
httpClient
=
null
;
...
@@ -12,6 +15,24 @@ public class PayAlipayUtils {
...
@@ -12,6 +15,24 @@ public class PayAlipayUtils {
private
final
String
sign_type
=
"RSA2"
;
private
final
String
sign_type
=
"RSA2"
;
private
final
String
charset
=
"utf-8"
;
private
final
String
charset
=
"utf-8"
;
private
final
String
gatewayUrl
=
"https://openapi.alipay.com/gateway.do"
;
private
final
String
gatewayUrl
=
"https://openapi.alipay.com/gateway.do"
;
/*支付宝小程序*/
private
AlipayClient
httpClientApplet
=
null
;
private
static
String
appletMerchantPrivateKey
;
private
static
String
appletAppId
;
private
static
String
appletMerchantPubKey
;
@Value
(
"${liquidnet.alipay.applet.privateKey}"
)
public
void
setAppletMerchantPrivateKey
(
String
appletMerchantPrivateKey
)
{
PayAlipayUtils
.
appletMerchantPrivateKey
=
appletMerchantPrivateKey
;
}
@Value
(
"${liquidnet.alipay.applet.appId}"
)
public
void
setAppletAppId
(
String
appletAppId
)
{
PayAlipayUtils
.
appletAppId
=
appletAppId
;
}
@Value
(
"${liquidnet.alipay.applet.pubKey}"
)
public
void
setAppletMerchantPubKey
(
String
pubKey
)
{
PayAlipayUtils
.
appletMerchantPubKey
=
pubKey
;
}
public
PayAlipayUtils
()
{
public
PayAlipayUtils
()
{
...
@@ -28,4 +49,12 @@ public class PayAlipayUtils {
...
@@ -28,4 +49,12 @@ public class PayAlipayUtils {
}
}
return
httpClient
;
return
httpClient
;
}
}
public
AlipayClient
getHttpClientApplet
()
{
if
(
httpClientApplet
==
null
){
httpClientApplet
=
new
DefaultAlipayClient
(
gatewayUrl
,
appletAppId
,
appletMerchantPrivateKey
,
"json"
,
charset
,
appletMerchantPubKey
,
sign_type
);
}
return
httpClientApplet
;
}
}
}
liquidnet-bus-service/liquidnet-service-sweet/pom.xml
View file @
90b5e63c
...
@@ -33,7 +33,11 @@
...
@@ -33,7 +33,11 @@
<artifactId>
fastjson
</artifactId>
<artifactId>
fastjson
</artifactId>
<version>
1.2.73
</version>
<version>
1.2.73
</version>
</dependency>
</dependency>
<dependency>
<groupId>
com.alipay.sdk
</groupId>
<artifactId>
alipay-sdk-java
</artifactId>
<version>
4.39.52.ALL
</version>
</dependency>
<dependency>
<dependency>
<groupId>
com.liquidnet
</groupId>
<groupId>
com.liquidnet
</groupId>
...
...
liquidnet-bus-service/liquidnet-service-sweet/src/main/java/com/liquidnet/service/sweet/config/PayAlipayUtils.java
0 → 100644
View file @
90b5e63c
package
com
.
liquidnet
.
service
.
sweet
.
config
;
import
com.alipay.api.AlipayClient
;
import
com.alipay.api.DefaultAlipayClient
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.context.annotation.Configuration
;
@Configuration
public
class
PayAlipayUtils
{
private
static
PayAlipayUtils
instance
=
new
PayAlipayUtils
();
private
final
String
sign_type
=
"RSA2"
;
private
final
String
charset
=
"utf-8"
;
private
final
String
gatewayUrl
=
"https://openapi.alipay.com/gateway.do"
;
/*支付宝小程序*/
private
AlipayClient
httpClientApplet
=
null
;
private
static
String
appletMerchantPrivateKey
;
private
static
String
appletAppId
;
private
static
String
appletMerchantPubKey
;
@Value
(
"${liquidnet.alipay.applet.privateKey}"
)
public
void
setAppletMerchantPrivateKey
(
String
appletMerchantPrivateKey
)
{
PayAlipayUtils
.
appletMerchantPrivateKey
=
appletMerchantPrivateKey
;
}
@Value
(
"${liquidnet.alipay.applet.appId}"
)
public
void
setAppletAppId
(
String
appletAppId
)
{
PayAlipayUtils
.
appletAppId
=
appletAppId
;
}
@Value
(
"${liquidnet.alipay.applet.pubKey}"
)
public
void
setAppletMerchantPubKey
(
String
pubKey
)
{
PayAlipayUtils
.
appletMerchantPubKey
=
pubKey
;
}
public
PayAlipayUtils
()
{
}
public
static
PayAlipayUtils
getInstance
()
{
return
instance
;
}
public
AlipayClient
getHttpClientApplet
()
{
if
(
httpClientApplet
==
null
){
httpClientApplet
=
new
DefaultAlipayClient
(
gatewayUrl
,
appletAppId
,
appletMerchantPrivateKey
,
"json"
,
charset
,
appletMerchantPubKey
,
sign_type
);
}
return
httpClientApplet
;
}
}
liquidnet-bus-service/liquidnet-service-sweet/src/main/java/com/liquidnet/service/sweet/controller/SweetAppletLoginController.java
0 → 100644
View file @
90b5e63c
package
com
.
liquidnet
.
service
.
sweet
.
controller
;
import
com.liquidnet.service.base.ResponseDto
;
import
com.liquidnet.service.sweet.service.impl.SweetAppletServiceImpl
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiImplicitParam
;
import
io.swagger.annotations.ApiImplicitParams
;
import
io.swagger.annotations.ApiOperation
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestParam
;
import
org.springframework.web.bind.annotation.RestController
;
@Api
(
tags
=
"小程序-登陆相关"
)
@RestController
@RequestMapping
(
"/appletLogin"
)
@Slf4j
public
class
SweetAppletLoginController
{
@Autowired
private
SweetAppletServiceImpl
sweetAppletService
;
@ApiOperation
(
value
=
"获取小程序openId"
)
@GetMapping
(
"/findCode2openid"
)
@ApiImplicitParams
({
@ApiImplicitParam
(
type
=
"query"
,
dataType
=
"String"
,
name
=
"code"
,
value
=
"code"
,
required
=
true
),
@ApiImplicitParam
(
type
=
"query"
,
dataType
=
"String"
,
name
=
"type"
,
value
=
"alipay支付宝,wepay 微信"
)
})
public
ResponseDto
<
String
>
findCode2openid
(
@RequestParam
String
code
,
@RequestParam
String
type
)
{
return
sweetAppletService
.
findCode2openid
(
code
,
type
);
}
}
liquidnet-bus-service/liquidnet-service-sweet/src/main/java/com/liquidnet/service/sweet/service/impl/SweetAppletServiceImpl.java
0 → 100644
View file @
90b5e63c
package
com
.
liquidnet
.
service
.
sweet
.
service
.
impl
;
import
com.alipay.api.AlipayClient
;
import
com.alipay.api.request.AlipaySystemOauthTokenRequest
;
import
com.alipay.api.response.AlipaySystemOauthTokenResponse
;
import
com.baomidou.mybatisplus.core.toolkit.Wrappers
;
import
com.liquidnet.commons.lang.util.CollectionUtil
;
import
com.liquidnet.commons.lang.util.DateUtil
;
import
com.liquidnet.service.base.ResponseDto
;
import
com.liquidnet.service.kylin.dto.vo.middle.KylinTicketTimesVo
;
import
com.liquidnet.service.kylin.dto.vo.mongo.KylinPerformanceVo
;
import
com.liquidnet.service.sweet.config.PayAlipayUtils
;
import
com.liquidnet.service.sweet.entity.SweetRemind
;
import
com.liquidnet.service.sweet.vo.SweetWechatUsersVo
;
import
lombok.extern.slf4j.Slf4j
;
import
me.chanjar.weixin.mp.bean.template.WxMpTemplateData
;
import
me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.CollectionUtils
;
import
org.springframework.util.ObjectUtils
;
import
java.time.LocalDateTime
;
import
java.time.format.DateTimeFormatter
;
import
java.util.ArrayList
;
import
java.util.List
;
/**
* @author zjp
* @create 2024-04-25 15:47
*/
@Slf4j
@Service
public
class
SweetAppletServiceImpl
{
public
ResponseDto
findCode2openid
(
String
code
,
String
type
)
{
AlipayClient
httpClientApplet
=
PayAlipayUtils
.
getInstance
().
getHttpClientApplet
();
// 构造请求参数以调用接口
AlipaySystemOauthTokenRequest
request
=
new
AlipaySystemOauthTokenRequest
();
// 设置授权码
request
.
setCode
(
code
);
// 设置授权方式
request
.
setGrantType
(
"authorization_code"
);
try
{
AlipaySystemOauthTokenResponse
response
=
httpClientApplet
.
execute
(
request
);
log
.
info
(
"获取支付宝用户信息response=={}"
,
response
.
getBody
());
System
.
out
.
println
(
response
.
getBody
());
if
(
response
.
isSuccess
())
{
return
ResponseDto
.
success
(
response
.
getOpenId
());
}
else
{
return
ResponseDto
.
failure
(
"获取支付宝用户信息失败!"
);
}
}
catch
(
Exception
e
)
{
log
.
error
(
"获取支付宝用户信息失败exception={}"
,
e
);
return
ResponseDto
.
failure
(
"获取支付宝用户信息失败!"
);
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment