签名算法请参阅微信官方文档: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");