String alipayCharset = PropertiesUtils.getInstace("config/webService.properties").getProperty("alipayCharset");
// 开始使用支付宝SDK中提供的API
AlipayClient alipayClient = new DefaultAlipayClient(aliPayGateway, aliPayAppId, rsaPrivatKey, alipayFormat, alipayCharset, rsaAlipayPublicKey, signType);
// 注意:不同接口这里的请求对象是不同的,这个可以查看蚂蚁金服开放平台的API文档查看
AlipayTradeAppPayRequest alipayRequest = new AlipayTradeAppPayRequest();
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setBody("XXX");
model.setSubject("XXX");
// 唯一订单号 根据项目中实际需要获取相应的
model.setOutTradeNo("");
// 支付超时时间(根据项目需要填写)
model.setTimeoutExpress("30m");
// 支付金额(项目中实际订单的需要支付的金额,金额的获取与操作请放在服务端完成,相对安全)
model.setTotalAmount("");
model.setProductCode("QUICK_MSECURITY_PAY");
alipayRequest.setBizModel(model);
// 支付成功后支付宝异步通知的接收地址url
alipayRequest.setNotifyUrl("XXX/getAlipayNotifyInfo");
// 注意:每个请求的相应对象不同,与请求对象是对应 。
AlipayTradeAppPayResponse alipayResponse = null;
try {
alipayResponse = alipayClient.sdkExecute(alipayRequest);
} catch (AlipayApiException e) {
e.printStackTrace();
}
// 返回支付相关信息(此处可以直接将getBody中的内容直接返回,无需再做一些其他操作)
return alipayResponse.getBody();
}
5.支付成功后服务端接收支付宝发来的异步通知的接口方法/**
*接收支付宝异步通知消息
*
*@author lp
*@date 2019/1/4 17:19
*/
@ApiOperation("接收支付宝异步通知消息")
@RequestMapping(value = https://www.isolves.com/it/cxkf/yy/JAVA/2020-11-16/"getAlipayNotifyInfo", method = RequestMethod.POST)
public String getAlipayNotifyInfoOfCombinedPayment(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
response.setHeader("Access-Control-Allow-Origin", "*");
// 解决POST请求中文乱码问题(推荐使用此种方式解决中文乱码,因为是支付宝发送异步通知使用的是POST请求)
request.setCharacterEncoding("UTF-8");
//获取支付宝POST过来反馈信息
Map<String,String> params = new HashMap<>();
Map<String,String[]> requestParams = request.getParameterMap();
for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
// 官方demo中使用如下方式解决中文乱码,在此本人不推荐使用,可能会出现中文乱码解决无效的问题 。
// valueStr = new String(valueStr.getBytes("ISO-8859-1"), "UTF-8");
params.put(name, valueStr);
}
// 支付宝公钥(请注意,不是商户公钥)
String rsaAlipayPublicKey = PropertiesUtils.getInstace("config/webService.properties").getProperty("rsaAlipayPublicKey");
String signType = PropertiesUtils.getInstace("config/webService.properties").getProperty("signType");
String alipayCharset = PropertiesUtils.getInstace("config/webService.properties").getProperty("alipayCharset");
boolean signVerified = false;
try {
//调用SDK验证签名
signVerified = AlipaySignature.rsaCheckV1(params, rsaAlipayPublicKey, alipayCharset, signType);
if(signVerified) {
// 验证通知后执行自己项目需要的业务操作
// 一般需要判断支付状态是否为TRADE_SUCCESS
// 更严谨一些还可以判断 1.appid 2.sellerId 3.out_trade_no 4.total_amount 等是否正确,正确之后再进行相关业务操作 。
// 成功要返回success,不然支付宝会不断发送通知 。
return "success";
}
// 验签失败 笔者在这里是输出log,可以根据需要做一些其他操作
// 失败要返回fail,不然支付宝会不断发送通知 。
return "fail";
} catch (AlipayApiException e) {
e.printStackTrace();
// 验签异常 笔者在这里是输出log,可以根据需要做一些其他操作
return "fail";
}
}
【支付宝app支付服务端的实现-Java版】
推荐阅读
- 异地医保如何报销?
- 刺客信条英灵殿攻略游民星空 刺客信条英灵殿宝藏奖励
- 宝华玉笋茶是什么茶,宝华玉笋茶简介
- 突然拉肚子处理小方法
- 绿茶八宝汤圆的做法,抹茶巧克力汤圆的做法
- 宝宝有痰消炎药中成药
- 宝宝头上有红色的一片
- 宝宝吃香蕉噎住
- 电脑钉钉怎么拉人进群 钉钉怎么拉人进群聊
- 宝宝在床上摔下来