支付宝支付成功,但异步回调验签失败,求大神们助攻!

小熊猫丶 2017-12-22 06:32:49
我是做APP的支付,蚂蚁金服开放平台有现成的demo和SDK ,我直接引用就可以支付了,但是支付成功之后,接收异步回调一直验签失败,不知道什么原因,我怀疑是支付宝公钥生成错误了,麻烦大神们帮忙看下是否正确。
==============================================================================

这是获取支付宝公钥的地方:



==============================================================================

这是请求生成APP支付订单信息的代码

public static String getAppPrepay(Map<String, String> maps) {
String form="";
// 实例化客户端
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.alipay_url,
AlipayConfig.APP_ID, AlipayConfig.APP_PRIVATE_KEY, AlipayConfig.FORMAT,AlipayConfig.CHARSET,
AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.SIGNTYPE);
// 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
// SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
//订单描述(可不填)
model.setBody(maps.get("payDesc"));
//订单标题
model.setSubject(maps.get("payDesc"));
//商户订单号,64个字符以内、可包含字母、数字、下划线;需保证在商户端不重复
model.setOutTradeNo(maps.get("orderId"));
/*该笔订单允许的最晚付款时间,逾期将关闭交易。
* 取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。
* 该参数数值不接受小数点, 如 1.5h,可转换为 90m*/
model.setTimeoutExpress("3000m");
//订单总金额,单位为元,精确到小数点后两位
model.setTotalAmount(maps.get("amount"));
//销售产品码 (可不填)
model.setProductCode("QUICK_MSECURITY_PAY");
request.setBizModel(model);
//支付宝服务器主动通知商户服务器里指定的页面http/https路径。
request.setNotifyUrl(AlipayConfig.notify_url);
try {
// 这里和普通的接口调用不同,使用的是sdkExecute
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
System.out.println(response.getBody());// 就是orderString 可以直接给客户端请求,无需再做处理。
form=response.getBody();
} catch (AlipayApiException e) {
e.printStackTrace();
}
return form;
}


==============================================================================

这是接收异步回调的代码

public String execute() throws Exception{
//支付宝支付结束回调接口
String result="failure";
try {
//获取支付宝POST过来反馈信息
Map<String, String> maps = new HashMap<String, String>();
Map requestParams = request.getParameterMap();
for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
}
// 乱码解决,这段代码在出现乱码时使用。
// valueStr = new String(valueStr.getBytes("ISO-8859-1"),"utf-8");
maps.put(name, valueStr);
}
//调用SDK验证签名
boolean signVerified = AlipaySignature.rsaCheckV1(maps, AlipayConfig.ALIPAY_PUBLIC_KEY, "UTF-8", "RSA2");
if (signVerified) {
// TODO 验签成功后
System.out.println("=============================验签成功==============================");
orderService.alipayNotify(maps);
//处理结束之后,返回success,支付宝系统将不再发送异步回调请求
result="success";
} else {
// TODO 验签失败则记录异常日志,并在response中返回failure.
System.out.println("=============================验证失败,不去更新状态==============================");
}


} catch (Exception e1) {
e1.printStackTrace();
System.out.println("=============================回调异常==============================");
} finally {
logger.info("=============================回调结束==============================");
}
return result;
}


==============================================================================

参考的是蚂蚁金服开发文档的DEMO:https://docs.open.alipay.com/54/106370/

使用了RSA签名验签工具,确实也是签名失败,麻烦大神们帮忙看看啊。两天了,各种方法,还是不行。


...全文
11302 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
闰土小蒋 2020-12-08
  • 打赏
  • 举报
回复
https://opensupport.alipay.com/support/home.htm
小熊猫丶 2020-07-29
  • 打赏
  • 举报
回复
引用 15 楼 C6992687 的回复:
支付宝公钥填写对了吗??
哈哈哈。17年的问题了。已经结帖了。不过还是谢谢大佬的回答~~
C6992687 2020-07-23
  • 打赏
  • 举报
回复
支付宝公钥填写对了吗??
Ace.中国行 2020-02-15
  • 打赏
  • 举报
回复
我也遇到这种问题了,在等待付款时 签名是验证成功的 ,付款后一直就是签名验证失败了
a01025042 2019-01-10
  • 打赏
  • 举报
回复 1
使用商户公钥会出现支付成功,却验签失败的情况;改成支付宝公钥就解决了
大灿兮 2018-06-11
  • 打赏
  • 举报
回复
【链接】支付宝异步通知验签失败解决方案 https://blog.csdn.net/sinat_32575213/article/details/79746731
qq_40881558 2018-06-11
  • 打赏
  • 举报
回复
在开发支付宝支付功能时,如果没在回调方法验证签名,有可能被刷钱,下面说下怎么造成的 场景:某个app有个充值功能,或者下单购买功能,假设用户选择的是支付宝支付。 切入口:支付宝的callback路径。通过伪装信息直接访问支付宝支付完成的回调路径,传入相应信息,如果app的服务端没验证签名,那有可能就被欺骗了,从而做支付成功的逻辑处理。 伪装信息如支付宝接口文档中的: http://notify.java.jpxx.org/index.jsp?discount=0.00&payment_type=1&subject=测试&trade_no=2013082244524842&buyer_email=dlwdgl@gmail.com&gmt_create=2013-08-22 14:45:23¬ify_type=trade_status_sync&quantity=1&out_trade_no=082215222612710&seller_id=2088501624816263¬ify_time=2013-08-22 14:45:24&body=测试测试&trade_status=TRADE_SUCCESS&is_total_fee_adjust=N&total_fee=1.00&gmt_payment=2013-08-22 14:45:24&seller_email=xxx@alipay.com&price=1.00&buyer_id=2088602315385429¬ify_id=64ce1b6ab92d00ede0ee56ade98fdf2f4c&use_coupon=N&sign_type=RSA&sign=1glihU9DPWee+UJ82u3+mw3Bdnr9u01at0M/xJnPsGuHh+JA5bk3zbWaoWhU6GmLab3dIM4JNdktTcEUI9/FBGhgfLO39BKX/eBCFQ3bXAmIZn4l26fiwoO613BptT44GTEtnPiQ6+tnLsGlVSrFZaLB9FVhrGfipH2SWJcnwYs= 其中需要修改的是: 1.订单号,通常打开支付宝支付之前,客户端会调用服务端接口创建一个订单信息,并返回订单号,这个需要做拦截才能拿到。 2.回调路径,这个路径有可能通过服务端返回给客户端的,这种情况可以尝试拦截获取,如果是写在apk中的,那就反编译获取。 拿到这两个信息后,可以修改下总价格total_fee,单价:price,数量:quantity 准备好以后,那就访问回调路径,同时传入伪装的所有信息。如果服务端没验证签名,那么此时服务端的金额可能已经修改。
小熊猫丶 2018-05-25
  • 打赏
  • 举报
回复
引用 9 楼 lzqSoinLoveXCC 的回复:
楼主 这个orderService.alipayNotify(maps); 是什么方法? 修改订单状态方法吗? 命名看不懂
alipayNotify这个方法是在验签成功之后调用的,是自定义的方法,用于根据支付宝返回数据来处理订单(如修改订单状态之类的)
lzqSoinLoveXCC 2018-05-23
  • 打赏
  • 举报
回复
楼主 这个orderService.alipayNotify(maps); 是什么方法? 修改订单状态方法吗? 命名看不懂
小熊猫丶 2017-12-25
  • 打赏
  • 举报
回复
引用 5 楼 qq_38204653 的回复:
楼主怎么申请支付宝接口的,个人网站想申请要执照
刚刚打通了客服,顺便帮你问了下,个人网站支付,也算是商家,要申请执照之类的。 然而我的问题还是没有得到解决,客服说他们没做这块的培训,也没有人工的技术支持,只能自己看官方的开发文档
小熊猫丶 2017-12-25
  • 打赏
  • 举报
回复
我这个是公司的,要支付的话,要先跟支付宝签约,需要营业执照啥的。
xls丶 2017-12-25
  • 打赏
  • 举报
回复
楼主怎么申请支付宝接口的,个人网站想申请要执照
小熊猫丶 2017-12-25
  • 打赏
  • 举报
回复
已经解决了,虽然没人回答 说一下我的问题,供后面遇到这个问题的人参考吧。 支付宝提供了RSA的验签生成工具,之前我使用的是1.0版的,生成的密钥可以支持支付,但是在回调的时候会校验失败,后面重新下载了1.3版的,就好了 参考链接:https://docs.open.alipay.com/291/105971/
小熊猫丶 2017-12-24
  • 打赏
  • 举报
回复
解析我是直接调用的支付宝的SDK,应该不会有问题吧。o(╥﹏╥)o
王伴闲 2017-12-23
  • 打赏
  • 举报
回复
是不是支付宝请求报文解析错了
小熊猫丶 2017-12-22
  • 打赏
  • 举报
回复
自己顶,不要沉啊。在线等。
小熊猫丶 2017-12-22
  • 打赏
  • 举报
回复
还有就是支付宝的技术支持在哪里找啊,我打服务热线,自动语音让去https://open.alipay.com/support/supportCenter.htm 但是我没有找到可以联系技术的地方,第一次做支付麻烦大神们帮助

81,123

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧