admin
2024-07-25 47e3087067abd35e6337c011f96d2338c0bb1aae
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
package org.yeshi.utils.alipay;
 
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.*;
import com.alipay.api.response.AlipayDataDataserviceBillDownloadurlQueryResponse;
import com.alipay.api.response.AlipayTradeCancelResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.alipay.api.response.AlipayTradeRefundResponse;
import net.sf.json.JSONObject;
import org.yeshi.utils.StringUtil;
import org.yeshi.utils.TimeUtil;
import org.yeshi.utils.entity.alipay.AlipayAppInfo;
 
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Map;
 
/**
 * 支付宝H5支付
 */
public class AlipayH5PayUtil {
 
    private static AlipayClient getAlipayClient(AlipayAppInfo app) {
        AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", app.getAppId(), app.getPrivateKey(), "json", "GBK", app.getAlipayPublicKey(), "RSA2"); //获得初始化的AlipayClient
        return alipayClient;
    }
 
 
    /**
     * 创建订单(支付宝API为https://opendocs.alipay.com/apis/api_1/alipay.trade.wap.pay)
     *
     * @param app
     * @param orderNo
     * @param money
     * @param goodsTitle
     * @param returnUrl
     * @param notifyUrl
     * @return
     */
 
    public static String createOrderForm(AlipayAppInfo app, String orderNo, BigDecimal money, String goodsTitle, String returnUrl, String notifyUrl) throws AlipayApiException {
        AlipayClient alipayClient = getAlipayClient(app);
        AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();//创建API对应的request
        alipayRequest.setReturnUrl(returnUrl);
        alipayRequest.setNotifyUrl(notifyUrl);//在公共参数中设置回跳和通知地址
        JSONObject bizContent = new JSONObject();
        bizContent.put("out_trade_no", orderNo);
        bizContent.put("total_amount", money);
        bizContent.put("subject", goodsTitle);
        bizContent.put("product_code", "QUICK_WAP_PAY");
        alipayRequest.setBizContent(bizContent.toString());//填充业务参数
        String form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单
 
 
        return form;
    }
 
    /**
     * 订单查询
     *
     * @param app
     * @param outTradeNo
     * @param alipayTradeNo
     * @return
     * @throws AlipayApiException
     */
    public static AlipayTradeQueryResponse queryOrder(AlipayAppInfo app, String outTradeNo, String alipayTradeNo) throws AlipayApiException {
        AlipayClient alipayClient = getAlipayClient(app);
        AlipayTradeQueryRequest request = new AlipayTradeQueryRequest(); //创建API对应的request类
        JSONObject content = new JSONObject();
        if (!StringUtil.isNullOrEmpty(outTradeNo)) {
            content.put("out_trade_no", outTradeNo);
        }
        if (!StringUtil.isNullOrEmpty(alipayTradeNo)) {
            content.put("trade_no", alipayTradeNo);
        }
        request.setBizContent(content.toString());
        AlipayTradeQueryResponse response = alipayClient.execute(request); //通过alipayClient调用API,获得对应的response类
        return response;
    }
 
 
    /**
     * 取消订单
     * 如果此订单用户支付失败,支付宝将关闭此订单。
     * 如果此订单用户支付成功,支付宝将退还订单资金给用户。
     *
     * @param app
     * @param outTradeNo
     * @param alipayTradeNo
     * @return
     * @throws AlipayApiException
     */
    public static AlipayTradeCancelResponse cancelOrder(AlipayAppInfo app, String outTradeNo, String alipayTradeNo) throws AlipayApiException {
        AlipayClient alipayClient = getAlipayClient(app);
        AlipayTradeCancelRequest request = new AlipayTradeCancelRequest(); //创建API对应的request类
        JSONObject content = new JSONObject();
        if (!StringUtil.isNullOrEmpty(outTradeNo)) {
            content.put("out_trade_no", outTradeNo);
        }
        if (!StringUtil.isNullOrEmpty(alipayTradeNo)) {
            content.put("trade_no", alipayTradeNo);
        }
        request.setBizContent(content.toString());  //设置业务参数
        AlipayTradeCancelResponse response = alipayClient.execute(request); //通过alipayClient调用API,获得对应的response类
        return response;
    }
 
 
    /**
     * 退款
     *
     * @param app
     * @param outTradeNo
     * @param alipayTradeNo
     * @param refundAmount  本次退款金额
     * @param outRequestNo  本次退款请求流水号,部分退款时必传。
     * @return
     * @throws AlipayApiException
     */
    public static AlipayTradeRefundResponse refund(AlipayAppInfo app, String outTradeNo, String alipayTradeNo, BigDecimal refundAmount, String outRequestNo) throws AlipayApiException {
        AlipayClient alipayClient = getAlipayClient(app);
        AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();//创建API对应的request类
        JSONObject content = new JSONObject();
        if (!StringUtil.isNullOrEmpty(outTradeNo)) {
            content.put("out_trade_no", outTradeNo);
        }
        if (!StringUtil.isNullOrEmpty(alipayTradeNo)) {
            content.put("trade_no", alipayTradeNo);
        }
 
        if (!StringUtil.isNullOrEmpty(outRequestNo)) {
            content.put("out_request_no", outRequestNo);
        }
 
        content.put("refund_amount", refundAmount);
 
        request.setBizContent(content.toString());  //设置业务参数
        AlipayTradeRefundResponse response = alipayClient.execute(request);//通过alipayClient调用API,获得对应的response类
        return response;
    }
 
 
    /**
     * 获取账单的链接
     *
     * @param app
     * @param date 需要下载的账单日期,最晚是当期日期的前一天。
     * @return
     * @throws AlipayApiException
     */
    public static String getBillLink(AlipayAppInfo app, Date date) throws AlipayApiException {
        AlipayClient alipayClient = getAlipayClient(app);
        AlipayDataDataserviceBillDownloadurlQueryRequest request = new AlipayDataDataserviceBillDownloadurlQueryRequest();//创建API对应的request类
        JSONObject content = new JSONObject();
        content.put("bill_type", "trade");
        content.put("bill_date", TimeUtil.getGernalTime(date.getTime(), "yyyy-MM-dd"));
        AlipayDataDataserviceBillDownloadurlQueryResponse response = alipayClient.execute(request);//通过alipayClient调用API,获得对应的response类
        return response.getBillDownloadUrl();
    }
 
 
    /**
     * 获取支付成功的外部订单号
     *
     * @param params
     * @param app
     * @return
     */
    public static String getPaySuccessNotifyOutOrderNo(Map<String, String> params, AlipayAppInfo app) throws Exception {
        try {
            boolean right = AlipaySignature.rsaCheckV1(params, app.getAlipayPublicKey(), "GBK", params.get("sign_type"));
            if (right) {
                String tradeStatus = params.get("trade_status");
                String outTradeNo = params.get("out_trade_no");
                //支付成功
                if ("TRADE_SUCCESS".equalsIgnoreCase(tradeStatus)) {
                    return outTradeNo;
                } else {
                    throw new Exception("订单为支付成功:" + tradeStatus);
                }
            } else {
                throw new Exception("签名错误");
            }
        } catch (AlipayApiException | IOException e) {
            throw e;
        }
    }
 
}