admin
2022-03-29 fade37e2d7232a2818959f8c0f4eeca7304c3b3e
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
package org.yeshi.utils.alipay;
 
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayFundAccountQueryRequest;
import com.alipay.api.request.AlipayFundTransCommonQueryRequest;
import com.alipay.api.request.AlipayFundTransUniTransferRequest;
import com.alipay.api.response.AlipayFundAccountQueryResponse;
import com.alipay.api.response.AlipayFundTransCommonQueryResponse;
import com.alipay.api.response.AlipayFundTransUniTransferResponse;
import net.sf.json.JSONObject;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.io.IOUtils;
import org.yeshi.utils.StringUtil;
import org.yeshi.utils.entity.alipay.AlipayAppInfo;
import org.yeshi.utils.entity.alipay.AlipayTransferInfo;
import org.yeshi.utils.exception.AlipayCommonException;
import org.yeshi.utils.exception.AlipayTransferException;
 
import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal;
 
public class AlipayUtil {
 
    public static AlipayClient getAlipayClient(AlipayAppInfo app) throws AlipayApiException {
        if (app.getCertInfo() == null) {
            AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", app.getAppId(), app.getPrivateKey(), "json", "GBK", app.getAlipayPublicKey(), "RSA2");
            return alipayClient;
        } else {
            String privateKey = app.getPrivateKey();
            MyCertAlipayRequest certAlipayRequest = new MyCertAlipayRequest();
            certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");
            certAlipayRequest.setAppId(app.getAppId());
            certAlipayRequest.setPrivateKey(privateKey);
            certAlipayRequest.setFormat("json");
            certAlipayRequest.setCharset("GBK");
            certAlipayRequest.setSignType("RSA2");
            certAlipayRequest.setCertStream(
                    app.getCertInfo().getAppCertPublicKeyStream());
            certAlipayRequest.setAlipayPublicCertStream(
                    app.getCertInfo().getAlipayPublicCertStream());
            certAlipayRequest.setRootCertStream(
                    app.getCertInfo().getAlipayRootCertStream());
            return new CertAlipayClient(certAlipayRequest);
        }
    }
 
    /**
     * 统一转账(包含红包与转账) https://opendocs.alipay.com/apis/api_28/alipay.fund.trans.uni.transfer
     *
     * @param app
     * @param info
     * @return
     * @throws AlipayApiException
     * @throws NumberFormatException
     * @throws AlipayTransferException
     */
    public static AlipayFundTransUniTransferResponse alipayFundTransUniTransfer(AlipayAppInfo app, AlipayTransferInfo info)
            throws AlipayApiException, NumberFormatException, AlipayTransferException {
        AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
        com.alibaba.fastjson.JSONObject json = new com.alibaba.fastjson.JSONObject();
        json.put("out_biz_no", info.getOutBizNo());
        json.put("trans_amount", info.getMoney().toString());
        json.put("product_code", info.getProductCode().name());
        json.put("order_title", info.getOrderTitle());
        JSONObject payee_info = new JSONObject();
 
        if (!StringUtil.isNullOrEmpty(info.getAccount().getUserId())) {
            payee_info.put("identity_type", "ALIPAY_USER_ID");
            payee_info.put("identity", info.getAccount().getUserId());
        } else {
            payee_info.put("identity", info.getAccount().getAccount());
            payee_info.put("identity_type", "ALIPAY_LOGON_ID");
            payee_info.put("name", info.getAccount().getName());
        }
 
 
        json.put("payee_info", payee_info);
        json.put("remark", info.getMark());
        json.put("biz_scene", info.getBizScene().name());
 
        com.alibaba.fastjson.JSONObject params = new com.alibaba.fastjson.JSONObject();
        if (AlipayTransferInfo.AlipayProductCodeEnum.STD_RED_PACKET == info.getProductCode()) {
            params.put("sub_biz_scene", "REDPACKET");
        }
 
        if (!StringUtil.isNullOrEmpty(info.getPayerName())) {
            params.put("payer_show_name", info.getPayerName());
        }
 
 
        json.put("business_params", params.toJSONString());
 
        request.setBizContent(json.toString());
        AlipayFundTransUniTransferResponse response = null;
        response = getAlipayClient(app).certificateExecute(request);
        // 成功转账
        if (response != null && response.isSuccess() && "10000".equals(response.getCode())) {
            return response;
        } else// 转账失败
        {
            throw new AlipayTransferException(Integer.parseInt(response.getCode()), response.getSubCode(),
                    response.getBody());
        }
    }
 
 
    /**
     * 获取订单详情
     * API接口地址为:https://opendocs.alipay.com/apis/api_28/alipay.fund.trans.common.query/
     *
     * @param app
     * @param productCode
     * @param bizScene
     * @param outBizNo
     * @return
     * @throws AlipayApiException
     */
    public static AlipayFundTransCommonQueryResponse getOrderDetail(AlipayAppInfo app, AlipayTransferInfo.AlipayProductCodeEnum productCode, AlipayTransferInfo.AlipayBizSceneEnum bizScene, String outBizNo) throws AlipayApiException, AlipayCommonException {
        AlipayClient alipayClient = getAlipayClient(app);
        AlipayFundTransCommonQueryRequest request = new AlipayFundTransCommonQueryRequest();
        com.alibaba.fastjson.JSONObject content = new com.alibaba.fastjson.JSONObject();
        if (productCode != null)
            content.put("product_code", productCode.name());
        if (bizScene != null)
            content.put("biz_scene", bizScene.name());
        content.put("out_biz_no", outBizNo);
        request.setBizContent(content.toString());
        AlipayFundTransCommonQueryResponse response = alipayClient.certificateExecute(request);
        if (response.isSuccess())
            return response;
        else
            throw new AlipayCommonException(response.getCode(), response.getSubMsg(), response.getBody());
    }
 
    /**
     * 获取账户余额
     * API接口地址:https://opendocs.alipay.com/apis/api_28/alipay.fund.account.query
     *
     * @param app
     * @param userId
     * @return
     * @throws AlipayApiException
     * @throws AlipayCommonException
     */
    public static BigDecimal getAccountBalance(AlipayAppInfo app, String userId) throws AlipayApiException, AlipayCommonException {
        AlipayClient alipayClient = getAlipayClient(app);
        AlipayFundAccountQueryRequest request = new AlipayFundAccountQueryRequest();
        com.alibaba.fastjson.JSONObject content = new com.alibaba.fastjson.JSONObject();
        content.put("alipay_user_id", userId);
        content.put("account_type", "ACCTRANS_ACCOUNT");
        request.setBizContent(content.toString());
 
        AlipayFundAccountQueryResponse response = alipayClient.certificateExecute(request);
        if (response.isSuccess()) {
            return new BigDecimal(response.getAvailableAmount());
        } else {
            throw new AlipayCommonException(response.getCode(), response.getSubMsg(), response.getBody());
        }
    }
 
 
}