• 支付宝电脑网站支付,异步通知


    一:异步通知是支付宝回调商户的服务器,所以这个地址需要通过外网访问,在真实项目中都会有对应的服务器,但是在测试中只有使用内网穿透工具

    推荐使用NATAPP-内网穿透 基于ngrok的国内高速内网映射工具

    配置好内网穿透之后不要忘记在常量类中配置异步返回的地址

    二:异步通知

    1. @RequestMapping("/alpay")
    2. @ResponseBody
    3. public String alpay(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
    4. // 获取支付宝POST过来反馈信息
    5. Map params = new HashMap<>();
    6. Map requestParams = httpServletRequest.getParameterMap();
    7. for (String name : requestParams.keySet()) {
    8. String[] values = requestParams.get( name );
    9. StringBuilder valueStr = new StringBuilder();
    10. for (String value : values) {
    11. valueStr.append( value );
    12. }
    13. params.put( name, valueStr.toString() );
    14. }
    15. // 调用支付宝SDK进行验签
    16. boolean verifyResult = false;
    17. try {
    18. verifyResult = AlipaySignature.rsaCheckV1( params, constant.PublicKey, "UTF-8", "RSA2" );
    19. } catch (Exception e) {
    20. e.printStackTrace();
    21. }
    22. // 验签通过,则处理业务逻辑
    23. if (verifyResult) {
    24. System.out.println( "异步验证通过" );
    25. //支付
    26. String tradeStatus = params.get( "trade_status" );
    27. if (tradeStatus.equals( "TRADE_SUCCESS" )) {
    28. // 交易支付成功,处理支付成功的逻辑
    29. String orderId = params.get( "out_trade_no" );
    30. String tradeNo = params.get( "trade_no" );
    31. String total_amount = params.get( "total_amount" );
    32. System.out.println( "订单id:" + orderId );
    33. System.out.println( "流水号:" + tradeNo );
    34. System.out.println( "支付金额:" + total_amount );
    35. //根据订单号调用查询接口,查询支付信息
    36. AlipayTradeQueryResponse query = query( params.get( "out_trade_no" ) );
    37. //查询支付信息,获取支付金额和订单金额是否一致,一致就就修改订单状态
    38. String totalAmount = query.getTotalAmount();
    39. if (totalAmount.equals( total_amount )) {
    40. boolean b = sysOrdersService.updateState( orderId );
    41. System.out.println( "修改数据库订单状态是否成功:" + b );
    42. }
    43. }
    44. }
    45. return "success";
    46. } else {
    47. // 验签失败,记录日志或进行其他后续处理
    48. System.out.println( "异步验证失败" );
    49. return "failure";
    50. }
    51. }

    三:查询交易信息接口

    1. /**
    2. * 查询交易信息
    3. *
    4. * @param outTradeNo
    5. * @return
    6. */
    7. public static AlipayTradeQueryResponse query(String outTradeNo) {
    8. try {
    9. AlipayClient alipayClient = new DefaultAlipayClient(
    10. constant.serverUrl,
    11. constant.appId,
    12. constant.privateKey,
    13. constant.format,
    14. constant.charset,
    15. constant.PublicKey,
    16. constant.signType );
    17. AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
    18. JSONObject bizContent = new JSONObject();
    19. bizContent.put( "out_trade_no", outTradeNo );
    20. request.setBizContent( bizContent.toString() );
    21. AlipayTradeQueryResponse response = alipayClient.execute( request );
    22. if (response.isSuccess()) {
    23. System.out.println( "调用查询接口成功" );
    24. return response;
    25. } else {
    26. System.out.println( "调用查询接口失败" );
    27. }
    28. } catch (AlipayApiException e) {
    29. e.printStackTrace();
    30. }
    31. return null;
    32. }

    四:测试

    查看支付宝是否调用异步通知接口,数据库状态是否修改

    新建订单

    控制台输出

    数据库

    状态修改成功

  • 相关阅读:
    YUV转RGB888
    VideoMAE
    【中国知名企业高管团队】系列49:VIVO
    【华为OD机试真题 JAVA】热点网站统计
    K8S原理架构与实战教程
    zabbix学习2--zabbix6.x高可用
    Blazor和Vue对比学习(基础1.6):祖孙传值,联级和注入
    《前端》css总结(下)
    新型LINUX驱动开发 DTS设备树
    单链表的相关操作(初阶)
  • 原文地址:https://blog.csdn.net/weixin_58696998/article/details/133383041