微信支付开发教程JAVA编[005]-签名算法

       签名算法请参阅微信官方文档:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=4_3

        这里,直接给出签名的代码片断.大家可以参考.

 

	/**
	 * array参数按字典序排序参数,组合成url键值对参数(key1=value1&key2=value2...)
	 * @return string url键值对参数(key1=value1&key2=value2...)
	 */
	protected String toUrlParams() {
		//1.按字典序排序key
		String[] keys = m_values.keySet().toArray(new String[0]);
		Arrays.sort(keys, String.CASE_INSENSITIVE_ORDER);

		//2.组合url键值对参数(key1=value1&key2=value2...)
		String str = "";
		for(String key : keys) {
			Object val = m_values.opt(key);
			if(!key.equals("sign") && !val.equals("") && !(val instanceof Array))
				str += key + "=" + m_values.opt(key) + "&";
		}
		if(str.endsWith("&"))
			str = str.substring(0, str.length() - 1);
		return str;
	}

	/**
	 * 生成签名
	 * @return string 签名
	 */
	protected void makeSign() {
		//if(m_values.opt("sign") != null) m_values.remove("sign");
		//签名步骤一:按字典序排序参数,组合成url键值对参数(key1=value1&key2=value2...)
		//ksort(this.m_values); //toUrlParams已排序
		String str = toUrlParams();
		//签名步骤二:在字符串后加入API密钥key
		str += "&key=" + m_key;
		//签名步骤三:MD5或HMAC-SHA256加密
		str = MD5.digest(str);
		//签名步骤四:所有字符转为大写
		String sign = str.toUpperCase();
		m_values.put("sign", sign);
	}

 

其中m_values为JSONObject对象.MD5.SHA-1哈希算法.也给出..

 

/***************************************************************
 * MD5算法
 ***************************************************************/
package wxlib.wxsdk.lib.utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5 {
	private final static String[] m_digits = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};

	/**
	 * 转换byte到16进制字符串
	 * @param byte $b 要转换的byte
	 * @return string 16进制字符串
	 */
	private static String byte2Hex(byte b) {
		int n = b;
		if(n < 0) //-1=ff,-2=fe,-3=fd
			n += 256;
		int d1 = n / 16;
		int d2 = n % 16;
		return m_digits[d1] + m_digits[d2];
	}

	/**
	 * MD5编码
	 * @param string $origin 原始字符串
	 * @return string 经过MD5加密之后的结果
	 */
	public static String digest(String origin) {
		String str = "";
		try {
			MessageDigest md = MessageDigest.getInstance("MD5");
			byte[] bytes = md.digest(origin.getBytes());
			for(byte b : bytes)
				str += byte2Hex(b);
		}
		catch(NoSuchAlgorithmException e) {
		}
		return str;
	}
}

 

 

SHA-1类似MD5,只是在以下代码有一处不相同(当然,这些都是在我的wxsdk4j已经写好了的.等我发布了,大家有福了):

 

MessageDigest md = MessageDigest.getInstance("SHA-1");

 

你可能感兴趣的:(微信支付开发教程JAVA编[005]-签名算法)