2 assasasasas assasasasas 于 2017.08.29 14:34 提问

支付宝接口调用报错,不知道是什么原因,各位大神帮忙看看呢

图片说明

// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
public static final String APP_ID = Const.APP_ID;

// 商户私钥,您的PKCS8格式RSA2私钥
public static final String PRIVATE_KEY = Const.PRIVATE_KEY;

// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
public static final String ALIPAY_PUBLIC_KEY = Const.ALIPAY_PUBLIC_KEY;

// 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static final String NOTIFY_URL = Const.ZHIAOADMINURL+"/alipayManager/notify.ajax";

// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static final String RETURN_URL = Const.ZHIAOADMINURL+"alipayManager/return_url.do";

// 签名方式
public static final String SIGN_TYPE = "RSA2";

// 字符编码格式
public static final String CHARSET = "UTF-8";

// 支付宝网关
public static final String GATEWAY_URL = "https://openapi.alipay.com/gateway.do";

//参数返回格式,只支持json
private static final String FORMAT = "json";

//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

public static void aliPay(String outTradeNo, double totalAmount, String subject, HttpServletResponse response) throws IOException {
    //获得初始化的AlipayClient
    AlipayClient alipayClient = new DefaultAlipayClient(GATEWAY_URL, APP_ID, PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);
    AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();//创建API对应的request
    alipayRequest.setReturnUrl(RETURN_URL);
    alipayRequest.setNotifyUrl(NOTIFY_URL);//在公共参数中设置回跳和通知地址
    StringBuilder bizContent = new StringBuilder("{\"out_trade_no\":\"").append(outTradeNo).append("\",\"total_amount\":").append(totalAmount).
            append(",\"subject\":\"").append(subject).append(",\"timeout_express\":\"10m\",\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
    alipayRequest.setBizContent(bizContent.toString());//填充业务参数
    System.out.println("请求报文为:----"+ JSON.toJSONString(alipayRequest));
    String form = "";
    try {
        form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单
    } catch (AlipayApiException e) {
        e.printStackTrace();
    }
    response.setContentType("text/html;charset=" + CHARSET);
    PrintWriter out = response.getWriter();
    out.write(form);//直接将完整的表单html输出到页面
    out.flush();
    out.close();
}










    调用:
            String orderids= UUID.randomUUID().toString().replace("-", "");
    double totalAmount = 0.01;

    //调用支付宝
    String outTradeNo =orderids, subject = "测试标题";
    AlipayConfig.aliPay(outTradeNo, totalAmount, subject, response);

5个回答

Amo_lt
Amo_lt   2017.08.29 16:25
已采纳

我大概找到你的问题了

  StringBuilder bizContent = new StringBuilder("{\"out_trade_no\":\"").append(outTradeNo).append("\",\"total_amount\":").append(totalAmount).append(",\"subject\":\"").append(subject).append(",\"timeout_express\":\"10m\",\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

你试试改成

 alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\"," 
                + "\"total_amount\":\""+ total_amount +"\"," 
                + "\"subject\":\""+ subject +"\"," 
                + "\"body\":\""+ body +"\"," 
                + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

我觉得是你append里面的格式有问题,

 System.out.println("请求报文为:----"+ JSON.toJSONString(alipayRequest));

这一行代码你能打印出来吗?能的话看看bizContent是什么格式。或者你在浏览器中调试一下,查看下接口传递的这个bizContent数据。

SeaTalks
SeaTalks   2017.08.29 14:52

上面写的是"非法的参数错误“
估计是你调用接口函数时传进去的参数不对,你仔细检查下

assasasasas
assasasasas 我检查过参数,是按照他的要求传的,参数应该是没问题的呀
3 个月之前 回复
Amo_lt
Amo_lt   2017.08.29 15:01

你这是电脑支付接口吧?这里需要的是应用私钥,支付宝公钥,以及APPID。还有如果你是沙箱环境的话,网关也需要修改,加上Dev。我的博客里有Java web接入支付宝接口的文章,不过没怎么说报错的。我也觉得是你的参数出错了。要不就是你的秘钥不是生成的2048而是1024的,或者你上传了应用公钥到支付宝吗?

assasasasas
assasasasas 你再看看呢?
3 个月之前 回复
Amo_lt
Amo_lt 回复ilikethatIdea: 楼主方便把你的配置文件发出来吗?隐私部分可打码。还有你调用支付接口的代码部分。这里说订单信息无法识别,你还可以检查setBizContent的方法里拼接字符串是否有问题,:\""这种东西很容易写错。
3 个月之前 回复
assasasasas
assasasasas 回复Amo_lt: 还是报同样的错,还有什么其他的可能吗?
3 个月之前 回复
Amo_lt
Amo_lt 回复ilikethatIdea: 在你的配置文件中需要加上支付宝正式环境网关,在支付宝官网中可以不用上传。
3 个月之前 回复
assasasasas
assasasasas 我是正式环境,公钥、私钥、appid都没问题,我想问一下应用网关我需要填吗?我不知道应用网关是干嘛的
3 个月之前 回复
assasasasas
assasasasas   2017.08.29 16:05
// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
public static final String APP_ID = Const.APP_ID;

// 商户私钥,您的PKCS8格式RSA2私钥
public static final String PRIVATE_KEY = Const.PRIVATE_KEY;

// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
public static final String ALIPAY_PUBLIC_KEY = Const.ALIPAY_PUBLIC_KEY;

// 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static final String NOTIFY_URL = Const.ZHIAOADMINURL+"/alipayManager/notify.ajax";

// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static final String RETURN_URL = Const.ZHIAOADMINURL+"alipayManager/return_url.do";

// 签名方式
public static final String SIGN_TYPE = "RSA2";

// 字符编码格式
public static final String CHARSET = "UTF-8";

// 支付宝网关
public static final String GATEWAY_URL = "https://openapi.alipay.com/gateway.do";

//参数返回格式,只支持json
private static final String FORMAT = "json";

//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

public static void aliPay(String outTradeNo, double totalAmount, String subject, HttpServletResponse response) throws IOException {
    //获得初始化的AlipayClient
    AlipayClient alipayClient = new DefaultAlipayClient(GATEWAY_URL, APP_ID, PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);
    AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();//创建API对应的request
    alipayRequest.setReturnUrl(RETURN_URL);
    alipayRequest.setNotifyUrl(NOTIFY_URL);//在公共参数中设置回跳和通知地址
    StringBuilder bizContent = new StringBuilder("{\"out_trade_no\":\"").append(outTradeNo).append("\",\"total_amount\":").append(totalAmount).
            append(",\"subject\":\"").append(subject).append(",\"timeout_express\":\"10m\",\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
    alipayRequest.setBizContent(bizContent.toString());//填充业务参数
    System.out.println("请求报文为:----"+ JSON.toJSONString(alipayRequest));
    String form = "";
    try {
        form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单
    } catch (AlipayApiException e) {
        e.printStackTrace();
    }
    response.setContentType("text/html;charset=" + CHARSET);
    PrintWriter out = response.getWriter();
    out.write(form);//直接将完整的表单html输出到页面
    out.flush();
    out.close();
}
Amo_lt
Amo_lt   2017.08.29 16:27

我本来想改成你的append格式在给你的,但是改了一个我就发现。。。好容易看错啊。。恕我无能。。。楼主你还是试试我这种写法吧,也是官网上的。

Amo_lt
Amo_lt 回复ilikethatIdea: 哇。。就知道是这个!当时我这里也写错过!不过是在订单查询的时候。如果可以了就采纳我的喔,谢谢!嘿嘿!
3 个月之前 回复
assasasasas
assasasasas 谢了,我找到了,就是那里面少了一个 "\" ,找了很久才看出来,
3 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片