今天做微信免密支付签约的时候,一直报entrustweb_sign参数结构错误,调了一天,反复核对参数发现没问题,比对生成的sign(签名)也是一致的。
【推荐一下微信官方接口调试工具来生成签名做比对:微信公众平台支付接口调试工具】;
后来反复读文档:
文档上签名算法是这样的。签约的文档部分有一部分非常重要,如下图(注意标注部分):
回调地址是要进行encode处理,但是生成签名的时候传进去的notufy_url是原值。(我就是在这个坑里待了一天)
还有就是此处的时间戳一定是10位。
下面看代码:
/** * @Author : lilong * @Description :微信支付签约 * @Date : 10:40 2018/5/3 **/ public static String wxContract() throws Exception { //签名所需要的参数 String appid = "wx05c*********"; String mch_id = "14847****"; String plan_id = "120***"; String contract_code = "100000"; Integer request_serial = 1000; String contract_display_account = "wechatPay"; String notifyUrl = "http://192.168.*.**:8080/mvc/callbackContract"; //回调地址需要encode,但是生成签名的时候传进去的是源值 String notify_url = java.net.URLEncoder.encode(notifyUrl); String version = "1.0"; //时间戳是10位 String timestamp =String.valueOf( new Date().getTime()/1000); // SortedMap<Object,Object> signMap = new TreeMap<Object,Object>(); Map<String,String> signMap = new TreeMap<>(); signMap.put("appid", appid); signMap.put("mch_id", mch_id); signMap.put("plan_id",plan_id); signMap.put("contract_code",contract_code); signMap.put("request_serial",request_serial.toString()); signMap.put("contract_display_account",contract_display_account); signMap.put("notify_url",notifyUrl); signMap.put("version",version); signMap.put("timestamp",timestamp); System.err.println(timestamp); String sign = createSign(signMap); String url = "https://api.mch.weixin.qq.com/papay/entrustweb?appid=" + appid + "&contract_code=" + contract_code + "&contract_display_account=" + contract_display_account + "&mch_id=" + mch_id + "¬ify_url=" + notify_url + "&plan_id=" + plan_id + "&request_serial=" + request_serial + "×tamp=" + timestamp + "&version=" + version + "&sign=" + sign; System.err.println("*************" + url + "***********"); return url; }