Skip to content

Commit fe62fbf

Browse files
egzosnegzosn
authored andcommitted
支付宝转账,发红包实现,交易结算单自定义属性扩展
1 parent f586c6f commit fe62fbf

4 files changed

Lines changed: 173 additions & 75 deletions

File tree

pay-java-ali/src/main/java/com/egzosn/pay/ali/api/AliPayService.java

Lines changed: 72 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.alibaba.fastjson.JSONObject;
55
import com.egzosn.pay.ali.bean.AliPayMessage;
66
import com.egzosn.pay.ali.bean.AliTransactionType;
7+
import com.egzosn.pay.ali.bean.AliTransferType;
78
import com.egzosn.pay.ali.bean.OrderSettle;
89
import com.egzosn.pay.common.api.BasePayService;
910
import com.egzosn.pay.common.bean.*;
@@ -15,7 +16,7 @@
1516
import com.egzosn.pay.common.util.Util;
1617
import com.egzosn.pay.common.util.sign.SignUtils;
1718
import com.egzosn.pay.common.util.str.StringUtils;
18-
import java.math.BigDecimal;
19+
1920
import java.util.*;
2021

2122
/**
@@ -36,29 +37,37 @@ public class AliPayService extends BasePayService<AliPayConfigStorage> {
3637
* 沙箱测试环境账号
3738
*/
3839
private static final String DEV_REQ_URL = "https://openapi.alipaydev.com/gateway.do";
39-
40-
public static final String SIGN = "sign";
41-
42-
public static final String SUCCESS_CODE = "10000";
43-
44-
public static final String CODE = "code";
40+
41+
private static final String SIGN = "sign";
42+
43+
private static final String SUCCESS_CODE = "10000";
44+
45+
private static final String CODE = "code";
4546
/**
4647
* 附加参数
4748
*/
48-
public static final String PASSBACK_PARAMS = "passback_params";
49+
private static final String PASSBACK_PARAMS = "passback_params";
4950
/**
5051
* 产品代码
5152
*/
52-
public static final String PRODUCT_CODE = "product_code";
53+
private static final String PRODUCT_CODE = "product_code";
5354
/**
5455
* 返回地址
5556
*/
56-
public static final String RETURN_URL = "return_url";
57+
private static final String RETURN_URL = "return_url";
5758

5859
/**
5960
* 请求内容
6061
*/
61-
public static final String BIZ_CONTENT = "biz_content";
62+
private static final String BIZ_CONTENT = "biz_content";
63+
/**
64+
* 应用授权概述
65+
*/
66+
private static final String APP_AUTH_TOKEN = "app_auth_token";
67+
/**
68+
* 收款方信息
69+
*/
70+
private static final String PAYEE_INFO = "payee_info";
6271

6372
/**
6473
* 获取对应的请求地址
@@ -190,7 +199,7 @@ private Map<String, Object> getOrder(PayOrder order) {
190199

191200
orderInfo.put("notify_url", payConfigStorage.getNotifyUrl());
192201
orderInfo.put("format", "json");
193-
202+
setAppAuthToken(orderInfo, order.getAttrs());
194203

195204
Map<String, Object> bizContent = new TreeMap<>();
196205
bizContent.put("body", order.getBody());
@@ -230,8 +239,8 @@ private Map<String, Object> getOrder(PayOrder order) {
230239
if (null != order.getExpirationTime()) {
231240
bizContent.put(order.getTransactionType() == AliTransactionType.SWEEPPAY ? "qr_code_timeout_express" : "timeout_express", DateUtils.minutesRemaining(order.getExpirationTime()) + "m");
232241
}
242+
bizContent.putAll(order.getAttrs());
233243
orderInfo.put(BIZ_CONTENT, JSON.toJSONString(bizContent));
234-
orderInfo.putAll(order.getAttrs());
235244
return preOrderHandler(orderInfo, order);
236245
}
237246

@@ -360,7 +369,10 @@ public Map<String, Object> microPay(PayOrder order) {
360369
public Map<String, Object> settle(OrderSettle order){
361370
//获取公共参数
362371
Map<String, Object> parameters = getPublicParameters(AliTransactionType.SETTLE);
363-
parameters.put(BIZ_CONTENT, JSON.toJSONString(order.toBizContent()));
372+
setAppAuthToken(parameters, order.getAttrs());
373+
final Map<String, Object> bizContent = order.toBizContent();
374+
bizContent.putAll(order.getAttrs());
375+
parameters.put(BIZ_CONTENT, JSON.toJSONString(bizContent));
364376
//设置签名
365377
setSign(parameters);
366378
return getHttpRequestTemplate().postForObject(getReqUrl() + "?" + UriVariables.getMapToParameters(parameters), null, JSONObject.class);
@@ -408,21 +420,13 @@ public Map<String, Object> cancel(String tradeNo, String outTradeNo) {
408420
}
409421

410422
/**
411-
* 申请退款接口
412-
* 废弃
413-
*
414-
* @param tradeNo 支付平台订单号
415-
* @param outTradeNo 商户单号
416-
* @param refundAmount 退款金额
417-
* @param totalAmount 总金额
418-
* @return 返回支付方申请退款后的结果
419-
* @see #refund(RefundOrder, com.egzosn.pay.common.api.Callback)
420-
* @deprecated 版本替代 {@link #refund(RefundOrder, com.egzosn.pay.common.api.Callback)}
423+
* 设置支付宝授权Token
424+
* @param parameters 参数
425+
* @param attrs 订单属性
426+
* @return 参数
421427
*/
422-
@Deprecated
423-
@Override
424-
public Map<String, Object> refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount) {
425-
return refund(new RefundOrder(tradeNo, outTradeNo, refundAmount, totalAmount));
428+
private void setAppAuthToken(Map<String, Object> parameters, Map<String, Object> attrs) {
429+
setParameters(parameters, APP_AUTH_TOKEN, (String) attrs.remove(APP_AUTH_TOKEN));
426430
}
427431

428432

@@ -436,30 +440,21 @@ public Map<String, Object> refund(String tradeNo, String outTradeNo, BigDecimal
436440
public Map<String, Object> refund(RefundOrder refundOrder) {
437441
//获取公共参数
438442
Map<String, Object> parameters = getPublicParameters(AliTransactionType.REFUND);
439-
443+
setAppAuthToken(parameters, refundOrder.getAttrs());
440444
Map<String, Object> bizContent = getBizContent(refundOrder.getTradeNo(), refundOrder.getOutTradeNo(), null);
441445
if (!StringUtils.isEmpty(refundOrder.getRefundNo())) {
442446
bizContent.put("out_request_no", refundOrder.getRefundNo());
443447
}
444448
bizContent.put("refund_amount", Util.conversionAmount(refundOrder.getRefundAmount()));
449+
bizContent.putAll(refundOrder.getAttrs());
445450
//设置请求参数的集合
446451
parameters.put(BIZ_CONTENT, JSON.toJSONString(bizContent));
447452
//设置签名
448453
setSign(parameters);
449454
return requestTemplate.getForObject(getReqUrl() + "?" + UriVariables.getMapToParameters(parameters), JSONObject.class);
450455
}
451456

452-
/**
453-
* 查询退款
454-
*
455-
* @param tradeNo 支付平台订单号
456-
* @param outTradeNo 商户单号
457-
* @return 返回支付方查询退款后的结果
458-
*/
459-
@Override
460-
public Map<String, Object> refundquery(String tradeNo, String outTradeNo) {
461-
return secondaryInterface(tradeNo, outTradeNo, AliTransactionType.REFUNDQUERY);
462-
}
457+
463458

464459
/**
465460
* 查询退款
@@ -469,17 +464,16 @@ public Map<String, Object> refundquery(String tradeNo, String outTradeNo) {
469464
*/
470465
@Override
471466
public Map<String, Object> refundquery(RefundOrder refundOrder) {
472-
473467
//获取公共参数
474468
Map<String, Object> parameters = getPublicParameters(AliTransactionType.REFUNDQUERY);
475-
469+
setAppAuthToken(parameters, refundOrder.getAttrs());
476470
Map<String, Object> bizContent = getBizContent(refundOrder.getTradeNo(), refundOrder.getOutTradeNo(), null);
477471
if (!StringUtils.isEmpty(refundOrder.getRefundNo())) {
478472
bizContent.put("out_request_no", refundOrder.getRefundNo());
479473
}
474+
bizContent.putAll(refundOrder.getAttrs());
480475
//设置请求参数的集合
481476
parameters.put(BIZ_CONTENT, JSON.toJSONString(bizContent));
482-
483477
//设置签名
484478
setSign(parameters);
485479
return requestTemplate.getForObject(getReqUrl() + "?" + UriVariables.getMapToParameters(parameters), JSONObject.class);
@@ -510,13 +504,15 @@ public Map<String, Object> downloadbill(Date billDate, String billType) {
510504
}
511505

512506

507+
513508
/**
514509
* @param tradeNoOrBillDate 支付平台订单号或者账单类型, 具体请
515510
* 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link PayErrorException}
516511
* @param outTradeNoBillType 商户单号或者 账单类型
517512
* @param transactionType 交易类型
518513
* @return 返回支付方对应接口的结果
519514
*/
515+
520516
@Override
521517
public Map<String, Object> secondaryInterface(Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType) {
522518

@@ -533,43 +529,63 @@ public Map<String, Object> secondaryInterface(Object tradeNoOrBillDate, String o
533529

534530
//获取公共参数
535531
Map<String, Object> parameters = getPublicParameters(transactionType);
532+
536533
//设置请求参数的集合
537534
parameters.put(BIZ_CONTENT, getContentToJson((String) tradeNoOrBillDate, outTradeNoBillType));
538535
//设置签名
539536
setSign(parameters);
537+
540538
return requestTemplate.getForObject(getReqUrl() + "?" + UriVariables.getMapToParameters(parameters), JSONObject.class);
541539
}
542540

543541
/**
544-
* 转账
542+
* 新版转账转账
545543
*
546544
* @param order 转账订单
547545
* @return 对应的转账结果
548546
*/
549547
@Override
550548
public Map<String, Object> transfer(TransferOrder order) {
549+
final TransferType transferType = order.getTransferType();
551550
//获取公共参数
552-
Map<String, Object> parameters = getPublicParameters(AliTransactionType.TRANS);
551+
Map<String, Object> parameters = getPublicParameters(transferType);
552+
setAppAuthToken(parameters, order.getAttrs());
553553

554-
Map<String, Object> bizContent = new TreeMap<String, Object>();
554+
Map<String, Object> bizContent = new LinkedHashMap<String, Object>();
555555
bizContent.put("out_biz_no", order.getOutNo());
556-
//默认 支付宝登录号,支持邮箱和手机号格式。
557-
bizContent.put("payee_type", "ALIPAY_LOGONID");
558-
if (null != order.getTransferType()) {
559-
bizContent.put("payee_type", order.getTransferType().getType());
560-
}
561-
bizContent.put("payee_account", order.getPayeeAccount());
562-
bizContent.put("amount", Util.conversionAmount(order.getAmount()));
563-
bizContent.put("payer_show_name", order.getPayerName());
564-
bizContent.put("payee_real_name", order.getPayeeName());
556+
bizContent.put("trans_amount", order.getAmount());
557+
transferType.setAttr(bizContent, order);
558+
setParameters(bizContent, "order_title", order);
559+
setParameters(bizContent, "original_order_id", order);
560+
setPayeeInfo(bizContent, order);
565561
bizContent.put("remark", order.getRemark());
562+
setParameters(bizContent, "business_params", order);
563+
566564
//设置请求参数的集合
567565
parameters.put(BIZ_CONTENT, JSON.toJSONString(bizContent));
568566
//设置签名
569567
setSign(parameters);
570568
return getHttpRequestTemplate().postForObject(getReqUrl() + "?" + UriVariables.getMapToParameters(parameters), null, JSONObject.class);
571569
}
572570

571+
private Map<String, Object> setPayeeInfo(Map<String, Object> bizContent, Order order){
572+
final Object attr = order.getAttr(PAYEE_INFO);
573+
574+
if (attr instanceof String){
575+
bizContent.put(PAYEE_INFO, attr);
576+
}
577+
if (attr instanceof TreeMap){
578+
bizContent.put(PAYEE_INFO, attr);
579+
}
580+
if (attr instanceof Map){
581+
Map<String, Object> payeeInfo = new TreeMap<String, Object>((Map)attr);
582+
bizContent.put(PAYEE_INFO, payeeInfo);
583+
}
584+
return bizContent;
585+
}
586+
587+
588+
573589
/**
574590
* 转账查询
575591
*
@@ -580,7 +596,7 @@ public Map<String, Object> transfer(TransferOrder order) {
580596
@Override
581597
public Map<String, Object> transferQuery(String outNo, String tradeNo) {
582598
//获取公共参数
583-
Map<String, Object> parameters = getPublicParameters(AliTransactionType.TRANS_QUERY);
599+
Map<String, Object> parameters = getPublicParameters(AliTransferType.TRANS_QUERY);
584600

585601
Map<String, Object> bizContent = new TreeMap<String, Object>();
586602
if (StringUtils.isEmpty(outNo)) {

pay-java-ali/src/main/java/com/egzosn/pay/ali/bean/AliTransactionType.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -88,14 +88,6 @@ public enum AliTransactionType implements TransactionType {
8888
* 下载对账单
8989
*/
9090
DOWNLOADBILL("alipay.data.dataservice.bill.downloadurl.query"),
91-
/**
92-
* 转账到支付宝
93-
*/
94-
TRANS("alipay.fund.trans.toaccount.transfer"),
95-
/**
96-
* 转账查询
97-
*/
98-
TRANS_QUERY("alipay.fund.trans.order.query"),
9991
/**
10092
* 查询刷脸结果信息
10193
* 暂时未接入

0 commit comments

Comments
 (0)