44import com .alibaba .fastjson .JSONObject ;
55import com .egzosn .pay .ali .bean .AliPayMessage ;
66import com .egzosn .pay .ali .bean .AliTransactionType ;
7+ import com .egzosn .pay .ali .bean .AliTransferType ;
78import com .egzosn .pay .ali .bean .OrderSettle ;
89import com .egzosn .pay .common .api .BasePayService ;
910import com .egzosn .pay .common .bean .*;
1516import com .egzosn .pay .common .util .Util ;
1617import com .egzosn .pay .common .util .sign .SignUtils ;
1718import com .egzosn .pay .common .util .str .StringUtils ;
18- import java . math . BigDecimal ;
19+
1920import 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 )) {
0 commit comments