支付宝的支付通知:ReturnUrl和NotifyUrl

支付宝的支付通知:ReturnUrl和NotifyUrl

相似点:都需要在设置AlipayTradeWapPayRequest时设置为通知接口,然后作为参数传递给支付宝。交易完成后,支付宝会按照设置的通知url请求验证,然后根据结果进行处理。

ReturnUrl
  1. 简介
    1. 同步返回URL,对应同步返回接口,是一个页面跳转通知(支付成功后,从支付宝跳转到指定的地址,该地址请求对应接口)。
  2. 获取参数方式:同步的get请求
  3. 通知到达率:由于为网页重定向通知,是由客户的浏览器触发的一个通知,由于各种影响因素特别多,如用户关闭页面等操作时,所以该种类型的通知支付宝不保证其到达率。
  4. 是否需要对支付宝传递过来的签名进行认证:需要验签(通常验签时如果NotifyUrl的接口已经验证过,则直接返回验签结果,否则为第一次验证)
  5. 除验签返回结果外接口中是否可包含相关业务处理:可,比如更新记录,标记付款成功信息等。但不建议
    1. (h5game中无其他业务处理)
  6. 调用顺序:无确定顺序,但ReturnUrl不如NotifyUrl稳定
  7. 接口返回结果:跳转至指定的通知页面
    1. 注:该页面可以包含相关业务处理,如:游戏物品发货等(h5game中仅做了本身功能:获取NotifyUrl的结果进行展示)
  8. 通知次数:只进行一次通知跳转
  9. 作用总结:验签,展示支付结果,可包含后续业务处理(不建议,因为经过了客户端调用不太安全)
NotifyUrl
  1. 简介:
    1. 异步通知的URL,对应异步通知接口,为一个服务器后台通知,该URL是支付宝服务器端自动调用商户服务端接口的地址,支付成功后调用,再根据支付宝转发的参数进行订单状态处理
  2. 获取参数方式:异步的post请求
  3. 通知到达率:支付宝可以保证99.9999%的通知到达率,前提是您的网络通畅。 支付结果通知以该结果为准
  4. 是否需要对支付宝传递过来的签名进行认证:需要验签(通过该接口会首先验证)
  5. 除验签返回结果外接口中是否可包含相关业务处理:可,比如更新记录,标记付款成功信息等。推荐在此处进行相关业务处理
    1. (h5game中验签成功后首先设置订单状态为支付成功状态并修改数据库中数据,设置成功后进行订单发货,并设置订单状态为已发货且修改数据库中数据)
  6. 调用顺序:无确定顺序,但由于本调用为服务端调用服务端,稳定性很高
  7. 接口返回结果:返回字符串"success"或者"fail",不能带有任何HTML信息。
  8. 通知次数:至少一次
    1. 如果不成功,支付宝服务器会不断重发通知,直到返回success(即使你返回了"success",也不能认为支付宝肯定不再回调了,所以业务代码要做幂等处理,h5game中进行了该处理)
  9. 作用总结:验签,防止订单丢失,下单成功后,支付宝服务器通知商户服务,并把这笔订单的状态通知给商户,商户根据返回的这笔订单的状态,修改网站订单的状态,比如等待买家付款状态,买家已经付款等待卖家发货
  10. 官方文档:https://opendocs.alipay.com/open/203/105286/
  11. 注意:NotifyUrl必须是一个外网可以访问的网址,因为它是由支付宝服务器发起的,只能是线上访问,而ReturnUrl可以是因为它是本地客户端请求URL,会被本地host拦截至本地服务器中。
以下是一个简单的Spring Boot和Vue.js应用程序中的支付宝沙箱支付代码示例: 在Spring Boot项目中: 1. 添加以下依赖: ``` <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>4.3.0.ALL</version> </dependency> ``` 2. 创建一个包含支付宝配置信息的类,例如: ``` @Configuration public class AlipayConfig { private String appId; private String privateKey; private String publicKey; private String notifyUrl; private String returnUrl; private String gatewayUrl; // getters and setters } ``` 3. 创建一个返回AlipayClient的方法: ``` @Bean public AlipayClient getAlipayClient() { return new DefaultAlipayClient( alipayConfig.getGatewayUrl(), alipayConfig.getAppId(), alipayConfig.getPrivateKey(), "json", "UTF-8", alipayConfig.getPublicKey(), "RSA2" ); } ``` 4. 在控制器中创建支付接口,例如: ``` @Autowired private AlipayClient alipayClient; @Autowired private AlipayConfig alipayConfig; @PostMapping("/pay") public String pay(@RequestParam String orderNo, @RequestParam String amount) throws AlipayApiException { AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest(); alipayRequest.setReturnUrl(alipayConfig.getReturnUrl()); alipayRequest.setNotifyUrl(alipayConfig.getNotifyUrl()); alipayRequest.setBizContent("{\"out_trade_no\":\"" + orderNo + "\"," + "\"total_amount\":\"" + amount + "\"," + "\"subject\":\"" + "测试订单" + "\"," + "\"body\":\"" + "测试订单" + "\"," + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}"); String form = alipayClient.pageExecute(alipayRequest).getBody(); return form; } ``` 在Vue.js中: 1. 创建一个按钮来启动支付流程: ``` <template> <div> <button @click="pay">Pay Now</button> </div> </template> ``` 2. 在脚本部分中创建一个调用支付接口的方法: ``` <script> export default { methods: { pay() { axios.post('/api/pay', { orderNo: '123456', amount: '0.01' }) .then(response => { let form = response.data; document.write(form); // 打开支付页面 }) .catch(error => { console.log(error); }); } } } </script> ``` 请注意,以上示例只适用于测试环境,如果您想在生产环境中使用支付宝支付,您需要进行更多的测试和配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值