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();
	}
}