支付宝的即时到账接口的实现还算是比较简单,从官网下载好demo后,配置好接口所需的参数,比如partner、seller_email、key等这些信息后,就可以调用支付宝的接口了。但是支付宝没有测试账号,所以测试的时候都是使用真实账号,并且要是真实的商家账号。所幸的是个人也可以申请成为商家,获取partner ID和key,这是申请链接和下载demo的地址:https://b.alipay.com/order/techService.htm。在测试的过程中,发现了一个问题,支付完成后支付宝异步通知notify_url地址验证支付宝反馈的结果时,一直提示sign和mysign的值不匹配,说可能是中文乱码问题造成的。验证的代码如下:
Map<String,String> params = new HashMap<String,String>();
Map requestParams = request.getParameterMap();
for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
}
//乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
//计算得出通知验证结果
return AlipayNotify.verify(params, partner ID, key);
反复检查代码,发现这是的字符编码都是utf-8,没有不会出现字符编码不一致的情况。后来把日志中的乱码拿出来在main方法中运行了一遍,发现控制台打印的内容和日志中乱码一致,算是有点眉目了。
public void main(String args[]) {
System.out.println(new String(中文.getBytes("ISO-8859-1"), "utf-8"));
}
于是就把标红那行代码注释掉,测试一把,验证成功。因为支付宝是通过post请求发送异步通知的,传递的中文参数无需再转码。这跟return_url同步通知不一样,同步通知是通过get请求发送,传递的中文参数经过浏览器处理后是乱码,故需要进行转码。