添加支付宝转账接口;
This commit is contained in:
parent
c165e6094e
commit
e1b32b33e5
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
// 服务商信息
|
// 服务商信息
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue