支付宝支付相关代码
①需要在支付宝中签约相关权限
②配置支付宝公私钥
③此处注意,前端金额单位为分,但支付宝的单位为元,此处是支付宝需要注意的地方
支付宝app支付
//getway变量(网关),appid(支付宝应用appid),privateKey(私钥),publicKey(支付宝公钥)
AlipayClient client = new DefaultAlipayClient(getway,appid,privateKey, "json","GBK", publicKey, "RSA2");
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
// callbackurl : 支付成功回调地址
request.setNotifyUrl(callBackUrl);
//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
//对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。
model.setBody(payParam.getBody());
//商品的标题/交易标题/订单标题/订单关键字等。
model.setSubject(payParam.getSubject());
//业务订单号
model.setOutTradeNo(payParam.getOrderId());
//设置订单超期时间
model.setTimeExpire(DateUtil.format(new Date(System.currentTimeMillis() + 1000 * 60 * OutTimeMinute), "yyyy-MM-dd HH:mm:ss"));
//支付宝金额(单位元)
model.setTotalAmount(payParam.getTotalAmount().divide(new BigDecimal("100"), 2, BigDecimal.ROUND_HALF_UP).toPlainString());
model.setProductCode("QUICK_MSECURITY_PAY");
log.info("model:{}", JSON.toJSONString(model, true));
request.setBizModel(model);
//这里和普通的接口调用不同,使用的是sdkExecute
AlipayTradeAppPayResponse response = client.sdkExecute(request);
log.info("支付宝下单response={}", response.getBody());
if (response.isSuccess()) {
//成功后处理的逻辑
} else {
//失败时处理的逻辑
}
支付宝js支付
//getway变量(网关),appid(支付宝应用appid),privateKey(私钥),publicKey(支付宝公钥)
AlipayClient client = new DefaultAlipayClient(getway,appid,privateKey, "json","GBK", publicKey, "RSA2");
AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
// callbackurl :
request.setNotifyUrl(callBackUrl);
AlipayTradeCreateModel model = new AlipayTradeCreateModel();
model.setBody(payParam.getBody());
model.setBuyerId(payParam.getBuyerId());
model.setSubject(payParam.getSubject());
model.setOutTradeNo(payParam.getOrderId());
model.setTimeoutExpress(DateUtil.format(DateUtils.addMinutes(new Date(), 10), "yyyy-MM-dd HH:mm:ss"));
//转化交易金额单位为元
DecimalFormat df = new DecimalFormat("#0.00");
model.setTotalAmount(df.format(payParam.getTotalAmount().divide(new BigDecimal("100"), 2, BigDecimal.ROUND_HALF_UP).toPlainString()));
request.setBizModel(model);
log.info("model:{}", JSON.toJSONString(model, true));
AlipayTradeCreateResponse response = client.pageExecute(request);
log.info("支付宝下单response={}", response);
if (response.isSuccess()) {
//成功后处理的逻辑
} else {
//失败时处理的逻辑
}
支付宝H5支付
//getway变量(网关),appid(支付宝应用appid),privateKey(私钥),publicKey(支付宝公钥)
AlipayClient client = new DefaultAlipayClient(getway,appid,privateKey, "json","GBK", publicKey, "RSA2");
//该笔订单允许的最晚付款时间
//设置请求参数
String content = "{\"out_trade_no\":\"" + payParam.getOrderId() + "\","
+ "\"total_amount\":\"" + payParam.getTotalAmount().divide(new BigDecimal("100"), 2, BigDecimal.ROUND_HALF_UP).toPlainString() + "\","
+ "\"subject\":\"" + payParam.getSubject() + "\","
+ "\"timeout_express\":\"" + DateUtil.format(new Date(System.currentTimeMillis() + 1000 * 60 * OutTimeMinute), "yyyy-MM-dd HH:mm:ss") + "\","
+ "\"body\":\"" + payParam.getBody() + "\","
+ "\"product_code\":\"" + "QUICK_MSECURITY_PAY" + "\"}";
AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();
// alipayRequest.setReturnUrl(AlipayConfig.return_url);
alipayRequest.setNotifyUrl(callBackUrl);
alipayRequest.setBizContent(content);
//请求
AlipayTradeWapPayResponse response = client.pageExecute(alipayRequest);
log.info("支付宝下单response={}", response);
if (response.isSuccess()) {
//成功后处理的逻辑
} else {
//失败时处理的逻辑
}
支付宝订单查询
log.info("支付宝订单查询queryPayParam={}", queryPayParam);
//getway变量(网关),appid(支付宝应用appid),privateKey(私钥),publicKey(支付宝公钥)
AlipayClient client = new DefaultAlipayClient(getway,appid,privateKey, "json","GBK", publicKey, "RSA2");
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();//创建API对应的request类
AlipayTradeQueryModel model = new AlipayTradeQueryModel();
model.setOutTradeNo(queryPayParam.getOrderId());
request.setBizModel(model);
log.info("支付宝第三方查询 : {}", ToStringUtils.getToString(request.getBizModel()));
AlipayTradeQueryResponse execute = client.execute(request);
log.info("支付宝订单查询response={}", response);
if (response.isSuccess()) {
PaidStatusEnum paidStatus;
switch (response.getTradeStatus()) {
case "TRADE_SUCCESS":
//支付成功
break;
case "TRADE_FINISHED":
//已支付
break;
case "WAIT_BUYER_PAY":
//支付中
break;
case "TRADE_CLOSED":
//订单关闭
break;
default:
//支付失败
break;
}
}else{
//查询失败相关逻辑
}
支付宝退单退费
log.info("支付宝订单退费refundParam={}", refundParam);
=================================(业务逻辑代码start)==================================
//1.查找支付记录
OrderPayRecord payRecord = orderPayRecodService.findByOrderId(refundParam.getOrderId());
ValidateUtil.checkNull(payRecord, ORDER_NOT_FOUND, String.format("不存在订单号:%s", refundParam.getOrderId()));
ValidateUtil.checkState(payRecord.getAmount().compareTo(refundParam.getRefundFee()) >= 0, ORDER_ALL_REFUNDED,
String.format("订单号:%s退款金额不能大于付款金额", refundParam.getOrderId()));
//2.检查是否有重复退款就记录
int count = orderRefundRecordService.countByRequestNoAndOrderId(refundParam.getOutRequestNo(), refundParam.getOrderId());
ValidateUtil.checkState(count == 0, REPEAT_REFUND_REQUEST_NO, String.format("存在重复的退款流水:%s", refundParam.getOutRequestNo()));
//3.init refundRecord modify payRecord
OrderRefundRecord refundRecord = OrderRefundRecord.build(refundParam);
refundRecord.setPayWay(PayEnum.PayWayEnum.ALIPAY);//支付宝
transactionTemplate.execute(transactionStatus -> {
orderRefundRecordService.save(refundRecord);
return null;
});
=================================(业务逻辑代码end)==================================
//退费流程
//getway变量(网关),appid(支付宝应用appid),privateKey(私钥),publicKey(支付宝公钥)
AlipayClient client = new DefaultAlipayClient(getway,appid,privateKey, "json","GBK", publicKey, "RSA2");
AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
AlipayTradeRefundModel model = new AlipayTradeRefundModel();
//订单号
model.setOutTradeNo(refundParam.getOrderId());
//退费流水号
model.setOutRequestNo(refundParam.getOutRequestNo());
//统一传入金额为分
DecimalFormat df = new DecimalFormat("#0.00");
//退费金额
model.setRefundAmount(df.format(refundParam.getRefundFee().divide(BigDecimal.valueOf(100))));
request.setBizModel(model);
//request.setNotifyUrl(callBackPrefix + "refund/" + refundParam.getAppId() + ".do"); 这里退款之后会回调支付时填写的地址
AlipayTradeRefundResponse response = client.execute(request);
log.info("支付宝订单退费response={}", response);
if (response.isSuccess()) {
//保存下返回json,最总结果以回调为准
} else {
return new CommonResult().failed("退费失败");
}
交易退费查询
log.info("支付宝订单退费查询queryRefundParam={}", queryRefundParam);
//getway变量(网关),appid(支付宝应用appid),privateKey(私钥),publicKey(支付宝公钥)
AlipayClient client = new DefaultAlipayClient(getway,appid,privateKey, "json","GBK", publicKey, "RSA2");
AlipayTradeFastpayRefundQueryRequest request = new AlipayTradeFastpayRefundQueryRequest();
AlipayTradeFastpayRefundQueryModel model = new AlipayTradeFastpayRefundQueryModel();
//退费流水号
model.setOutRequestNo(queryRefundParam.getRequestNo());
//订单号
model.setOutTradeNo(queryRefundParam.getOrderId());
request.setBizModel(model);
AlipayTradeFastpayRefundQueryResponse execute = client.execute(request);
log.info("支付宝订单退费查询response={}", response);
if (response.isSuccess()) {
//定义的枚举类,详见如下代码块
RefundStatusEnum refundStatus = RefundStatusEnum.REFUNDED;
for (RefundRoyaltyResult refundRoyaltyResult : response.getRefundRoyaltys()) {
if (!"SUCCESS".equals(refundRoyaltyResult.getResultCode())) {
refundStatus = RefundStatusEnum.FAILED;
}
}
=============================查询处理逻辑start===================================
//查询结果与本地不符时,更新本地信息
if (refundRecord.getStatus() != refundStatus) {
RefundStatusEnum finalRefundStatus = refundStatus;
//声明式事务
transactionTemplate.execute(transactionStatus -> {
refundRecord.setStatus(finalRefundStatus);
if (finalRefundStatus == RefundStatusEnum.REFUNDED) {
mqUtil.sendRefundMsg(refundRecord.getOrderId(), refundRecord.getRequestNo());
try {
RespBean respBean = tradeCallBackService.tradeRefundNotify(refundRecord);
if (respBean.getCode() != 0) {
refundRecord.setUpstreamSynStatus(1);
}
} catch (Exception e) {
throw new BizException(AppExceptionEnum.REMOTECALLEXCEPTION, "");
}
refundRecord.setSynStatus(SynStatusEnum.PUSHED);
refundRecord.setRefundTime(new Date());
refundRecord.setTradeNo(response.getTradeNo());
OrderPayRecord payRecord = orderPayRecodService.findByOrderId(response.getOutTradeNo());
BigDecimal originalRefundFee = Objects.isNull(payRecord.getRefundFee()) ? BigDecimal.ZERO :
payRecord.getRefundFee();
payRecord.setRefundFee(new BigDecimal(response.getRefundAmount()).add(originalRefundFee));
orderPayRecodService.update(payRecord);
} else {
refundRecord.setErrMsg(response.getSubMsg());
}
orderRefundRecordService.update(refundRecord);
return null;
});
}
=============================查询处理逻辑end===================================
}else{
//查询失败逻辑
}
枚举类代码
public enum RefundStatusEnum implements BaseEnum<Integer> {
REFUNDING(1,"退款中"),
REFUNDED(2,"已退款"),
CLOSED(3,"已关闭"),
FAILED(4,"失败");
private Integer value;
private String name;
RefundStatusEnum(Integer value, String name) {
this.value = value;
this.name = name;
}
@Override
public Integer getValue() {
return value;
}
@Override
public String getName() {
return name;
}
}
支付宝提现
①支付宝签约能力
②支付宝提现加签管理(三个证书)
CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
certAlipayRequest.setServerUrl(aliWiGetway);
certAlipayRequest.setAppId(aliWiAppid);
certAlipayRequest.setPrivateKey(aliWiPrivateKey);
certAlipayRequest.setFormat("json");
certAlipayRequest.setCharset("GBK");
certAlipayRequest.setSignType("RSA2");
certAlipayRequest.setCertPath(new File(aliWiAppCertPublicKey).getAbsolutePath());
certAlipayRequest.setAlipayPublicCertPath(new File(aliWiAlipayCertPublicKey).getAbsolutePath());
certAlipayRequest.setRootCertPath(new File(aliWiAlipayRootCert).getAbsolutePath());
DefaultAlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);
AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
String str = "";
//alistr为支付宝授权返回参数,例success=true&result_code=200&app_id=xxxxxxxx&auth_code=02af020d57d643xxxxxxxx646950VC76&scope=kuaijie&alipay_open_id=20880017xxxxxxxx78616971213276&user_id=20887xxxxxx43762&target_id=8753239xxxxxxx5888
//通过支付宝用户userid提现
if(StringUtils.isNotBlank(payParam.getAliStr())){
str = payParam.getAliStr().substring(payParam.getAliStr().indexOf("user_id") + 8);
str = str.substring(0, str.indexOf("&"));
request.setBizContent("{" +
"\"out_biz_no\":\"" + payParam.getOrderNo() + "\"," +
//转账金额 (上游单位为分,转化成元)
"\"trans_amount\":" + payParam.getAmount().divide(new BigDecimal(100)) + "," +
//单笔无密转账固定为TRANS_ACCOUNT_NO_PWD
"\"product_code\":\"TRANS_ACCOUNT_NO_PWD\"," +
//单笔无密转账固定为DIRECT_TRANSFER
"\"biz_scene\":\"DIRECT_TRANSFER\"," +
"\"order_title\":\"" + payParam.getNow() + "发起提现申请" + "\"," +
"\"payee_info\":{" +
//参与方的标识ID,比如支付宝用户UID。
"\"identity\":\"" + str + "\"," +
//参与方的标识类型,目前支持如下枚举:1、ALIPAY_USER_ID 支付宝的会员ID 2、ALIPAY_LOGON_ID:支付宝登录号,支持邮箱和手机号格式
"\"identity_type\":\"ALIPAY_USER_ID\"," +
" }," +
"\"remark\":\"" + "余额提现" + "\"," +
"\"business_params\":\"{\\\"sub_biz_scene\\\":\\\"REDPACKET\\\"}\"" +
" }");
}else {
//通过支付宝账号和支付宝实名姓名提现
request.setBizContent("{" +
"\"out_biz_no\":\"" + payParam.getOrderNo() + "\"," +
//转账金额 (上游单位为分,转化成元)
"\"trans_amount\":" + payParam.getAmount().divide(new BigDecimal(100)) + "," +
//单笔无密转账固定为TRANS_ACCOUNT_NO_PWD
"\"product_code\":\"TRANS_ACCOUNT_NO_PWD\"," +
//单笔无密转账固定为DIRECT_TRANSFER
"\"biz_scene\":\"DIRECT_TRANSFER\"," +
"\"order_title\":\"" + payParam.getNow() + "发起提现申请" + "\"," +
"\"payee_info\":{" +
//参与方的标识ID,比如支付宝用户UID。
"\"identity\":\"" + payParam.getAliAccount() + "\"," +
//参与方的标识类型,目前支持如下枚举:1、ALIPAY_USER_ID 支付宝的会员ID 2、ALIPAY_LOGON_ID:支付宝登录号,支持邮箱和手机号格式
"\"identity_type\":\"ALIPAY_LOGON_ID\"," +
//参与方真实姓名,如果非空,将校验收款支付宝账号姓名一致性。当identity_type=ALIPAY_LOGON_ID时,本字段必填。若传入该属性,则在支付宝回单中将会显示这个属性
"\"name\":\"" + payParam.getAliRealName() + "\"" +
" }," +
"\"remark\":\"" + "余额提现" + "\"," +
"\"business_params\":\"{\\\"sub_biz_scene\\\":\\\"REDPACKET\\\"}\"" +
" }");
}
AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request);
if (response.isSuccess()) {
//提现成功处理逻辑
}else{
//提现失败处理逻辑
}
支付宝提现查询
CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
certAlipayRequest.setServerUrl(aliWiGetway);
certAlipayRequest.setAppId(aliWiAppid);
certAlipayRequest.setPrivateKey(aliWiPrivateKey);
certAlipayRequest.setFormat("json");
certAlipayRequest.setCharset("GBK");
certAlipayRequest.setSignType("RSA2");
certAlipayRequest.setCertPath(new File(aliWiAppCertPublicKey).getAbsolutePath());
certAlipayRequest.setAlipayPublicCertPath(new File(aliWiAlipayCertPublicKey).getAbsolutePath());
certAlipayRequest.setRootCertPath(new File(aliWiAlipayRootCert).getAbsolutePath());
DefaultAlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);
AlipayFundTransCommonQueryRequest request = new AlipayFundTransCommonQueryRequest();
if(StringUtils.isNotBlank(param.getOrderId()) && StringUtils.isNotBlank(param.getPayFundOrderId())) {
request.setBizContent("{" +
"\"product_code\":\"TRANS_ACCOUNT_NO_PWD\"," +
"\"biz_scene\":\"DIRECT_TRANSFER\"," +
"\"out_biz_no\":\"" + param.getOrderNo() + "\"," + //业务订单号
"\"order_id\":\"" + param.getOrderId() + "\"," + //第三方orderId
"\"pay_fund_order_id\":\"" + param.getPayFundOrderId() + "\"" + //第三方pay_fund_order_id
" }");
}else{
request.setBizContent("{" +
"\"product_code\":\"TRANS_ACCOUNT_NO_PWD\"," +
"\"biz_scene\":\"DIRECT_TRANSFER\"," +
"\"out_biz_no\":\"" + param.getOrderNo() + "\"" +
" }");
}
AlipayFundTransCommonQueryResponse response = alipayClient.certificateExecute(request);
if(response.isSuccess()){
//提现查询成功逻辑
}else{
//提现查询失败逻辑
}
关注公众号
每周会更新干货知识