View Javadoc
1   package com.foxinmy.weixin4j.mp.oldpayment;
2   
3   import com.alibaba.fastjson.JSON;
4   import com.alibaba.fastjson.JSONObject;
5   import com.foxinmy.weixin4j.sign.AbstractWeixinSignature;
6   import com.foxinmy.weixin4j.type.SignType;
7   import com.foxinmy.weixin4j.util.DigestUtil;
8   import com.foxinmy.weixin4j.util.MapUtil;
9   
10  /**
11   * 老版本支付签名
12   *
13   * @className WeixinOldPaymentSignature
14   * @author jinyu(foxinmy@gmail.com)
15   * @date 2016年3月26日
16   * @since JDK 1.6
17   * @see
18   */
19  public class WeixinOldPaymentSignature extends AbstractWeixinSignature {
20  
21  	/**
22  	 * 支付签名密钥
23  	 */
24  	private final String paySignKey;
25  	/**
26  	 * package签名密钥
27  	 */
28  	private final String partnerKey;
29  
30  	public WeixinOldPaymentSignature(String paySignKey, String partnerKey) {
31  		this.paySignKey = paySignKey;
32  		this.partnerKey = partnerKey;
33  	}
34  
35  	@Override
36  	public boolean lowerCase() {
37  		return true;
38  	}
39  
40  	@Override
41  	public String sign(Object obj) {
42  		if (obj instanceof String) {
43  			obj = JSON.parse(String.valueOf(obj));
44  		} else {
45  			obj = ((JSONObject) JSON.toJSON(obj));
46  		}
47  		((JSONObject) obj).put("appKey", paySignKey);
48  		return DigestUtil.SHA1(join(obj).toString());
49  	}
50  
51  	@Override
52  	public SignType getSignType() {
53  		return SignType.SHA1;
54  	}
55  
56  	/**
57  	 * package拼接签名
58  	 *
59  	 * @param packageInfo
60  	 *            package对象
61  	 * @return
62  	 */
63  	public String sign(PayPackageV2 packageInfo) {
64  		StringBuilder sb = new StringBuilder();
65  		// a.对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序) 后,
66  		// 使用 URL 键值 对的格式(即 key1=value1&key2=value2...)拼接成字符串 string1
67  		// 注意:值为空的参数不参与签名
68  		sb.append(MapUtil.toJoinString(packageInfo, false, false));
69  		// b--->
70  		// 在 string1 最后拼接上 key=signKey 得到 stringSignTemp 字符串,并 对
71  		// stringSignTemp 进行 md5 运算
72  		// 再将得到的 字符串所有字符转换为大写 ,得到 sign 值 signValue。
73  		sb.append("&key=").append(partnerKey);
74  		// c---> & d---->
75  		String sign = DigestUtil.MD5(sb.toString()).toUpperCase();
76  		sb.delete(0, sb.length());
77  		// c.对传入参数中所有键值对的 value 进行 urlencode 转码后重新拼接成字符串 string2
78  		sb.append(MapUtil.toJoinString(packageInfo, true, false))
79  				.append("&sign=").append(sign);
80  		return sb.toString();
81  	}
82  }