潜水阿宝 2023-06-06 11:09 采纳率: 57.1%
浏览 21
已结题

PC端支付宝沙箱无法支付

在做学校实训任务的时候,我们项目有支付模块,于是我采用的是支付宝沙箱来做,但是遇到这种问题,我并不知道问题是出在哪
报错信息:

img

但是控制台上也没有什么错误
代码

 @GetMapping("/pay/{payNo}") // &subject=xxx&traceNo=xxx&totalAmount=xxx
    public void pay(@PathVariable String payNo, HttpServletResponse httpResponse) throws Exception {
        OutPay outPay = outPayService.queryOutPayByPayNo(payNo);
        if (outPay == null) {
            System.out.println("支付记录不存在");
            throw new RuntimeException("支付记录不存在");
        }
        //支付结果
        String status = outPay.getStatus();
        if ("0".equals(status)) {
            throw new RuntimeException("已支付,请不要重复支付");
        }
        System.out.println("outpay" + outPay);
        // 1. 创建Client,通用SDK提供的Client,负责调用支付宝的API
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.URL, APP_ID,
                APP_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, ALIPAY_PUBLIC_KEY, AlipayConfig.SIGNTYPE);
        // 2. 创建 Request并设置Request参数
        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();  // 发送请求的 Request类
//        AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();  // 发送请求的 Request类
        request.setNotifyUrl(notifyUrl);//异步通知的地址
//        request.setReturnUrl(aliPayConfig.getReturnUrl());//同步通知的地址
        JSONObject bizContent = new JSONObject();
        bizContent.set("out_trade_no", outPay.getPayNo());  // 我们自己生成的订单编号
        bizContent.set("total_amount", outPay.getTotalPrice()); // 订单的总金额
        bizContent.set("subject", outPay.getOrderName());   // 支付的名称
        bizContent.set("product_code", "FAST_INSTANT_TRADE_PAY");  // 固定配置
        request.setBizContent(bizContent.toString());
        
        // 执行请求,拿到响应的结果,返回给浏览器
        String form = "";
        try {
            form = alipayClient.pageExecute(request).getBody(); // 调用SDK生成表单

        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        httpResponse.setContentType("text/html;charset=" + AlipayConfig.CHARSET);
        httpResponse.getWriter().write(form);// 直接将完整的表单html输出到页面
        httpResponse.getWriter().flush();
        httpResponse.getWriter().close();
    }

导入的依赖

  <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>4.22.110.ALL</version>
        </dependency>
    <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.15</version>
        </dependency>

现在的情况是:访问到这个接口就出现上面的错误,网上搜索出来的是支付成功之后出现这种情况,但是我现在是还没有支付就出现在这个问题
我现在也无法定位到是哪个地方出现的问题,都说是参数的问题,但是参数就两个地方,一个是调用支付宝的参数比如APPID之类的,还有一个地方就是订单参数,但是这里两个地方我都来回的检查了一遍,应该是没有问题的,希望有人能够指出问题的地方

  • 写回答

1条回答 默认 最新

  • IT论之程序员 2023-06-06 20:34
    关注

    从你描述的情况来看,很可能是支付宝沙箱环境的问题。有几点建议:

    1. 检查APPID和APP_PRIVATE_KEY是否正确。这两个参数直接决定是否可以访问支付宝沙箱环境,如果有错误会直接导致你描述的情况。
    2. 检查支付宝公钥ALIPAY_PUBLIC_KEY是否正确。这个参数用于验签,如果错误也会导致访问失败。
    3. 检查NotifyUrl和ReturnUrl是否配置正确。这两个参数需要配置为外网可以访问的地址,如果配置为localhost等内网地址会导致访问失败。
    4. 在支付宝开放平台检查该应用的沙箱环境是否开启。如果沙箱环境没有开启,订单也无法在沙箱环境下正常工作。
    5. 检查项目中的支付宝jar包版本是否太旧。支付宝不定期会更新接口,如果使用太旧的版本也可能会导致兼容性问题。
    6. 在支付宝开放平台的日志中心检查是否有错误日志。这个可以直接定位到访问失败的具体原因。
    7. 如果以上方法都无法解决,可以联系支付宝技术支持,他们可以进一步查找导致失败的原因。
      总之,访问支付宝沙箱环境失败的原因通常与参数配置、环境问题等相关。我的建议是从这两个方向入手检查,看是否能够定位到具体的问题所在。如果仍无法解决,支付宝技术支持团队会更加专业和准确的帮助你解决这个问题。
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月7日
  • 创建了问题 6月6日

悬赏问题

  • ¥15 Xsheii7我安装这个文件的时候跳出来另一个文件已锁定文件的无一部分进程无法访问。这个该怎么解决
  • ¥15 unity terrain打包后地形错位,跟建筑不在同一个位置,怎么办
  • ¥15 FileNotFoundError 解决方案
  • ¥15 uniapp实现如下图的图表功能
  • ¥15 u-subsection如何修改相邻两个节点样式
  • ¥30 vs2010开发 WFP(windows filtering platform)
  • ¥15 服务端控制goose报文控制块的发布问题
  • ¥15 学习指导与未来导向啊
  • ¥15 求多普勒频移瞬时表达式
  • ¥15 如果要做一个老年人平板有哪些需求