package com.unionpay.acp.demo; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.Map.Entry; import org.apache.commons.lang.StringUtils; import com.unionpay.acp.sdk.HttpClient; import com.unionpay.acp.sdk.SDKConstants; import com.unionpay.acp.sdk.SDKUtil; import com.unionpay.acp.sdk.SecureUtil; /** * 名称: 基础参数<br> * 功能: 提供基础数据<br> * 版本: 5.0<br> * 日期: 2014-07<br> * 作者: 中国银联ACP团队<br> * 版权: 中国银联<br> * 说明:以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己需要,按照技术文档编写。该代码仅供参考。<br> */ public class DemoBase { public static String encoding = "UTF-8"; /** * 5.0.0 */ public static String version = "5.0.0"; /** * http://localhost:8080/ACPTest/acp_front_url.do */ // 后台服务对应的写法参照 FrontRcvResponse.java public static String frontUrl = "http://localhost:8080/ACPTest/acp_front_url.do"; public DemoBase() { super(); } /** * http://localhost:8080/ACPTest/acp_back_url.do */ // 后台服务对应的写法参照 BackRcvResponse.java public static String backUrl = "http://localhost:8080/ACPTest/acp_back_url.do";// 受理方和发卡方自选填写的域[O]--后台通知地址 /** * 构造HTTP POST交易表单的方法示例 * * @param action * 表单提交地址 * @param hiddens * 以MAP形式存储的表单键值 * @return 构造好的HTTP POST交易表单 */ public static String createHtml(String action, Map<String, String> hiddens) { StringBuffer sf = new StringBuffer(); sf.append("<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"/></head><body>"); sf.append("<form id = \"pay_form\" action=\"" + action + "\" method=\"post\">"); if (null != hiddens && 0 != hiddens.size()) { Set<Entry<String, String>> set = hiddens.entrySet(); Iterator<Entry<String, String>> it = set.iterator(); while (it.hasNext()) { Entry<String, String> ey = it.next(); String key = ey.getKey(); String value = ey.getValue(); sf.append("<input type=\"hidden\" name=\"" + key + "\" id=\"" + key + "\" value=\"" + value + "\"/>"); } } sf.append("</form>"); sf.append("</body>"); sf.append("<script type=\"text/javascript\">"); sf.append("document.all.pay_form.submit();"); sf.append("</script>"); sf.append("</html>"); return sf.toString(); } /** * java main方法 数据提交 对数据进行签名 * * @param contentData * @return 签名后的map对象 */ @SuppressWarnings("unchecked") public static Map<String, String> signData(Map<String, ?> contentData) { Entry<String, String> obj = null; Map<String, String> submitFromData = new HashMap<String, String>(); for (Iterator<?> it = contentData.entrySet().iterator(); it.hasNext();) { obj = (Entry<String, String>) it.next(); String value = obj.getValue(); if (StringUtils.isNotBlank(value)) { // 对value值进行去除前后空处理 submitFromData.put(obj.getKey(), value.trim()); System.out.println(obj.getKey() + "-->" + String.valueOf(value)); } } /** * 签名 */ SDKUtil.sign(submitFromData, encoding); return submitFromData; } /** * java main方法 数据提交 提交到后台 * * @param contentData * @return 返回报文 map */ public static Map<String, String> submitUrl(Map<String, String> submitFromData, String requestUrl) { String resultString = ""; System.out.println("requestUrl====" + requestUrl); System.out.println("submitFromData====" + submitFromData.toString()); /** * 发送 */ HttpClient hc = new HttpClient(requestUrl, 30000, 30000); try { int status = hc.send(submitFromData, encoding); if (200 == status) { resultString = hc.getResult(); } } catch (Exception e) { e.printStackTrace(); } Map<String, String> resData = new HashMap<String, String>(); /** * 验证签名 */ if (null != resultString && !"".equals(resultString)) { // 将返回结果转换为map resData = SDKUtil.convertResultStringToMap(resultString); if (SDKUtil.validate(resData, encoding)) { System.out.println("验证签名成功"); } else { System.out.println("验证签名失败"); } // 打印返回报文 System.out.println("打印返回报文:" + resultString); } return resData; } /** * 解析返回文件 */ public static void deCodeFileContent(Map<String, String> resData) { // 解析返回文件 String fileContent = resData.get(SDKConstants.param_fileContent); if (null != fileContent && !"".equals(fileContent)) { try { byte[] fileArray = SecureUtil.inflater(SecureUtil.base64Decode(fileContent.getBytes(encoding))); String root = "D:\\"; String filePath = null; if (SDKUtil.isEmpty(resData.get("fileName"))) { filePath = root + File.separator + resData.get("merId") + "_" + resData.get("batchNo") + "_" + resData.get("txnTime") + ".txt"; } else { filePath = root + File.separator + resData.get("fileName"); } File file = new File(filePath); if (file.exists()) { file.delete(); } file.createNewFile(); FileOutputStream out = new FileOutputStream(file); out.write(fileArray, 0, fileArray.length); out.flush(); out.close(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } /** * java main方法 数据提交 数据组装进行提交 包含签名 * * @param contentData * @return 返回报文 map */ public static Map<String, String> submitDate(Map<String, ?> contentData, String requestUrl) { Map<String, String> submitFromData = (Map<String, String>) signData(contentData); return submitUrl(submitFromData, requestUrl); } /** * 持卡人信息域操作 * * @param encoding * 编码方式 * @return base64后的持卡人信息域字段 */ public static String getCustomer(String encoding) { StringBuffer sf = new StringBuffer("{"); // 证件类型 String certifTp = "01"; // 证件号码 String certifId = "1301212386859081945"; // 姓名 String customerNm = "测试"; // 手机号 String phoneNo = "18613958987"; // 短信验证码 String smsCode = "123311"; // 持卡人密码 String pin = "123213"; // cvn2 String cvn2 = "400"; // 有效期 String expired = "1212"; sf.append("certifTp=" + certifTp + SDKConstants.AMPERSAND); sf.append("certifId=" + certifId + SDKConstants.AMPERSAND); sf.append("customerNm=" + customerNm + SDKConstants.AMPERSAND); sf.append("phoneNo=" + phoneNo + SDKConstants.AMPERSAND); sf.append("smsCode=" + smsCode + SDKConstants.AMPERSAND); // 密码加密 sf.append("pin=" + SDKUtil.encryptPin("622188123456789", pin, encoding) + SDKConstants.AMPERSAND); // 密码不加密 // sf.append("pin="+pin + SDKConstants.AMPERSAND); // cvn2加密 // sf.append(SDKUtil.encrptCvn2(cvn2, encoding) + // SDKConstants.AMPERSAND); // cvn2不加密 sf.append("cvn2=" + cvn2 + SDKConstants.AMPERSAND); // 有效期加密 // sf.append(SDKUtil.encrptAvailable(expired, encoding)); // 有效期不加密 sf.append("expired=" + expired); sf.append("}"); String customerInfo = sf.toString(); try { return new String(SecureUtil.base64Encode(sf.toString().getBytes(encoding))); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return customerInfo; } }