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 相关文章推荐
JavaScript入门学习书籍推荐
Jun 12 Javascript
JavaScript 使用技巧精萃(.net html
Apr 25 Javascript
getJSON调用后台json数据时函数被调用两次的原因猜想
Sep 29 Javascript
如何使用HTML5地理位置定位功能
Apr 27 Javascript
js兼容pc端浏览器并有多种弹出小提示的手机端浮层控件实例
Apr 29 Javascript
jquery图片倾斜层叠切换特效代码分享
Aug 27 Javascript
JS关闭窗口时产生的事件及用法示例
Aug 20 Javascript
JavaScript中利用for循环遍历数组
Jan 15 Javascript
基于jQuery实现定位导航位置效果
Nov 15 jQuery
json解析大全 双引号、键值对不在一起的情况
Dec 06 Javascript
Js实现复选框的全选、全不选反选功能代码实例
Feb 28 Javascript
angula中使用iframe点击后不执行变更检测的问题
May 10 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 闭包特性在实际应用中的问题
2009/10/30 PHP
php数组函数序列之array_intersect() 返回两个或多个数组的交集数组
2011/11/10 PHP
php仿QQ验证码的实例分析
2013/07/01 PHP
PHP中in_array的隐式转换的解决方法
2018/03/06 PHP
window.showModalDialog使用手册
2007/01/11 Javascript
JAVASCRIPT下判断IE与FF的比较简单的方式
2008/10/17 Javascript
基于jQuery的Spin Button自定义文本框数值自增或自减
2010/07/17 Javascript
Jquery 的outerHeight方法使用介绍
2013/09/11 Javascript
jsonp原理及使用
2013/10/28 Javascript
iframe子父页面调用js函数示例
2013/11/07 Javascript
js的toUpperCase方法用法实例
2015/01/27 Javascript
javascript基本包装类型介绍
2015/04/10 Javascript
js实现选中复选框文字变色的方法
2015/08/14 Javascript
js实现简单的联动菜单效果
2015/08/19 Javascript
浅谈Nodejs观察者模式
2015/10/13 NodeJs
分享网页检测摇一摇实例代码
2016/01/14 Javascript
BootStrap文件上传样式超好看【持续更新】
2016/05/10 Javascript
jQuery弹出div层过2秒自动消失
2016/11/29 Javascript
关于Google发布的JavaScript代码规范你要知道哪些
2018/04/04 Javascript
微信小程序实现点击图片旋转180度并且弹出下拉列表
2018/11/27 Javascript
Echart折线图手柄触发事件示例详解
2018/12/16 Javascript
详解小程序中h5页面onShow实现及跨页面通信方案
2019/05/30 Javascript
通过循环优化 JavaScript 程序
2019/06/24 Javascript
基于webpack4+vue-cli3项目实现换肤功能
2019/07/17 Javascript
python基础教程之类class定义使用方法
2014/02/20 Python
Python序列操作之进阶篇
2016/12/08 Python
Python扩展内置类型详解
2018/03/26 Python
Python GUI自动化实现绕过验证码登录
2020/01/10 Python
python selenium 获取接口数据的实现
2020/12/07 Python
Mamaearth官方网站:印度母婴护理产品公司
2019/10/06 全球购物
教育英语专业毕业生的求职信
2014/03/13 职场文书
兽医医药专业求职信
2014/07/27 职场文书
财务工作疏忽检讨书
2014/09/11 职场文书
人事主管岗位职责
2015/02/04 职场文书
员工旷工检讨书
2015/08/15 职场文书
小程序实现悬浮按钮的全过程记录
2021/10/16 HTML / CSS