这篇文章主要介绍了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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。