本文提供的是证书的方式实现的。
1、首先引入支付宝支付的 jar 包。
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.5.0.ALL</version>
</dependency>
2、核心代码
@Override
public void pay(List<OrderInfo> list,Integer userId,List<UserCoupon>couponList) {
JSONObject json = new JSONObject();
System.out.println("===========开始调用支付接口============");
try {
//构造client
CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
//设置网关地址
certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");
//设置应用Id
certAlipayRequest.setAppId("xxx");
//设置应用私钥
certAlipayRequest.setPrivateKey("xxx");
//设置请求格式,固定值json
certAlipayRequest.setFormat("json");
//设置字符集
certAlipayRequest.setCharset("utf-8");
//设置签名类型
certAlipayRequest.setSignType(RSA2);
//设置应用公钥证书路径
certAlipayRequest.setCertPath("xxx");
//设置支付宝公钥证书路径
certAlipayRequest.setAlipayPublicCertPath("xxx");
//设置支付宝根证书路径
certAlipayRequest.setRootCertPath("xxx");
//构造client
AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
//商品详情
model.setBody("商品购买");
//商品名称
model.setSubject("支付宝支付");
//订单号(唯一订单号)
model.setOutTradeNo("xxx");
//支付时间
model.setTimeoutExpress("30m");
model.setTotalAmount("0.01");
model.setProductCode("QUICK_MSECURITY_PAY");
request.setBizModel(model);
request.setNotifyUrl("xxx");
//这里和普通的接口调用不同,使用的是sdkExecute AlipayTradeAppPayResponse
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
System.out.println("=============调用支付宝结束查看返回==============="+response.isSuccess());
}
} catch (AlipayApiException e) {
e.printStackTrace();
}
}
@Override
public String notify(HttpServletRequest request) {
try {
//获取支付宝POST过来反馈信息
Map<String,String> params = new HashMap<>();
Map requestParams = request.getParameterMap();
for (Iterator 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] + ",";
}
//乱码解决,这段代码在出现乱码时使用。
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
//切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
//boolean AlipaySignature.rsaCertCheckV1(Map<String, String> params, String publicKeyCertPath, String charset,String signType)
boolean flag = AlipaySignature.rsaCertCheckV1(params, AlibabapayConfig.ALIPAY_CERT_PUBLIC_KEY_RSA2, AlibabapayConfig.CHATSET,AlibabapayConfig.SINGNTYPE);
if(flag){
//订单完成 支付完成
if ("TRADE_SUCCESS".equals(params.get("trade_status")) || "TRADE_FINISHED".equals(params.get("trade_status"))) {
/**
*回调成功之后处理业务逻辑(比如,更新订单状态,增加积分,通知仓库发货等等。)
*/
return "success";
}
}
} catch (AlipayApiException e) {
e.printStackTrace();
}
return "fail";
}
3、到此,支付宝支付已经集成。