前言:大致说一下流程,其实支付宝官方文档写的很清楚了,还有就是下面我写的一些描述可能转载了其他博客的内容。
用户在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/