支付宝电脑网站支付及回调

本文详细介绍了支付宝电脑网站支付接口`alipay.trade.page.pay`的调用顺序,包括用户确认支付后的同步返回和异步通知。强调支付结果必须依赖异步通知或查询接口,而非同步跳转,并提醒商户进行验签和一致性检查。同时,提供了JAVA SDK的使用示例,包括下单支付、查询交易状态和验签的代码片段。最后,指出了新版支付接口的特性及回调成功后的返回要求。

官方文档:https://docs.open.alipay.com/270

支付

电脑网站支付的支付接口 alipay.trade.page.pay 调用时序图如下:
电脑网站支付.png

调用顺序如下:

  1. 商户系统请求支付宝接口 alipay.trade.page.pay,支付宝对商户请求参数进行校验,而后重新定向至用户登录页面。
  2. 用户确认支付后,支付宝通过 get 请求 returnUrl(商户入参传入),返回同步返回参数。
  3. 交易成功后,支付宝通过 post 请求 notifyUrl(商户入参传入),返回异步通知参数。
  4. 若由于网络等问题异步通知没有到达,商户可自行调用交易查询接口 alipay.trade.query 进行查询,根据查询接口获取交易以及支付信息(商户也可以直接调用查询接口,不需要依赖异步通知)。

注意 

  • 由于同步返回的不可靠性,支付结果必须以异步通知或查询接口返回为准,不能依赖同步跳转。
  • 商户系统接收到异步通知以后,必须通过验签(验证通知中的 sign 参数)来确保支付通知是由支付宝发送的。详细验签规则参考异步通知验签
  • 接收到异步通知并验签通过后,一定要检查通知内容,包括通知中的 app_id、out_trade_no、total_amount 是否与请求中的一致,并根据 trade_status 进行后续业务处理。
  • 在支付宝端,partnerId 与 out_trade_no 唯一对应一笔单据,商户端保证不同次支付 out_trade_no 不可重复;若重复,支付宝会关联到原单据,基本信息一致的情况下会以原单据为准进行支付。

开放平台提供了支持主流开发语言的 SDK 接入的方式。对于页面跳转类 API,SDK 不会也无法像系统调用类 API 一样自动请求支付宝并获得结果,而是在接受 request 请求对象后,为开发者生成前台页面请求需要的完整 form 表单的 html(包含自动提交脚本),商户直接将这个表单的 String 输出到 http response 中即可。

以 JAVA 语言为例,调用统一收单下单并支付页面接口 alipay.trade.page.pay 的代码示例如下:

public void doPost(HttpServletRequest httpRequest,
                      HttpServletResponse httpResponse) throws ServletException, IOException {
    AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE); //获得初始化的AlipayClient
    AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();//创建API对应的request
    alipayRequest.setReturnUrl("http://domain.com/CallBack/return_url.jsp");
    alipayRequest.setNotifyUrl("http://domain.com/CallBack/notify_url.jsp");//在公共参数中设置回跳和通知地址
    alipayRequest.se
<think>我们正在处理支付宝支付回调的验签问题。根据引用[1]和引用[4]中的信息,验签是确保回调请求确实来自支付宝的重要步骤。以下是一个基本的步骤和示例代码:步骤:1.在回调接口中,接收支付宝传递过来的所有参数(通常是一个Map)。2.使用支付宝提供的公钥、字符集和签名类型,调用验签方法(如AlipaySignature.rsaCheckV1)验证签名。3.根据验签结果执行相应的业务逻辑:验签成功则处理业务(如更新订单状态)并返回"success";验签失败则记录日志并返回"failure"。示例代码(基于引用[1]和引用[4]):```javaimportcom.alipay.api.AlipayApiException;importcom.alipay.api.internal.util.AlipaySignature;importlombok.RequiredArgsConstructor;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.ResponseBody;importjava.util.Map;@RequiredArgsConstructor@ControllerpublicclassPayedListener{privatefinalAlipayTemplatealipayTemplate;//包含支付宝配置信息,如公钥、字符集、签名类型等@ResponseBody@PostMapping("/payed/notify")publicStringhandleAlipayed(@RequestParamMap<String,String>paramsMap)throwsAlipayApiException{try{//调用SDK验证签名booleansignVerified=AlipaySignature.rsaCheckV1(paramsMap,alipayTemplate.getAlipayPublicKey(),//支付宝公钥alipayTemplate.getCharset(),//字符编码,如UTF-8alipayTemplate.getSignType()//签名类型,如RSA2);if(signVerified){//验签成功,处理业务逻辑//例如:更新订单状态,注意需要检查订单金额等关键信息return"success";//返回success告知支付宝已处理}else{//验签失败,记录日志return"failure";}}catch(Exceptione){//异常处理,记录日志return"failure";}}}```注意:-`AlipayTemplate`是一个自定义的配置类,用于存储支付宝相关的配置(如应用ID、支付宝公钥、私钥、字符集、签名类型等)。这个类需要你自己定义,并通过构造器注入(使用`@RequiredArgsConstructor`由Lombok生成构造器)。-支付宝公钥(alipayPublicKey)需要从支付宝开放平台获取,注意不是应用公钥,而是支付宝公钥。-在业务逻辑处理中,除了验签,还应该检查订单金额、商户订单号等是否与系统一致,防止伪造通知。-必须返回字符串"success"(不含双引号),支付宝在收到success后就不会再重复发送通知。如果返回其他内容,支付宝会在一段时间内重发通知,最多8次。以上代码提供了一个基本的验签处理框架,你需要根据实际情况调整配置和业务逻辑部分。§§相关问题§§1.如何获取支付宝公钥?2.如何处理支付宝回调中的业务逻辑(如更新订单状态)?3.支付宝回调验签失败的可能原因有哪些?</think>### Spring Boot实现支付宝支付回调验签教程 在Spring Boot中处理支付宝支付回调的验签流程如下: #### 核心步骤 1. **接收回调参数**:支付宝以`POST`形式发送回调请求,参数格式为`application/x-www-form-urlencoded` 2. **验证签名**:使用支付宝公钥验证请求参数的签名合法性 3. **业务处理**:验签成功后执行业务逻辑(如更新订单状态) 4. **返回响应**:必须返回`success`或`failure`字符串 #### 示例代码 ```java import com.alipay.api.AlipayApiException; import com.alipay.api.internal.util.AlipaySignature; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import java.util.Map; @RequiredArgsConstructor @RestController @RequestMapping("/alipay") public class AlipayCallbackController { private final AlipayConfig alipayConfig; // 支付宝配置类 @PostMapping("/notify") public String handleCallback(@RequestParam Map<String, String> params) { try { // 1. 验证签名 boolean signVerified = AlipaySignature.rsaCheckV1( params, alipayConfig.getAlipayPublicKey(), // 支付宝公钥 alipayConfig.getCharset(), // 字符集(UTF-8) alipayConfig.getSignType() // 签名类型(RSA2) ); if (!signVerified) { return "failure"; // 签名验证失败 } // 2. 验证业务参数 String tradeStatus = params.get("trade_status"); if (!"TRADE_SUCCESS".equals(tradeStatus)) { return "failure"; // 交易状态异常 } // 3. 处理业务逻辑 processBusiness(params); // 更新订单状态等操作 return "success"; // 必须返回success } catch (AlipayApiException e) { return "failure"; // 处理异常 } } private void processBusiness(Map<String, String> params) { // 示例业务逻辑 String outTradeNo = params.get("out_trade_no"); // 商户订单号 String tradeNo = params.get("trade_no"); // 支付宝交易号 BigDecimal amount = new BigDecimal(params.get("total_amount")); // TODO: 更新订单状态、记录支付日志等 } } ``` #### 支付宝配置类示例 ```java @Component @Data public class AlipayConfig { private String appId = "2021000122****"; // 应用ID private String alipayPublicKey = "MIIBIjANBg..."; // 支付宝公钥 private String charset = "UTF-8"; private String signType = "RSA2"; } ``` #### 注意事项 1. **签名验证关键点**: - 必须使用支付宝公钥(非应用公钥) - 参数`sign_type`需与实际签名类型一致(通常为RSA2) - 回调URL需在支付宝商户平台配置白名单 2. **安全建议**: ```java // 额外验证重要参数 if (!alipayConfig.getAppId().equals(params.get("app_id"))) { return "failure"; // 应用ID不匹配 } ``` 3. **幂等性处理**:支付宝可能重复发送回调,需通过`out_trade_no`+`trade_no`做幂等控制[^1][^4] #### 常见问题解决 - **验签失败可能原因**: 1. 公钥配置错误(混淆了应用公钥和支付宝公钥) 2. 参数编码不一致(必须使用UTF-8) 3. 签名类型不匹配(新接入必须使用RSA2) 4. 未排除`sign`和`sign_type`参数外的空值参数 - **调试建议**: 1. 使用支付宝提供的[验签工具](https://opendocs.alipay.com/open/291/106118) 2. 记录原始回调参数到日志文件 3. 沙箱环境测试通过后再上线[^2] > 提示:完整集成示例可参考支付宝官方[电脑网站支付文档](https://opendocs.alipay.com/open/270/105899)和Spring Boot集成案例[^3][^4]
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值