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 相关文章推荐
动态修改DOM 里面的 id 属性的弊端分析
Sep 03 Javascript
常用Extjs工具:Extjs.util.Format使用方法
Mar 22 Javascript
JavaScript中“基本类型”之争小结
Jan 03 Javascript
一个JavaScript变量声明的知识点
Oct 28 Javascript
js实现图片漂浮效果的方法
Mar 02 Javascript
jQuery创建自定义的选择器用以选择高度大于100的超链接实例
Mar 18 Javascript
Bootstrap弹出带合法性检查的登录框实例代码【推荐】
Jun 23 Javascript
纯js和css完成贪吃蛇小游戏demo
Sep 01 Javascript
jQuery为某个div加入行样式
Jun 09 jQuery
react-native动态切换tab组件的方法
Jul 07 Javascript
如何去除富文本中的html标签及vue、react、微信小程序中的过滤器
Nov 21 Javascript
vue+django实现一对一聊天功能的实例代码
Jul 17 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
PHPWind 发帖回帖Api PHP版打包下载
2010/02/08 PHP
本地计算机无法启动Apache故障处理
2014/08/08 PHP
百度工程师讲PHP函数的实现原理及性能分析(三)
2015/05/13 PHP
php获取文件后缀的9种方法
2016/03/22 PHP
Laravel中unique和exists验证规则的优化详解
2018/01/28 PHP
PHP读取目录树的实现方法分析
2019/03/22 PHP
PHP7 新增功能
2021/03/09 PHP
javascript中获取选中对象的类型
2007/04/02 Javascript
jQuery EasyUI API 中文文档 - ValidateBox验证框
2011/10/06 Javascript
解析Javascript中大括号“{}”的多义性
2013/12/02 Javascript
javaScript对文字按照拼音排序实现代码
2013/12/27 Javascript
javascript学习笔记(五)原型和原型链详解
2014/10/08 Javascript
新手快速学习JavaScript免费教程资源汇总
2015/06/25 Javascript
初识angular框架后的所思所想
2016/02/19 Javascript
理解javascript中Map代替循环
2016/02/26 Javascript
一篇文章搞定JavaScript类型转换(面试常见)
2017/01/21 Javascript
NodeJS学习笔记之Module的简介
2017/03/24 NodeJs
JS禁止浏览器右键查看元素或按F12审查元素自动关闭页面示例代码
2017/09/07 Javascript
浅谈Webpack 持久化缓存实践
2018/03/22 Javascript
NodeJS搭建HTTP服务器的实现步骤
2018/10/12 NodeJs
在Web关闭页面时发送Ajax请求的实现方法
2019/03/07 Javascript
微信小程序个人中心的列表控件实现代码
2020/04/26 Javascript
跟老齐学Python之有容乃大的list(1)
2014/09/14 Python
Python实现按学生年龄排序的实际问题详解
2017/08/29 Python
python简单区块链模拟详解
2019/07/03 Python
Python获取当前脚本文件夹(Script)的绝对路径方法代码
2019/08/27 Python
TENSORFLOW变量作用域(VARIABLE SCOPE)
2020/01/10 Python
在spyder IPython console中,运行代码加入参数的实例
2020/04/20 Python
关于Python3爬虫利器Appium的安装步骤
2020/07/29 Python
python实现KNN近邻算法
2020/12/30 Python
Python经典五人分鱼实例讲解
2021/01/04 Python
python 如何用urllib与服务端交互(发送和接收数据)
2021/03/04 Python
女孩每月服装订阅盒:kidpik
2019/04/17 全球购物
舞蹈教师自荐信
2014/01/27 职场文书
python基于tkinter实现gif录屏功能
2021/05/19 Python
小程序与后端Java接口交互实现HelloWorld入门
2021/07/09 Java/Android