ProfitSharingApi.java
- package com.foxinmy.weixin4j.pay.api;
- import com.alibaba.fastjson.TypeReference;
- import com.foxinmy.weixin4j.exception.WeixinException;
- import com.foxinmy.weixin4j.http.weixin.WeixinResponse;
- import com.foxinmy.weixin4j.pay.model.WeixinPayAccount;
- import com.foxinmy.weixin4j.pay.profitsharing.*;
- import com.foxinmy.weixin4j.pay.type.ProfitIdType;
- import com.foxinmy.weixin4j.pay.type.SignType;
- import com.foxinmy.weixin4j.pay.type.profitsharing.ReturnAccountType;
- import com.foxinmy.weixin4j.util.RandomUtil;
- import com.foxinmy.weixin4j.xml.XmlStream;
- import java.util.List;
- /**
- * 微信商户平台分账接口(直连商户/服务商)
- *
- * @author kit (kit.li@qq.com)
- * @date 2020年05月20日
- * @since weixin4j-pay 1.1.0
- */
- public class ProfitSharingApi extends MchApi {
- public ProfitSharingApi(WeixinPayAccount weixinAccount) {
- super(weixinAccount);
- }
- /**
- * 添加分账接收方
- * 服务商代子商户发起添加分账接收方请求,后续可通过发起分账请求将结算后的钱分到该分账接收方。
- *
- * @param receiver
- * 分帐接收方
- * @return
- * @see Receiver
- * @see ReceiverResult
- * @see <a href="https://pay.weixin.qq.com/wiki/doc/api/allocation_sl.php?chapter=25_3&index=4">添加分账接收方</a>
- *
- */
- public ReceiverResult addReceiver(Receiver receiver) throws WeixinException {
- ReceiverRequest receiverRequest = new ReceiverRequest(receiver);
- super.declareMerchant(receiverRequest);
- String url = getRequestUri("profit_sharing_add_receiver_uri");
- receiverRequest.setSign(weixinSignature.sign(receiverRequest, SignType.HMAC$SHA256));
- String para = XmlStream.toXML(receiverRequest);
- WeixinResponse response = weixinExecutor.post(url, para);
- return response.getAsObject(new TypeReference<ReceiverResult>(){});
- }
- /**
- * 删除分账接收方
- * 商户发起删除分账接收方请求,删除后不支持将结算后的钱分到该分账接收方。
- *
- * @param receiver
- * 分帐接收方
- * @return
- * @throws WeixinException
- * @see Receiver
- * @see ReceiverResult
- * @see <a href="https://pay.weixin.qq.com/wiki/doc/api/allocation.php?chapter=27_4&index=5">删除分账接收方</a>
- */
- public ReceiverResult removeReceiver(Receiver receiver) throws WeixinException {
- ReceiverRequest receiverRequest = new ReceiverRequest(receiver);
- super.declareMerchant(receiverRequest);
- String url = getRequestUri("profit_sharing_remove_receiver_uri");
- receiverRequest.setSign(weixinSignature.sign(receiverRequest, SignType.HMAC$SHA256));
- String para = XmlStream.toXML(receiverRequest);
- WeixinResponse response = weixinExecutor.post(url, para);
- return response.getAsObject(new TypeReference<ReceiverResult>(){});
- }
- /**
- * 请求分帐
- *
- * @param transactionId
- * 微信订单号
- * @param outOrderNo
- * 商户分帐单号
- * @param receivers
- * 分帐接收方
- * @param multi
- * 是否多次分帐,默认为单次分帐,即调用分帐成功后马上解冻剩余金额给商户,不需要完结分帐。多次分帐可多次调用分帐API,需调完结分帐结束分帐
- * @return
- * @throws WeixinException
- * @see <a href="https://pay.weixin.qq.com/wiki/doc/api/allocation.php?chapter=27_1&index=1">请求单次分帐</a>
- */
- public ProfitSharingResult profitSharing(String transactionId, String outOrderNo, List<ReceiverProfit> receivers,
- Boolean multi) throws WeixinException {
- ProfitSharingRequest request = new ProfitSharingRequest(transactionId, outOrderNo, receivers);
- super.declareMerchant(request);
- String url = multi==null || multi.booleanValue()==false ? getRequestUri("profit_sharing_uri") :
- getRequestUri("multi_profit_sharing_uri");
- request.setSign(weixinSignature.sign(request, SignType.HMAC$SHA256));
- String para = XmlStream.toXML(request);
- WeixinResponse response = getWeixinSSLExecutor().post(url, para);
- return response.getAsObject(new TypeReference<ProfitSharingResult>(){});
- }
- /**
- * 分帐查询
- *
- * @param transactionId
- * 微信订单号
- * @param outOrderNo
- * 商户分帐单号
- * @return
- * @throws WeixinException
- * @see <a href="https://pay.weixin.qq.com/wiki/doc/api/allocation.php?chapter=27_2&index=3">分帐查询</a>
- */
- public ProfitSharingResult profitSharingQuery(String transactionId, String outOrderNo) throws WeixinException {
- ProfitSharingRequest request = new ProfitSharingRequest(transactionId, outOrderNo, null);
- request.setMchId(weixinAccount.getMchId());
- request.setNonceStr(RandomUtil.generateString(16));
- request.setSubMchId(weixinAccount.getSubMchId());
- String url = getRequestUri("profit_sharing_query_uri");
- request.setSign(weixinSignature.sign(request, SignType.HMAC$SHA256));
- String para = XmlStream.toXML(request);
- WeixinResponse response = weixinExecutor.post(url, para);
- return response.getAsObject(new TypeReference<ProfitSharingResult>(){});
- }
- /**
- * 完结分账
- * 1、不需要进行分账的订单,可直接调用本接口将订单的金额全部解冻给本商户
- * 2、调用多次分账接口后,需要解冻剩余资金时,调用本接口将剩余的分账金额全部解冻给特约商户
- * 3、已调用请求单次分账后,剩余待分账金额为零,不需要再调用此接口。
- *
- * @param transactionId
- * 微信订单号
- * @param outOrderNo
- * 商户分帐单号
- * @param description
- * 分帐完结描述
- * @return
- * @throws WeixinException
- * @see <a href="https://pay.weixin.qq.com/wiki/doc/api/allocation.php?chapter=27_5&index=6">完结分账</a>
- */
- public ProfitSharingResult profitSharingFinish(String transactionId, String outOrderNo, String description)
- throws WeixinException {
- ProfitSharingRequest request = new ProfitSharingRequest(transactionId, outOrderNo, null);
- request.setDescription(description);
- super.declareMerchant(request);
- String url = getRequestUri("profit_sharing_finish_uri");
- request.setSign(weixinSignature.sign(request, SignType.HMAC$SHA256));
- String para = XmlStream.toXML(request);
- WeixinResponse response = getWeixinSSLExecutor().post(url, para);
- return response.getAsObject(new TypeReference<ProfitSharingResult>(){});
- }
- /**
- * 分账回退
- *
- * @param id
- * 分帐单号
- * @param outReturnNo
- * 商户回退单号
- * @param returnAccountType
- * 回退方类型
- * @param returnAccount
- * 回退方账号
- * @param returnAmount
- * 回退金额
- * @param description
- * 回退描述
- * @return
- * @throws WeixinException
- * @see ProfitSharingReturnRequest
- * @see <a href="https://pay.weixin.qq.com/wiki/doc/api/allocation.php?chapter=27_7&index=7">分账回退</a>
- */
- public ProfitSharingReturnResult profitSharingReturn(ProfitId id, String outReturnNo,
- ReturnAccountType returnAccountType, String returnAccount,
- int returnAmount, String description) throws WeixinException{
- ProfitSharingReturnRequest request;
- if(id.getIdType()== ProfitIdType.ORDER_ID){
- request = new ProfitSharingReturnRequest(id.getId(), null, outReturnNo, returnAccountType,
- returnAccount, returnAmount, description);
- }else{
- request = new ProfitSharingReturnRequest(null, id.getId(), outReturnNo, returnAccountType,
- returnAccount, returnAmount, description);
- }
- super.declareMerchant(request);
- String url = getRequestUri("profit_sharing_return_uri");
- request.setSign(weixinSignature.sign(request, SignType.HMAC$SHA256));
- String para = XmlStream.toXML(request);
- WeixinResponse response = getWeixinSSLExecutor().post(url, para);
- return response.getAsObject(new TypeReference<ProfitSharingReturnResult>(){});
- }
- /**
- * 回退结果查询
- *
- * @param id
- * 分帐单号
- * @param outReturnNo
- * 商户回退单号
- * @return
- * @throws WeixinException
- * @see ProfitSharingReturnRequest
- * @see <a href="https://pay.weixin.qq.com/wiki/doc/api/allocation.php?chapter=27_8&index=8">回退结果查询</a>
- */
- public ProfitSharingReturnResult profitSharingReturnQuery(ProfitId id, String outReturnNo) throws WeixinException{
- ProfitSharingReturnRequest request;
- if(id.getIdType()== ProfitIdType.ORDER_ID){
- request = new ProfitSharingReturnRequest(id.getId(), null, outReturnNo);
- }else{
- request = new ProfitSharingReturnRequest(null, id.getId(), outReturnNo);
- }
- super.declareMerchant(request);
- String url = getRequestUri("profit_sharing_return_query_uri");
- request.setSign(weixinSignature.sign(request, SignType.HMAC$SHA256));
- String para = XmlStream.toXML(request);
- WeixinResponse response = weixinExecutor.post(url, para);
- return response.getAsObject(new TypeReference<ProfitSharingReturnResult>(){});
- }
- }