实在是不知道是我代码写的不对还是支付宝本身就有的坑,整合的时候碰到的问题简直就是俄罗斯套娃;

1.这个回调地址存放的值应该是放在params里的,不知道是因为什么原因我一直取的为空,,,,,


这个是请求的参数(按理来说应该可以拿到的);

2.这个传输协议的Content-Type原来正常应该都是穿的json格式的数据,但是支付宝的不太一样,他是这个(application/x-www-form-urlencoded; text/html; charset=utf-8),所以传的值是text文本的,不是json。。。。

3.使用支付宝验签的时候,使用的是支付宝公钥,不是应用公钥。。。。

4.请求的参数要使用URLDecoder来转译。。。不然会验签失败

就这么些个错误愣是改了两天,才找出来的,慢慢解决掉的,不知道有没有人跟我一样悲催的

    @RequestMapping(value = "/alipay/callback")@ApiOperation(value = "支付宝回调地址", notes = "支付宝支付回调")public String paymentAlipayCallback(HttpServletRequest request) {logger.error("1.开始执行回调方法:");try {//获取body里的信息使用二进制获取BufferedReader br = null;StringBuilder sb = new StringBuilder("");try {br = request.getReader();String str;while ((str = br.readLine()) != null) {sb.append(str);}br.close();} catch (Exception e) {e.printStackTrace();} finally {if (null != br) {try {br.close();} catch (Exception e) {e.printStackTrace();}}}Map<String, String> params = new HashMap<>();String toJSONString = sb.toString();//将url转mapString[] param = toJSONString.split("&");for (String s : param) {String[] p = s.split("=");if (p.length == 2) {String decode = URLDecoder.decode(p[1], "UTF-8");params.put(p[0],decode);}}boolean checkV1 = AlipaySignature.rsaCheckV1(params, PMaliPublicKey, CHARSET, SIGN_TYPE);if (!checkV1) {logger.error("验签异常 -> AlipaySignature error");return "failure";}String appId = params.get("app_id"); // 支付宝appidif (!pMaliAppId.equals(appId)) {logger.error("appid错误 -> app_id error. request: {}, response: {} ", pMaliAppId, appId);return "failure";}// 交易状态 TRADE_CLOSED交易关闭 TRADE_FINISHED交易完结 TRADE_SUCCESS支付成功 WAIT_BUYER_PAY交易创建String tradeStatus = params.get("trade_status");if (NOTIFY_TRADE_STATUS_SUCCESS.equals(tradeStatus) || NOTIFY_TRADE_STATUS_FINISHED.equals(tradeStatus)) {MealOrders mealOrders = mealOrdersService.getByParamNo(params.get("out_trade_no"));// 订单号// 订单号if (mealOrders == null) {logger.error("支付宝回调编号错误找不到相应的编号 -> out_trade_no error. out_trade_no: {} ", params.get("out_trade_no"));return "failure";}//支付金额if (mealOrders.getPaymentPrice().compareTo(new BigDecimal(params.get("total_amount"))) != 0) {logger.error("支付宝支付金额与应付金额不等 -> total_amount error. total_amount: {} ", params.get("total_amount"));return "failure";}// 付款回调,处理后续付款逻辑mealOrdersService.paySuccess(mealOrders);return "success";}return "failure";} catch (Exception ex) {ex.printStackTrace();logger.error("支付宝支付状态异常:{}", ex);return "failure";}}

参考链接:
https://www.cnblogs.com/panxuejun/p/6550131.html(decode转译)
https://blog.csdn.net/mengxianhua/article/details/9961843(url转map)
https://blog.csdn.net/chai1230/article/details/105674244(获取post方法里的body信息)

java整合支付宝遇到的坑及解决方法相关推荐

  1. Ionic使用常用插件时遇到的坑与解决方法

    一. 什么是Ionic Ionic 是一个强大的 HTML5 应用程序开发框架(HTML5 Hybrid Mobile App Framework ). 可以帮助您使用 Web 技术,比如 HTML. ...

  2. java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 解决方法 java.lang.ClassNotFoundException: com.

    java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 解决方法 java.lang.ClassNotFoundException: com.m ...

  3. Adobe flash cs5 的Java运行时环境初始化错误 完美解决方法

    Adobe flash cs5 的Java运行时环境初始化错误 完美解决方法 下载网络上的Adobe flash cs5 精简版(绿色版),Java运行时环境初始化时出现错误,你可能需要重装Flash ...

  4. java开发中遇到的问题及解决方法(持续更新)

    java开发中遇到的问题及解决方法(持续更新) 参考文章: (1)java开发中遇到的问题及解决方法(持续更新) (2)https://www.cnblogs.com/LiuYanYGZ/p/6112 ...

  5. Android DialogFragment 遇到 java.lang.IllegalStateException: Fragment already added: 的解决方法

    Android DialogFragment 遇到 java.lang.IllegalStateException: Fragment already added: 的解决方法 参考文章: (1)An ...

  6. CocoaPods更新过程中出现的坑及解决方法

    CocoaPods更新过程中出现的坑及解决方法 参考文章: (1)CocoaPods更新过程中出现的坑及解决方法 (2)https://www.cnblogs.com/hero11223/p/1071 ...

  7. ubuntu16.04安装CUDA 8.0(很详尽,包括一些坑的解决方法)

    ubuntu16.04安装CUDA 8.0(很详尽,包括一些坑的解决方法) 参考文章: (1)ubuntu16.04安装CUDA 8.0(很详尽,包括一些坑的解决方法) (2)https://www. ...

  8. Idea运行web项目时,提示java.lang.ClassNotFoundException: com.mysql.jdbc.Driver解决方法

    Idea运行web项目时,提示java.lang.ClassNotFoundException: com.mysql.jdbc.Driver解决方法 参考文章: (1)Idea运行web项目时,提示j ...

  9. java.net.BindException: Address already in use: 解决方法

    java.net.BindException: Address already in use: 解决方法 参考文章: (1)java.net.BindException: Address alread ...

最新文章

  1. zhs16gbk对应mysql_[Oracle] 彻底搞懂Oracle字符集
  2. vue学习:v-text,v-html, v-model, {{}}之间的异同
  3. 企业Java中事务隔离级别的初学者指南
  4. IDEA远程调试Tomcat
  5. 前沿 | 加州理工大学什么是Imitation Learning(模仿学习)
  6. 入门javascript_Espruino入门,Espruino是用于微控制器JavaScript解释器
  7. Exchange Server DAG群集状态部分在线
  8. CAN分析仪:便携式CAN总线分析仪
  9. 计算机程序丢失或损坏,电脑开机后出现winload.exe丢失或损坏异常的解决方法
  10. 操作系统形式化验证实践教程(1) - 证明第一个定理
  11. JSP实战项目教程|基于JSP的学生请假系统开发视频教程
  12. html文档绝对引用,excel中的绝对引用怎么用 excel中引用绝对引用是哪个键
  13. 为什么科技互联网公司越来越重视数学?
  14. Android手机应用CTA认证自测
  15. 【51CTO学院】双11抽奖规则
  16. jquery $ # 什么意思
  17. 横河川仪压力变送器故障代码_EJA压力变送器常见故障处理方法
  18. mac新版迅雷,如何取消开机启动?
  19. 华为云弹性公网IP,如何解决现代企业的网络IP烦恼
  20. 利用FFmpeg将H.264文件读入内存,再输出封装格式文件

热门文章

  1. ubuntu中firebox无法联网
  2. 使用ECS和OSS搭建个人网盘
  3. 取消usb计算机连接网络,usb连接(如何设置usb网络连接)
  4. 模式识别算法之2--感知器(感知机)算法
  5. 永久60服务器消息,魔兽世界怀旧服:永久60级已经成为了另一个游戏,这如你所愿吗?...
  6. 算法训练 24点游戏
  7. [转]数据挖掘十大经典算法
  8. [Vue warn]: Invalid component name: “.-pages-smartRecommendation-questionStart-questionStart“. Comp
  9. python爬取内容_Python爬取数据(基础,从0开始)
  10. Python爬虫 | 以滑雪为例演示大众点评商铺信息采集!