/** * 验证消息是否是支付宝发出的合法消息 * * @param params 通知返回来的参数数组 * @return 验证结果 */ public static boolean verify(Map<String, String> params) { String mysign = getMysign(params); String responseTxt = "true"; if (params.get("notify_id") != null) { responseTxt = verifyResponse(params.get("notify_id")); } String sign = ""; if (params.get("sign") != null) { sign = params.get("sign"); } // 写日志记录(若要调试,请取消下面两行注释) String sWord = "responseTxt=" + responseTxt + "\n notify_url_log:sign=" + sign + "&mysign=" + mysign + "\n notify回来的参数:" + AlipayCore.createLinkString(params); AlipayCore.logResult(sWord); System.out.println(sWord); // 验证 // responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关 // mysign与sign不等,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关 if (mysign.equals(sign) && responseTxt.equals("true")) { return true; } else { return false; } }
/** * 生成要请求给支付宝的参数数组 * * @param sParaTemp 请求前的参数数组 * @return 要请求的参数数组 */ private static Map<String, String> buildRequestPara(Map<String, String> sParaTemp) { // 除去数组中的空值和签名参数 Map<String, String> sPara = AlipayCore.paraFilter(sParaTemp); // 生成签名结果 String mysign = AlipayCore.buildMysign(sPara); // 签名结果与签名方式加入请求提交参数组中 sPara.put("sign", mysign); sPara.put("sign_type", AlipayConfig.sign_type); return sPara; }
/** * 生成签名结果 * * @param sPara 要签名的数组 * @return 签名结果字符串 */ public static String buildRequestMysign(Map<String, String> sPara) { String prestr = AlipayCore.createLinkString(sPara); // 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串 String mysign = ""; if (AlipayConfig.sign_type.equals("MD5")) { mysign = MD5.sign(prestr, AlipayConfig.key, AlipayConfig.input_charset); } return mysign; }
/** * 根据反馈回来的信息,生成签名结果 * * @param Params 通知返回来的参数数组 * @return 生成的签名结果 */ private static String getMysign(Map<String, String> Params) { Map<String, String> sParaNew = AlipayCore.paraFilter(Params); // 过滤空值、sign与sign_type参数 String mysign = AlipayCore.buildMysign(sParaNew); // 获得签名结果 return mysign; }