添加支付宝转账接口;

This commit is contained in:
terrfly 2021-08-13 10:28:19 +08:00
parent c165e6094e
commit e1b32b33e5
6 changed files with 192 additions and 2 deletions

View File

@ -36,7 +36,7 @@ public interface ITransferService {
boolean isSupport(String entryType); boolean isSupport(String entryType);
/** 前置检查如参数等信息是否符合要求, 返回错误信息或直接抛出异常即可 */ /** 前置检查如参数等信息是否符合要求, 返回错误信息或直接抛出异常即可 */
String preCheck(TransferOrderRQ bizRQ, TransferOrder refundOrder); String preCheck(TransferOrderRQ bizRQ, TransferOrder transferOrder);
/** 调起退款接口,并响应数据; 内部处理普通商户和服务商模式 **/ /** 调起退款接口,并响应数据; 内部处理普通商户和服务商模式 **/
ChannelRetMsg transfer(TransferOrderRQ bizRQ, TransferOrder refundOrder, MchAppConfigContext mchAppConfigContext) throws Exception; ChannelRetMsg transfer(TransferOrderRQ bizRQ, TransferOrder refundOrder, MchAppConfigContext mchAppConfigContext) throws Exception;

View File

@ -67,6 +67,8 @@ public class AlipayKit {
((AlipayTradeRefundRequest)req).putOtherTextParam("app_auth_token", isvsubMchParams.getAppAuthToken()); ((AlipayTradeRefundRequest)req).putOtherTextParam("app_auth_token", isvsubMchParams.getAppAuthToken());
} else if(req instanceof AlipayTradeFastpayRefundQueryRequest) { } else if(req instanceof AlipayTradeFastpayRefundQueryRequest) {
((AlipayTradeFastpayRefundQueryRequest)req).putOtherTextParam("app_auth_token", isvsubMchParams.getAppAuthToken()); ((AlipayTradeFastpayRefundQueryRequest)req).putOtherTextParam("app_auth_token", isvsubMchParams.getAppAuthToken());
} else if(req instanceof AlipayFundTransToaccountTransferRequest) {
((AlipayFundTransToaccountTransferRequest)req).putOtherTextParam("app_auth_token", isvsubMchParams.getAppAuthToken());
} }
// 服务商信息 // 服务商信息

View File

@ -0,0 +1,106 @@
/*
* Copyright (c) 2021-2031, 河北计全科技有限公司 (https://www.jeequan.com & jeequan@126.com).
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.jeequan.jeepay.pay.channel.alipay;
import com.alipay.api.domain.AlipayFundTransToaccountTransferModel;
import com.alipay.api.request.AlipayFundTransToaccountTransferRequest;
import com.alipay.api.response.AlipayFundTransToaccountTransferResponse;
import com.alipay.api.response.AlipayTradeRefundResponse;
import com.jeequan.jeepay.core.constants.CS;
import com.jeequan.jeepay.core.entity.TransferOrder;
import com.jeequan.jeepay.core.utils.AmountUtil;
import com.jeequan.jeepay.pay.channel.ITransferService;
import com.jeequan.jeepay.pay.model.MchAppConfigContext;
import com.jeequan.jeepay.pay.rqrs.msg.ChannelRetMsg;
import com.jeequan.jeepay.pay.rqrs.transfer.TransferOrderRQ;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
/**
* 转账接口 支付宝官方
*
* @author terrfly
* @site https://www.jeepay.vip
* @date 2021/8/11 14:05
*/
@Slf4j
@Service
public class AlipayTransferService implements ITransferService {
@Override
public String getIfCode() {
return CS.IF_CODE.ALIPAY;
}
@Override
public boolean isSupport(String entryType) {
// 支付宝账户
if(TransferOrder.ENTRY_ALIPAY_CASH.equals(entryType)){
return true;
}
return false;
}
@Override
public String preCheck(TransferOrderRQ bizRQ, TransferOrder transferOrder) {
return null;
}
@Override
public ChannelRetMsg transfer(TransferOrderRQ bizRQ, TransferOrder transferOrder, MchAppConfigContext mchAppConfigContext){
AlipayFundTransToaccountTransferRequest request = new AlipayFundTransToaccountTransferRequest();
AlipayFundTransToaccountTransferModel model = new AlipayFundTransToaccountTransferModel();
model.setAmount(AmountUtil.convertCent2Dollar(transferOrder.getAmount())); //转账金额单位
model.setOutBizNo(transferOrder.getTransferId()); //商户转账唯一订单号
model.setPayeeType("ALIPAY_LOGONID"); //ALIPAY_USERID 支付宝用户ID ALIPAY_LOGONID:支付宝登录账号
model.setPayeeAccount(transferOrder.getAccountNo()); //收款方账户
model.setPayeeRealName(StringUtils.defaultString(transferOrder.getAccountName(), null)); //收款方真实姓名
model.setRemark(transferOrder.getTransferDesc()); //转账备注
request.setBizModel(model);
//统一放置 isv接口必传信息
AlipayKit.putApiIsvInfo(mchAppConfigContext, request, model);
// 调起支付宝接口
AlipayFundTransToaccountTransferResponse response = mchAppConfigContext.getAlipayClientWrapper().execute(request);
ChannelRetMsg channelRetMsg = new ChannelRetMsg();
channelRetMsg.setChannelAttach(response.getBody());
// 调用成功
if(response.isSuccess()){
channelRetMsg.setChannelState(ChannelRetMsg.ChannelState.CONFIRM_SUCCESS);
channelRetMsg.setChannelOrderId(response.getOrderId());
}else{
// 系统繁忙 无法确认结果
if("SYSTEM_ERROR".equalsIgnoreCase(response.getSubCode())){
return ChannelRetMsg.waiting();
}
channelRetMsg.setChannelState(ChannelRetMsg.ChannelState.CONFIRM_FAIL);
channelRetMsg.setChannelErrCode(response.getSubCode());
channelRetMsg.setChannelErrMsg(response.getSubMsg());
}
return channelRetMsg;
}
}

View File

@ -0,0 +1,67 @@
/*
* Copyright (c) 2021-2031, 河北计全科技有限公司 (https://www.jeequan.com & jeequan@126.com).
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.jeequan.jeepay.pay.ctrl.transfer;
import com.jeequan.jeepay.core.entity.TransferOrder;
import com.jeequan.jeepay.core.exception.BizException;
import com.jeequan.jeepay.core.model.ApiRes;
import com.jeequan.jeepay.pay.ctrl.ApiController;
import com.jeequan.jeepay.pay.rqrs.transfer.QueryTransferOrderRQ;
import com.jeequan.jeepay.pay.rqrs.transfer.QueryTransferOrderRS;
import com.jeequan.jeepay.pay.service.ConfigContextService;
import com.jeequan.jeepay.service.impl.TransferOrderService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 商户转账单查询controller
*
* @author terrfly
* @site https://www.jeequan.com
* @date 2021/8/13 15:20
*/
@Slf4j
@RestController
public class QueryTransferOrderController extends ApiController {
@Autowired private TransferOrderService transferOrderService;
@Autowired private ConfigContextService configContextService;
/**
* 查单接口
* **/
@RequestMapping("/api/transfer/query")
public ApiRes queryTransferOrder(){
//获取参数 & 验签
QueryTransferOrderRQ rq = getRQByWithMchSign(QueryTransferOrderRQ.class);
if(StringUtils.isAllEmpty(rq.getMchOrderNo(), rq.getTransferId())){
throw new BizException("mchOrderNo 和 transferId不能同时为空");
}
TransferOrder refundOrder = transferOrderService.queryMchOrder(rq.getMchNo(), rq.getMchOrderNo(), rq.getTransferId());
if(refundOrder == null){
throw new BizException("订单不存在");
}
QueryTransferOrderRS bizRes = QueryTransferOrderRS.buildByRecord(refundOrder);
return ApiRes.okWithSign(bizRes, configContextService.getMchAppConfigContext(rq.getMchNo(), rq.getAppId()).getMchApp().getAppSecret());
}
}

View File

@ -29,7 +29,7 @@ import lombok.Data;
public class QueryTransferOrderRQ extends AbstractMchAppRQ { public class QueryTransferOrderRQ extends AbstractMchAppRQ {
/** 商户转账单号 **/ /** 商户转账单号 **/
private String mchRefundNo; private String mchOrderNo;
/** 支付系统转账单号 **/ /** 支付系统转账单号 **/
private String transferId; private String transferId;

View File

@ -19,6 +19,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jeequan.jeepay.core.entity.TransferOrder; import com.jeequan.jeepay.core.entity.TransferOrder;
import com.jeequan.jeepay.service.mapper.TransferOrderMapper; import com.jeequan.jeepay.service.mapper.TransferOrderMapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -98,5 +99,19 @@ public class TransferOrderService extends ServiceImpl<TransferOrderMapper, Trans
/** 查询商户订单 **/
public TransferOrder queryMchOrder(String mchNo, String mchOrderNo, String transferId){
if(StringUtils.isNotEmpty(transferId)){
return getOne(TransferOrder.gw().eq(TransferOrder::getMchNo, mchNo).eq(TransferOrder::getTransferId, transferId));
}else if(StringUtils.isNotEmpty(mchOrderNo)){
return getOne(TransferOrder.gw().eq(TransferOrder::getMchNo, mchNo).eq(TransferOrder::getMchOrderNo, mchOrderNo));
}else{
return null;
}
}
} }