微信支付验证或签名失败是什么原因?附三种解决方案

微信支付验证或签名失败是什么原因?附三种解决方案

微信支付作为当前商业社会中非常流行的一种支付方式,被广泛应用于各个行业。但是,随着微信支付的不断升级和优化,有时会出现微信支付验证或签名失败的情况。那么,微信支付验证或签名失败的原因是什么?如何解决?本文将从这两个方面进行详细介绍。

1. 微信支付验证或签名失败的原因

(1) 时间戳失效

在微信支付中,请求支付必须带有三个参数:appid、mch_id和nonce_str。其中nonce_str是一个随机字符串,但其实有效期只有2小时,如果时间戳失效,可能会导致签名验证失败。请务必确保nonce_str参数的生成时间在2小时内。

(2) 签名错误

签名作为微信支付中的一项重要保障,其生成规则很复杂。如果签名错误,那么微信支付验证或签名失败也是必然结果。签名过程中需要参与签名的参数也较多,比如:随机字符串nonce_str、时间戳timestamp、商户号mch_id、预支付ID prepay_id等等。其中签名算法的实现过程可能会出现错误,需要仔细检查签名过程中的参数、方法和顺序等其他因素。

(3) 支付参数不正确

支付参数不正确也可能导致微信支付验证或签名失败。在提交支付请求时,需要将请求参数放到统一的请求格式中,具体内容包括:sign签名、商户号、商户订单号、支付类型、支付金额、时间戳和IP等。如果请求参数过程中,以上参数值设置错误、重复、漏报等情况均可能出现支付失败或者验证失败的情况。

2. 解决方案

(1) 时间戳验证失败的解决方案

保证nonce_str参数的生成时间在2小时内,可以通过以下方法来获取时间戳:

{

“timestamp”: new Date().getTime();

}

(2) 签名错误的解决方案

在生成签名时需要参与签名的参数较多,在签名的过程中可能会出现签名错误的情况。解决的方法是逐步排查该过程中的各个步骤,可以通过以下方法进行排查:

var has = Object.prototype.hasOwnProperty;

// 对传进来的 object 进行 key 排序

function sortKeys(obj, keys){

return keys.sort().map(function(key){

if (has.call(obj, key)){

return key + "=" + obj[key];

}

else if (key === 'sign'){

return '';

}

throw new Error("Unknown property '" + key + "'");

}).join('&');

}

var self = this;

let rawStr = sortKeys(self.fields, Object.keys(self.fields));

// 签名前需要先将参数进行排序

let toSignStr = `${rawStr}&key=${WECHAT_POLICY_KEY}`;

// 生成签名

let sign = CryptoJS.MD5(toSignStr).toString().toUpperCase();

(3) 支付参数不正确的解决方案

验证支付时,必须要使用正确的参数。以下是正确的支付参数设置示例:

{

"appid": Config.appId,

"partnerid": Config.mchId,

"prepayid": r.package,

"package": r.package,

"noncestr": r.nonceStr,

"timestamp": parseInt(r.timeStamp),

"sign": r.sign

}

总的来说,微信支付验证或签名失败可能是由于时间戳失效、签名错误或支付参数不正确等原因触发的。对于这些情况,我们可以针对具体问题逐一排查和解决。通过有效的解决方案,我们可以更好地提高微信支付的成功率及验签的通过率,保证企业的正常运营。