一、业务场景
想实现每笔当面付收款的订单的资金,实时划转到一个或多个分账收入方的支付宝账户。(只有通过当面付接口支付收款的订单才能分账,固定收钱码收款订单不支持分账)。
二、如何实现 1、集成当面付
(1)如果之前对接过支付宝产品,那么可以直接使用之前对接支付宝接口的APPID,在APPID下添加当面付功能包并签约。签约成功后该APPID就有调用当面付接口的权限,再进行代码集成,接入流程可参考【当面付接入流程】
(2)如果之前没有对接过支付宝产品,则需要先入驻支付宝开放平台,步骤可参考【如何入驻开放平台】,如何获取APPID可参考【创建应用】,在APPID下添加当面付功能包,【签约】成功后进行接口对接,接入流程可参考【当面付接入流程】。
2、集成商家分账
商家分账接入流程可参考【如何接入】
三、接口调用 1、支付流程
1、用户在线下商店进行付款;
(1)扫码枪扫用户付款码支付,则扫码枪获取到付款码,商家服务端调用【alipay.trade.pay】条码支付接口进行支付;
(2)商家服务端调用【alipay.trade.precreate】生成付款二维码,展示给用户,用户扫商家收银机展示的付款码进行支付。
2、获取到支付成功的支付宝交易号(trade_no),可以调用【alipay.trade.query】查询接口获取;
3、调用【alipay.trade.order.settle】分账接口传入需要分账的支付宝订单号(trade_no)和分账收入方账号(trans_in)、分账金额(amount),进行分账。
注意:如果第一次分账,或者是新的分账收款方账号,需要先调用【alipay.trade.royalty.relation.bind】分账关系绑定接口绑定分账关系后才可分账。
2、退款流程
分账成功后,如果用户退款,商家服务端调用【alipay.trade.refund】退款接口,此时退款是按照分账比例退款的,当面付交易不支持自定义退款金额和退款方.
四、代码示例 1、支付
【alipay.trade.app.pay】APP支付接口
AlipayClient alipayClient = new DefaultAlipayClient(ALIPAY_GATEWAY, APP_ID, PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE); AlipayTradePayRequest request = new AlipayTradePayRequest(); //request.putOtherTextParam("app_auth_token","商家授权的app_auth_token"); //第三方应用APPID调用接口时传入 request.setBizContent("{" + ""out_trade_no":"20150320010101001"," + //商家订单号 ""scene":"bar_code"," + //支付场景 ""auth_code":"28763443825664394"," + //付款码值 ""subject":"测试订单"," + //订单标题
""total_amount":"0.1"" + //金额 "}"); AlipayTradePayResponse response = alipayClient.execute(request); //输出响应结果 System.out.println(response.getBody());
2、分账
【alipay.trade.order.settle】分账接口
(注意:如果第一次分账,或者是新的分账收款方账号,需要先调用【alipay.trade.royalty.relation.bind】分账关系绑定接口绑定分账关系后才可分账。)
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", AlipayConfig.APPID, AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.SIGNTYPE); //获得初始化的AlipayClient AlipayTradeOrderSettleRequest request = new AlipayTradeOrderSettleRequest(); request.setBizContent("{" + ""out_request_no":"26665934326"," + //请求号,每次请求不重复 ""trade_no":"2020010222001446280540872500"," + //支付成功的支付宝交易号 ""royalty_parameters":[{"+ //分账明细 ""royalty_type":"transfer"," + //分账类型 ""trans_out":"2088********"," + //支出方账户(填商家) ""trans_out_type":"userId"," + //支出方账户类型。userId表示是支付宝账号对应的支付宝唯一用户号;loginName表示是支付宝登录号; ""trans_in_type":"userId"," + //收入方账户类型 ""trans_in":"2088********"," + //收入方账户(填分账收入方) ""amount":0.01," + //分账金额 ""desc":"分账给测试账号"" + //分账描述
"}]" + "}"); AlipayTradeOrderSettleResponse response = alipayClient.execute(request); if(response.isSuccess()){ System.out.println("调用成功"); } else { System.out.println("调用失败"); } System.out.println(response.getBody()); }
3、退分账
【alipay.trade.refund】交易退款接口
注意:当面付退分账是按照分账比例退款的,所以不需要传入退分账参数refund_royalty_parameters。
AlipayClient alipayClient = new DefaultAlipayClient(Config.gatewayUrl, Config.app_id, Config.merchant_private_key, "json", Config.charset, Config.alipay_public_key, Config.sign_type); //锟斤拷贸锟绞硷拷锟斤拷锟紸lipayClient AlipayTradeRefundRequest request = new AlipayTradeRefundRequest(); request.setBizContent("{" + //""out_trade_no":"20150320010101001"," + //商家订单号 ""trade_no":"2020010222001446280540872500"," + //支付宝交易号 ""refund_amount":0.1" + //退款金额 "}"); AlipayTradeRefundResponse response = alipayClient.execute(request); if(response.isSuccess()){ System.out.println("调用成功"); } else { System.out.println("调用失败"); } System.out.print(response.getBody()); }
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。