支付模块-分账

关于支付模块中分账

分账:给参与方分钱(分润)

由于资金最终是交由有资质的结算中心(如支付宝,微信支付,电子银行等),所以分账系统最终还是需要调用资金结算平台提供的分账API。如果对接的金额结算平台没有提供分账的API,则无法进行分账的业务处理。资金结算平台提供的分账接口通常不涉及分账比例,而是需要传入确定金额,所以分账规则的维护就是业务系统要做的事了。说白了,分账业务就是代理各大结算平台的API,系统的价值就看大家在代理时,谁的增强服务做的好(提供多维度统计、稳定易用、功能丰富等等)。

对比了支付宝和微信的分账API,说一下不同点:

  • 微信的分账接口中有“资金冻结”的概念,如果在支付时标记某单交易需分账,则此单金额会被冻结(即使没有维护分账用户列表),需要手动调用解冻API。在调用分账接口执行分账指令时,支付宝接口会自动判断是否存在分账用户。
  • 分账后,如果订单发生退款。支付宝只有一个退款接口,通过参数配置退款、退分账和补差。微信支付则涉及“退款”和“分账回退”两个接口。这个分账后退款的场景中,如果接口调用参数只关注退款,分账后减少的金额需要由收款方补上,即订单100,分账后商户得到60,退款时商户补上40 。如果接口调用时明确退回分账金额,则在调用API时需要明确从哪个分账收入方退,退多少分账金额,这里是较为繁琐的地方(即使对于每一笔需要分账的交易都有对应的分账记录表),且微信支付中,如果分账对象为个人,分账也无法退还。从资金结算平台的接口设计来看,涉及分账后的退款,无法退回的分账皆由收款商户来承担。

总结:涉及到分销成功后订单发生退款的场景,从分润放收回的金额将<=用户的付款金额,这部分差额的承担需要注意。

### Java 实现微信支付 V2 分账功能 #### 依赖引入 为了实现微信支付V2分账功能,在项目中需引入必要的Maven依赖。通常情况下,这些依赖会包含HTTP客户端库以及JSON解析库等。 ```xml <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.9.1</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.78</version> </dependency> ``` 上述配置能够支持发起HTTPS请求并处理响应数据[^1]。 #### 创建辅助工具类 开发过程中可能需要用到一些帮助函数来简化操作流程,比如日期时间转换、加密解密等功能模块。对于微信支付而言,特别需要注意的是要准备用于生成签名和验签的方法。 - **DateTimeZoneUtil.java**: 提供统一的时间格式化服务。 - **AesUtil.java**: AES算法加解密组件,适用于敏感信息保护场景下使用。 这两个工具类可以参照已有框架设计模式自行编写完成[^2]。 #### 接口调用逻辑构建 针对具体的业务需求——即执行分账动作,则应按照如下方式组织代码结构: ##### 准备工作 定义好API访问路径前缀URL,并读取商户平台分配的应用ID(appid),商户号(mch_id)等相关认证凭证材料;同时准备好私钥文件(.pem)以便后续参与计算数字摘要值。 ##### 发送请求 通过POST方法向`/secapi/pay/profitsharing/orderaddreceiver`端点提交XML格式报文体,其中包含了本次交易流水号(out_trade_no), 收款方账户(openid)/服务商子商户号(sub_mch_id)及其对应的金额(amount)字段描述。 ```java public class ProfitSharingService { private static final String API_URL_PREFIX = "https://api.mch.weixin.qq.com"; public void addReceiver(String outTradeNo, List<ReceiverInfo> receivers){ Map<String,Object> params=new HashMap<>(); params.put("appid","your_appid"); params.put("mch_id","your_mch_id"); ... StringBuilder xmlBuilder=buildXml(params); OkHttpClient client=new OkHttpClient(); RequestBody body=RequestBody.create(MediaType.parse("application/xml;charset=UTF-8"),xmlBuilder.toString()); Request request=new Request.Builder() .url(API_URL_PREFIX+"/secapi/pay/profitsharing/orderaddreceiver") .post(body) .build(); try (Response response = client.newCall(request).execute()) { if (!response.isSuccessful()){ throw new RuntimeException("Failed to call wechat api."); } // Process the result here... } catch (IOException e) { log.error(e.getMessage(),e); } } } ``` 此段落展示了如何利用OkHttp发送带有自定义头部信息的HTTP POST请求给定目标服务器地址,并附带了构造好的XML字符串作为负载传递过去。 ##### 处理反馈消息 当接收到由对方返回的数据包之后,应当立即对其进行有效性校验(如检查回执状态码是否正常),再依据实际情形作出相应措施,例如更新本地数据库记录或是触发其他关联事件的通知机制等等。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值