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