二、创建担保订单
生成担保订单并给付款方支付,支付完成后,对于付款来说,这笔费用是冻结状态。由开发者调用蜂巢进行转账给其他支付宝。 如果交易中止,开发者也可以调用取消担保订单接口,剩余的资金(充值金额-手续费-已转账金额)原路退回给付款方。
说明:担保订单生成后并由于付款方付款后, 不管后续买卖双方交易是否正常完成或中途取消,手续费都不会退还。
一、请求参数
请求URL:
POST https://kf.fw199.com/gateway/partner/pay/alipay/wallet/take/order
基础参数
| 参数名 | 类型 | 说明 | 示例 |
|---|---|---|---|
| appid | String | 合作伙伴AppId | uwkahf@jfs92 |
| timestamp | String | 当前时间戳 | |
| sign | String | 接口签名 | 如何计算生成见示例代码 |
| alipay_logon_id | String | 签约的付款方支付宝账号 | |
| out_biz_no | String | 网站侧订单号 | |
| order_title | String | 订单标题 | |
| amount | int | 要充值的订单金额,注意单位是分,不是元 | 100元,则传入10000 |
| notice_url | String | 网站侧的回调地址,商家对订单付款后,蜂巢会POST异步请求此url,将结果带回 |
二、请求示例代码
Java
@Testpublic void FCWalletTakeOrder() throws Exception {
Map<String, String> data = new HashMap<String, String>(); data.put("appid", Config.AppId); Long timestamp = System.currentTimeMillis() / 1000; data.put("timestamp", timestamp.toString()); data.put("alipay_logon_id", "abcxxxxxxxx@gmail.com"); data.put("out_biz_no", "1686742412677"); data.put("order_title", "618达人招集大会"); data.put("amount", "5000"); data.put("notice_url", "http://yousite.com/fc/paynotice"); // 签名 data.put("sign", Utils.Sign(data,Config.AppSecret)); // 调用服务API String rsp =doHttpRequest(Config.FCWalletTakeOrderUrl ,data); System.out.println(rsp);}说明:
-
如果第一次付款方没有付款成功, 可以再次请求接口,传入相同的商家侧订单号out_biz_no进来,重新获取付款链接。 金额,标题 ,还是会使用之前的订单的金额和标题。
-
如果订单状态是待付款状态的,可传入老的商家侧订单号out_biz_no进行重新付款。如果付过款了,则会提示状态不对,不用重复提交。
三、接口返回付款链接
网站调用下单支付接口,会得到一个付款链接, 在电脑上点击此链接, 跳到支付宝收银台。
{ "code": 0, "message": "ok", "data": "https://kf.fw199.com/gateway/partner/pay/alipay/wallet/recharge?bizid=20230614193801715551", "trace_id": ""}
四、付款完成回调通知
付款方完成付款后,蜂巢将异步通知(POST)给开发者在创建担保订单时传入的网址notice_url。
{ "action": "guarantee_paid", "fc_biz_no": "20230614193332551094", "out_biz_no": "1686742412677", "trans_amount": 5000, "available_amount": 4985, "timestamp": 1686742720, "sign": "29d7aebed0d0717520a351a979ce5a219297721f666e4a45cf118b0dac691190"}返回参数说明
| 参数名 | 类型 | 说明 | 示例 |
|---|---|---|---|
| action | String | 通知类型,guarantee_paid表示担保交易支付 | |
| sign | String | 服务端返回的签名,为安全起见,开发者需要进行验签 | |
| fc_biz_no | String | 蜂巢侧订单号,后续给其他支付宝转账时,需要传入 | |
| out_biz_no | String | 开发者请求时传入的订单号 | |
| trans_amount | int | 付款方充值金额,单位是分,切记!与创建时担保订单金额一致。 | |
| available_amount | int | 可用金额,单位是分,切记! 可用金额=充值金额-手续费 | |
| timestamp | long | 时间戳,秒 |
接收的回调的代码
@RequestMapping("/recharge/notice")@ResponseBodypublic String rechargeNotice(@RequestBody String jsonData , HttpServletResponse response) {
Map<String, Object> map = new HashMap<String, Object>(); try { JSONObject jsonObject = JSON.parseObject(jsonData); String fcBizNo = jsonObject.getString("fc_biz_no"); String bizOutNo = jsonObject.getString("out_biz_no"); String transAmount = jsonObject.getString("trans_amount"); String availableAmount = jsonObject.getString("available_amount"); // 构建签名参数 Map<String, String> data = new HashMap<String, String>(); data.put("fc_biz_no", fcBizNo ); data.put("out_biz_no", bizOutNo ); data.put("trans_amount", transAmount ); data.put("available_amount", availableAmount); data.put("action", jsonObject.getString("action")); String fcSign = jsonObject.getString("sign"); String sign = Utils.Sign(data, Config.AppSecret);
//参数签名 if( sign.equals(fcSign) ){ return "ERROR,签名不相等"; }
// 根据收到的订单处理,处理逻辑 System.out.println("处理业务逻辑");
//处理成功后,一定返回 SUCCESS return "SUCCESS";
} catch (Exception ex) { ex.printStackTrace(); logger.error(ex.getMessage()); //日志处理 }
return "SUCCESS"; //处理成功后,一定返回 SUCCESS}