Skip to content

Commit 3ec59f7

Browse files
committed
易极付功能完成
1 parent 94f70be commit 3ec59f7

4 files changed

Lines changed: 281 additions & 114 deletions

File tree

pay-java-yiji/src/main/java/com/egzosn/pay/yiji/api/YiJiPayService.java

Lines changed: 82 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,23 @@
11
package com.egzosn.pay.yiji.api;
22

3-
import com.alibaba.fastjson.JSON;
43
import com.alibaba.fastjson.JSONObject;
54
import com.egzosn.pay.common.api.BasePayService;
65
import com.egzosn.pay.common.bean.*;
7-
import com.egzosn.pay.common.bean.result.PayException;
86
import com.egzosn.pay.common.exception.PayErrorException;
97
import 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;
129
import com.egzosn.pay.common.util.Util;
1310
import com.egzosn.pay.common.util.sign.SignUtils;
1411
import com.egzosn.pay.common.util.str.StringUtils;
12+
import com.egzosn.pay.yiji.bean.YiJiTransactionType;
13+
1514
import java.awt.image.BufferedImage;
1615
import 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

Comments
 (0)