SDK版本
gradle
compile group: 'com.alipay.sdk', name: 'alipay-sdk-java', version: '4.15.0.ALL'
maven
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<scope>4.15.0.ALL</scope>
</dependency>
创建连接的bean
@Bean
public AlipayClient alipayClient() {
AlipayConfig alipayConfig = new AlipayConfig();
//支付宝公钥,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/207/201602487431
alipayConfig.setAlipayPublicKey(ALIPAY_PUBLIC_KEY);
//支付宝私钥
alipayConfig.setPrivateKey(APP_PRIVATE_KEY);
// 应用私钥,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/207/201602469554
alipayConfig.setAppCertPath(APP_CERT_PATH);
//应用id,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/190/201602493024
alipayConfig.setAppId(APP_ID);
try {
return new DefaultAlipayClient(alipayConfig);
} catch (AlipayApiException e) {
logger.error("创建支付宝链接Bean失败 AlipayApiException:{}", e);
return null;
}
}
收款码示例代码
/**
* 创建支付信息
*
* @param order 支付订单信息
* @return 支付页面URL
*/
public String createAlipayUrl(RechargeIntegralReferOrder order) {
AlipayTradePagePayModel model = new AlipayTradePagePayModel();
//商户订单号,商户自定义,需保证在商户端不重复,如:20200612000001
model.setOutTradeNo(order.getOrderCode());
model.setProductCode(FAST);
model.setSubject(order.getSubject());//订单标题
//设置过期时间
long time = System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(5);
String ymdHmsStr = DateTimeUtil.getYmdHmsStr(new Date(time));
model.setTimeExpire(ymdHmsStr);
//订单金额,精确到小数点后两位
model.setTotalAmount(order.getPrice().toString());
//订单描述
model.setBody(order.getBody());
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setBizModel(model);//设置配置的参数
logger.info("获取支付订单接口参数配置 userNick:{} 金额:{} 过期时间:{}", order.getUserNick(), order.getPrice(), ymdHmsStr);
//异步通知地址,以http或者https开头,商户外网可以post访问的异步地址,用于接收支付宝返回的支付结果
alipayRequest.setNotifyUrl(ymlConfigBean.getAlipay_notify_url());
//支付成功后同步地址,用于提示用户支付成功
alipayRequest.setReturnUrl(ymlConfigBean.getAlipay_return_url());
String alipayUrl = null;
try {
alipayUrl = alipayClient.pageExecute(alipayRequest, "GET").getBody();
} catch (AlipayApiException e) {
logger.error("getAlipayUrl AlipayApiException:{}", e);
}
return alipayUrl;
}
回调示例代码
异步回调
/**
* 支付宝异步订单回调
*
* @param request
*/
public void alipayNotifyCallBack(HttpServletRequest request) {
Map<String, String> params = convertRequestParamsToMap(request); // 将异步通知中收到的待验证所有参数都存放到map中
String paramsJson = JSON.toJSONString(params);
logger.info("支付宝异步回调,{}", paramsJson);
try {
AlipayConfig alipayConfig = new AlipayConfig();// 支付宝配置
// 调用SDK验证签名,使用秘钥的验证方式
boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayBeanConfig.ALIPAY_PUBLIC_KEY,
alipayConfig.getCharset(), alipayConfig.getSignType());
logger.info("signVerified:{}", signVerified);
if (!signVerified) {
logger.info("支付宝异步回调签名认证失败,signVerified=false, paramsJson:{}", paramsJson);
return;
}
logger.info("支付宝异步回调签名认证成功,开始处理订单业务");
String tradeStatus = params.get("trade_status");//订单状态
String orderCode = params.get("out_trade_no");//唯一的商家订单编号,创建订单的时候传入
logger.info("订单状态TradeStatus:{} orderCode:{}", tradeStatus, orderCode);
if (tradeStatus.equals(AlipayTradeEnum.支付成功.getTradeStatus()) || tradeStatus.equals(AlipayTradeEnum.交易完成.getTradeStatus())) {
synchronized (orderCode.intern()) {
RechargeIntegralReferOrder integralReferOrder = integralOrderService.findByOrderCode(orderCode);
if (!integralReferOrder.getPayResult().isCancelable()) {
logger.info("当前订单已进行过充值积分相关操作 orderCode:{}", orderCode);
return;
}
//积分充值增加
iIntegralOpsRecordService.integralRecharge(integralReferOrder.getUserNick(), integralReferOrder.getPrice(),
integralReferOrder.getDiscount(), integralReferOrder.getIntegral(), IntegralOpsEnum.积分充值);
RechargeIntegralReferOrder payResult = integralOrderService.updateOrderPayResult(integralReferOrder, PayResultEnum.支付成功);
userVipService.plusVipIntegral(integralReferOrder.getUserNick(), null, integralReferOrder.getPrice().intValue(), UserVipOpsEnum.充值加分);
logger.info("积分充值完毕 订单状态:{} orderCode:{}", payResult.getPayResult(), orderCode);
}
} else {
integralOrderService.updateOrderPayResult(orderCode, PayResultEnum.支付失败);
logger.info("订单支付失败,不进行业务操作");
}
} catch (AlipayApiException e) {
logger.error("支付宝回调签名认证失败,paramsJson:{},errorMsg:{}", paramsJson, e.getMessage());
}
}
同步回调
/**
* 支付宝同步订单回调
*
* @param request
* @return
*/
public AlipayReturnParam alipayReturnCallBack(HttpServletRequest request) {
Map<String, String> params = convertRequestParamsToMap(request); // 将异步通知中收到的待验证所有参数都存放到map中
String paramsJson = JSON.toJSONString(params);
logger.info(paramsJson);
AlipayConfig alipayConfig = new AlipayConfig();//支付宝配置
try {// 调用SDK验证签名,使用秘钥的验证方式
boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayBeanConfig.ALIPAY_PUBLIC_KEY,
alipayConfig.getCharset(), alipayConfig.getSignType());
logger.info("signVerified:{}", signVerified);
if (!signVerified) {
logger.info("支付宝同步回调签名认证失败,signVerified=false");
return null;
}
} catch (AlipayApiException e) {
logger.error("alipayReturnCallBack AlipayApiException:{}", e);
}
logger.info("支付宝同步回调签名认证成功,开始处理订单业务");
AlipayReturnParam param = new AlipayReturnParam();
String timestamp = params.get("timestamp");//支付时间
param.setTimestamp(timestamp);
String amount = params.get("total_amount");//金额
param.setAmount(amount);
logger.info("支付宝同步回调 {}", param.toString());
return param;
}