java遇到微信小程序 "支付验证签名失败" 问题解决
最近在做一个微信小程序项目做到微信支付的时候遇到的一些问题!
详细步骤:
开发前准备(必须)
小程序标识(appid):wx4d4838ebec29b8**
商户号(mch_id):15508070**
商户密钥(key):wHtQckdfiRBVF7ceGTcSWEEORt6C0D**
我们用微信官方提供的SDK开发:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1
下载SDK完成后:
开始写我们的程
进入微信支付开发文档:https://pay.weixin.qq.com/wiki/doc/api/index.html
选择小程序支付
选择API列表统一下单可以看到微信接口链接和请求参数,你需要看下每个参数什么意思,接下来就需要知道怎么操作这些参数就可以了ok
一首先把刚下载的微信提供的SDK拷贝到你的项目里自定义一个类继承里面的一个WXPayConfig抽象类
publicclassMyWxPayConfigextendsWXPayConfig{ privatebyte[]certData; publicMyWxPayConfig()throwsException{} publicStringgetAppID(){ return"wx4d4838ebec29b8**";//你的appid } publicStringgetMchID(){ return"15508070**";//你的商户号mch_id } publicStringgetKey(){ return"wHtQckdfiRBVF7ceGTcSWEEORt6C0D**";//你的商户号秘钥key } publicInputStreamgetCertStream(){ ByteArrayInputStreamcertBis=newByteArrayInputStream(this.certData); returncertBis; } publicintgetHttpConnectTimeoutMs(){ return8000; } publicintgetHttpReadTimeoutMs(){ return10000; } publicIWXPayDomaingetWXPayDomain(){ //这个方法需要这样实现,否则无法正常初始化WXPay IWXPayDomainiwxPayDomain=newIWXPayDomain(){ publicvoidreport(Stringdomain,longelapsedTimeMillis,Exceptionex){ } publicDomainInfogetDomain(WXPayConfigconfig){ returnnewIWXPayDomain.DomainInfo(WXPayConstants.DOMAIN_API,true);//微信工具常量类有"api.mch.weixin.qq.com";wxpay.unifiedorder()/pay/unifiedorder } }; returniwxPayDomain; } }
找到SDK中的WxPay类修改里面的代码
publicWXPay(finalWXPayConfigconfig,finalStringnotifyUrl,finalbooleanautoReport,finalbooleanuseSandbox)throwsException{ 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=newWXPayRequest(config); }
微信支付接口所需要的参数(前端):https://developers.weixin.qq.com/miniprogram/dev/api/open-api/payment/wx.requestPayment.html
可知前端所需要的参数我们直接反回给他们就ok!
java微信支付代码
//你自己需要定义一个方法 publicstaticvoidmain(String[]args)throwsException{ //统一下单支付 HashMapmap=newHashMap<>(); IdWorkeridWorker=newIdWorker();//自定义订单号类 longout_trade_no=idWorker.nextId();//获取订单号 SortedMap
测试:打印结果
第一次签名后生成的数据主要是支付交易会话标识:prepay_id
第二次签名后再次组装数据返回给前端的数据wx.requestPayment需要接收的数据
容易遇到的错误!容易遇到的错误!容易遇到的错误!
1商户号key不要与appid的secret弄混淆了
2SDK工具类中Wxpay类中this.signType=SignType.HMACSHA256;HMACSHA256改成MD5
3第二次签名需要的五个参数一个不能少appId,nonceStr,package,signType,timeStamp。注意都是以驼峰命名不然也会报错
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。