最近研究微信支付,尝试用jsapi前端发起支付时,弹出“支付签名验证失败”,多方查找后发现是由于统一下单时的加密方式与前端再次签名时的签名方式不同导致。

官方的SDK中WXPay类的构造函数定义是这样的:

public WXPay(final WXPayConfig config) throws Exception {this(config, null, true, false);  //useSandbox值为false,即默认为非沙箱环境
}
...//此处省略
public WXPay(final WXPayConfig config, final String notifyUrl, final boolean autoReport, final boolean useSandbox) throws Exception {this.config = config;this.notifyUrl = notifyUrl;this.autoReport = autoReport;this.useSandbox = useSandbox;if (useSandbox) {this.signType = SignType.MD5; // 沙箱环境}else {this.signType = SignType.HMACSHA256; //非沙箱环境signtype默认为HMACSHA256}this.wxPayRequest = new WXPayRequest(config);
}

所以在使用官方的示例时:

MyConfig config = new MyConfig();
WXPay wxpay = new WXPay(config);

默认signtype值为SignType.HMACSHA256而不是SignType.MD5。

那么如果直接给定sign_type值为MD5是不是就可以了呢?通过研究后续代码发现:在WXPay.fillRequestData方法中压根儿就没有判断用户是否传入了默认的sign_type,所以给了默认值也没用。

public Map<String, String> fillRequestData(Map<String, String> reqData) throws Exception {reqData.put("appid", config.getAppID());reqData.put("mch_id", config.getMchID());reqData.put("nonce_str", WXPayUtil.generateNonceStr());if (SignType.MD5.equals(this.signType)) {reqData.put("sign_type", WXPayConstants.MD5);}else if (SignType.HMACSHA256.equals(this.signType)) {reqData.put("sign_type", WXPayConstants.HMACSHA256);}reqData.put("sign", WXPayUtil.generateSignature(reqData, config.getKey(), this.signType));return reqData;}

这里可以将上面这个方法更改一下,判断一下初始给定的默认值就OK了。(PS:也可以根据需求按照指定的构造方法初始化WXPay实例。)

public Map<String, String> fillRequestData(Map<String, String> reqData) throws Exception {reqData.put("appid", config.getAppID());reqData.put("mch_id", config.getMchID());reqData.put("nonce_str", WXPayUtil.generateNonceStr());String userSignType = ""+reqData.get("sign_type"); //如果定义了signtype,则使用定义的signtypeif(userSignType.equals(WXPayConstants.MD5)){this.signType = SignType.MD5;}else if(userSignType.equals(WXPayConstants.HMACSHA256)){this.signType = SignType.HMACSHA256;}else{if (SignType.MD5.equals(this.signType)) {reqData.put("sign_type", WXPayConstants.MD5);}else if (SignType.HMACSHA256.equals(this.signType)) {reqData.put("sign_type", WXPayConstants.HMACSHA256);}}reqData.put("sign", WXPayUtil.generateSignature(reqData, config.getKey(), this.signType));return reqData;}

另外,还需注意官方文档中的描述:参数区分大小写以及签名方式与统一下单时的签名类型一致!

开发云 - 一站式云服务平台

更多优惠,尽在--开发云 - 一站式云服务平台

关于微信jsapi 支付签名验证失败相关推荐

  1. 微信支付服务商,![CDATA[sub_mch_id与sub_appid不匹配],微信小程序支付,签名错误,CDATA[签名错误]解决方法,支付签名验证失败

    微信支付服务商,微信小程序支付,签名错误,CDATA[签名错误]解决方法 1:服务商和普通的商户支付在代码上没有太大差异(不同的是上传的参数,而且微信支付服务商参数上比较难找,官方文档又太简洁,所以很 ...

  2. php微信jsapi支付小结,ThinkPHP接入微信支付 - JSAPI支付

    一.支付准备 二.获取用户openid 首先,到微信公众平台后台 - 设置 - 网页授权域名(别忘了添加开发者) // 在头部引入WechatPubService.php文件,见附录一 use app ...

  3. 微信JSAPI支付 跟 所遇到的那些坑

    首先介绍一下我在调用微信支付接口使用的是 weixin.senparc SDK,非常方便好用开源的一个微信开发SDK. weixin.senparc SDK 官网:http://weixin.senp ...

  4. APP支付支付签名验证失败

    问题描述 最近做APP支付,微信下单没有问题,成功获取了预支付订单id,然后二次签名提供给前端,却一直提示支付签名验证失败,不知道什么原因,故期望大神能解答一下 二次签名 Map<String, ...

  5. 微信JSApi支付~订单号和微信交易号

    返回目录 谈谈transactionId和out_trade_no 前一篇微信JSApi支付~坑和如何填坑文章反映不错,所以又写了个后篇,呵呵. 每个第三方在线支付系统中都会有至少两类订单号,其一为支 ...

  6. 微信JSAPI支付对接流程及支付接口设计

    文章目录 前言 一.JSAPI支付场景及逻辑 二.开发步骤 1.设置支付目录 2.设置授权域名 3.业务流程 三.代码设计 1. 支付页面 2. Controller 3. JS调起支付 4. 工具类 ...

  7. 关于微信JSAPI支付成功后,点击完成后没有返回值并且页面被自动关闭问题

    微信JSAPI支付成功后,点击完成后没有返回值并且页面被自动关闭 简介 解决方式 错误的处理方式 总结 简介 最近很多人可能都遇到一个问题,在使用微信JSAPI支付成功后,不走成功的回调方法,只有支付 ...

  8. JAVA+微信JSAPI支付

    JAVA+微信JSAPI支付 引入依赖 获取请求ip 组装微信支付请求 回调处理 引入依赖 <dependency><groupId>com.github.binarywang ...

  9. C# .NETMVC 微信JSAPI支付

    C# .NET MVC微信JSAPI支付 经过本人不断翻找资料和百度终于结合一些大佬的经验和思路弄出来一个MVC的微信支付了. 再弄微信支付之前我们需要先有一个商户号,并且开通了微信支付的JSAPI支 ...

  10. Java 微信jsapi支付

    spring boot微信jsapi支付 话不多说,撸起袖子就是干,下面上源码 pom.xml 配置文件 resources/wx.properties 配置类 service(WechatPaySe ...

最新文章

  1. 蓝色梦想,再次起航 | 水下目标检测算法比赛正式开赛!
  2. Spring Cloud Gateway 雪崩了,该怎么办不要慌
  3. no awt in java.libary.path
  4. 【论文知识点笔记】Binarized P-Network(强化学习+保守值迭代+二值化神经网络)
  5. 自定义控件SettingItemView
  6. 中继链路,以太网通道,DHCP配置
  7. 最新!全球学术排名出炉:21 所中国大学位居世界 100 强
  8. wince系统usb刷机工具_中兴B860AV1.2-S905L刷机救砖教程,喜欢的分享一下
  9. #ifdef 支持Mac #ifndef 支持Windows #if defined (Q_OS_WIN) 应该可以再两个系统通用
  10. 穿越迷宫的函数c语言,数据结构课外实践题库(26页)-原创力文档
  11. 一款二进制文件查看器
  12. visio画图复制粘贴到word_用VISIO画图 复制完之后粘贴到word中为什么只显示下面一部分?...
  13. Cisco 路由器ntp服务配置
  14. 微信客服介绍和使用指引(4.19)
  15. FPGA作为电力电子设备控制器的实践
  16. Day9 Four French Words Pronounced Differently in English
  17. iphone6s维修定位服务器,iphone6s修理点
  18. 大学生就业的三方协议基本概述
  19. NVIDIA驱动 XORG频繁崩溃
  20. BI规划落地的正确姿势,五步教你搭建企业级BI项目

热门文章

  1. 小象学院python网课值得吗-小象学院python
  2. 小象学院0基础python视频_[大数据] 小象学院大数据全套视频教程
  3. 使用VM Ware创建虚拟机
  4. luogu P2123 皇后游戏
  5. 怎么快速剪裁照片?这款智能剪裁工具你知道吗?
  6. 计算机商务应用课要带电脑吗,笔记本电脑上网课需要用麦吗
  7. CloudComparePCL 点云OOB包围盒
  8. 登陆邮箱的方法有哪些?解析mail163邮箱如何误删恢复?
  9. HTML超链接标签—链接QQ在线聊天
  10. 利用VSCode+platformio学习esp32开发