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());
|
}
|
}
|
|
|
}
|