详解java集成支付宝支付接口(JSP+支付宝20160912)
吐槽一下:
支付宝的接口和微信的DEMO和文档真心太难看懂了,乱七八糟,都不知道去哪里找自己要的东西,最近几天我们公司需要做类似的开发,我作为先锋,率先解决Java集成支付宝支付和微信支付接口工作。
我们的工作环境:JSP网站+支付接口,目前工作的支付宝接口为20160912,微信为V3版本,如遇到版本升级,请联系相关机构的客户服务人员升级。
本文介绍JSP+支付宝接口,本文非原创。
新手注意:
1、本文使用的接口地址和参数为沙箱的地址,无论你在使用沙箱或者正式地址,务必核实使用接口地址和参数,不要想当然。
2、本文使用JAR包:
alipay-sdk-java20160912220103.jar
commons-codec-1.6.jar
commons-httpclient-3.0.1.jar
commons-logging-1.1.1.jar
fastjson-1.2.7.jar
json-lib-2.2.3-jdk13.jar
json.jar
jsp-api.jar
servlet-api.jar
说明:
alipay-sdk-java是官方支付SDK,请到官方下载,本文使用版本20160912
首页调用:
<body> <% CsPaypay=newCsPay(); pay.doPost(request,response); %> </body>
packagecom.luozhuang.alipay; importjava.util.HashMap; importjava.util.Map; importcom.alibaba.fastjson.JSON; importcom.alipay.api.AlipayApiException; importcom.alipay.api.AlipayClient; importcom.alipay.api.DefaultAlipayClient; importcom.alipay.api.internal.util.StringUtils; importcom.alipay.api.request.AlipayTradeCancelRequest; importcom.alipay.api.request.AlipayTradePayRequest; importcom.alipay.api.request.AlipayTradePrecreateRequest; importcom.alipay.api.request.AlipayTradeQueryRequest; importcom.alipay.api.request.AlipayTradeRefundRequest; importcom.alipay.api.request.AlipayTradeWapPayRequest; importcom.alipay.api.response.AlipayTradeCancelResponse; importcom.alipay.api.response.AlipayTradePayResponse; importcom.alipay.api.response.AlipayTradePrecreateResponse; importcom.alipay.api.response.AlipayTradeQueryResponse; importcom.alipay.api.response.AlipayTradeRefundResponse; publicclassAlipayClientFactory{ privatestaticfinalAlipayClientclient=newDefaultAlipayClient( Config.URL,Config.APPID,Config.RSA_RRIVATE_KEY,Config.FORMAT, Config.CHARSET,Config.ALIPAY_PUBLIC_KEY); publicstaticAlipayClientgetAlipayClientInstance(){ returnclient; } /** *appAuthToken *如ISV代替商家调用当面付接口,需将商户授权后获取的app_auth_token带上;如商家申请当面付自己调用,则传nullbizContent *JSON格式商户的请求参数 */ //手机网页支付网站支付 publicStringydAndPc_Pay(Map<String,String>maps) throwsAlipayApiException{ AlipayTradeWapPayRequestalipayRequest=newAlipayTradeWapPayRequest(); StringNotifyUrl=maps.get("NotifyUrl"); StringReturnUrl=maps.get("ReturnUrl"); //后台回调 if(!StringUtils.isEmpty(NotifyUrl)){ alipayRequest.setNotifyUrl(NotifyUrl); //bizContent中不需要公共参数 maps.remove("NotifyUrl"); } //页面回调 if(!StringUtils.isEmpty(ReturnUrl)){ alipayRequest.setReturnUrl(ReturnUrl); //bizContent中不需要公共参数 maps.remove("ReturnUrl"); } StringbizCon=JSON.toJSONString(maps); alipayRequest.setBizContent(bizCon); Stringform=""; try{ form=AlipayClientFactory.getAlipayClientInstance() .pageExecute(alipayRequest).getBody(); }catch(AlipayApiExceptione){ form="err"; e.printStackTrace(); }//调用SDK生成表单 returnform; } //查询订单状态 publicAlipayTradeQueryResponsequery(StringappAuthToken,StringbizContent) throwsAlipayApiException{ AlipayTradeQueryRequestrequest=newAlipayTradeQueryRequest(); request.putOtherTextParam("app_auth_token",appAuthToken); request.setBizContent(bizContent); returnAlipayClientFactory.getAlipayClientInstance().execute(request); } //条码支付 publicAlipayTradePayResponsepay(StringappAuthToken,StringbizContent) throwsAlipayApiException{ AlipayTradePayRequestrequest=newAlipayTradePayRequest(); request.putOtherTextParam("app_auth_token",appAuthToken); request.setBizContent(bizContent); returnAlipayClientFactory.getAlipayClientInstance().execute(request); } //扫码支付 publicAlipayTradePrecreateResponseprecreate(StringappAuthToken, StringbizContent)throwsAlipayApiException{ AlipayTradePrecreateRequestrequest=newAlipayTradePrecreateRequest(); request.putOtherTextParam("app_auth_token",appAuthToken); request.setBizContent(bizContent); returnAlipayClientFactory.getAlipayClientInstance().execute(request); } //订单撤销 publicAlipayTradeCancelResponsecancel(StringappAuthToken, StringbizContent)throwsAlipayApiException{ AlipayTradeCancelRequestrequest=newAlipayTradeCancelRequest(); request.putOtherTextParam("app_auth_token",appAuthToken); request.setBizContent(bizContent); returnAlipayClientFactory.getAlipayClientInstance().execute(request); } //申请退款 publicAlipayTradeRefundResponserefund(StringappAuthToken, StringbizContent)throwsAlipayApiException{ AlipayTradeRefundRequestrequest=newAlipayTradeRefundRequest(); request.putOtherTextParam("app_auth_token",appAuthToken); request.setBizContent(bizContent); returnAlipayClientFactory.getAlipayClientInstance().execute(request); } @SuppressWarnings("unused") publicstaticvoidmain(String[]args){ AlipayClientFactoryc=newAlipayClientFactory(); try{ Map<String,String>map=newHashMap<String,String>(); map.put("out_trade_no","20160914113218"); StringbizContent=JSON.toJSONString(map); System.err.println(bizContent); AlipayTradeQueryResponserp=c.query(null,bizContent); }catch(AlipayApiExceptione){ e.printStackTrace(); } } }
packagecom.luozhuang.alipay; publicclassConfig{ //开发者应用私钥。java配置PKCS8格式,PHP/.Net语言配置rsa_private_key.pem文件中原始私钥。 publicstaticfinalStringRSA_RRIVATE_KEY="luozhuang"; //接口请求网关。当面付支付、查询、退款、撤销接口中为固定值 publicstaticfinalStringURL="https://openapi.alipaydev.com/gateway.do"; //商户应用APPID,只要您的应用中包含当面付接口且是开通状态,就可以用此应用对应的appid。开发者可登录开放平台-管理中心-对应应用中查看 publicstaticfinalStringAPPID="luozhuang"; //编码字符集。默认utf-8 publicstaticfinalStringCHARSET="utf-8"; //返回格式。默认json publicstaticfinalStringFORMAT="json"; //支付宝公钥,用于获取同步返回信息后进行验证,验证是否是支付宝发送的信息。 publicstaticfinalStringALIPAY_PUBLIC_KEY="luozhuang"; }
packagecom.luozhuang.alipay; importjava.io.IOException; importjava.util.HashMap; importjava.util.Map; importjavax.servlet.ServletException; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importcom.alipay.api.AlipayApiException; /** *ServletimplementationclassCsPay */ publicclassCsPayextendsHttpServlet{ privatestaticfinallongserialVersionUID=1L; /** *@seeHttpServlet#doGet(HttpServletRequestrequest,HttpServletResponse *response) */ publicvoiddoGet(HttpServletRequestrequest, HttpServletResponseresponse)throwsServletException,IOException{ doPost(request,response); } /** *@seeHttpServlet#doPost(HttpServletRequestrequest,HttpServletResponse *response) */ publicvoiddoPost(HttpServletRequestrequest, HttpServletResponseresponse)throwsServletException,IOException{ //参数目前都是写死的根据业务需求写活 Map<String,String>maps=newHashMap<String,String>(); maps.put("out_trade_no",UtilDate.getOrderNum()); maps.put("total_amount","0.01"); maps.put("subject","Iphone616G"); maps.put("body","Iphone616G"); maps.put("product_code","QUICK_WAP_PAY"); //下面两个参数的KEY不要乱写要和工具类里面对应 maps.put("ReturnUrl","http://domain.com/CallBack/return_url.jsp"); maps.put("NotifyUrl","http://domain.com/CallBack/notify_url.jsp"); try{ AlipayClientFactoryali=newAlipayClientFactory(); Stringform=ali.ydAndPc_Pay(maps); if(!form.equals("err")){ response.setContentType("text/html;charset=utf-8"); response.getWriter().write(form);//直接将完整的表单html输出到页面 response.getWriter().flush(); } }catch(AlipayApiExceptione){ e.printStackTrace(); } } }
packagecom.luozhuang.alipay; importjava.util.ArrayList; importjava.util.Collections; importjava.util.List; importjava.util.Map; publicclassCsUtil{ /** *把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串 * *@paramparams *需要排序并参与字符拼接的参数组 *@return拼接后字符串 */ publicstaticStringcreateLinkString(Map<String,String>params){ List<String>keys=newArrayList<String>(params.keySet()); Collections.sort(keys); Stringprestr=""; for(inti=0;i<keys.size();i++){ Stringkey=keys.get(i); Stringvalue=params.get(key); if(i==keys.size()-1){//拼接时,不包括最后一个&字符 prestr=prestr+key+"="+value; }else{ prestr=prestr+key+"="+value+"&"; } } returnprestr; } }
packagecom.luozhuang.alipay; importjava.util.Date; importjava.util.Random; importjava.text.SimpleDateFormat; importjava.text.DateFormat; /** *类名:UtilDate *功能:自定义订单类 *详细:工具类,可以用作获取系统日期、订单编号等 *版本:3.3 *日期:2012-08-17 *说明: *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。 */ publicclassUtilDate{ /**年月日时分秒(无下划线)yyyyMMddHHmmss*/ publicstaticfinalStringdtLong="yyyyMMddHHmmss"; /**完整时间yyyy-MM-ddHH:mm:ss*/ publicstaticfinalStringsimple="yyyy-MM-ddHH:mm:ss"; /**年月日(无下划线)yyyyMMdd*/ publicstaticfinalStringdtShort="yyyyMMdd"; /** *返回系统当前时间(精确到毫秒),作为一个唯一的订单编号 *@return *以yyyyMMddHHmmss为格式的当前系统时间 */ publicstaticStringgetOrderNum(){ Datedate=newDate(); DateFormatdf=newSimpleDateFormat(dtLong); returndf.format(date); } /** *获取系统当前日期(精确到毫秒),格式:yyyy-MM-ddHH:mm:ss *@return */ publicstaticStringgetDateFormatter(){ Datedate=newDate(); DateFormatdf=newSimpleDateFormat(simple); returndf.format(date); } /** *获取系统当期年月日(精确到天),格式:yyyyMMdd *@return */ publicstaticStringgetDate(){ Datedate=newDate(); DateFormatdf=newSimpleDateFormat(dtShort); returndf.format(date); } /** *产生随机的三位数 *@return */ publicstaticStringgetThree(){ Randomrad=newRandom(); returnrad.nextInt(1000)+""; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。