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