[java]代码库JAVA调用支付宝的直充接口原理和银联接口一样,当商家和支付宝签好协议后就可以问支付宝的人要相关的代码了。
我本地用的是支付宝UTF-8编码的代码,先把util里的东西达成一个alipay.jar文件。然后编写我们自己的调用和响应代码:
1.封装支付宝需要的接口数据
@Description("会员中心资金帐户支付宝充值")
@CreatedInfo(creator="hamano",date="-09-22")
publicModelAndViewfundsDepositByAliPay(HttpServletRequestrequest,
HttpServletResponseresponse){
RemindPageUtilremindPageUtil=newRemindPageUtil();
MapparaMap=newHashMap();
Stringpaygateway="/cooperate/gateway.do?";//'支付接口
Stringservice="create_direct_pay_by_user";//快速付款交易服务
Stringsign_type="MD5";
Stringout_trade_no=SnGenerator.generateUnionPaySn();//商户网站订单
Stringinput_charset="utf-8";
Stringkey="";//支付宝安全校验码(账户内提取)
Stringpartner="";//支付宝合作伙伴id(账户内提取)
Stringbody="商品描述";//商品描述,推荐格式:商品名称(订单编号:订单编号)
Stringtotal_fee="0.01";//订单总价
Stringpayment_type="1";//支付宝类型.1代表商品购买
Stringseller_email="pay@";//卖家支付宝帐户
Stringsubject="商品名称";//商品名称
Stringshow_url="http://www//product/show_product.jsp";//商品显示页
Stringnotify_url="http://www//accountController.do?method=alipayNotify";//通知接收URL
Stringreturn_url="http://www//accountController.do?method=alipayReturn";//支付完成后跳转返回的网址URL
StringItemUrl=Payment.CreateUrl(paygateway,service,sign_type,
out_trade_no,input_charset,partner,key,show_url,body,
total_fee,payment_type,seller_email,subject,notify_url,
return_url);
//支付宝接口用POST传输,所以我自己写了个将GET转为POST的方法,代码在下面的程序中给出
HttpClienthttp=newHttpClient(response);
http.setParameter("body",body);
http.setParameter("notify_url",notify_url);
http.setParameter("out_trade_no",out_trade_no);
http.setParameter("partner",partner);
http.setParameter("payment_type",payment_type);
http.setParameter("return_url",return_url);
http.setParameter("seller_email",seller_email);
http.setParameter("service",service);
http.setParameter("show_url",show_url);
http.setParameter("sign",ItemUrl);
http.setParameter("sign_type",sign_type);
http.setParameter("subject",subject);
http.setParameter("total_fee",total_fee);
try{
http.sendByPost("/cooperate/gateway.do?_input_charset=utf-8");
}catch(IOExceptione){
}
returnnull;
}
2.根据notify_url的设置响应支付宝接口
publicModelAndViewalipayNotify(HttpServletRequestrequest,
HttpServletResponseresponse)throwsException{
RemindPageUtilremindPageUtil=newRemindPageUtil();
MapparaMap=newHashMap();
StringprivateKey="";//支付宝安全校验码(账户内提取)
Stringpartner="";//支付宝合作伙伴id(账户内提取)
StringalipayNotifyURL="/trade/notify_query.do?"
+"&partner="
+partner
+"¬ify_id="
+request.getParameter("notify_id");
//获取支付宝ATN返回结果,true是正确的订单信息,false是无效的
StringresponseTxt=CheckURL.check(alipayNotifyURL);
Mapparams=newHashMap();
//获得POST过来参数设置到新的params中
MaprequestParams=request.getParameterMap();
for(Iteratoriter=requestParams.keySet().iterator();iter.hasNext();){
Stringname=(String)iter.next();
String[]values=(String[])requestParams.get(name);
StringvalueStr="";
for(inti=0;i
valueStr=(i==values.length-1)?valueStr+values[i]
:valueStr+values[i]+",";
}
params.put(name,valueStr);
}
Stringmysign=com.alipay.util.SignatureHelper.sign(params,privateKey);
StringorderId=request.getParameter("out_trade_no");
Stringamount=request.getParameter("total_fee");
if(mysign.equals(request.getParameter("sign"))
&&responseTxt.equals("true")){
if("TRADE_FINISHED".equals(request.getParameter("trade_status"))){
returnnull;
}else{
System.out.println("支付失败");
}
}else{
System.out.println("支付失败");
}
returnnull;
}
3.return_url的调用和前面一致,用于支付完成后的返回页面
附注:将GET转为POST的类
publicclassHttpClient{
Mapparameter=newHashMap();
HttpServletResponseresponse;
publicHttpClient(HttpServletResponseresponse)
{
this.response=response;
}
publicvoidsetParameter(Stringkey,Stringvalue)
{
this.parameter.put(key,value);
}
publicvoidsendByPost(Stringurl)throwsIOException
{
this.response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriterout=this.response.getWriter();
out.println("HTMLPUBLIC/"-//W3C//DTDHTML4.01Transitional//EN/">");
out.println("");
out.println("
sender");
out.println("
");
out.println("
");
Iteratorit=this.parameter.keySet().iterator();
while(it.hasNext())
{
Stringkey=it.next();
out.println("");
}
out.println("");
out.println("");
out.println("");
out.println("");
out.flush();
out.close();
}
}
我在做程序的时候碰到了一个很怪的现象,在if(mysign.equals(request.getParameter("sign"))&&responseTxt.equals("true")){}这一句,用jsp页面的时候没有任何问题,但写在类的方法中就会出现mysign和sign不一致的情况,在网上也查过相关资料有的说是编码问题,但我打印出回调的参数时中文数据都是对的。后来问了支付宝的工作人员,说是key和partner没写,可我写的都对的。最后他们也没给我一个合理的答案,他们说&&用||代替好了,因为最关键的是下面if("TRADE_FINISHED".equals(request.getParameter("trade_status"))){}这里的判断。
所以最后我就改成了if(mysign.equals(request.getParameter("sign"))||responseTxt.equals("true")){},如果有谁也碰到我一样的情况,请在此留言,告知我一下答案。谢谢!!!//源代码片段来自云代码