相关场景
一、获取授权令牌
1、错误描述:“sub_msg”:“授权码code无效”
原因:每个authorization_code 只能查询一次令牌,不管查询接口正确与否,下一次查询都需要更换新的授权码
解决:更换新的授权码
2、错误描述:{“code”:“40004”,“msg”:“Business Failed”,“sub_code”:“AUTH_CODE_NOT_EXIST”,“sub_msg”:“auth_code不存在”}
原因:接口调用错误
解决:参照后面的【获取授权令牌】,使用正确方式请求
3、错误描述:“sub_msg”:"验签出错,建议检查签名字符串或私钥与应用公钥是否匹配
原因:很大原因是公钥用错,ALIPAY_PUBLIC_KEY 是 支付宝公钥!!不是 应用公钥!!应用公钥是自己用 支付宝开放平台开发助手生成的 支付宝公钥是上传后自己生成的
解决:程序中要用支付宝公钥!!
二、版本发布
原因:发布版本不对,正式版,体验版 版本有误
解决:先预览,再上传版本,不然上传的都是旧的版本
下面对比获取授权令牌(用授权码换取授权令牌 access_token)公钥方式和证书方式
1、公钥方式(ALIPAY_PUBLIC_KEY 是 支付宝公钥!!不是 应用公钥!!应用公钥是自己用 支付宝开放平台开发助手生成的 支付宝公钥是上传后自己生成的)
public static void main(String[] args) throws AlipayApiException {
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",APP_ID,APP_PRIVATE_KEY,"json","GBK",ALIPAY_PUBLIC_KEY,"RSA2");
AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
request.setGrantType("authorization_code");//固定
request.setCode("授权码");//授权码
AlipaySystemOauthTokenResponse response = alipayClient.execute(request);
if(response.isSuccess()){
System.out.println("调用成功");
} else {
System.out.println("调用失败");
}
}
2、证书方式
public static void main(String[] args) throws AlipayApiException {
CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");
certAlipayRequest.setAppId(APP_ID);
certAlipayRequest.setPrivateKey(APP_PRIVATE_KEY);
certAlipayRequest.setFormat("json");
certAlipayRequest.setCharset("utf-8");
certAlipayRequest.setSignType("RSA2");
certAlipayRequest.setCertPath("F://appCertPublicKey.crt");
certAlipayRequest.setAlipayPublicCertPath("F://alipayCertPublicKey_RSA2.crt");
certAlipayRequest.setRootCertPath("F://alipayRootCert.crt");
AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);
AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
request.setGrantType("authorization_code");
request.setCode("授权码");
AlipaySystemOauthTokenResponse response = alipayClient.certificateExecute(request);
if(response.isSuccess()){
System.out.println("调用成功");
} else {
System.out.println("调用失败");
}
}