Java支付宝支付接口对接(app端)

前言:大致说一下流程,其实支付宝官方文档写的很清楚了,还有就是下面我写的一些描述可能转载了其他博客的内容。

用户在app端提交订单--->选择支付方式即支付宝付款(调用了商家端的付款接口,调用之后会返回一个订单信息)---->

app端调用支付宝接口支付和返回的那个订单信息进行比对----->支付成功后,异步通知商家端支付成功(调用了了一个回调接口)

一、支付宝支付流程:

具体描述:

a.用户向商家服务器请求一个付款(预支付)

b.服务器生成一个带签名的订单发送给客户端

c.客户端通过这个订单向app sdk请求付款

d.sdk把用户引入支付宝付款界面进行支付

e.支付成功后支付宝向前端返回支付成功结果,并且向服务器发送一个支付通知

f.服务器接受通知并且验证是否是支付宝发送的成功结果

app端需要做的事情:

a.向自己的服务器请求一个订单

b.接受到订单后,向支付宝sdk发送一个支付请求

c.交易结束后返回一个成功或者失败

商家服务端需要做的事情:

a.写一个付款接口

b.写一个回调接口(即支付成功后,支付宝将结果异步通知到服务端)

二、应用场景流程:

图a:图b:图c:

1.用户在商家App中选择商品提交订单。如:图1

2.用户选择支付方式,选择支付宝,用户点击确认支付。(调用商家服务端支付接口)

3.调用支付宝接口进行付款操作。

三、具体代码

 付款接口:

//先保存一条支付记录
T_meeting_deposit_payment payment = new T_meeting_deposit_payment();
payment.setOrdernumber(ordernum);//订单号
payment.setChange();
payment.setPayment_state(2);//支付状态 先设置为失败回调成功之后修改为支付成功
payment.setCreatetime(new Date());
payment.setType(2);
String out_trade_no = StringUtils.getUUID();
payment.setOut_trade_no(out_trade_no);//支付宝订单号
//开发者appid
String appid ="";
//客户私钥
String private_key ="";
//客户公钥
String alipay_public_key= "";
//回调接口地址
String alinotify_url ="";
//设置请求的参数
Map<String,String> alimap = new HashMap<String,String>();
alimap.put("out_trade_no", out_trade_no);
alimap.put("total_amount", String.valueOf(0.01));//订单总金额  为了测试目前先写死为0.01  
alimap.put("subject", "会议室预付定金");//商品描述
alimap.put("timeout_express", "30m");//订单失效时间
//将公共回传参数进行urlencode,支付宝要求
String differencepay = URLEncoder.encode("会议支付", "UTF-8");
alimap.put("passback_params", differencepay);
String requestjson = JsonUtil.toJson(alimap);
System.out.println("请求的json数据:"+requestjson);
//支付宝客户端
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",appid,private_key,"json","utf-8",alipay_public_key,"RSA2");
AlipayTradeAppPayRequest  ali_request = new AlipayTradeAppPayRequest();
ali_request.setNotifyUrl(alinotify_url);
ali_request.setApiVersion("1.0");
ali_request.setBizContent(requestjson);
                  
//获取ali的响应数据
AlipayTradeAppPayResponse  aliresponse = alipayClient.sdkExecute(ali_request);
System.out.println("响应body:"+aliresponse.getBody());
//验证阿里的响应是否成功
if(aliresponse.isSuccess()){  
     data.put("sign", aliresponse.getBody());
}else{
  ServiceTools.write(request, response, false,"服务器异常,请稍后进行操作!",data);
   return;
}
SqlHelper.getBaseService().add(payment);//增加支付记录

回调接口:

//获取到所有请求参数
Map<String, String> params = new HashMap<String, String>();
Enumeration<String> parameterNames = request.getParameterNames();
while(parameterNames.hasMoreElements()){
	String nextElement = parameterNames.nextElement();
	params.put(nextElement, request.getParameter(nextElement));
}
//给ali的通知信息
String message = "success";
boolean signVerified = false;
//公匙
String alipay_public_key = "";
//验签
try {
    //看验签是否通过
	signVerified = AlipaySignature.rsaCheckV1(params, alipay_public_key, "UTF-8","RSA2");
} catch (AlipayApiException e) {
	message="failed";
	e.printStackTrace();
}
if(signVerified){
    //先获取是酒店的回调还是会议的回调,以便来处理不同的业务逻辑
	String passback_params = null;
	try {
		passback_params = URLDecoder.decode(params.get("passback_params").toString(), "UTF-8");
	} catch (UnsupportedEncodingException e) {
		e.printStackTrace();
	}
    if("酒店支付".equals(passback_params)){
    
    }else if("会议支付".equals(passback_params)){
     //实付金额:
     String realPayMoney =params.get("total_amount");
     //修改支付记录为成功
     //修改会议室订单状态为支付
    }
}else{
	//签名验证没有通过。
	message = "failed";
}		

参考链接:

支付场景:https://openhome.alipay.com/developmentDocument.htm
支付参数api:https://docs.open.alipay.com/api_1/alipay.trade.app.pay
参考文档:https://blog.csdn.net/qq_29125669/article/details/78555553
https://docs.open.alipay.com/291/106118
https://docs.open.alipay.com/api_1
https://openclub.alipay.com/read.php?tid=9568
https://docs.open.alipay.com/54/106370/

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值