1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 支付宝接口 java_JAVA调用支付宝的直充接口

支付宝接口 java_JAVA调用支付宝的直充接口

时间:2018-08-01 09:44:01

相关推荐

支付宝接口 java_JAVA调用支付宝的直充接口

[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

+"&notify_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")){},如果有谁也碰到我一样的情况,请在此留言,告知我一下答案。谢谢!!!//源代码片段来自云代码

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。