支付宝当面付,报验签失败"code":"40002","msg":"Invalid Arguments"解决方案

这几天在调试支付宝相应的接口,支付宝的加密使用了证书,调用网站支付时可以正常跳转支付页面,调试当面付接口时发现报了

{“alipay_trade_precreate_response”:{“code”:“40002”,“msg”:“Invalid Arguments”,“sub_code”:“isv.invalid-signature”,“sub_msg”:“验签出错,建议检查签名字符串或签名私钥与应用公钥是否匹配,网关生成的验签字符串为:alipay_root_cert_sn=6bc29aa3b4d406c43483ffea81e08d22&alipay_sdk=alipay-sdk-java-4.8.10.ALL&app_id=2016101200665312&biz_content={“body”:“好的商品”,“out_trade_no”:“20191017105011111112011ddd”,“product_code”:“FACE_TO_FACE_PAYMENT”,“subject”:“2222”,“timeout_express”:“10m”,“total_amount”:“58888”}&charset=utf-8&format=json&method=alipay.trade.precreate&sign_type=RSA2×tamp=2019-10-18 17:49:24&version=1.0”},“sign”:“G+qYsFyUb4+n5e65lZjOFX7Bje6rXc7ykpsN3BK+bnoz/ATT1+7/aiBNznSo72zAmn+722uT9fZ8zjDxaBlgBfHD2rPpNtJVLq4sfUWgJt+Tsq328f7FsESVBEJMQ9MTkxbMpVndmZQDkL2yNH1Ke+4Lrpbv6oocMeWrnSiwaPMmhGZ1JOjFghVX9rNKZN1Qf1ZMGFlMu4wKzfRDqu1H8ipEW3IquJYNaiQuy6PNbsfplT84tsoOsfSF3xAsAlg853FPnig6aaYI35/hyYsm00GwPNdLraEwyMR+P5sbPGamyBIohJhTQFU2lGWTY8R9+SdWh2csvo6eXDohMS8pkg==”}

这个错误。

我们看看官方对这个错误的解释
支付宝当面付,报验签失败
然后看看我写的两个接口

/**
     * 通过跳转支付页面支付的方法
     * @param alipay
     * @return
     * @throws AlipayApiException
     */
    public static String aliPayBypage(Alipay alipay) throws AlipayApiException {
        Logger logger = LoggerFactory.getLogger(AlipayUtil.class);
        logger.info("开始请求支付页面");
        //构造client,设置公共请求参数
        DefaultAlipayClient alipayClient = new DefaultAlipayClient(AlipayUtil.setCertAlipayRequest());
        //发送API请求
        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
        //页面跳转同步通知页面路径
        request.setReturnUrl(StringUtils.trimToNull(Configure.getString("return_url")));
        // 服务器异步通知页面路径
        request.setNotifyUrl(StringUtils.trimToNull(Configure.getString("notify_url")));
        //封装参数
        request.setBizContent(JSON.toJSONString(alipay));
        //3、请求支付宝进行付款,并获取支付结果
        String form = "";
        try {
            form = alipayClient.pageExecute(request).getBody();
        }catch (AlipayApiException e){
                e.printStackTrace();
        }
        //返回付款信息
        logger.info(form);
        return form;
    }

    /**
     * 获取支付二维码
     * @param alipay
     * @return
     * @throws AlipayApiException
     */
    public static String aliPayByQrCode(Alipay alipay) throws AlipayApiException {
        Logger logger = LoggerFactory.getLogger(AlipayUtil.class);
        logger.info("开始请求支付二维码参数");
        //构造client,设置公共请求参数
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayUtil.setCertAlipayRequest());
        //发送API请求
        AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();//创建API对应的request类
        //封装参数
        alipay.setProduct_code("FACE_TO_FACE_PAYMENT");
        request.setBizContent(JSON.toJSONString(alipay));
        //3、请求支付宝进行付款,并获取支付结果
        String form = "";
        //certificateExecute
        try {
            form = alipayClient.execute(request).getBody();
        }catch (AlipayApiException e){
            e.printStackTrace();
        }
        //返回付款信息
        logger.info(form);
        return form;
    }

可以看到两个接口只有API请求的接口使用不同,其他的完全一样,所以上面的问题都可以排除,我也百度了这个问题发现没有跟我一样的情况,最后问了开放平台的技术支持
支付宝当面付,报验签失败
最后得知密钥的当面付接口调用 alipayClient.execute()
证书的当面付接口调用 alipayClient.certificateExecute()

而我的代码参考的官方文档写的,官方文档现在默认使用密钥方式下单,还未区分密钥和证书的方法
支付宝当面付,报验签失败所以把当面付接口换成alipayClient.certificateExecute() 可以正确拿到支付二维码。

你可能感兴趣的:(支付宝当面付,报验签失败"code":"40002","msg":"Invalid Arguments"解决方案)