近期应用了支付宝即时到账交易接口,过程中遇上了验证的问题。
支付宝是很简单的接口,需要我们做的就是 “收集数据”,然后交由接口生成表单HTML,然后提交就可以,注意的是生成方式默认是GET,改为POST比较保险。
AlipaySubmit.buildForm(sParaTemp, ALIPAY_GATEWAY_NEW, "post", strButtonName);
接下来就等待返回,返回有两种,一种是“异步通知”(服务器主动通知,客户不可见),一种是“页面跳转通知”(支付操作后几秒,支付宝自动跳转回商户指定页面)。
分别对应我们传过去的 notify_url 和 return_url。两个参数不要含有“?”号。
还要注意就是参数是空的就不要传过去。直接注释掉那一行。如默认银行我们不需要:
//sParaTemp.put("defaultbank", "");
两个方法都需要验证支付支付结果,验证条件只有两个,
一个就是验证提交数据的签名,示例代码都很完整的操作,我们只需要照搬就可以。
另一个就是针对验证来源是否支付宝的 验证,通过返回的参数notify_id,以及我们的卖家账号,以下面形式提交回去进行验证,返回true则对应。
https://mapi.alipay.com/gateway.do?service=notify_verify&partner=2088002396712354¬ify_id=RqPnCoPT3K9%252Fvwbh3I%252BFioE227%252BPfNMl8jwyZqMIiXQWxhOCmQ5MQO%252FWd93rvCB%252BaiGg
而第二个验证对于我们来说是透明的,我们只需要理解就可以。
再提一下我遇到的问题,因为数据中有中文,所以编码问题造成验证签名不成功,
现在总结出来主要是我们需要保证编码上的统一。我是使用GBK编码的。
1. 为了保证这一点,我们首先要检查tomcat的配置
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="GBK"
2. alipayto.jsp,notify_url.jsp,return_url.jsp 里面所有四种编码都要统一,分别是
<%@ page language="java" contentType="text/html; charset=GBK"
pageEncoding="GBK"%>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
以及文档本身的编码。GBK 就对应 ANSI
3.设置AlipayConfig 的编码格式 input_charset = "GBK"
这样就不用对数据进行任何编码转换 就可以 传输中文。