WeixinOldPaymentSignature.java
package com.foxinmy.weixin4j.mp.oldpayment;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.foxinmy.weixin4j.sign.AbstractWeixinSignature;
import com.foxinmy.weixin4j.type.SignType;
import com.foxinmy.weixin4j.util.DigestUtil;
import com.foxinmy.weixin4j.util.MapUtil;
/**
* 老版本支付签名
*
* @className WeixinOldPaymentSignature
* @author jinyu(foxinmy@gmail.com)
* @date 2016年3月26日
* @since JDK 1.6
* @see
*/
public class WeixinOldPaymentSignature extends AbstractWeixinSignature {
/**
* 支付签名密钥
*/
private final String paySignKey;
/**
* package签名密钥
*/
private final String partnerKey;
public WeixinOldPaymentSignature(String paySignKey, String partnerKey) {
this.paySignKey = paySignKey;
this.partnerKey = partnerKey;
}
@Override
public boolean lowerCase() {
return true;
}
@Override
public String sign(Object obj) {
if (obj instanceof String) {
obj = JSON.parse(String.valueOf(obj));
} else {
obj = ((JSONObject) JSON.toJSON(obj));
}
((JSONObject) obj).put("appKey", paySignKey);
return DigestUtil.SHA1(join(obj).toString());
}
@Override
public SignType getSignType() {
return SignType.SHA1;
}
/**
* package拼接签名
*
* @param packageInfo
* package对象
* @return
*/
public String sign(PayPackageV2 packageInfo) {
StringBuilder sb = new StringBuilder();
// a.对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序) 后,
// 使用 URL 键值 对的格式(即 key1=value1&key2=value2...)拼接成字符串 string1
// 注意:值为空的参数不参与签名
sb.append(MapUtil.toJoinString(packageInfo, false, false));
// b--->
// 在 string1 最后拼接上 key=signKey 得到 stringSignTemp 字符串,并 对
// stringSignTemp 进行 md5 运算
// 再将得到的 字符串所有字符转换为大写 ,得到 sign 值 signValue。
sb.append("&key=").append(partnerKey);
// c---> & d---->
String sign = DigestUtil.MD5(sb.toString()).toUpperCase();
sb.delete(0, sb.length());
// c.对传入参数中所有键值对的 value 进行 urlencode 转码后重新拼接成字符串 string2
sb.append(MapUtil.toJoinString(packageInfo, true, false))
.append("&sign=").append(sign);
return sb.toString();
}
}