Java实现支付宝之第三方支付宝即时到账支付功能
alipay的几个内核功能文件:
AlipayFunction.java
packagecom.test.util.alipay; importjava.io.FileWriter; importjava.io.IOException; importjava.net.MalformedURLException; importjava.net.URL; importjava.util.ArrayList; importjava.util.Collections; importjava.util.HashMap; importjava.util.List; importjava.util.Map; importorg.dom4j.Document; importorg.dom4j.DocumentException; importorg.dom4j.Node; importorg.dom4j.io.SAXReader; publicclassAlipayFunction{ /** *功能:生成签名结果 *@paramsArray要签名的数组 *@paramkey安全校验码 *@return签名结果字符串 */ publicstaticStringBuildMysign(MapsArray,Stringkey){ Stringprestr=CreateLinkString(sArray);//把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串 prestr=prestr+key;//把拼接后的字符串再与安全校验码直接连接起来 Stringmysign=Md5Encrypt.md5(prestr); returnmysign; } /** *功能:除去数组中的空值和签名参数 *@paramsArray签名参数组 *@return去掉空值与签名参数后的新签名参数组 */ publicstaticMapParaFilter(MapsArray){ Listkeys=newArrayList(sArray.keySet()); MapsArrayNew=newHashMap(); for(inti=0;i<keys.size();i++){ Stringkey=(String)keys.get(i); Stringvalue=(String)sArray.get(key); if(value==null||value.equals("")|| key.equalsIgnoreCase("sign")||key.equalsIgnoreCase("sign_type")){ continue; } sArrayNew.put(key,value); } returnsArrayNew; } /** *功能:把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串 *@paramparams需要排序并参与字符拼接的参数组 *@return拼接后字符串 */ publicstaticStringCreateLinkString(Mapparams){ Listkeys=newArrayList(params.keySet()); Collections.sort(keys); Stringprestr=""; for(inti=0;i<keys.size();i++){ Stringkey=(String)keys.get(i); Stringvalue=(String)params.get(key); if(i==keys.size()-1){//拼接时,不包括最后一个&字符 prestr=prestr+key+"="+value; }else{ prestr=prestr+key+"="+value+"&"; } } returnprestr; } /** *功能:写日志,方便测试(看网站需求,也可以改成把记录存入数据库) *@paramsWord要写入日志里的文本内容 */ publicstaticvoidLogResult(StringsWord){ //该文件存在于和应用服务器启动文件同一目录下,文件名是alipaylog加服务器时间 try{ FileWriterwriter=newFileWriter("D:\\alipay_log"+System.currentTimeMillis()+".txt"); writer.write(sWord); writer.close(); }catch(Exceptione){ e.printStackTrace(); } } /** *功能:用于防钓鱼,调用接口query_timestamp来获取时间戳的处理函数 *注意:远程解析XML出错,与服务器是否支持SSL等配置有关 *@parampartner合作身份者ID *@return时间戳字符串 *@throwsIOException *@throwsDocumentException *@throwsMalformedURLException */ publicstaticStringquery_timestamp(Stringpartner) throwsMalformedURLException,DocumentException,IOException{ StringstrUrl="https://mapi.alipay.com/gateway.do?service=query_timestamp&partner="+partner; StringBufferbuf1=newStringBuffer(); SAXReaderreader=newSAXReader(); Documentdoc=reader.read(newURL(strUrl).openStream()); List<Node>nodeList=doc.selectNodes("//alipay/*"); for(Nodenode:nodeList){ //截取部分不需要解析的信息 if(node.getName().equals("is_success") &&node.getText().equals("T")){ //判断是否有成功标示 List<Node>nodeList1=doc.selectNodes("//response/timestamp/*"); for(Nodenode1:nodeList1){ buf1.append(node1.getText()); } } } returnbuf1.toString(); } }
AlipayNotify.java
packagecom.test.util.alipay; importjava.io.BufferedReader; importjava.io.InputStreamReader; importjava.net.HttpURLConnection; importjava.net.URL; importjava.util.Map; importcom.test.constants.AlipayConfig; publicclassAlipayNotify{ /** **功能:根据反馈回来的信息,生成签名结果 *@paramParams通知返回来的参数数组 *@paramkey安全校验码 *@return生成的签名结果 */ publicstaticStringGetMysign(MapParams,Stringkey){ MapsParaNew=AlipayFunction.ParaFilter(Params);//过滤空值、sign与sign_type参数 Stringmysign=AlipayFunction.BuildMysign(sParaNew,key);//获得签名结果 returnmysign; } /** **功能:获取远程服务器ATN结果,验证返回URL *@paramnotify_id通知校验ID *@return服务器ATN结果 *验证结果集: *invalid命令参数不对出现这个错误,请检测返回处理中partner和key是否为空 *true返回正确信息 *false请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟 */ publicstaticStringVerify(Stringnotify_id){ //获取远程服务器ATN结果,验证是否是支付宝服务器发来的请求 Stringtransport=AlipayConfig.transport; Stringpartner=AlipayConfig.partner; Stringveryfy_url=""; if(transport.equalsIgnoreCase("https")){ veryfy_url="https://www.alipay.com/cooperate/gateway.do?service=notify_verify"; }else{ veryfy_url="http://notify.alipay.com/trade/notify_query.do?"; } veryfy_url=veryfy_url+"&partner="+partner+"¬ify_id="+notify_id; StringresponseTxt=CheckUrl(veryfy_url); returnresponseTxt; } /** **功能:获取远程服务器ATN结果 *@paramurlvalue指定URL路径地址 *@return服务器ATN结果 *验证结果集: *invalid命令参数不对出现这个错误,请检测返回处理中partner和key是否为空 *true返回正确信息 *false请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟 */ publicstaticStringCheckUrl(Stringurlvalue){ StringinputLine=""; try{ URLurl=newURL(urlvalue); HttpURLConnectionurlConnection=(HttpURLConnection)url .openConnection(); BufferedReaderin=newBufferedReader(newInputStreamReader( urlConnection.getInputStream())); inputLine=in.readLine().toString(); }catch(Exceptione){ e.printStackTrace(); } returninputLine; } }
AlipayService.java
packagecom.test.util.alipay; importjava.util.ArrayList; importjava.util.HashMap; importjava.util.List; importjava.util.Map; publicclassAlipayService{ /** *功能:构造表单提交HTML *@parampartner合作身份者ID *@paramseller_email签约支付宝账号或卖家支付宝帐户 *@paramreturn_url付完款后跳转的页面要用以http开头格式的完整路径,不允许加?id=123这类自定义参数 *@paramnotify_url交易过程中服务器通知的页面要用以http开格式的完整路径,不允许加?id=123这类自定义参数 *@paramshow_url网站商品的展示地址,不允许加?id=123这类自定义参数 *@paramout_trade_no请与贵网站订单系统中的唯一订单号匹配 *@paramsubject订单名称,显示在支付宝收银台里的“商品名称”里,显示在支付宝的交易管理的“商品名称”的列表里。 *@parambody订单描述、订单详细、订单备注,显示在支付宝收银台里的“商品描述”里 *@paramtotal_fee订单总金额,显示在支付宝收银台里的“应付总额”里 *@parampaymethod默认支付方式,四个值可选:bankPay(网银);cartoon(卡通);directPay(余额);CASH(网点支付) *@paramdefaultbank默认网银代号,代号列表见club.alipay.com/read.php?tid=8681379 *@paramencrypt_key防钓鱼时间戳 *@paramexter_invoke_ip买家本地电脑的IP地址 *@paramextra_common_param自定义参数,可存放任何内容(除等特殊字符外),不会显示在页面上 *@parambuyer_email默认买家支付宝账号 *@paramroyalty_type提成类型,该值为固定值:10,不需要修改 *@paramroyalty_parameters提成信息集,与需要结合商户网站自身情况动态获取每笔交易的各分润收款账号、各分润金额、各分润说明。最多只能设置10条 *@paraminput_charset字符编码格式目前支持GBK或utf-8 *@paramkey安全校验码 *@paramsign_type签名方式不需修改 *@paramkey安全校验码 *@return表单提交HTML文本 */ publicstaticStringBuildForm(Stringpartner, Stringseller_email, Stringreturn_url, Stringnotify_url, Stringshow_url, Stringout_trade_no, Stringsubject, Stringbody, Stringtotal_fee, Stringpaymethod, Stringdefaultbank, Stringanti_phishing_key, Stringexter_invoke_ip, Stringextra_common_param, Stringbuyer_email, Stringroyalty_type, Stringroyalty_parameters, Stringinput_charset, Stringkey, Stringsign_type, Stringit_b_pay){ MapsPara=newHashMap(); sPara.put("service","create_direct_pay_by_user"); sPara.put("payment_type","1"); sPara.put("partner",partner); sPara.put("seller_email",seller_email); sPara.put("return_url",return_url); sPara.put("notify_url",notify_url); sPara.put("_input_charset",input_charset); sPara.put("show_url",show_url); sPara.put("out_trade_no",out_trade_no); sPara.put("subject",subject); sPara.put("body",body); sPara.put("total_fee",total_fee); sPara.put("paymethod",paymethod); sPara.put("defaultbank",defaultbank); sPara.put("anti_phishing_key",anti_phishing_key); sPara.put("exter_invoke_ip",exter_invoke_ip); sPara.put("extra_common_param",extra_common_param); sPara.put("buyer_email",buyer_email); sPara.put("royalty_type",royalty_type); sPara.put("royalty_parameters",royalty_parameters); sPara.put("it_b_pay",it_b_pay); MapsParaNew=AlipayFunction.ParaFilter(sPara);//除去数组中的空值和签名参数 Stringmysign=AlipayFunction.BuildMysign(sParaNew,key);//生成签名结果 StringBuffersbHtml=newStringBuffer(); Listkeys=newArrayList(sParaNew.keySet()); Stringgateway="https://www.alipay.com/cooperate/gateway.do?"; //GET方式传递 //sbHtml.append("<formid=\"alipaysubmit\"name=\"alipaysubmit\"action=\""+gateway+"_input_charset="+input_charset+"\"method=\"get\">"); //POST方式传递(GET与POST二必选一) sbHtml.append("<formid=\"alipaysubmit\"name=\"alipaysubmit\"action=\""+gateway+"_input_charset="+input_charset+"\"method=\"post\">"); for(inti=0;i<keys.size();i++){ Stringname=(String)keys.get(i); Stringvalue=(String)sParaNew.get(name); sbHtml.append("<inputtype=\"hidden\"name=\""+name+"\"value=\""+value+"\"/>"); } sbHtml.append("<inputtype=\"hidden\"name=\"sign\"value=\""+mysign+"\"/>"); sbHtml.append("<inputtype=\"hidden\"name=\"sign_type\"value=\""+sign_type+"\"/>"); //submit按钮控件请不要含有name属性 sbHtml.append("<inputtype=\"submit\"value=\"支付宝确认付款\"></form>"); sbHtml.append("<script>document.forms['alipaysubmit'].submit();</script>"); returnsbHtml.toString(); } }
Md5Encrypt.java
packagecom.test.util.alipay; importjava.io.UnsupportedEncodingException; importjava.security.MessageDigest; importjava.security.NoSuchAlgorithmException; importcom.test.constants.AlipayConfig; /** *功能:支付宝MD5加密处理核心文件,不需要修改 *版本:3.1 *修改日期:2010-11-01 *说明: *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。 *该代码仅供学习和研究支付宝接口使用,只是提供一个 **/ publicclassMd5Encrypt{ /** *UsedbuildingoutputasHex */ privatestaticfinalchar[]DIGITS={'0','1','2','3','4','5','6', '7','8','9','a','b','c','d','e','f'}; /** *对字符串进行MD5加密 * *@paramtext *明文 * *@return密文 */ publicstaticStringmd5(Stringtext){ MessageDigestmsgDigest=null; try{ msgDigest=MessageDigest.getInstance("MD5"); }catch(NoSuchAlgorithmExceptione){ thrownewIllegalStateException( "Systemdoesn'tsupportMD5algorithm."); } try{ msgDigest.update(text.getBytes(AlipayConfig.input_charset));//注意改接口是按照指定编码形式签名 }catch(UnsupportedEncodingExceptione){ thrownewIllegalStateException( "Systemdoesn'tsupportyourEncodingException."); } byte[]bytes=msgDigest.digest(); Stringmd5Str=newString(encodeHex(bytes)); returnmd5Str; } publicstaticchar[]encodeHex(byte[]data){ intl=data.length; char[]out=newchar[l<<1]; //twocharactersformthehexvalue. for(inti=0,j=0;i<l;i++){ out[j++]=DIGITS[(0xF0&data[i])>>>4]; out[j++]=DIGITS[0x0F&data[i]]; } returnout; } }
AlipayConfig.java这里是对账号,Key,回调连接地址等一些设置
packagecom.test.constants; importjava.util.Properties; importcom.test.util.PropertiesUtil; publicclassAlipayConfig{ privatestaticAlipayConfigalconfig=null; privateAlipayConfig(){ } publicstaticAlipayConfiggetInstance(){ if(alconfig==null){ alconfig=newAlipayConfig(); } returnalconfig; } //如何获取安全校验码和合作身份者ID //1.访问支付宝商户服务中心(b.alipay.com),然后用您的签约支付宝账号登陆. //2.访问“技术服务”→“下载技术集成文档”(https://b.alipay.com/support/helperApply.htm?action=selfIntegration) //3.在“自助集成帮助”中,点击“合作者身份(PartnerID)查询”、“安全校验码(Key)查询” //↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ //合作身份者ID,以2088开头由16位纯数字组成的字符串 publicstaticStringit_b_pay="1h"; publicstaticStringpartner="2088601003079118"; publicstaticStringservice="create_direct_pay_by_user"; //交易安全检验码,由数字和字母组成的32位字符串 publicstaticStringkey="zxcdvxgksaam2zjrmv5cv0p4jqesaioh"; //签约支付宝账号或卖家收款支付宝帐户 publicstaticStringseller_email="test@yahoo.com.cn"; //读配置文件 //notify_url交易过程中服务器通知的页面要用http://格式的完整路径,不允许加?id=123这类自定义参数 publicstaticStringnotify_url="http:www.xxx.com/projectName/alipayTrade.action"; //付完款后跳转的页面要用http://格式的完整路径,不允许加?id=123这类自定义参数 //return_url的域名不能写成http://localhost/js_jsp_utf8/return_url.jsp,否则会导致return_url执行无效 //publicstaticStringreturn_url="http:www.xxx.com/projectName/alipayTrade.action"; //网站商品的展示地址,不允许加?id=123这类自定义参数 publicstaticStringshow_url="http://www.alipay.com"; //收款方名称,如:公司名称、网站名称、收款人姓名等 publicstaticStringmainname="收款方名称"; //↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ //字符编码格式目前支持gbk或utf-8 publicstaticStringinput_charset="UTF-8"; //签名方式不需修改 publicstaticStringsign_type="MD5"; //访问模式,根据自己的服务器是否支持ssl访问,若支持请选择https;若不支持请选择http publicstaticStringtransport="http"; }
下面是一个简单的应用流程:
从JSP调用的就不说了,因为这也就只是传给后台你要买的东西是什么,价格多少等一些参数。
这里介绍一下后台处理的:
PaymentAction.java
/** *获取支付宝交易订单号 *@return */ publicsynchronizedstaticStringgetOrderNum(){ Datedate=newDate(); DateFormatdf=newSimpleDateFormat("yyyyMMddHHmmssSSS"); returndf.format(date); } protectedHttpServletRequestgetRequest(){ returnServletActionContext.getRequest(); } //支付宝交易订单号 StringorderNum=getOrderNum(); //此次交易的总金额 getRequest().setAttribute("totalMoney","0.01"); //此次交易的订单号 getRequest().setAttribute("out_trade_no",orderNum); //商品名称描述 getRequest().setAttribute("subject","商品名称"); //这里省略了将此次订单信息存到数据库的流程
alipay.jsp
<%@pageimport="com.test.constants.AlipayConfig"%> <%@pageimport="com.test.util.alipay.UtilDate"%> <%@pageimport="com.test.util.alipay.AlipayService"%> <% /* 功能:设置商品有关信息(入口页) *详细:该页面是接口入口页面,生成支付时的URL *版本:3.1 *日期:2010-11-01 *说明: *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。 *************************注意***************** 如果您在接口集成过程中遇到问题, 您可以到商户服务中心(https://b.alipay.com/support/helperApply.htm?action=consultationApply),提交申请集成协助,我们会有专业的技术工程师主动联系您协助解决, 您也可以到支付宝论坛(http://club.alipay.com/read-htm-tid-8681712.html)寻找相关解决方案 要传递的参数要么不允许为空,要么就不要出现在数组与隐藏控件或URL链接里。 ********************************************** */ %> <%@pagelanguage="java"contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"> <html> <head> <metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"> <title>test</title> <linkrel="SHORTCUTICON"href="favicon.ico"> <metaname="keywords"content=""/> <metaname="description"content=""/> <styletype="text/css"> .font_content{ font-family:"宋体"; font-size:14px; color:#FF6600; } .font_title{ font-family:"宋体"; font-size:16px; color:#FF0000; font-weight:bold; } table{ border:1pxsolid#CCCCCC; } </style> <scripttype="text/javascript"> var_gaq=_gaq||[]; _gaq.push(['_setAccount','UA-25469955-1']); _gaq.push(['_trackPageview']); (function(){ varga=document.createElement('script');ga.type='text/javascript';ga.async=true; ga.src=('https:'==document.location.protocol?'https://ssl':'http://www')+'.google-analytics.com/ga.js'; vars=document.getElementsByTagName('script')[0];s.parentNode.insertBefore(ga,s); })(); </script> </head> <% //request.setCharacterEncoding("UTF-8"); //AlipyConfig.java中配置信息(不可以修改) Stringinput_charset=AlipayConfig.getInstance().input_charset; Stringsign_type=AlipayConfig.getInstance().sign_type; Stringseller_email=AlipayConfig.getInstance().seller_email; Stringpartner=AlipayConfig.getInstance().partner; Stringkey=AlipayConfig.getInstance().key; Stringshow_url=AlipayConfig.getInstance().show_url; Stringnotify_url=AlipayConfig.getInstance().notify_url; Stringreturn_url=AlipayConfig.getInstance().return_url; Stringit_b_pay=AlipayConfig.getInstance().it_b_pay; /////////////////////////////////////////////////////////////////////////////////// //以下参数是需要通过下单时的订单数据传入进来获得 //必填参数 Stringout_trade_no=(String)request.getAttribute("out_trade_no");//请与贵网站订单系统中的唯一订单号匹配 //订单名称,显示在支付宝收银台里的“商品名称”里,显示在支付宝的交易管理的“商品名称”的列表里。 Stringsubject=(String)request.getAttribute("subject"); //订单描述、订单详细、订单备注,显示在支付宝收银台里的“商品描述”里 Stringbody=(String)request.getAttribute("body"); //订单总金额,显示在支付宝收银台里的“应付总额”里 Stringtotal_fee=(String)request.getAttribute("totalMoney"); //扩展功能参数——默认支付方式 //Stringpay_mode=request.getParameter("pay_bank"); Stringpaymethod="";//默认支付方式,四个值可选:bankPay(网银);cartoon(卡通);directPay(余额);CASH(网点支付) Stringdefaultbank="";//默认网银代号,代号列表见http://club.alipay.com/read.php?tid=8681379 /*if(pay_mode.equals("directPay")){ paymethod="directPay"; } else{ paymethod="bankPay"; defaultbank=pay_mode; }*/ //扩展功能参数——防钓鱼 //请慎重选择是否开启防钓鱼功能 //exter_invoke_ip、anti_phishing_key一旦被设置过,那么它们就会成为必填参数 //开启防钓鱼功能后,服务器、本机电脑必须支持远程XML解析,请配置好该环境。 //建议使用POST方式请求数据 Stringanti_phishing_key="";//防钓鱼时间戳 Stringexter_invoke_ip="";//获取客户端的IP地址,建议:编写获取客户端IP地址的程序 //如: //anti_phishing_key=AlipayFunction.query_timestamp(partner);//获取防钓鱼时间戳函数 //exter_invoke_ip="202.1.1.1"; //扩展功能参数——其他 Stringextra_common_param="";//自定义参数,可存放任何内容(除=、&等特殊字符外),不会显示在页面上 Stringbuyer_email="137672927";//默认买家支付宝账号 Stringextend_param=""; //扩展功能参数——分润(若要使用,请按照注释要求的格式赋值) Stringroyalty_type="";//提成类型,该值为固定值:10,不需要修改 Stringroyalty_parameters=""; //提成信息集,与需要结合商户网站自身情况动态获取每笔交易的各分润收款账号、各分润金额、各分润说明。最多只能设置10条 //各分润金额的总和须小于等于total_fee //提成信息集格式为:收款方Email_1^金额1^备注1|收款方Email_2^金额2^备注2 //如: //royalty_type="10" //royalty_parameters="111@126.com^0.01^分润备注一|222@126.com^0.01^分润备注二" //之前设置的1h将返回 //错误描述:抱歉,商户没有开通自定义超时权限,请联系您的商家。 //错误代码:SELF_TIMEOUT_NOT_SUPPORT it_b_pay=""; //构造函数,生成请求URL StringsHtmlText=AlipayService.BuildForm(partner,seller_email,return_url,notify_url,show_url,out_trade_no, subject,body,total_fee,paymethod,defaultbank,anti_phishing_key,exter_invoke_ip,extra_common_param,buyer_email, royalty_type,royalty_parameters,input_charset,key,sign_type,it_b_pay); %> <body> <tablealign="center"width="350"cellpadding="5"cellspacing="0"> <tr> <tdalign="center"class="font_title"colspan="2">订单确认</td> </tr> <tr> <tdclass="font_content"align="right">订单号:</td> <tdclass="font_content"align="left"><%=out_trade_no%></td> </tr> <tr> <tdclass="font_content"align="right">付款总金额:</td> <tdclass="font_content"align="left"><%=total_fee%></td> </tr> <tr> <tdalign="center"colspan="2"><%=sHtmlText%></td> </tr> </table> </body> </html>
支付宝回调的接口:AlipayNotify.java
packagecom.test.action.payment; importjava.util.Date; importjava.util.List; importcom.test.action.base.BaseAction; importcom.test.dao.model.paymentcenter.OrderForm; importcom.test.dao.model.paymentcenter.OrderList; importcom.test.dao.model.paymentcenter.UserPurview; publicclassAlipayNotifyextendsBaseAction{ privatestaticfinallongserialVersionUID=1L; privateStringbuyer_email; privatelongbuyer_id; privateStringexterface; privateStringis_success; privateStringnotify_id; privateStringnotify_time; privateStringnotify_type; privateStringout_trade_no; privateStringpayment_type; privateStringseller_email; privatelongseller_id; privateStringsubject; privatefloattotal_fee; privateStringtrade_no; privateStringtrade_status; privateStringsign; privateStringsign_type; privateOrderFormof; //……这里省去了get和set方法 ……………………………………………………………… //处理支付宝传过来的参数信息 publicStringalipayTrade()throwsException{ if(this.is_success.equalsIgnoreCase("T") &&"TRADE_SUCCESS".equalsIgnoreCase(this.trade_status)){ of=(OrderForm)orderFormService .findOrderFormsByOut_trade_no(this.out_trade_no); if(of!=null){ of.setTradeStatus(1); of.setTradeNo(this.trade_no); of.setNotifyTime(newDate()); orderFormService.updateOldModel(of);//更新 List<OrderList>orderList=orderListService .findOrderFormsByOutTradeNo(this.out_trade_no); for(OrderListol:orderList){ //这里省去了处理订单逻辑代码…………………… } } //回调成功之后,给支付宝返回一个"success"字符就可以了 returnSUCCESS; } return"failure"; } }
就这样,支付宝的第三方即时到账接口就算实现了。
以上所述是小编给大家介绍的Java实现支付宝之第三方支付宝即时到账支付功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!