1.引入依赖 (后期版本可能会更新)
-
com.alipay.sdk -
alipay-sdk-java -
4.23.0.ALL
2,写配置类
- @Configuration
- public class AlipayClientConfig{
- @Value("${ali-pay.app-id}")
- private String appId;
- @Value("${ali-pay.merchant-private-key}")
- private String merchantPrivateKey;
- @Value("${ali-pay.ali-pay-public-key}")
- private String aliPayPublicKey;
- @Value("${ali-pay.gateway-url}")
- private String gatewayUrl;
- @Bean
- public AlipayClient alipayClient() throws AlipayApiException{
- AlipayConfig alipayConfig=new AlipayConfig();
- //设置appId
- alipayConfig.setAppId(appId);
- //设置商户私钥
- alipayConfig.setPrivateKey(merchantPrivateKey);
- //设置支付宝公钥
- alipayConfig.setAlipayPublicKey(aliPayPublicKey);
- //设置支付宝网关
- alipayConfig.setServerUrl(gatewayUrl);
- //设置请求格式,固定值json.
- alipayConfig.setFormat(AlipayConstants.FORMAT_JSON);
- //设置字符集
- alipayConfig.setCharset(AlipayConstants.CHARSET_UTF8);
- //设置签名类型
- alipayConfig.setSignType(AlipayConstants.SIGN_TYPE_RSA2);
- //构造client
- AlipayClient alipayClient=new DefaultAlipayClient(alipayConfig);
- return alipayClient;
- }
- }
3.配置字段说明
- ali-pay:
- #接下来两个用来标识用户
- #商户id
- pid: xxxxxxxxxxx
- #应用appid(和商户id绑定过)
- app-id: xxxxxxxxxxx
- #接下来三个用来确保SSL
- #商户私钥
- merchant-private-key: xxxxxxxxxxx
- #支付宝公钥
- ali-pay-public-key: xxxxxxxxxxx
- #TODO: #对称加密密钥
- # content-key:
- #接下来三个是相关地址
- #支付宝网关
- gateway-url: https://openapi.alipaydev.com/gateway.do
- #接收结果通知地址
- notify-url: xxxxxxxxxxx
- #页面跳转同步通知页面路径
- return-url: xxxxxxxxxxx
4.其他
- public class AliPayConstant{
- public static final String TRADE_STATE_SUCCESS="TRADE_SUCCESS";
- public static final String REFUND_STATE_SUCCESS="REFUND_SUCCESS";
- }
5.创建支付功能 小程序文档 - 支付宝文档中心
- private String createPay(OrderInfo orderInfo){
- //请求
- AlipayTradePagePayRequest request=new AlipayTradePagePayRequest();
- //数据
- AlipayTradePagePayModel bizModel=new AlipayTradePagePayModel();
- bizModel.setOutTradeNo(orderInfo.getOrderNo());
- //单位是元
- bizModel.setTotalAmount(orderInfo.getTotalFee()
- .toString());
- bizModel.setSubject(orderInfo.getTitle());
- //默认的
- bizModel.setProductCode("FAST_INSTANT_TRADE_PAY");
- request.setBizModel(bizModel);
- request.setNotifyUrl(notifyUrl+"/pay/order/pay-signal");
- //用户支付后支付宝会以GET方法请求returnUrl,并且携带out_trade_no,trade_no,total_amount等参数.
-
- request.setReturnUrl(returnUrl);
- AlipayTradePagePayResponse response=null;
- try{
- //完成签名并执行请求
- response=alipayClient.pageExecute(request);
- if(response.isSuccess()){
- log.debug("调用成功");
- return response.getBody();
- }
- else{
- log.error("调用失败");
- log.error(response.getMsg());
- return null;
- }
- }
- catch(AlipayApiException e){
- log.error("调用异常");
- return null;
- }
- }
返回的是一个表单 需要前端进行处理,随后可以直接扫码或者使用只用支付号账号登录进行付款
6.支付回调结果通知 小程序文档 - 支付宝文档中心
- @PostMapping("/pay-signal")
- public String paySignal(@RequestBody Map
data) { - log.debug("收到支付宝回调");
- //验签
- boolean signVerified=false;
- try{
- signVerified=AlipaySignature.rsaCheckV1(data,aliPayPublicKey,AlipayConstants.CHARSET_UTF8,AlipayConstants.SIGN_TYPE_RSA2);
- //验签成功
- if(signVerified){
- log.debug("验签成功");
- //从数据库中查出对应的订单
- QueryWrapper
queryWrapper=new QueryWrapper<>(); - queryWrapper.eq("order_no",data.get("out_trade_no"));
- OrderInfo orderInfo=orderInfoService.getOne(queryWrapper);
- synchronized(this){
- if(orderInfo.getOrderStatus()
- .equals(OrderInfo.NOT_PAIED)){
- //将订单设置为已支付状态
- orderInfo.setOrderStatus(OrderInfo.PAIED);
- //更新订单状态
- orderInfoService.updateById(orderInfo);
- //添加支付记录
- PaymentInfo paymentInfo=new PaymentInfo();
- paymentInfo.setOrderNo(orderInfo.getOrderNo());
- paymentInfo.setCreateTime(new Date());
- paymentInfo.setUpdateTime(new Date());
- paymentInfo.setPayerTotal(orderInfo.getTotalFee());
- paymentInfo.setPaymentType(PaymentInfo.ALI_PAY);
- //支付宝支付中的支付编号
- paymentInfo.setTransactionId(data.get("trade_no"));
- //交易类型(扫码 登录等等)
- paymentInfo.setTradeType("扫码/登录支付");
- paymentInfo.setTradeState(data.get("trade_status"));
- //存放全部数据(json)以备不时之需
- paymentInfo.setContent(gson.toJson(data));
- paymentInfoService.save(paymentInfo);
- log.info("订单{}的支付记录添加成功,支付记录id为{}.",orderInfo.getOrderNo(),paymentInfo.getId());
- }
- else{
- log.debug("订单{}状态为{},回调处理退出.",orderInfo.getOrderNo(),OrderInfo.PAIED);
- }
- }
- //除了success外其他返回均认为是失败
- return "success";
- }
- //验签失败
- else{
- log.error("验签失败");
- return "failure";
- }
- }
- catch(AlipayApiException e){
- log.error("验签异常");
- return "failure";
- }
- }
7.查询支付 小程序文档 - 支付宝文档中心
- private Map
queryPay(String orderNo){ - //请求
- AlipayTradeQueryRequest request=new AlipayTradeQueryRequest();
- //数据
- AlipayTradeQueryModel bizModel=new AlipayTradeQueryModel();
- bizModel.setOutTradeNo(orderNo);
- request.setBizModel(bizModel);
- try{
- //完成签名并执行请求
- AlipayTradeQueryResponse response=alipayClient.execute(request);
- if(response.isSuccess()){
- log.debug("查询订单{}成功",orderNo);
- HashMap
resultMap=gson.fromJson(response.getBody(),HashMap.class); - return resultMap;
- }
- else{
- log.error("查询订单{}失败,响应数据是{}.",orderNo,response.getBody());
- return null;
- }
- }
- catch(AlipayApiException e){
- log.error("查询订单{}异常",orderNo);
- return null;
- }
- }
8.取消支付 小程序文档 - 支付宝文档中心
- private boolean cancelPay(String orderNo){
- //请求
- AlipayTradeCloseRequest request=new AlipayTradeCloseRequest();
- //数据
- AlipayTradeCloseModel bizModel=new AlipayTradeCloseModel();
- bizModel.setOutTradeNo(orderNo);
- request.setBizModel(bizModel);
- try{
- //完成签名并执行请求
- AlipayTradeCloseResponse response=alipayClient.execute(request);
- if(response.isSuccess()){
- log.debug("订单{}取消成功",orderNo);
- }
- else{
- log.debug("订单{}未创建,因此也可认为本次取消成功.",orderNo);
- }
- return true;
- }
- catch(AlipayApiException e){
- log.error("订单{}取消异常",orderNo);
- return false;
- }
- }
9.创建支付 小程序文档 - 支付宝文档中心
- private HashMap
createRefund(RefundInfo refundInfo){ - //请求
- AlipayTradeRefundRequest request=new AlipayTradeRefundRequest();
- //数据
- AlipayTradeRefundModel bizModel=new AlipayTradeRefundModel();
- //订单号
- bizModel.setOutTradeNo(refundInfo.getOrderNo());
- //退款单号
- bizModel.setOutRequestNo(refundInfo.getRefundId());
- bizModel.setRefundAmount(refundInfo.getTotalFee().toString());
- bizModel.setRefundReason(refundInfo.getReason());
- request.setBizModel(bizModel);
- HashMap
resultMap=new HashMap<>(); - try{
- //完成签名并执行请求
- AlipayTradeRefundResponse response=alipayClient.execute(request);
- //成功则说明退款成功了
- resultMap.put("data",response.getBody());
- if(response.isSuccess()){
- resultMap.put("isRefundSuccess",true);
- log.debug("订单{}退款成功",refundInfo.getOrderNo());
- }
- else{
- resultMap.put("isRefundSuccess",false);
- log.error("订单{}退款失败",refundInfo.getOrderNo());
- }
- return resultMap;
- }
- catch(AlipayApiException e){
- resultMap.put("isRefundSuccess",false);
- log.error("订单{}退款异常",refundInfo.getOrderNo());
- return resultMap;
- }
- }
10.查询退款 小程序文档 - 支付宝文档中心
- private Map
queryRefund(RefundInfo refundInfo){ - AlipayTradeFastpayRefundQueryRequest request=new AlipayTradeFastpayRefundQueryRequest();
- AlipayTradeFastpayRefundQueryModel bizModel=new AlipayTradeFastpayRefundQueryModel();
- //订单号
- bizModel.setOutTradeNo(refundInfo.getOrderNo());
- //退款单号
- bizModel.setOutRequestNo(refundInfo.getRefundNo());
- //想要额外返回的数据(也就是文档中响应可选的数据)
- ArrayList
extraResponseDatas=new ArrayList<>(); - extraResponseDatas.add("refund_status");
- bizModel.setQueryOptions(extraResponseDatas);
- request.setBizModel(bizModel);
- try{
- //完成签名并执行请求
- AlipayTradeFastpayRefundQueryResponse response=alipayClient.execute(request);
- if(response.isSuccess()){
- log.debug("退款{}查询成功",refundInfo.getRefundNo());
- return gson.fromJson(response.getBody(),HashMap.class);
- }
- else{
- log.debug("退款{}查询失败",refundInfo.getRefundNo());
- return null;
- }
- }
- catch(AlipayApiException e){
- log.debug("退款{}查询异常",refundInfo.getRefundNo());
- return null;
- }
- }
11. 查询账单下载url
- /**
- * @param billType 账单类型,枚举值为1.trade(交易账单)2.signcustomer(流水账).
- * @param billDate 账单日期:
- * 日账单:格式:yyyy-MM-dd 5.6日的账单记录的时间为05-06 9:00到05-07 9:00,并且在05-07 9:00后才能查到.
- * 月账单:格式:yyyy-MM 8月的账单记录的时间为08-03到09-03,并且在09-03后才能查到.
- * @return 账单下载url(30s后则失效)
- */
- @GetMapping("/query-bill-download-url")
- public String queryBillDownloadUrl(String billType,String billDate){
- //请求
- AlipayDataDataserviceBillDownloadurlQueryRequest request=new AlipayDataDataserviceBillDownloadurlQueryRequest();
- //数据
- AlipayDataDataserviceBillDownloadurlQueryModel bizModel=new AlipayDataDataserviceBillDownloadurlQueryModel();
- bizModel.setBillType(billType);
- bizModel.setBillDate(billDate);
- request.setBizModel(bizModel);
- try{
- //完成签名并执行请求
- AlipayDataDataserviceBillDownloadurlQueryResponse response=alipayClient.execute(request);
- if(response.isSuccess()){
- log.debug("获取账单下载url成功");
- return response.getBillDownloadUrl();
- }
- else{
- log.error("获取账单下载url失败");
- return null;
- }
- }
- catch(AlipayApiException e){
- log.error("获取账单下载url异常");
- return null;
- }
- }