Skip to content

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
  • 解码后提取出actionUrlactionToken等关键信息

准备调用商家接口:在 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 保存在数据库中,确保两种支付方式的后台处理逻辑相同。

最近更新