详解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)+"";
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。