80fafa的聚合支付API调用方法
80fafa 聚合支付 API 调用方法概述

具体说明
1.商家发起支付(跳转到 80fafa)
(1)商家网站需要跳转到 80fafa 平台完成支付时,会生成一个包含多个信息的链接,格式如下:
const paymentUrl = ${response.data.data.paymentUrl}?passbackParams=${passbackParams}&nav=no; window.location.href = paymentUrl;
(2)passbackParams 包含哪些信息?
| 参数 | 名称 | 作用 |
|---|---|---|
| ProductID | 商品 ID | 格式:http://www.80fafa.com/aabbccdd/ 商家在 80fafa 平台创建商品,商品 ID 用于:关联后续订单、结算提成等, 生成支付跳转链接,实际金额以 finalPrice 为准,商品价仅供参考。 |
| returnUrl | 返回地址 | 在支付成功后的跳转 urL, 通常为当前网站的支付结果展示页面 |
| actionUrl | 操作 API 地址 | 格式:http: //api.v2plus.xyz/api/Demo_GroupBuy/Create? productId=9F3DC52954DA8B9A& OutTradeNo=904bf5e521e64dbd9473532a1df15f2e& TotalAmount=0.20&PayPlatform=支付宝& TradeNo=2025120722001424791440530661 支付成功后,80fafa 对这个地址添加参数并调用此地址来通知商家。 |
| actionToken | 操作令牌 | 示例:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... 当前网站的 token(通常为 JWT),配合 actionUrl 使用。 对于需要登录的网站,此 token 会作为 actionUrl 请求的 header 参数, 确保动作能顺利执行。 |
| finalPrice | 最终价格 | 当前商品的实际价格,如果没有这个参数,80fafa 会使用商品的标准价格 |
(3)安全验证流程
商家后端准备:使用 secret-key 和 SDK 函数对 passbackParams 参数进行计算,生成一个 sha1 值,实际上已经把参数传递给了 80fafa 服务器(设置 2 分钟超时)。
返回给前端:返回一个 80fafa 的重定向付款页面,并携带 sha1 参数。
80fafa 验证:收到支付请求后,先验证 sha1 码。如果验证通过,将 passbackParams 传递给第三方支付平台;如果验证失败,就拒绝请求。
支付处理流程

(1) 跳转到 80fafa
- 访问路由:
Controller Alipay/Alipay - 关键操作:将
passbackParams通过public async Task Alipay(string Id, string passbackParams)原封不动地传递给支付宝平台。 - 支付宝支付完成后,会通过通知(Notify)把这个参数再传回来。 传入(请求支付时):
var model = new AlipayTradeWapPayModel { Body = passbackParams, ....... }接收通知:[Route("AlipayNotify/PagePay/{Id}/")] [AllowAnonymous] [HttpPost] public async Task PagePay(string Id) { try { var notify = await _notifyClient.CertificateExecuteAsync(Request, _optionsAccessor.Value)
(2)支付成功后的处理
当支付宝通知 80fafa 支付成功时:
解析参数 :
- 从通知中获取
passbackParams - 解码后提取出
actionUrl、actionToken等关键信息
准备调用商家接口:在 actionUrl 后面添加额外参数:
&OutTradeNo=订单号&TotalAmount=支付金额&PayPlatform=支付宝执行操作 :
- 使用 actionToken 作为认证,调用商家的 actionUrl 接口
- 如果调用成功:先在商家平台创建订单,再在 80fafa 平台创建订单
- 如果调用失败:记录失败信息
var response = await httpClient.GetAsync(actionUrl);
if (!response.IsSuccessStatusCode)
{//向商家的平台中写入失败
}
else
{//先向商家的数据库中插入数据, 如果成功了, 再向自己的数据库中插入数据
await _orderRepository.InsertAsync(order);
}注意:
如果 URL 含有“&”,则认为不是 BASE64 编码;
if (passbackParams.isBase64())
{
passbackParams = Encoding.UTF8.GetString(Convert.FromBase64String(passbackParams));
}有些商家给的密码前面加了“Bearer ”字样,这里把“Bearer ”去掉,只留真正的密码。
if (!string.IsNullOrEmpty(actionToken) && actionToken.StartsWith("Bearer ", StringComparison.OrdinalIgnoreCase))
{
actionToken = actionToken.Substring("Bearer ".Length).Trim();
}(3)结果确认与跳转
异步通知(后台处理):支付成功后立即执行,完成商家订单状态更新等操作; 同步通知(用户可见):用户支付完成后看到的页面,显示支付结果,并准备跳转商品页面;
AlipayTradePagePayReturn notify = await _client.CertificateExecuteAsync<AlipayTradePagePayReturn>(Request, _optionsAccessor.Value);
Order order = null;
//设置一个异步Task
Task task = Task.Run(() =>
{
order = _orderRepository.FirstOrDefault(out_trade_no => out_trade_no.OrdersNum.Equals(notify.OutTradeNo.ToString()));
});
ViewData["returnUrl"] = returnUrl;
ViewBag.HideNav = true;
return View();
}跳转在 80fafa 页面中将收到 retrunUrl 参数,最终会再次跳转回商家网站;
let returnUrl = '@ViewData["returnUrl"]';
if (returnUrl && returnUrl.trim() !== "") {
//returnUrl解码
window.location.href = decodedUrl;
}
}, 1000);
}(4)微信支付的特别说明
由于微信支付的 attach 参数最多只能 127 个字符,无法像支付宝那样直接传递完整的 passbackParams,所 以处理方式不同:
跳转到微信时,将 passbackParams 保存在 MySQL 数据库中,只传递一个简化的标识给微信;支付成功后,从数据库中取出之前保存的 passbackParams,按照同样的流程处理 actionUr1 和 actionToken;为了保持数据库处理的一致性,支付宝支付时也会将 passbackParams 保存在数据库中,确保两种支付方式的后台处理逻辑相同。