From 3f0282ead1e57c9b79bd18c84696e1257fab3791 Mon Sep 17 00:00:00 2001 From: Actinia-517 <412605202@qq.com> Date: Tue, 19 Dec 2017 01:00:16 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=BA=8C=E7=BB=B4=E7=A0=81=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E9=80=9A=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pay/common/http/ClientHttpRequest.java | 4 +- .../egzosn/pay/common/http/UriVariables.java | 78 ++++++++++++++++++ .../pay/demo/controller/PayController.java | 2 +- .../pay/demo/dao/ApyAccountRepository.java | 2 +- .../egzosn/pay/union/api/UnionPayService.java | 79 ++++++++++--------- .../egzosn/pay/union/sdk/SDKConstants.java | 5 +- 6 files changed, 129 insertions(+), 41 deletions(-) diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/http/ClientHttpRequest.java b/pay-java-common/src/main/java/com/egzosn/pay/common/http/ClientHttpRequest.java index 9018abb..ccfdb8a 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/http/ClientHttpRequest.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/http/ClientHttpRequest.java @@ -151,10 +151,10 @@ public class ClientHttpRequest extends HttpEntityEnclosingRequestBase impleme return this; } if (request instanceof Map) { - StringEntity entity = new StringEntity(getMapToParameters((Map) request), Consts.UTF_8); + StringEntity entity = new StringEntity(getMapToParameters((Map) request), ContentType.APPLICATION_FORM_URLENCODED); setEntity(entity); } else if (request instanceof String) { - StringEntity entity = new StringEntity((String) request, Consts.UTF_8); + StringEntity entity = new StringEntity((String) request, ContentType.APPLICATION_FORM_URLENCODED); setEntity(entity); } else { StringEntity entity = new StringEntity(JSON.toJSONString(request), ContentType.APPLICATION_JSON); diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/http/UriVariables.java b/pay-java-common/src/main/java/com/egzosn/pay/common/http/UriVariables.java index 533f248..7c81ea9 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/http/UriVariables.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/http/UriVariables.java @@ -1,5 +1,9 @@ package com.egzosn.pay.common.http; +import com.alibaba.fastjson.JSONObject; +import com.egzosn.pay.common.bean.result.PayException; +import com.egzosn.pay.common.exception.PayErrorException; + import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.List; @@ -118,7 +122,81 @@ public class UriVariables { return builder.toString(); } + /** + * 解析应答字符串,生成应答要素 + * + * @param str 需要解析的字符串 + * @return 解析的结果map + * @throws UnsupportedEncodingException + */ + public static JSONObject getParametersToMap (String str) { + JSONObject map = new JSONObject(); + int len = str.length(); + StringBuilder temp = new StringBuilder(); + char curChar; + String key = null; + boolean isKey = true; + boolean isOpen = false;//值里有嵌套 + char openName = 0; + if (len > 0) { + for (int i = 0; i < len; i++) {// 遍历整个带解析的字符串 + curChar = str.charAt(i);// 取当前字符 + if (isKey) {// 如果当前生成的是key + + if (curChar == '=') {// 如果读取到=分隔符 + key = temp.toString(); + temp.setLength(0); + isKey = false; + } else { + temp.append(curChar); + } + } else {// 如果当前生成的是value + if (isOpen) { + if (curChar == openName) { + isOpen = false; + } + + } else {//如果没开启嵌套 + if (curChar == '{') {//如果碰到,就开启嵌套 + isOpen = true; + openName = '}'; + } + if (curChar == '[') { + isOpen = true; + openName = ']'; + } + } + if (curChar == '&' && !isOpen) {// 如果读取到&分割符,同时这个分割符不是值域,这时将map里添加 + putKeyValueToMap(temp, isKey, key, map); + temp.setLength(0); + isKey = true; + } else { + temp.append(curChar); + } + } + + } + putKeyValueToMap(temp, isKey, key, map); + } + return map; + } + + private static void putKeyValueToMap (StringBuilder temp, boolean isKey, + String key, Map map) { + if (isKey) { + key = temp.toString(); + if (key.length() == 0) { + throw new PayErrorException(new PayException("QString format illegal", "内容格式有误")); + } + map.put(key, ""); + } else { + if (key.length() == 0) { + throw new PayErrorException(new PayException("QString format illegal", "内容格式有误")); + } + map.put(key, temp.toString()); + } + } } diff --git a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/PayController.java b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/PayController.java index 32c72d6..62975e3 100644 --- a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/PayController.java +++ b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/PayController.java @@ -191,7 +191,7 @@ public class PayController { PayResponse payResponse = service.getPayResponse(payId); ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ImageIO.write(payResponse.getService().genQrPay(new PayOrder("订单title", "摘要", null == price ? new BigDecimal(0.01) : price, UUID.randomUUID().toString().replace("-", ""), PayType.valueOf(payResponse.getStorage().getPayType()).getTransactionType(transactionType))), "JPEG", baos); + ImageIO.write(payResponse.getService().genQrPay(new PayOrder("订单title", "摘要", null == price ? new BigDecimal(0.01) : price, System.currentTimeMillis()+"", PayType.valueOf(payResponse.getStorage().getPayType()).getTransactionType(transactionType))), "JPEG", baos); return baos.toByteArray(); } diff --git a/pay-java-demo/src/main/java/com/egzosn/pay/demo/dao/ApyAccountRepository.java b/pay-java-demo/src/main/java/com/egzosn/pay/demo/dao/ApyAccountRepository.java index 11a42fa..38fb99a 100644 --- a/pay-java-demo/src/main/java/com/egzosn/pay/demo/dao/ApyAccountRepository.java +++ b/pay-java-demo/src/main/java/com/egzosn/pay/demo/dao/ApyAccountRepository.java @@ -83,7 +83,7 @@ public class ApyAccountRepository { ApyAccount apyAccount4 = new ApyAccount(); apyAccount4.setPayId(4); - apyAccount4.setPartner("777290058154626"); + apyAccount4.setPartner("777290058110048"); // apyAccount4.setAppid("777290058110097"); apyAccount4.setPublicKey("D:\\certs\\acp_test_middle.cer;D:\\certs\\acp_test_root.cer"); apyAccount4.setPrivateKey("D:\\certs\\acp_test_sign.pfx;000000"); diff --git a/pay-java-union/src/main/java/com/egzosn/pay/union/api/UnionPayService.java b/pay-java-union/src/main/java/com/egzosn/pay/union/api/UnionPayService.java index 082e2fc..fa74582 100644 --- a/pay-java-union/src/main/java/com/egzosn/pay/union/api/UnionPayService.java +++ b/pay-java-union/src/main/java/com/egzosn/pay/union/api/UnionPayService.java @@ -8,6 +8,7 @@ import com.egzosn.pay.common.bean.*; import com.egzosn.pay.common.bean.result.PayException; import com.egzosn.pay.common.exception.PayErrorException; import com.egzosn.pay.common.http.HttpConfigStorage; +import com.egzosn.pay.common.http.UriVariables; import com.egzosn.pay.common.util.MatrixToImageWriter; import com.egzosn.pay.common.util.sign.SignUtils; import com.egzosn.pay.common.util.sign.encrypt.RSA; @@ -91,11 +92,6 @@ public class UnionPayService extends BasePayService { DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); //订单发送时间 params.put(SDKConstants.param_txnTime, df.format(System.currentTimeMillis())); - // 订单超时时间。 - // 超过此时间后,除网银交易外,其他交易银联系统会拒绝受理,提示超时。 跳转银行网银交易如果超时后交易成功,会自动退款,大约5个工作日金额返还到持卡人账户。 - // 此时间建议取支付时的北京时间加15分钟。 - // 超过超时时间调查询接口应答origRespCode不是A6或者00的就可以判断为失败。 - params.put("payTimeout", df.format(System.currentTimeMillis() + 30 * 60 * 1000)); //后台通知地址 params.put(SDKConstants.param_backUrl, payConfigStorage.getNotifyUrl()); //交易币种 @@ -172,24 +168,33 @@ public class UnionPayService extends BasePayService { UnionTransactionType type = (UnionTransactionType)order.getTransactionType(); - //交易金额 - params.put(SDKConstants.param_txnAmt, order.getPrice().multiply(new BigDecimal(100))); + //设置交易类型相关的参数 type.convertMap(params); params.put(SDKConstants.param_orderId, order.getOutTradeNo()); - params.put("orderDesc", order.getSubject()); - switch (type){ case WAP: case WEB: case B2B: + //交易金额 + params.put(SDKConstants.param_txnAmt, order.getPrice().multiply(new BigDecimal(100))); + params.put("orderDesc", order.getSubject()); + DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); + // 订单超时时间。 + // 超过此时间后,除网银交易外,其他交易银联系统会拒绝受理,提示超时。 跳转银行网银交易如果超时后交易成功,会自动退款,大约5个工作日金额返还到持卡人账户。 + // 此时间建议取支付时的北京时间加15分钟。 + // 超过超时时间调查询接口应答origRespCode不是A6或者00的就可以判断为失败。 + params.put(SDKConstants.param_payTimeout, df.format(System.currentTimeMillis() + 30 * 60 * 1000)); params.put(SDKConstants.param_frontUrl, payConfigStorage.getReturnUrl()); break; - case CONSUME: + //交易金额 + params.put(SDKConstants.param_txnAmt, order.getPrice().multiply(new BigDecimal(100))); params.put(SDKConstants.param_qrNo, order.getAuthCode()); - params.put(SDKConstants.param_termId, order.getDeviceInfo()); + break; + case QUERY: + break; default: } @@ -324,20 +329,21 @@ public class UnionPayService extends BasePayService { * @return 返回图片信息,支付时需要的 */ @Override - public BufferedImage genQrPay (PayOrder order) { - Map params = orderInfo(order); - this.setSign(params); - JSONObject response = getHttpRequestTemplate().postForObject(this.getBackTransUrl(),params,JSONObject.class); - if(this.vailSign(response)){ - if("00".equals(response.getString(SDKConstants.param_respCode))){ - //成功,获取tn号 - return MatrixToImageWriter.writeInfoToJpgBuff( response.getString(SDKConstants.param_respCode)); - }else{ - throw new PayErrorException(new PayException(response.getString(SDKConstants.param_respCode), response.getString(SDKConstants.param_respMsg), response.toJSONString())); - } - }else{ - throw new PayErrorException(new PayException("1000", "验证签名失败", response.toJSONString())); + public BufferedImage genQrPay (PayOrder order) { + Map params = orderInfo(order); + String responseStr = getHttpRequestTemplate().postForObject(this.getBackTransUrl(),params,String.class); + Map response = UriVariables.getParametersToMap(responseStr); + if(response.isEmpty()){ + throw new PayErrorException(new PayException("failure", "响应内容有误!",responseStr)); } + if(this.vailSign(response)){ + if("00".equals(response.get(SDKConstants.param_respCode))){ + //成功,获取tn号 + return MatrixToImageWriter.writeInfoToJpgBuff((String)response.get(SDKConstants.param_qrCode)); + } + throw new PayErrorException(new PayException((String)response.get(SDKConstants.param_respCode), (String)response.get(SDKConstants.param_respMsg), responseStr)); + } + throw new PayErrorException(new PayException("failure", "验证签名失败", responseStr)); } /** @@ -349,7 +355,8 @@ public class UnionPayService extends BasePayService { @Override public Map microPay (PayOrder order) { Map params = orderInfo(order); - return getHttpRequestTemplate().postForObject(this.getBackTransUrl(),params,JSONObject.class); + String responseStr = getHttpRequestTemplate().postForObject(this.getBackTransUrl(),params,String.class); + return UriVariables.getParametersToMap(responseStr); } @@ -362,11 +369,9 @@ public class UnionPayService extends BasePayService { */ @Override public Map query (String tradeNo, String outTradeNo) { - Map params = this.getCommonParam(); - UnionTransactionType.QUERY.convertMap(params); - params.put(SDKConstants.param_orderId,outTradeNo); - this.setSign(params); - JSONObject response = getHttpRequestTemplate().postForObject(this.getSingleQueryUrl(),params,JSONObject.class); + Map params = orderInfo(new PayOrder("交易查询","摘要",null,outTradeNo,UnionTransactionType.QUERY)); + String responseStr = getHttpRequestTemplate().postForObject(this.getSingleQueryUrl(),params,String.class); + JSONObject response = UriVariables.getParametersToMap(responseStr); if(this.vailSign(response)){ if("00".equals(response.getString(SDKConstants.param_respCode))){ String origRespCode = response.getString(SDKConstants.param_origRespCode); @@ -381,7 +386,7 @@ public class UnionPayService extends BasePayService { throw new PayErrorException(new PayException(response.getString(SDKConstants.param_respCode), response.getString(SDKConstants.param_respMsg), response.toJSONString())); } }else{ - throw new PayErrorException(new PayException("1000", "验证签名失败", response.toJSONString())); + throw new PayErrorException(new PayException("failure", "验证签名失败", response.toJSONString())); } } @@ -405,7 +410,8 @@ public class UnionPayService extends BasePayService { params.put(SDKConstants.param_origTxnTime, queryOrder.getOrigOrderId()); } this.setSign(params); - JSONObject response = getHttpRequestTemplate().postForObject(this.getBackTransUrl(),params,JSONObject.class); + String responseStr = getHttpRequestTemplate().postForObject(this.getBackTransUrl(),params,String.class); + JSONObject response = UriVariables.getParametersToMap(responseStr); if(this.vailSign(response)){ if("00".equals(response.getString(SDKConstants.param_respCode))){ String origRespCode = response.getString(SDKConstants.param_origRespCode); @@ -417,7 +423,7 @@ public class UnionPayService extends BasePayService { throw new PayErrorException(new PayException(response.getString(SDKConstants.param_respCode), response.getString(SDKConstants.param_respMsg), response.toJSONString())); } }else{ - throw new PayErrorException(new PayException("1000", "验证签名失败", response.toJSONString())); + throw new PayErrorException(new PayException("failure", "验证签名失败", response.toJSONString())); } } /** @@ -501,7 +507,7 @@ public class UnionPayService extends BasePayService { /** * 获取输出消息,用户返回给支付端, 针对于web端 * - * @param orderInfo 发起支付的订单信息 + * @param ` 发起支付的订单信息 * @param method 请求方式 "post" "get", * @return 获取输出消息,用户返回给支付端, 针对于web端 * @see MethodType 请求类型 @@ -642,7 +648,8 @@ public class UnionPayService extends BasePayService { params.put(SDKConstants.param_settleDate,df.format(new Date())); params.put(SDKConstants.param_fileType,billType); this.setSign(params); - Map response = getHttpRequestTemplate().postForObject(this.getFileTransUrl(),params,Map.class); + String responseStr = getHttpRequestTemplate().postForObject(this.getFileTransUrl(),params,String.class); + JSONObject response = UriVariables.getParametersToMap(responseStr); if(this.vailSign(response)){ if("00".equals(response.get(SDKConstants.param_respCode))){ @@ -652,7 +659,7 @@ public class UnionPayService extends BasePayService { throw new PayErrorException(new PayException(response.get(SDKConstants.param_respCode).toString(), response.get(SDKConstants.param_respMsg).toString(), response.toString())); } }else{ - throw new PayErrorException(new PayException("1000", "验证签名失败", response.toString())); + throw new PayErrorException(new PayException("failure", "验证签名失败", response.toString())); } } diff --git a/pay-java-union/src/main/java/com/egzosn/pay/union/sdk/SDKConstants.java b/pay-java-union/src/main/java/com/egzosn/pay/union/sdk/SDKConstants.java index 94df3ed..d57e3c0 100644 --- a/pay-java-union/src/main/java/com/egzosn/pay/union/sdk/SDKConstants.java +++ b/pay-java-union/src/main/java/com/egzosn/pay/union/sdk/SDKConstants.java @@ -204,7 +204,7 @@ public class SDKConstants { /** 订单超时时间间隔. */ public static final String param_orderTimeoutInterval = "orderTimeoutInterval"; /** 支付超时时间. */ - public static final String param_payTimeoutTime = "payTimeoutTime"; + public static final String param_payTimeout = "payTimeout"; /** 默认支付方式. */ public static final String param_defaultPayType = "defaultPayType"; /** 支持支付方式. */ @@ -394,6 +394,9 @@ public class SDKConstants { /** C2B码,1-20位数字*/ public static final String param_qrNo = "qrNo"; + /** 二维码url */ + public static final String param_qrCode = "qrCode"; + /*原交易商户订单号*/ public static final String param_origOrderId = "origOrderId";