支付簽名

// 3.簽名
		Map signData = XhPayUtil.sign(reqData, "utf-8");

 

/**
	 * 生成簽名值(SHA1摘要算法)
	 * 
	 * @param data
	 *            待簽名數據Map鍵值對形式
	 * @param encoding
	 *            編碼
	 * @return 簽名是否成功
	 */
	public static Map sign(Map<String, String> data, String encoding) {
		Map signMap = new HashMap();
		String transData = createTransDataByMap(data);
		signMap.put("transData", transData);
		signMap.put("signMsg", signByStr(transData, encoding));
		System.out.println("數據:" + signMap);
		return signMap;
	}

 

/**
	 * 將map數據按key=value&key=value進行組裝
	 * 
	 * @param data
	 * @param encoding
	 * @return
	 */
	public static String createTransDataByMap(Map data) {
		if (data == null || data.isEmpty()) {
			return "";
		}

		StringBuffer sb = new StringBuffer();
		Iterator iter = data.keySet().iterator();
		while (iter.hasNext()) {
			Object key = iter.next();
			sb.append(key).append("=").append(data.get(key)).append("&");
		}
		sb.deleteCharAt(sb.length() - 1);// 清楚最後一個&
		return sb.toString();
	}

 

/**
	 * 簽名
	 * 
	 * @param transData
	 * @param encoding
	 * @return
	 */
	public static String signByStr(String transData, String encoding) {
		System.out.println("調用簽名方法....");
		String webappPath = FileUtils.getProjectPath();
		log.info("證書加載路徑爲={}", webappPath);

		String[] b = transData.split("&");

		String c = "";
		String merchId = "";
		for (int i = 0; i < b.length; i++) {
			c = b[i];
			if (c.indexOf("merchId=") != -1) {
				merchId = c.substring(8, c.length());
			}
		}
		if (pfx_path == null) {
			pfx_path = webappPath + Properties.getString("pfxDir") + "/"
					+ merchId + "/" + merchId + ".pfx";
			// pfx_path = Properties.getString("pfxDir") + "/" + merchId + "/"
			// + merchId + ".pfx";
		}

		if (pfx_pwd == null) {
			pfx_pwd = Properties.getString("pfx_pwd");
		}

		if (!new File(pfx_path).exists()) {
			System.err.println(pfx_path + "文件不存在");
			pfx_path = null;
			throw new RuntimeException("商戶證書不存在");
		}

		byte[] byteSign = null;
		try {
			byte[] signDigest = transData.getBytes(encoding);// SecureUtil.sha1X16(stringData,
																// encoding);
			byteSign = SecureUtil
					.signBySoft(CertUtil.getSignCertPrivateKeyByStoreMap(
							pfx_path, pfx_pwd), signDigest);
			pfx_path = null;
			// 設置簽名域值
		} catch (Exception e) {
			LogUtil.writeErrorLog("簽名異常", e);
		}
		if (byteSign == null) {
			LogUtil.writeErrorLog("簽名異常");
			pfx_path = null;
			return "";
		}
		String signStr = Base64.encode(byteSign);

		System.out.println("signStr:" + signStr);
		return signStr;

	}

 

public static PrivateKey getSignCertPrivateKeyByStoreMap(String certPath,
			String certPwd) {
		if (!certKeyStoreMap.containsKey(certPath)) {
			loadRsaCert(certPath, certPwd);
		}
		try {
			Enumeration<String> aliasenum = certKeyStoreMap.get(certPath)
					.aliases();
			String keyAlias = null;
			if (aliasenum.hasMoreElements()) {
				keyAlias = aliasenum.nextElement();
			}
			PrivateKey privateKey = (PrivateKey) certKeyStoreMap.get(certPath)
					.getKey(keyAlias, certPwd.toCharArray());
			return privateKey;
		} catch (KeyStoreException e) {
			LogUtil.writeErrorLog("getSignCertPrivateKeyByStoreMap Error", e);
			return null;
		} catch (UnrecoverableKeyException e) {
			LogUtil.writeErrorLog("getSignCertPrivateKeyByStoreMap Error", e);
			return null;
		} catch (NoSuchAlgorithmException e) {
			LogUtil.writeErrorLog("getSignCertPrivateKeyByStoreMap Error", e);
			return null;
		}
	}

 

/**
	 * 軟簽名
	 * 
	 * @param privateKey
	 *            私鑰
	 * @param data
	 *            待簽名數據
	 * @param signMethod
	 *            簽名方法
	 * @return 結果
	 * @throws Exception
	 */
	public static byte[] signBySoft(PrivateKey privateKey, byte[] data)
			throws Exception {
		byte[] result = null;
		Signature st = Signature.getInstance(BC_PROV_ALGORITHM_SHA256RSA);
		st.initSign(privateKey);
		st.update(data);
		result = st.sign();
		String s = Base64.encodeBase64String(result);
		System.out.println(s);
		return result;
	}

 

/**
	 * 算法常量:SHA1withRSA
	 */
	private static final String BC_PROV_ALGORITHM_SHA256RSA = "SHA256withRSA";

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章