java遇到微信小程序 "支付验证签名失败" 问题解决


Posted in Javascript onDecember 22, 2019

最近在做一个微信小程序项目做到微信支付的时候遇到的一些问题!

详细步骤:

开发前准备(必须)

小程序标识(appid):wx4d4838ebec29b8**

商户号(mch_id):15508070**

商户密钥(key) :wHtQckdfiRBVF7ceGTcSWEEORt6C0D**

我们用微信官方提供的SDK开发 :https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1

java遇到微信小程序 "支付验证签名失败" 问题解决

下载 SDK完成后 :

java遇到微信小程序 "支付验证签名失败" 问题解决

开始写我们的程

进入微信支付开发文档 :https://pay.weixin.qq.com/wiki/doc/api/index.html

选择 小程序支付

java遇到微信小程序 "支付验证签名失败" 问题解决

选择 API列表 统一下单可以看到微信接口链接和 请求参数 , 你需要看下每个参数什么意思,接下来就需要知道怎么操作这些参数就可以了 ok

java遇到微信小程序 "支付验证签名失败" 问题解决

一 首先 把刚下载的 微信提供的 SDK 拷贝到你的项目里 自定义一个类继承里面的一个WXPayConfig 抽象类

public class MyWxPayConfig extends WXPayConfig {
 private byte[] certData;

 public MyWxPayConfig() throws Exception { }

 public String getAppID() {
 return "wx4d4838ebec29b8** "; //你的appid
 }

 public String getMchID() {
 return "15508070**";//你的商户号mch_id
 }

 public String getKey() {
 return "wHtQckdfiRBVF7ceGTcSWEEORt6C0D**";

//你的商户号秘钥 key
 }

 public InputStream getCertStream() {
 ByteArrayInputStream certBis = new ByteArrayInputStream(this.certData);
 return certBis;
 }

 public int getHttpConnectTimeoutMs() {
 return 8000;
 }

 public int getHttpReadTimeoutMs() {
 return 10000;
 }
 public IWXPayDomain getWXPayDomain() {
 // 这个方法需要这样实现, 否则无法正常初始化WXPay
 IWXPayDomain iwxPayDomain = new IWXPayDomain() {

  public void report(String domain, long elapsedTimeMillis, Exception ex) {

  }

  public DomainInfo getDomain(WXPayConfig config) {
  return new IWXPayDomain.DomainInfo(WXPayConstants.DOMAIN_API, true);

//微信工具常量类有 "api.mch.weixin.qq.com"; wxpay.unifiedorder() /pay/unifiedorder


 } 
 
}; 

return iwxPayDomain; 

 } 

}

找到 SDK 中的 WxPay 类 修改里面的代码

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;//注意:这点是个坑! 默认是HMACSHAS56加密 一定要修改成MD5 不然无论如何都会报 “微信签名失败” 的错误!
  this.signType = SignType.MD5;
 }
 this.wxPayRequest = new WXPayRequest(config);
 }

微信支付接口所需要的参数(前端):https://developers.weixin.qq.com/miniprogram/dev/api/open-api/payment/wx.requestPayment.html

java遇到微信小程序 "支付验证签名失败" 问题解决

可知 前端所需要的参数 我们直接反回给他们 就ok!

java微信支付代码

//你自己需要定义一个方法
public static void main(String[] args) throws Exception {

 //统一下单支付 

 HashMap<String, String> map = new HashMap<>();
 IdWorker idWorker = new IdWorker();


//自定义订单号类
 long out_trade_no = idWorker.nextId();

//获取订单号

 SortedMap<Object, Object> parameters = new TreeMap<Object, Object>();
 Map<String, String> data = new HashMap<>();
 data.put("body", "微信支付");   //商品描述
 data.put("total_fee", "1");   // 标价金额 单位:分
 data.put("openid", "你传来的openid");   //用户标识 trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识
 data.put("out_trade_no", out_trade_no + "");   //商户系统内部订单号

 data.put("nonce_str",WxpayUtil.generateNonceStr()); //随机字符串,长度要求在32位以内。推荐随机数生成算法
 data.put("spbill_create_ip", WeiXinHelper.localIp());  //支持IPV4和IPV6两种格式的IP地址。调用微信支付API的机器IP 自定获取ip
 data.put("notify_url", "http://www.weixin.qq.com/wxpay/pay.php"); // 没用到.通知地址:通知url必须为外网可访问的url,不能携带参数。
 data.put("trade_type", "JSAPI");
//交易类型
 data.put("sign_type", WXPayConstants.MD5); //签名类型//MyWxPayConfig 配置了一些默认信息 appid,商户号,商户秘钥,请求域名 ..
 MyWxPayConfig myWxPayConfig = new MyWxPayConfig();
 WXPay wxpay = new WXPay(myWxPayConfig);
 Map<String, String> rMap = wxpay.unifiedOrder(data);
//生成一次签名 sign
 System.out.println(rMap);



 // 下面只是为了生成第二次签名 仅此而已
 String return_code = rMap.get("return_code");//返回状态码
 String result_code = rMap.get("result_code");//结果状态码


 String nonce_str = rMap.get("nonce_str"); //随即字符串


 
 Long s = System.currentTimeMillis() / 1000;
//获取时间戳除以千变字符串
 String timeStamp = String.valueOf(s);
 if ("SUCCESS".equals(return_code) && return_code.equals(result_code)) {




 
  map.put("appId", “appid”);

//你的appid
  map.put("timeStamp", timeStamp);//这边要将返回的时间戳转化成字符串,不然小程序端调用wx.requestPayment方法会报签名错误
  map.put("nonceStr", nonce_str);
  map.put("package", "prepay_id=" + rMap.get("prepay_id"));
  map.put("signType", "MD5");
  System.out.println("二次签名参数 : " + map);
//需要生成二次签名 所用的参数
  //再次签名sign,这个签名用于小程序端调用wx.requesetPayment方法
  String sign = WXPayUtil.generateSignature(map, "key");
//你的商户号key
  map.put("paySign", sign); // 生成签名 重要
  System.out.println("生成的签名paySign : " + sign);



 // return map; //将map响应给前端 微信支付接口需要的参数
 }

 }

测试:打印结果

第一次签名后生成的数据 主要是 支付交易会话标识:prepay_id

java遇到微信小程序 &quot;支付验证签名失败&quot; 问题解决

第二次签名后 再次组装数据 返回给前端的数据

wx.requestPayment 需要接收的数据

java遇到微信小程序 &quot;支付验证签名失败&quot; 问题解决

容易遇到的错误 !

容易遇到的错误 !

容易遇到的错误 !

1 商户号key 不要与 appid 的secret 弄混淆了

2 SDK 工具类中 Wxpay 类中 this.signType = SignType.HMACSHA256;

HMACSHA256 改成 MD5

3 第二次签名需要的五个参数一个不能少

appId,nonceStr,package,signType,timeStamp 。 注意 都是以驼峰命名 不然也会报错

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Sample script that deletes a SQL Server database
Jun 16 Javascript
Javascript 面向对象 继承
May 13 Javascript
JS简单的图片放大缩小的两种方法
Nov 11 Javascript
JS输入用户名自动显示邮箱后缀列表的方法
Jan 27 Javascript
在JavaScript应用中使用RequireJS来实现延迟加载
Jul 01 Javascript
深入浅析Bootstrap列表组组件
May 03 Javascript
ES6新特性之数组、Math和扩展操作符用法示例
Apr 01 Javascript
JS自定义滚动条效果简单实现代码
Oct 27 Javascript
vue如何安装使用Quill富文本编辑器
Sep 21 Javascript
javascript中一些奇葩的日期换算方法总结
Nov 14 Javascript
vue使用better-scroll实现滑动以及左右联动
Jun 30 Javascript
理解Proxy及使用Proxy实现vue数据双向绑定操作
Jul 18 Javascript
webpack打包html里面img后src为“[object Module]”问题
Dec 22 #Javascript
node.js事件轮询机制原理知识点
Dec 22 #Javascript
javascript实现fetch请求返回的统一拦截
Dec 22 #Javascript
详解vue-router 动态路由下子页面多页共活的解决方案
Dec 22 #Javascript
判断JavaScript中的两个变量是否相等的操作符
Dec 21 #Javascript
javascript中的相等操作符(==与===区别)
Dec 21 #Javascript
JavaScript中的相等操作符使用详解
Dec 21 #Javascript
You might like
php懒人函数 自动添加数据
2011/06/28 PHP
PHP5中实现多态的两种方法实例分享
2014/04/21 PHP
PHP fprintf()函数用法讲解
2019/02/16 PHP
Swoole 5将移除自动添加Event::wait()特性详解
2019/07/10 PHP
msn上的tab功能Firefox对childNodes处理的一个BUG
2008/01/21 Javascript
jquery获取input的value问题说明
2010/08/19 Javascript
在网站上应该用的30个jQuery插件整理
2011/11/03 Javascript
javascript object array方法使用详解
2012/12/03 Javascript
PHP开发者必须掌握的6个关键字
2014/04/14 Javascript
javascript实现数组内值索引随机化及创建随机数组的方法
2015/08/10 Javascript
CKEditor无法验证的解决方案(js验证+jQuery Validate验证)
2016/05/09 Javascript
写jQuery插件时的注意点
2017/02/20 Javascript
JS实现的加减乘除四则运算计算器示例
2017/08/09 Javascript
JS基于对象的特性实现去除数组中重复项功能详解
2017/11/17 Javascript
JS块级作用域和私有变量实例分析
2019/05/11 Javascript
Jquery异步上传文件代码实例
2019/11/13 jQuery
JavaScript面试中常考的字符串操作方法大全(包含ES6)
2020/05/10 Javascript
vue:el-input输入时限制输入的类型操作
2020/08/05 Javascript
[48:47]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python ElementTree 基本读操作示例
2009/04/09 Python
python检测远程udp端口是否打开的方法
2015/03/14 Python
如何在Python中编写并发程序
2016/02/27 Python
python3中的md5加密实例
2018/05/29 Python
python pexpect ssh 远程登录服务器的方法
2019/02/14 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
2019/05/27 Python
浅谈python 中类属性共享的问题
2019/07/02 Python
利用python中的matplotlib打印混淆矩阵实例
2020/06/16 Python
css3.0 图形构成实例练习一
2013/03/19 HTML / CSS
妇产医师自荐信
2014/01/29 职场文书
学生安全教育材料
2014/02/14 职场文书
解除施工合同协议书
2014/10/17 职场文书
特此通知格式
2015/04/27 职场文书
2015年度合同管理工作总结
2015/05/22 职场文书
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
2021/04/06 Python
CSS几步实现赛博朋克2077风格视觉效果
2021/06/16 HTML / CSS
Nginx使用Lua模块实现WAF的原理解析
2021/09/04 Servers