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

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

这篇文章主要介绍了Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)遇到微信小程序'支付验证签名失败' 问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

详细步骤:

开发前准备(必须)

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

商户号(mch_id):15508070**

商户密钥(关键):whtqckdfirbvf 7 cegtcsweeort6c 0d * *

我们用微信官方提供的软件开发工具包(软件开发工具包)开发:https://pay.weixin.qq.com/wiki/doc/api/native.php?第11章_1

下载软件开发工具包(软件开发工具包)完成后:

开始写我们的程

进入微信支付开发文档:https://支付。微信。QQ。com/wiki/doc/API/index。超文本标记语言

选择小程序支付

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

一首先把刚下载的微信提供的软件开发工具包(软件开发工具包)拷贝到你的项目里自定义一个类继承里面的一个WXPayConfig抽象类

公共类MyWxPayConfig扩展了WXPayConfig {

私有字节[]证书数据;

公共MyWxPayConfig()引发异常{ }

公共字符串getAppID() {

返回“wx4d 4838 ebec 29 b 8 * *”;//你的appid

}

公共字符串getMchID() {

返回"15508070 * *";//你的商户号mch_id

}

公共字符串getKey() {

返回whtqckdfirbvf 7 cegtcsweeart 6 c0d * * ';//你的商户号秘钥键

}

公共输入流getCertStream() {

bytearray输入流cert bis=new bytearray输入流(this。证书数据);

返回证书;

}

public int getHttpConnectTimeoutMs(){

返8000;

}

public int getHttpReadTimeoutMs(){

返还10000;

}

公共IWXPayDomain getWXPayDomain() {

//这个方法需要这样实现,否则无法正常初始化WXPay

IWXPayDomain IWXPayDomain=new IWXPayDomain(){

公共空的报告(字符串域,长elapsedTimeMillis,异常ex) {

}

公共域信息getDomain(WXPayConfig配置){

返回新的IWXPayDomain .DomainInfo(WXPayConstants .DOMAIN_API,true);//微信工具常量类有API。mch。微信。QQ。com’;wx pay。统一订单()/支付/统一订单

}

};

返回iwxPayDomain

}

}

找到软件开发工具包(软件开发工具包)中的WxPay类修改里面的代码

公共WXPay(最终WXPayConfig配置、最终字符串notifyUrl,最终布尔自动报告,最终布尔使用沙箱)引发异常{

this.config=配置

这个。通知URL=通知URL;

this.autoReport=自动报告

这个。使用沙箱=使用沙箱;

如果(使用沙盒){

this.signType=SignType .MD5//沙箱环境

}

否则{

//this.signType=SignType .HMACSHA256//注意:这点是个坑!默认是HMACSHAS56加密一定要修改成讯息摘要5不然无论如何都会报"微信签名失败"的错误!

this.signType=SignType .讯息摘要5

}

这个。WXPayRequest=new WXPayRequest(config);

}

微信支付接口所需要的参数(前端):https://开发者。微信。QQ。com/mini program/dev/API/open-API/payment/wx。要求付款。超文本标记语言

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

Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)微信支付代码

//你自己需要定义一个方法

公共静态void main(String[] args)引发异常{

//统一下单支付

HashMapString,String map=new HashMap();

id worker id worker=new id worker();//自定义订单号类

long out _ trade _ no=id worker。nextid();//获取订单号

SortedMapObject,对象参数=new TreeMapObject,Object();

MapString,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/wx pay/pay . PHP ');//未使用。通知地址:通知url必须可以被外部网络访问,并且不能携带参数。

data.put('trade_type ',' JSAPI ');//交易类型

data.put('sign_type ',WXPayConstants。MD5);//签名类型//MyWxPayConfig配置了一些默认的信息appid,商户号,商户密钥,请求的域名。

MyWxPayConfig MyWxPayConfig=new MyWxPayConfig();

wx pay wx pay=new wx pay(myWxPayConfig);

MapString,String rMap=wx pay . unified order(data);//生成一次签名

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 . current time millis()/1000;//获取除以千位字符串的时间戳

string timeStamp=string . value of(s);

if('成功'。equals(return _ code)return _ code . equals(result _ code)){

map.put('appId '," appId ");//您的appid

map.put('timeStamp ',时间戳);//这里要把返回的时间戳转换成字符串,否则小程序会调用wx.requestPayment方法,报告签名错误。

map . put(' non centr ',nonce _ str);

map.put('package ',' prepay _ id=' rmap . get(' prepay _ id ');

map.put('signType ',' MD5 ');

System.out.println('二级签名参数:' map ');//用于生成第二个签名的参数是必需的。

//再签签。这个签名用于applet调用wx.requesetPayment方法。

string sign=wxpayutil . generate signature(map,' key ');//您的商户编号密钥

map.put('paySign ',sign);//生成签名很重要

System.out.println('生成的签名paySign:' sign ');

//返回地图;//响应映射到前端微信支付接口所需的参数

}

}

测试:打印结果

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

第二次签名后,重新组装数据,返回给前端数据wx.requestPayment需要接收数据。

容易遇到的错误 !  容易遇到的错误 !    容易遇到的错误 !

商家1号密匙不要和appid的秘密混淆

2 SDK工具类中Wxpay类的this . sign type=sign type . hmacsha 256;HMACSHA256已更改为MD5

3第二个签名所需的五个参数之一必须是appid、noncestr、package、signtype和timestamp。注意都是以驼峰命名的,否则会报错。

这就是本文的全部内容。希望对大家的学习有帮助,支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: