11package com .egzosn .pay .yiji .api ;
22
3- import com .alibaba .fastjson .JSON ;
43import com .alibaba .fastjson .JSONObject ;
54import com .egzosn .pay .common .api .BasePayService ;
65import com .egzosn .pay .common .bean .*;
7- import com .egzosn .pay .common .bean .result .PayException ;
86import com .egzosn .pay .common .exception .PayErrorException ;
97import com .egzosn .pay .common .http .HttpConfigStorage ;
10- import com .egzosn .pay .common .http .UriVariables ;
11- import com .egzosn .pay .common .util .MatrixToImageWriter ;
8+ import com .egzosn .pay .common .util .DateUtils ;
129import com .egzosn .pay .common .util .Util ;
1310import com .egzosn .pay .common .util .sign .SignUtils ;
1411import com .egzosn .pay .common .util .str .StringUtils ;
12+ import com .egzosn .pay .yiji .bean .YiJiTransactionType ;
13+
1514import java .awt .image .BufferedImage ;
1615import java .math .BigDecimal ;
17- import java .util .*;
16+ import java .util .Collections ;
17+ import java .util .Date ;
18+ import java .util .Map ;
19+ import java .util .TreeMap ;
20+
1821
1922/**
2023 * 易极付支付服务
@@ -30,6 +33,10 @@ public class YiJiPayService extends BasePayService<YiJiPayConfigStorage> {
3033 * 正式测试环境
3134 */
3235 private static final String HTTPS_REQ_URL = "https://api.yiji.com" ;
36+ /**
37+ * 全球正式测试环境
38+ */
39+ private static final String HTTPS_GLOBAL_REQ_URL = "https://openapiglobal.yiji.com/gateway.html" ;
3340 /**
3441 * 沙箱测试环境账号
3542 */
@@ -40,41 +47,22 @@ public class YiJiPayService extends BasePayService<YiJiPayConfigStorage> {
4047 public static final String SUCCESS_CODE = "10000" ;
4148
4249 public static final String CODE = "code" ;
43- /**
44- * 附加参数
45- */
46- public static final String PASSBACK_PARAMS = "passback_params" ;
47- /**
48- * 产品代码
49- */
50- public static final String PRODUCT_CODE = "product_code" ;
51- /**
52- * 返回地址
53- */
54- public static final String RETURN_URL = "return_url" ;
5550
56- /**
57- * 请求内容
58- */
59- public static final String BIZ_CONTENT = "biz_content" ;
6051 /**
6152 * 获取对应的请求地址
6253 *
6354 * @return 请求地址
6455 */
6556 public String getReqUrl (TransactionType transactionType ) {
66- return payConfigStorage .isTest () ? DEV_REQ_URL : HTTPS_REQ_URL ;
67- }
68- /**
69- * 获取对应的请求地址
70- *
71- * @return 请求地址
72- */
73- public String getReqUrl () {
74- return getReqUrl (null );
57+ if (payConfigStorage .isTest ()){
58+ return DEV_REQ_URL ;
59+ }else if (/*YiJiTransactionType.corderRemittanceSynOrder == transactionType ||*/ YiJiTransactionType .applyRemittranceWithSynOrder == transactionType ){
60+ return HTTPS_GLOBAL_REQ_URL ;
61+ }else {
62+ return HTTPS_REQ_URL ;
63+ }
7564 }
7665
77-
7866 public YiJiPayService (YiJiPayConfigStorage payConfigStorage , HttpConfigStorage configStorage ) {
7967 super (payConfigStorage , configStorage );
8068 }
@@ -84,9 +72,6 @@ public YiJiPayService(YiJiPayConfigStorage payConfigStorage) {
8472 }
8573
8674
87- public String getHttpsVerifyUrl () {
88- return getReqUrl () + "?service=notify_verify" ;
89- }
9075
9176 /**
9277 * 回调校验
@@ -102,7 +87,7 @@ public boolean verify(Map<String, Object> params) {
10287 return false ;
10388 }
10489
105- return signVerify (params , (String ) params .get (SIGN )) && verifySource (( String ) params . get ( "notify_id" )) ;
90+ return signVerify (params , (String ) params .get (SIGN ));
10691
10792 }
10893
@@ -116,20 +101,6 @@ public boolean verify(Map<String, Object> params) {
116101 @ Override
117102 public boolean signVerify (Map <String , Object > params , String sign ) {
118103
119- if (params instanceof JSONObject ) {
120- for (Map .Entry <String , Object > entry : params .entrySet ()) {
121- if (SIGN .equals (entry .getKey ())) {
122- continue ;
123- }
124- TreeMap <String , Object > response = new TreeMap ((Map <String , Object > )entry .getValue ());
125- LinkedHashMap <Object , Object > linkedHashMap = new LinkedHashMap <>();
126- linkedHashMap .put (CODE , response .remove (CODE ));
127- linkedHashMap .put ("msg" , response .remove ("msg" ));
128- linkedHashMap .putAll (response );
129- return SignUtils .valueOf (payConfigStorage .getSignType ()).verify (JSON .toJSONString (linkedHashMap ), sign , payConfigStorage .getKeyPublic (), payConfigStorage .getInputCharset ());
130- }
131- }
132-
133104 return SignUtils .valueOf (payConfigStorage .getSignType ()).verify (params , sign , payConfigStorage .getKeyPublic (), payConfigStorage .getInputCharset ());
134105 }
135106
@@ -153,7 +124,7 @@ public boolean verifySource(String id) {
153124 * @return 请求参数
154125 */
155126 private Map <String , Object > setSign (Map <String , Object > parameters ) {
156- parameters .put ("sign_type " , payConfigStorage .getSignType ());
127+ parameters .put ("signType " , payConfigStorage .getSignType ());
157128 String sign = createSign (SignUtils .parameterText (parameters , "&" , SIGN ), payConfigStorage .getInputCharset ());
158129
159130 parameters .put (SIGN , sign );
@@ -185,17 +156,24 @@ public Map<String, Object> orderInfo(PayOrder order) {
185156 */
186157 private Map <String , Object > getOrder (PayOrder order ) {
187158
188-
189159 Map <String , Object > orderInfo = getPublicParameters (order .getTransactionType ());
190- orderInfo .put ("orderNo" , order .getTradeNo ());
160+ orderInfo .put ("orderNo" , order .getOutTradeNo ());
191161 orderInfo .put ("outOrderNo" , order .getOutTradeNo ());
192162
193163 if (StringUtils .isNotEmpty (payConfigStorage .getSeller ())){
194164 orderInfo .put ("sellerUserId" , payConfigStorage .getSeller ());
195165 }
166+
167+ ((YiJiTransactionType )order .getTransactionType ()).setAttribute (orderInfo , order );
168+
196169 orderInfo .put ("tradeAmount" , Util .conversionAmount (order .getPrice ()));
170+ //商品条款信息 商品名称
197171 orderInfo .put ("goodsClauses" , String .format ("[{'name':'%s'}]" , order .getBody ()));
198-
172+ //交易名称
173+ orderInfo .put ("tradeName" , order .getSubject ());
174+ if (null != order .getCurType ()){
175+ orderInfo .put ("currency" , order .getCurType ());
176+ }
199177
200178 return orderInfo ;
201179 }
@@ -208,7 +186,6 @@ private Map<String, Object> getOrder(PayOrder order) {
208186 private Map <String , Object > getPublicParameters (TransactionType transactionType ) {
209187 Map <String , Object > orderInfo = new TreeMap <>();
210188 orderInfo .put ("partnerId" , payConfigStorage .getPid ());
211- orderInfo .put ("signType" , payConfigStorage .getSignType ());
212189 orderInfo .put ("returnUrl" , payConfigStorage .getReturnUrl ());
213190 orderInfo .put ("notifyUrl" , payConfigStorage .getNotifyUrl ());
214191 orderInfo .put ("service" , transactionType .getMethod ());
@@ -248,13 +225,19 @@ public PayOutMessage successPayOutMessage(PayMessage payMessage) {
248225 @ Override
249226 public String buildRequest (Map <String , Object > orderInfo , MethodType method ) {
250227 StringBuilder formHtml = new StringBuilder ();
251- formHtml .append ("<form id=\" _alipaysubmit_\" name=\" alipaysubmit\" action=\" " );
252- String bizContent = (String ) orderInfo .remove (BIZ_CONTENT );
253- formHtml .append (getReqUrl ()).append ("?" ).append (UriVariables .getMapToParameters (orderInfo ))
228+ formHtml .append ("<meta charset=\" UTF-8\" >\n " );
229+ formHtml .append ("<form id=\" gatewayform\" name=\" gatewayform\" action=\" " );
230+
231+ formHtml .append (getReqUrl (YiJiTransactionType .getTransactionType ((String ) orderInfo .get ("service" ))))
254232 .append ("\" method=\" " ).append (method .name ().toLowerCase ()).append ("\" >" );
255- formHtml .append ("<input type=\" hidden\" name=\" biz_content\" value=\' " + bizContent + "\' />" );
256- formHtml .append ("</form>" );
257- formHtml .append ("<script>document.forms['_alipaysubmit_'].submit();</script>" );
233+ for (Map .Entry <String , Object > entry : orderInfo .entrySet ()) {
234+ formHtml .append ("<input type=\" hidden\" name=\" " ).append (entry .getKey ()).append ("\" value=\" " ).append (entry .getValue ()).append ("\" />\n " );
235+ }
236+ formHtml .append ("</form>\n " );
237+ formHtml .append ("<script type=\" text/javascript\" >\n " );
238+ formHtml .append ("window.onload = function() {document.getElementById('gatewayform').submit();}\n " );
239+ formHtml .append ("</script>\n " );
240+
258241
259242 return formHtml .toString ();
260243 }
@@ -268,17 +251,7 @@ public String buildRequest(Map<String, Object> orderInfo, MethodType method) {
268251 @ Override
269252 public BufferedImage genQrPay (PayOrder order ) {
270253
271- Map <String , Object > orderInfo = orderInfo (order );
272-
273-
274- //预订单
275- JSONObject result = getHttpRequestTemplate ().postForObject (getReqUrl () + "?" + UriVariables .getMapToParameters (orderInfo ), null , JSONObject .class );
276- JSONObject response = result .getJSONObject ("alipay_trade_precreate_response" );
277- if (SUCCESS_CODE .equals (response .getString (CODE ))) {
278- return MatrixToImageWriter .writeInfoToJpgBuff (response .getString ("qr_code" ));
279- }
280- throw new PayErrorException (new PayException (response .getString (CODE ), response .getString ("msg" ), result .toJSONString ()));
281-
254+ return null ;
282255 }
283256
284257 /**
@@ -289,14 +262,8 @@ public BufferedImage genQrPay(PayOrder order) {
289262 */
290263 @ Override
291264 public Map <String , Object > microPay (PayOrder order ) {
292- Map <String , Object > orderInfo = orderInfo (order );
293- //预订单
294- JSONObject result = getHttpRequestTemplate ().postForObject (getReqUrl () + "?" + UriVariables .getMapToParameters (orderInfo ), null , JSONObject .class );
295- JSONObject response = result .getJSONObject ("alipay_trade_pay_response" );
296- if (!SUCCESS_CODE .equals (response .getString (CODE ))) {
297- LOG .info ("收款失败" );
298- }
299- return result ;
265+
266+ return Collections .emptyMap ();
300267 }
301268
302269 /**
@@ -308,8 +275,7 @@ public Map<String, Object> microPay(PayOrder order) {
308275 */
309276 @ Override
310277 public Map <String , Object > query (String tradeNo , String outTradeNo ) {
311- return null ;
312-
278+ return Collections .emptyMap ();
313279 }
314280
315281
@@ -322,23 +288,10 @@ public Map<String, Object> query(String tradeNo, String outTradeNo) {
322288 */
323289 @ Override
324290 public Map <String , Object > close (String tradeNo , String outTradeNo ) {
325- return null ;
291+ return Collections . emptyMap () ;
326292 }
327293
328- /**
329- * 支付交易返回失败或支付系统超时,调用该接口撤销交易。
330- * 如果此订单用户支付失败,易极付系统会将此订单关闭;如果用户支付成功,易极付系统会将此订单资金退还给用户。
331- * 注意:只有发生支付系统超时或者支付结果未知时可调用撤销,其他正常支付的单如需实现相同功能请调用申请退款API。
332- * 提交支付交易后调用【查询订单API】,没有明确的支付结果再调用【撤销订单API】。
333- *
334- * @param tradeNo 支付平台订单号
335- * @param outTradeNo 商户单号
336- * @return 返回支付方交易撤销后的结果
337- */
338- @ Override
339- public Map <String , Object > cancel (String tradeNo , String outTradeNo ) {
340- return null ;
341- }
294+
342295
343296 /**
344297 * 申请退款接口
@@ -367,8 +320,14 @@ public Map<String, Object> refund(String tradeNo, String outTradeNo, BigDecimal
367320 */
368321 @ Override
369322 public Map <String , Object > refund (RefundOrder refundOrder ) {
370-
371- return null ;
323+ Map <String , Object > orderInfo = getPublicParameters (YiJiTransactionType .tradeRefund );
324+ orderInfo .put ("orderNo" , refundOrder .getOutTradeNo ());
325+ orderInfo .put ("outOrderNo" , refundOrder .getOutTradeNo ());
326+ orderInfo .put ("refundAmount" , refundOrder .getRefundAmount ());
327+ orderInfo .put ("refundTime" , DateUtils .formatDay (refundOrder .getOrderDate ()));
328+ orderInfo .put ("refundReason" , refundOrder .getDescription ());
329+ setSign (orderInfo );
330+ return getHttpRequestTemplate ().postForObject (getReqUrl (YiJiTransactionType .tradeRefund ), orderInfo , JSONObject .class );
372331 }
373332
374333 /**
@@ -380,7 +339,7 @@ public Map<String, Object> refund(RefundOrder refundOrder) {
380339 */
381340 @ Override
382341 public Map <String , Object > refundquery (String tradeNo , String outTradeNo ) {
383- return null ;
342+ return Collections . emptyMap () ;
384343 }
385344
386345 /**
@@ -392,7 +351,7 @@ public Map<String, Object> refundquery(String tradeNo, String outTradeNo) {
392351 @ Override
393352 public Map <String , Object > refundquery (RefundOrder refundOrder ) {
394353
395- return null ;
354+ return Collections . emptyMap () ;
396355
397356 }
398357
@@ -406,7 +365,7 @@ public Map<String, Object> refundquery(RefundOrder refundOrder) {
406365 @ Override
407366 public Map <String , Object > downloadbill (Date billDate , String billType ) {
408367
409- return null ;
368+ return Collections . emptyMap () ;
410369 }
411370
412371
@@ -421,19 +380,36 @@ public Map<String, Object> downloadbill(Date billDate, String billType) {
421380 public Map <String , Object > secondaryInterface (Object tradeNoOrBillDate , String outTradeNoBillType , TransactionType transactionType ) {
422381
423382
424- return null ;
383+ return Collections . emptyMap () ;
425384 }
426385
427386 /**
428- * 转账
387+ * 转账 这里外部进行调用{@link #buildRequest(Map, MethodType)}
429388 *
430389 * @param order 转账订单
431390 * @return 对应的转账结果
432391 */
433392 @ Override
434393 public Map <String , Object > transfer (TransferOrder order ) {
435-
436- return null ;
394+ Map <String , Object > data = getPublicParameters (YiJiTransactionType .applyRemittranceWithSynOrder );
395+ data .put ("remittranceBatchNo" , order .getBatchNo ());
396+ data .put ("outOrderNo" , order .getOutNo ());
397+ data .put ("payAmount" , Util .conversionAmount (order .getAmount ()) );
398+ data .put ("payCurrency" , order .getCurType ().getType ());
399+ data .put ("withdrawCurrency" , DefaultCurType .CNY .getType ());
400+ data .put ("payMemo" ,order .getRemark ());
401+ data .put ("toCountryCode" , order .getCountryCode ().getCode ());
402+ data .put ("tradeUseCode" , "326" );
403+ data .put ("payeeName" , order .getPayeeName ());
404+ data .put ("payeeAddress" , order .getPayeeAddress ());
405+ data .put ("payeeBankName" , order .getBank ().getCode ());
406+ data .put ("payeeBankAddress" , order .getPayeeBankAddress ());
407+ data .put ("payeeBankSwiftCode" , "CNAPS CODE" );
408+ data .put ("payeeBankNo" , order .getPayeeAccount ());
409+ setSign (data );
410+
411+
412+ return data ;
437413 }
438414
439415 /**
@@ -446,7 +422,7 @@ public Map<String, Object> transfer(TransferOrder order) {
446422 @ Override
447423 public Map <String , Object > transferQuery (String outNo , String tradeNo ) {
448424
449- return null ;
425+ return Collections . emptyMap () ;
450426 }
451427
452428}
0 commit comments