开源软件
企业版
特惠
高校版
博客
我的码云
··
8月18日(周六)成都源创会火热报名中,四位一线行业大牛与你面对面,探讨区块链技术热潮下的冷思考。
开源项目
>
WEB应用开发
>
Web开发框架
捐赠0
Watch157
Star321
Fork58
eric / simbaJava
代码
Issues
0
Pull Requests
0
附件
0
Wiki
0
统计
服务
一个基于spring boot + spring cloud的敏捷开发框架,一键生成CRUD及管理后台页面,后台管理系统使用Bootstrap开发,集成Redis实现分布式Session,集成Spring Cache,邮件,阿里OSS,极光推送,极光短信,微信公众号,微信硬件平台,Groovy,自动化部署服务器,微服务监控等Spring Cloud全家桶------可以关注微信公众号 Simba技术交流 不定期推送Simba框架的使用方法及设计思路,或者一些技术分享 如果有公司需要系统架构设计师证书挂靠的,也欢迎随时找我
680 次提交
1 个分支
0 个标签
0 个发行版
6 位贡献者
克隆/下载
master
simba
/
framework
/
simba-alipay
/
src
/
main
/
java
/
com
/
simba
/
alipay
/
util
/
AliPayUtil.java
一键复制
编辑
原始数据
按行查看
历史
AliPayUtil.java 18.00 KB →
loceme.student@163.com 提交于 23天前 . 支付宝企业支付
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
package
com
.
simba
.
alipay
.
util
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
javax.annotation.PostConstruct
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.commons.lang3.math.NumberUtils
;
import
org.apache.commons.logging.Log
;
import
org.apache.commons.logging.LogFactory
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.stereotype.Component
;
import
com.alipay.api.AlipayApiException
;
import
com.alipay.api.AlipayClient
;
import
com.alipay.api.DefaultAlipayClient
;
import
com.alipay.api.domain.AlipayTradeAppPayModel
;
import
com.alipay.api.internal.util.AlipaySignature
;
import
com.alipay.api.request.AlipayDataDataserviceBillDownloadurlQueryRequest
;
import
com.alipay.api.request.AlipayFundTransOrderQueryRequest
;
import
com.alipay.api.request.AlipayFundTransToaccountTransferRequest
;
import
com.alipay.api.request.AlipayTradeAppPayRequest
;
import
com.alipay.api.request.AlipayTradeCancelRequest
;
import
com.alipay.api.request.AlipayTradeCloseRequest
;
import
com.alipay.api.request.AlipayTradeCreateRequest
;
import
com.alipay.api.request.AlipayTradeFastpayRefundQueryRequest
;
import
com.alipay.api.request.AlipayTradeOrderSettleRequest
;
import
com.alipay.api.request.AlipayTradePayRequest
;
import
com.alipay.api.request.AlipayTradePrecreateRequest
;
import
com.alipay.api.request.AlipayTradeQueryRequest
;
import
com.alipay.api.request.AlipayTradeRefundRequest
;
import
com.alipay.api.response.AlipayDataDataserviceBillDownloadurlQueryResponse
;
import
com.alipay.api.response.AlipayFundTransOrderQueryResponse
;
import
com.alipay.api.response.AlipayFundTransToaccountTransferResponse
;
import
com.alipay.api.response.AlipayTradeAppPayResponse
;
import
com.alipay.api.response.AlipayTradeCancelResponse
;
import
com.alipay.api.response.AlipayTradeCloseResponse
;
import
com.alipay.api.response.AlipayTradeCreateResponse
;
import
com.alipay.api.response.AlipayTradeFastpayRefundQueryResponse
;
import
com.alipay.api.response.AlipayTradeOrderSettleResponse
;
import
com.alipay.api.response.AlipayTradePayResponse
;
import
com.alipay.api.response.AlipayTradePrecreateResponse
;
import
com.alipay.api.response.AlipayTradeQueryResponse
;
import
com.alipay.api.response.AlipayTradeRefundResponse
;
import
com.simba.alipay.cosntantData.AliPayConstantData
;
import
com.simba.alipay.model.CreateOrder
;
import
com.simba.alipay.model.EnterprisePay
;
import
com.simba.alipay.model.PayOrder
;
import
com.simba.alipay.model.Precreate
;
import
com.simba.alipay.model.RoyaltyParameter
;
import
com.simba.exception.BussException
;
import
com.simba.framework.util.json.FastJsonUtil
;
import
com.simba.model.constant.ConstantData
;
/**
* 阿里支付工具类
*
* @author caozhejun
*
*/
@Component
public
class
AliPayUtil
{
private
static
final
Log
logger
=
LogFactory
.
getLog
(
AliPayUtil
.
class
);
@Value
(
"${alipay.appid}"
)
private
String
appId
;
/**
* 应用的私钥
*/
@Value
(
"${alipay.private.key}"
)
private
String
privateKey
;
/**
* 支付宝的公钥
*/
@Value
(
"${alipay.public.key}"
)
private
String
publicKey
;
@Value
(
"${alipay.domain}"
)
private
String
domain
;
private
AlipayClient
alipayClient
;
/**
* 回调通知url
*/
private
String
callbackUrl
;
@PostConstruct
private
void
init
()
{
if
(
StringUtils
.
isEmpty
(
appId
)
||
StringUtils
.
isEmpty
(
privateKey
)
||
StringUtils
.
isEmpty
(
publicKey
)
||
StringUtils
.
isEmpty
(
domain
))
{
logger
.
warn
(
"没有配置阿里支付相关信息,不能使用阿里支付功能"
);
return
;
}
alipayClient
=
new
DefaultAlipayClient
(
AliPayConstantData
.
payUrl
,
appId
,
privateKey
,
AliPayConstantData
.
format
,
ConstantData
.
DEFAULT_CHARSET
,
publicKey
,
AliPayConstantData
.
signType
);
callbackUrl
=
domain
+
"/alipay/callback"
;
}
/**
* 交易查询(该接口提供所有支付宝支付订单的查询,商户可以通过该接口主动查询订单状态,完成下一步的业务逻辑。 需要调用查询接口的情况:
* 当商户后台、网络、服务器等出现异常,商户系统最终未接收到支付通知; 调用支付接口后,返回系统错误或未知交易状态情况;
* 调用alipay.trade.pay,返回INPROCESS的状态; 调用alipay.trade.cancel之前,需确认支付状态)
*
* @param out_trade_no
* 支付时传入的商户订单号,与trade_no必填一个
* @param trade_no
* 支付时返回的支付宝交易号,与out_trade_no必填一个
* @return
* @throws AlipayApiException
*/
public
AlipayTradeQueryResponse
query
(
String
out_trade_no
,
String
trade_no
)
throws
AlipayApiException
{
checkParams
(
out_trade_no
,
trade_no
);
AlipayTradeQueryRequest
request
=
new
AlipayTradeQueryRequest
();
// 创建API对应的request类
request
.
setBizContent
(
"{"
+
" \"out_trade_no\":\""
+
StringUtils
.
defaultString
(
out_trade_no
)
+
"\","
+
" \"trade_no\":\""
+
StringUtils
.
defaultString
(
trade_no
)
+
"\""
+
" }"
);
// 设置业务参数
AlipayTradeQueryResponse
response
=
alipayClient
.
execute
(
request
);
// 通过alipayClient调用API,获得对应的response类
logger
.
info
(
"交易查询返回结果:"
+
response
.
getBody
());
return
response
;
}
private
void
checkParams
(
String
out_trade_no
,
String
trade_no
)
{
if
(
StringUtils
.
isEmpty
(
out_trade_no
)
&&
StringUtils
.
isEmpty
(
trade_no
))
{
throw
new
BussException
(
"支付时传入的商户订单号和支付时返回的支付宝交易号不能同时为空"
);
}
}
/**
* 交易退款(当交易发生之后一段时间内,由于买家或者卖家的原因需要退款时,卖家可以通过退款接口将支付款退还给买家,支付宝将在收到退款请求并且验证成功之后,按照退款规则将支付款按原路退到买家帐号上。
* 交易超过约定时间(签约时设置的可退款时间)的订单无法进行退款
* 支付宝退款支持单笔交易分多次退款,多次退款需要提交原支付订单的商户订单号和设置不同的退款单号。一笔退款失败后重新提交,要采用原来的退款单号。总退款金额不能超过用户实际支付金额)
*
* @param out_trade_no
* 支付时传入的商户订单号,与trade_no必填一个
* @param trade_no
* 支付时返回的支付宝交易号,与out_trade_no必填一个
* @param out_request_no
* 本次退款请求流水号,部分退款时必传
* @param refund_amount
* 本次退款金额
* @return
* @throws AlipayApiException
*/
public
AlipayTradeRefundResponse
refund
(
String
out_trade_no
,
String
trade_no
,
String
out_request_no
,
String
refund_amount
)
throws
AlipayApiException
{
checkParams
(
out_trade_no
,
trade_no
);
AlipayTradeRefundRequest
request
=
new
AlipayTradeRefundRequest
();
// 创建API对应的request类
request
.
setBizContent
(
"{"
+
" \"out_trade_no\":\""
+
StringUtils
.
defaultString
(
out_trade_no
)
+
"\","
+
" \"trade_no\":\""
+
StringUtils
.
defaultString
(
trade_no
)
+
"\","
+
" \"out_request_no\":\""
+
StringUtils
.
defaultString
(
out_request_no
)
+
"\","
+
" \"refund_amount\":\""
+
StringUtils
.
defaultString
(
refund_amount
)
+
"\""
+
" }"
);
// 设置业务参数
AlipayTradeRefundResponse
response
=
alipayClient
.
execute
(
request
);
// 通过alipayClient调用API,获得对应的response类
logger
.
info
(
"交易退款返回结果:"
+
response
.
getBody
());
return
response
;
}
/**
* 查询对账单下载地址
*
* @param bill_date
* 需要下载的账单日期,最晚是当期日期的前一天
* @return
* @throws AlipayApiException
*/
public
AlipayDataDataserviceBillDownloadurlQueryResponse
billDown
(
String
bill_date
)
throws
AlipayApiException
{
AlipayDataDataserviceBillDownloadurlQueryRequest
request
=
new
AlipayDataDataserviceBillDownloadurlQueryRequest
();
// 创建API对应的request类
request
.
setBizContent
(
"{"
+
" \"bill_type\":\"trade\","
+
" \"bill_date\":\""
+
bill_date
+
"\""
+
" }"
);
// 设置业务参数
AlipayDataDataserviceBillDownloadurlQueryResponse
response
=
alipayClient
.
execute
(
request
);
logger
.
info
(
"查询对账单下载地址返回结果:"
+
response
.
getBody
());
return
response
;
}
/**
* 统一收单交易退款查询(商户可使用该接口查询自已通过alipay.trade.refund提交的退款请求是否执行成功。
* 该接口的返回码10000,仅代表本次查询操作成功,不代表退款成功。如果该接口返回了查询数据,则代表退款成功,如果没有查询到则代表未退款成功,可以调用退款接口进行重试。重试时请务必保证退款请求号一致)
*
* @param trade_no
* 支付宝交易号,和商户订单号不能同时为空
* @param out_trade_no
* 订单支付时传入的商户订单号,和支付宝交易号不能同时为空。
* trade_no,out_trade_no如果同时存在优先取trade_no
* @param out_request_no
* 请求退款接口时,传入的退款请求号,如果在退款请求时未传入,则该值为创建交易时的外部交易号
* @return
* @throws AlipayApiException
*/
public
AlipayTradeFastpayRefundQueryResponse
refundQuery
(
String
trade_no
,
String
out_trade_no
,
String
out_request_no
)
throws
AlipayApiException
{
AlipayTradeFastpayRefundQueryRequest
request
=
new
AlipayTradeFastpayRefundQueryRequest
();
request
.
setBizContent
(
"{"
+
"\"trade_no\":\""
+
StringUtils
.
defaultString
(
trade_no
)
+
"\","
+
"\"out_trade_no\":\""
+
StringUtils
.
defaultString
(
out_trade_no
)
+
"\","
+
"\"out_request_no\":\""
+
StringUtils
.
defaultString
(
out_request_no
)
+
"\""
+
" }"
);
AlipayTradeFastpayRefundQueryResponse
response
=
alipayClient
.
execute
(
request
);
logger
.
info
(
"统一收单交易退款查询返回结果:"
+
response
.
getBody
());
return
response
;
}
/**
* 统一收单交易结算(用于在线下场景交易支付后,进行结算)
*
* @param out_request_no
* 结算请求流水号 开发者自行生成并保证唯一性
* @param trade_no
* 支付宝订单号
* @param royalty_parameters
* 分账明细信息
* @param operator_id
* 操作员id
* @return
* @throws AlipayApiException
*/
public
AlipayTradeOrderSettleResponse
orderSettle
(
String
out_request_no
,
String
trade_no
,
List
<
RoyaltyParameter
>
royalty_parameters
,
String
operator_id
)
throws
AlipayApiException
{
AlipayTradeOrderSettleRequest
request
=
new
AlipayTradeOrderSettleRequest
();
request
.
setBizContent
(
"{"
+
"\"out_request_no\":\""
+
StringUtils
.
defaultString
(
out_request_no
)
+
"\","
+
"\"trade_no\":\""
+
StringUtils
.
defaultString
(
trade_no
)
+
"\","
+
" \"royalty_parameters\":"
+
FastJsonUtil
.
toJson
(
royalty_parameters
)
+
","
+
"\"operator_id\":\""
+
StringUtils
.
defaultString
(
operator_id
)
+
"\""
+
" }"
);
AlipayTradeOrderSettleResponse
response
=
alipayClient
.
execute
(
request
);
logger
.
info
(
"统一收单交易结算返回结果:"
+
response
.
getBody
());
return
response
;
}
/**
* 统一收单交易关闭(用于交易创建后,用户在一定时间内未进行支付,可调用该接口直接将未付款的交易进行关闭)
*
* @param out_trade_no
* 订单支付时传入的商户订单号,和支付宝交易号不能同时为空。
* trade_no,out_trade_no如果同时存在优先取trade_no
* @param trade_no
* 该交易在支付宝系统中的交易流水号。最短 16 位,最长 64 位。和out_trade_no不能同时为空,如果同时传了
* out_trade_no和 trade_no,则以 trade_no为准
* @param operator_id
* 卖家端自定义的的操作员 ID
* @return
* @throws AlipayApiException
*/
public
AlipayTradeCloseResponse
close
(
String
out_trade_no
,
String
trade_no
,
String
operator_id
)
throws
AlipayApiException
{
AlipayTradeCloseRequest
request
=
new
AlipayTradeCloseRequest
();
request
.
setBizContent
(
"{"
+
"\"trade_no\":\""
+
StringUtils
.
defaultString
(
trade_no
)
+
"\","
+
"\"out_trade_no\":\""
+
StringUtils
.
defaultString
(
out_trade_no
)
+
"\","
+
"\"operator_id\":\""
+
StringUtils
.
defaultString
(
operator_id
)
+
"\""
+
" }"
);
AlipayTradeCloseResponse
response
=
alipayClient
.
execute
(
request
);
logger
.
info
(
"统一收单交易关闭返回结果:"
+
response
.
getBody
());
return
response
;
}
/**
* 统一收单交易撤销(支付交易返回失败或支付系统超时,调用该接口撤销交易。如果此订单用户支付失败,支付宝系统会将此订单关闭;如果用户支付成功,支付宝系统会将此订单资金退还给用户。
* 注意:只有发生支付系统超时或者支付结果未知时可调用撤销,其他正常支付的单如需实现相同功能请调用申请退款API。提交支付交易后调用【查询订单API】,没有明确的支付结果再调用【撤销订单API】)
*
* @param out_trade_no
* 原支付请求的商户订单号,和支付宝交易号不能同时为空
* @param trade_no
* 支付宝交易号,和商户订单号不能同时为空
* @return
* @throws AlipayApiException
*/
public
AlipayTradeCancelResponse
cancel
(
String
out_trade_no
,
String
trade_no
)
throws
AlipayApiException
{
AlipayTradeCancelRequest
request
=
new
AlipayTradeCancelRequest
();
request
.
setBizContent
(
"{"
+
"\"out_trade_no\":\""
+
StringUtils
.
defaultString
(
out_trade_no
)
+
"\","
+
"\"trade_no\":\""
+
StringUtils
.
defaultString
(
trade_no
)
+
"\""
+
" }"
);
AlipayTradeCancelResponse
response
=
alipayClient
.
execute
(
request
);
logger
.
info
(
"统一收单交易撤销返回结果:"
+
response
.
getBody
());
return
response
;
}
/**
* 统一收单线下交易预创建(收银员通过收银台或商户后台调用支付宝接口,生成二维码后,展示给用户,由用户扫描二维码完成订单支付)
*
* @param precreate
* @return
* @throws AlipayApiException
*/
public
AlipayTradePrecreateResponse
precreate
(
Precreate
precreate
)
throws
AlipayApiException
{
AlipayTradePrecreateRequest
request
=
new
AlipayTradePrecreateRequest
();
request
.
setBizContent
(
FastJsonUtil
.
toJson
(
precreate
));
AlipayTradePrecreateResponse
response
=
alipayClient
.
execute
(
request
);
logger
.
info
(
"统一收单线下交易预创建返回结果:"
+
response
.
getBody
());
return
response
;
}
/**
* 统一收单交易创建(商户通过该接口进行交易的创建下单)
*
* @param order
* @return
* @throws AlipayApiException
*/
public
AlipayTradeCreateResponse
create
(
CreateOrder
order
)
throws
AlipayApiException
{
AlipayTradeCreateRequest
request
=
new
AlipayTradeCreateRequest
();
request
.
setBizContent
(
FastJsonUtil
.
toJson
(
order
));
AlipayTradeCreateResponse
response
=
alipayClient
.
execute
(
request
);
logger
.
info
(
"统一收单交易创建返回结果:"
+
response
.
getBody
());
return
response
;
}
/**
* 统一收单交易支付(收银员使用扫码设备读取用户手机支付宝“付款码”/声波获取设备(如麦克风)读取用户手机支付宝的声波信息后,将二维码或条码信息/声波信息通过本接口上送至支付宝发起支付)
*
* @param order
* @return
* @throws AlipayApiException
*/
public
AlipayTradePayResponse
pay
(
PayOrder
order
)
throws
AlipayApiException
{
AlipayTradePayRequest
request
=
new
AlipayTradePayRequest
();
request
.
setBizContent
(
FastJsonUtil
.
toJson
(
order
));
AlipayTradePayResponse
response
=
alipayClient
.
execute
(
request
);
logger
.
info
(
"统一收单交易支付返回结果:"
+
response
.
getBody
());
return
response
;
}
/**
* 生成APP支付订单
*
* @param model
* @return
* @throws AlipayApiException
*/
public
AlipayTradeAppPayResponse
appPay
(
AlipayTradeAppPayModel
model
)
throws
AlipayApiException
{
AlipayTradeAppPayRequest
request
=
new
AlipayTradeAppPayRequest
();
request
.
setBizModel
(
model
);
request
.
setNotifyUrl
(
callbackUrl
);
// 这里和普通的接口调用不同,使用的是sdkExecute
AlipayTradeAppPayResponse
response
=
alipayClient
.
sdkExecute
(
request
);
logger
.
info
(
"生成APP支付订单返回结果:"
+
response
.
getBody
());
// 就是orderString,可以直接给客户端请求,无需再做处理。
return
response
;
}
/**
* 检查支付宝支付回调通知的参数是否正确
*
* @param params
* @throws AlipayApiException
*/
public
void
checkSign
(
Map
<
String
,
String
>
params
)
throws
AlipayApiException
{
logger
.
info
(
"检查签名参数:"
+
params
.
toString
());
boolean
flag
=
AlipaySignature
.
rsaCheckV1
(
params
,
publicKey
,
ConstantData
.
DEFAULT_CHARSET
,
"RSA2"
);
if
(!
flag
)
{
throw
new
BussException
(
"支付宝支付回调url签名错误,可能有人攻击"
);
}
}
/**
* 单笔转账到支付宝账户接口
*
* @param enterprisePay
* @return
* @throws AlipayApiException
*/
public
AlipayFundTransToaccountTransferResponse
enterprisePay
(
EnterprisePay
enterprisePay
)
throws
AlipayApiException
{
String
amount
=
enterprisePay
.
getAmount
();
double
money
=
NumberUtils
.
toDouble
(
amount
)
/
100
;
amount
=
new
java
.
text
.
DecimalFormat
(
"0.00"
).
format
(
money
);
enterprisePay
.
setAmount
(
amount
);
AlipayFundTransToaccountTransferRequest
request
=
new
AlipayFundTransToaccountTransferRequest
();
request
.
setBizContent
(
FastJsonUtil
.
toJson
(
enterprisePay
));
return
alipayClient
.
execute
(
request
);
}
/**
* 按支付宝转账单据号查询转账订单接口
*
* @param orderId
* 支付宝转账单据号
* @return
* @throws AlipayApiException
*/
public
AlipayFundTransOrderQueryResponse
searchEnterprisePayByOrderId
(
String
orderId
)
throws
AlipayApiException
{
Map
<
String
,
String
>
param
=
new
HashMap
<>(
1
);
param
.
put
(
"order_id"
,
orderId
);
AlipayFundTransOrderQueryRequest
request
=
new
AlipayFundTransOrderQueryRequest
();
request
.
setBizContent
(
FastJsonUtil
.
toJson
(
param
));
return
alipayClient
.
execute
(
request
);
}
/**
* 按商户转账唯一订单号查询转账订单接口
*
* @param outBizNo
* 商户转账唯一订单号
* @return
* @throws AlipayApiException
*/
public
AlipayFundTransOrderQueryResponse
searchEnterprisePayByOutBizNo
(
String
outBizNo
)
throws
AlipayApiException
{
Map
<
String
,
String
>
param
=
new
HashMap
<>(
1
);
param
.
put
(
"out_biz_no"
,
outBizNo
);
AlipayFundTransOrderQueryRequest
request
=
new
AlipayFundTransOrderQueryRequest
();
request
.
setBizContent
(
FastJsonUtil
.
toJson
(
param
));
return
alipayClient
.
execute
(
request
);
}
}
评论 ( 0 )
评论
© Gitee.com
关于我们
使用条款
意见建议
合作伙伴
OpenAPI
Git 大全
帮助文档
APP与插件下载
更新日志
代码片段
码云封面人物
微信服务号
官方技术支持QQ群:655903986
码云Gitee
企业版售前及售后使用咨询:400-898-2008 转2
本站带宽由
提供
粤ICP备12009483号-8 深圳市奥思网络科技有限公司版权所有
简 体 /
繁 體 /
English
转载于:https://www.cnblogs.com/wangdaijun/p/9483439.html