先上代码
package cn.com.kj.ApiRunDemo.zrk.config;
import java.io.FileWriter;
import java.io.IOException;
/
*类名:AlipayConfig
*功能:基础配置类
*详细:设置帐户有关信息及返回路径
*修改日期:2017-04-05
*说明:
*以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
*该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
*/
public class AlipayConfig {
//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
public static String app_id = "2016101800713382";
// 商户私钥,您的PKCS8格式RSA2私钥
public static String merchant_private_key = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDRmpqXfakoM1F+pDkwurgUXMHuXA/zsfLcnTMBg5exjtpCRXRcxLrhtlNESRvv6/oDiz4vKdjiFi2s5uqVUSJnfBXYK28hLVqo0Hg7Cby8uIqUZAiyD1XQUgC14t2gx+R63eoY0afSKbIP9Gg0RhLCH/Xv0dGu/0VmP1aR5YBqVZ3bi2yQjR6BY7kVZWTfW1Lf6mpHdi4hRC3myEbu8w01kdI15EgaIoYeNKD94BoxNCQqtCXKyE5jyMaK16RP9tOjtpRl+E7EzQhBtWHoReMv2fTOInXScqKALdheX5KKfMTJSZ34wkV3T7vzIpV1zO7fa6BtRzN37P8Fi4H62sXjAgMBAAECggEAFKNpd2MrJccvzg1ziCXKfE7J1aOA+pjZ9fkQjaScaiJLwVy/YWcJk7H1LvMX6h7NJk4umExBi7ltU+oEzSEJBzGDoR5dueGSXK7yN7X0vIxbMNNMu+Ogqnt4kHA/LFaiW6rAIyN5p8rtOn7xR7ximnS1LaD2SYnfFntEFeeIJnAMEtR5FIstdgNC3GXs+cGNTwrcM1Qi3OKM8500ajK4LGVvb5bxYalqzOF61pZ9TvtejF4MlKwkxoraf9VsK9fZs9sRdJvFpsLke89ywuL+mvi+ukPfMlV6Peno35wX+edb4eXgZ59kRrjJmr1cN18L5IBKGpnJ91SQn77HjUEjsQKBgQDtGbEamucVP6Q7cnSMEMcN+XWTHFNIjCVaEDpy8r1pJAVKTmgCGXyMKlk1q6a7FsmJPZOsNhejKIQgZOGBuR7rYe08BvpZ+FCAlhO8ryy+D5GKdu7QImzVgyJYEhijjzj0t/sm+nSzBlTs2P1BSWLdZlOd/6SPQeU7TC7h/ThfmwKBgQDiT9C5JPdm9ArpR1kMjRmuhZJtAAosg6YIywDfypNANfueHojPjygAScY+7Rapvwaw/nqwnb8DHcRt3evSAYTklEXIQedfdEZysi4PSpA4IUzpAuBHda3JXOKbuuHoHlI41GucgLYSGYBo2QvciPUbNeISa5OfhmxfipK5nf+rWQKBgQDQDnx38TgYUElolQ4qnspdu+rtlayLe9eHCbiQh+uoKKCvzM++D+lYAg1YaHEduWhOkwdT1f+1/+a5mmy8bdrxCHSp+SGU866It6lIKJvliDnZvHXhlGPWlIT9rZuLYzHCpPOyB5OCSWsaj2rk8GXeDF4RxnP79gIWn8qAKrleQwKBgG9h9wlYb0dFbyVXDzXFMFGbvfBVp6w28v264+hA7G4a44bz4kO9YmOZ669GwvOyZ9mutbW9PaiL+wRTx9+pDb3uV9Xy0axCLvX+SfsOqKJniVHZL4ccHPdQ9trMhKjYW4FK0tfI5VNNJ8zyngrhgTjuMSD9vz8xSp9PNV2TrKSpAoGBAOQ/z3tEj7ZdAcn8MK5zKelNcnHrh5+0ZIBBCV83gbjA+DRggokJQsIpuOg8BOYr3b9PpjyZCK4ZUTBczBZxwA9MoUT49IEIc8pl6FN62nJpmy/bfc98ttKtMr0osn3KhJ4+hxptCgP9YK4CnphR8oJBjj1nYUuvZkF3WfDYAnev";
// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
public static String alipay_public_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtd35uIqT+5JNqNo97gAYo1T9tWOnlr9Md9mQFiI2QeJohYWMu988kxao9j9vHNR3SuGnkd7Iv6Frr8KVJqyTtWBWhzDjc8F79Lg/aRcHg6xx2lUxMQyN9zQcDCJqYDLXtOdmVxzr6aH9OOdEPPrEMBfH8fuYQGL+DQMqClyclnzoxQ6LkDFQCwFscZmCblnsnuaC7+vE6NEAdhrwmURT1vjtQJA98AQOjwuGiSkbMDnFk+H5t7PaAZ0rX5tQZthqltq5iG1Yn3IDoMAB6+lRnW93+tWaLdRJcUvGC+GZIitgXI/7vm8myWF084YjWh0sKbQPQtIyEh9sS4QTYqu3uQIDAQAB";
// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String notify_url = "http://工程公网访问地址/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp";
// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String return_url = "http://工程公网访问地址/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp";
// 签名方式
public static String sign_type = "RSA2";
// 字符编码格式
public static String charset = "utf-8";
// 支付宝网关
public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";
// 支付宝网关
public static String log_path = "C:\\";
//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
/**
* 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
* @param sWord 要写入日志里的文本内容
*/
public static void logResult(String sWord) {
FileWriter writer = null;
try {
writer = new FileWriter(log_path + "alipay_log_" + System.currentTimeMillis()+".txt");
writer.write(sWord);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
报错
com.alipay.api.AlipayApiException: RSAcontent = alipay_sdk=alipay-sdk-java-dynamicVersionNo&app_id=2016101800713382&biz_content={"out_trade_no":"123456","total_amount":"500","subject":"测试","body":"","product_code":"FAST_INSTANT_TRADE_PAY"}&charset=utf-8&format=json&method=alipay.trade.page.pay¬ify_url=http://工程公网访问地址/alipa...://工程公网访问地址/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp&sign_type=RSA2×tamp=2020-02-15 17:23:07&version=1.0; charset = utf-8
at com.alipay.api.internal.util.AlipaySignature.rsa256Sign(AlipaySignature.java:141)
at com.alipay.api.internal.util.AlipaySignature.rsaSign(AlipaySignature.java:102)
at com.alipay.api.DefaultAlipayClient.getRequestHolderWithSign(DefaultAlipayClient.java:323)
at com.alipay.api.DefaultAlipayClient.pageExecute(DefaultAlipayClient.java:139)
at com.alipay.api.DefaultAlipayClient.pageExecute(DefaultAlipayClient.java:134)
at cn.com.kj.ApiRunDemo.zrk.controller.PayController.payController(PayController.java:70)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:888)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1598)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
Caused by: java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : DER input, Integer tag error
at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(Unknown Source)
at java.security.KeyFactory.generatePrivate(Unknown Source)
at com.alipay.api.internal.util.AlipaySignature.getPrivateKeyFromPKCS8(AlipaySignature.java:202)
at com.alipay.api.internal.util.AlipaySignature.rsa256Sign(AlipaySignature.java:123)
... 55 more
Caused by: java.security.InvalidKeyException: IOException : DER input, Integer tag error
at sun.security.pkcs.PKCS8Key.decode(Unknown Source)
at sun.security.pkcs.PKCS8Key.decode(Unknown Source)
at sun.security.rsa.RSAPrivateCrtKeyImpl.<init>(Unknown Source)
at sun.security.rsa.RSAPrivateCrtKeyImpl.newKey(Unknown Source)
at sun.security.rsa.RSAKeyFactory.generatePrivate(Unknown Source)
... 59 more
看了很多网站说是PKCS8Key解密格式的问题,但是调整了没用
我也遇到了同样的报错信息,我的配置信息都是放在数据库的,检查发现是存入数据库的私钥和公钥长度被截断了,导致私钥和公钥长度完整。
建议检查一下
1:支付宝配置的应用是否已上线,已上线的才可以正确拉起收银台支付。
2:项目正式上线后,支付宝网关必须修改成正式环境而非沙箱环境.
3:读取时的“私钥和公钥”是否完整。