问题已经解决 首先感谢楼上两位朋友的帮助,特别感谢北望沣渭兄弟明确的指出了问题所在和解决方法!! 前端使用的是微信jssdk, 后端使用的是微信php sdk_v3, v2请略过 本次开发,支付验证签名失败的原因有以下几点: 签名字段大小写问题, 签名字段多余问题sdk_v3发起的预支付,签名必须对应的使用用rsa二次签名阅读文档时没有分清v2和v3, 导致加密签名试过了MD5和HMAC_SH2都不行 简单附上本次流程和容易踩的坑 //第一步: 获取微信授权链接, 主要是用来获取用户openId的,参数scope选择的是静默跳转 // https://open.weixin.qq.com/connect/oauth2/authorize?appid={$app_id}&redirect_uri={$redirect_uri}&response_type=code&scope=snsapi_base&state={$state}#wechat_redirect // 这里的$redirect_uri 必须要url编码 // 第二步: 利用上一步得到的get参数code 获取授权token网页授权 // appsecret 在公众号平台->设置与开发->基本配置里设置 // https://api.weixin.qq.com/sns/oauth2/access_token?appid={$appid}&secret={$appsecret}&code={$code}&grant_type=authorization_code // 成功后会得到jsapi预支付必传参数openId // 第三步: 利用v3_sdk jsapi发起预支付, 请求成功后会获得 预支付标识prepay_id // 然后就开始加密了,jssdk的wx.chooseWXPay方法使用 // 签名数据, 4个参数,不要传多,也不需要拼接什么, 注意大小写. 加密方法要和发起预支付的方法相同,楼上朋友有提供,v3只支持RSH加密 我就是这里耽误几天各种尝试,什么md5加密,hmac-sha256加密(估计我看错了文档) $sign_data = [ 'appId' => $config['appID'], 'timeStamp' => strval($info['timestamp']), // 11位时间戳 'nonceStr' => $info['nonceStr'], // 支付签名随机串,不长于 32 位 'package' => $info['package'], // 这个地方很关键, 时面是预支付标识prepay_id=xxxxxxxxx,必须加上prepay_id= ]; // jssdk的wx.config参数加密, 这里的键都要小写, noncestr和timestamp参数必须和上面相同,而且只能使用sha1加密,把参数键值拼接后还要加上商户平台设置的密钥key // url不要进行编码,不然会把url参数中的特殊字符转义 // jsapi_ticket根据token到链接 https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=' . $app_token['token'] . '&type=jsapi' 获取 // access_token是公众号的access_token, 不是上面获取openid返回的access_token, 而且公众号token和jsapi_ticket有请求次数限制,都要做缓存(2小时左右) $signature = [ 'noncestr' => $info['nonceStr'], 'jsapi_ticket' => $info['ticket'], 'timestamp' => strval($info['timestamp']), 'url' => 'https://xxx.com/' ]; // 最后jssdk参数参考文档https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#3,还是要注意大小写 // wx.config参数: debug appId timestamp nonceStr jsApiList signature // wx.chooseWXPay参数: timestamp nonceStr package signType paySign // url未注册问题: 到商户平台->产品中心->开发配置里面添加SAPI支付 支付授权目录
微信jsapi支付:支付签名验证失败(五天了!!!百度翻个遍)// 后端: php // wx.chooseWXPay签名数据, 这个已经到校验工具试过,签名没有问题 $sign_data = [ 'appId' => $config['appID'], 'timeStamp' => strval($info['timestamp']), // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。 //但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 'nonceStr' => $info['nonceStr'], // 支付签名随机串,不长于 32 位 'package' => $info['package'], // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*) 'signType' => 'HMAC-SHA256' // 签名方式,默认为'SHA1',使用新版支付需传入'MD5' ]; // wx.config签名数据 拼接字符串然后使用sha1加密 strtoupper(hash_hmac("sha1", $str, $mach_key)) $signature = [ 'noncestr' => $info['nonceStr'], 'jsapi_ticket' => $info['ticket'], 'timestamp' => strval($info['timestamp']), 'url' => 'https://m.***.com/' ]; 我想知道, 我后端sdk使用的是V3版本, 这个加密key究竟使用API还是apiV3的key????两种都试了,还是签名失败,整个人都被你们微信支付折磨疯了 菜是原罪,我承认,可是翻过百度几十页, 实在没办法了,也不是知道是jsapi jsdk的问题还是什么问题,jsdk使用的是vue的,就是支付签名失败,也没有详细错误 想骂人但是没有资格,微信技术,能否救俺一命或者饶俺一命??????? I need help!
2021-11-09