微信支付jsapi支付提示chooseWXPay:fail, the permission value is offline verifying
发布日期: 2024-05-26
FontSize: 【小 中 大】

微信支付v3,jsapi支付提示chooseWXPay:fail, the permission value is offline verifying,出现这种情况,您大概率是在微信开发者工具里面看到这句提示。
您可以尝试一下在微信(您的手机微信)里面打开,如果正常,就不用再找错误原因了。
微信支付v3的SDK好像没有生成paySign,paySign在jsapi调起微信支付的时候需要使用。
php生成paySign
/*签名*/
$jsapi['appId'] = 'wx***';//商户申请的公众号对应的AppID,由微信支付生成,若下单时传了sub_appid,可为sub_appid的值。
$jsapi['timeStamp'] = $_SERVER['REQUEST_TIME'];//时间戳,标准北京时间,时区为东八区,自1970年1月1日 0点0分0秒以来的秒数,10位数字。
$jsapi['nonceStr'] = 'abcdefg';//随机字符串,不长于32位。
$jsapi['package'] = 'prepay_id=wx1234562989820821cf76f35dd4c85e8888';//JSAPI下单接口返回的prepay_id参数值
//构造签名串,签名串一共有四行,每一行为一个参数。行尾以\n(换行符,ASCII编码值为0x0A)结束,包括最后一行。如果参数本身以\n结束,也需要附加一个\n
$plaintext = $jsapi['appId']."\n".$jsapi['timeStamp']."\n".$jsapi['nonceStr']."\n".$jsapi['package']."\n";
// 读取私钥内容
$privateKey = openssl_get_privatekey(file_get_contents('path/apiclient_key.pem'));
// 进行 SHA256 签名
openssl_sign($plaintext, $signature, $privateKey, OPENSSL_ALGO_SHA256);
$jsapi['signType'] = 'RSA';//签名类型,默认为RSA,仅支持RSA。
$jsapi['paySign'] = base64_encode($signature);//签名,使用字段AppID、timeStamp、nonceStr、package计算得出的签名值
示例中的值请替换成自己的数据,包括appId、nonceStr、package、path/apiclient_key.pem(私钥地址),请注意区别大小写。
然后使用微信支付提供的前端JS方法调起公众号支付,把上面的数据代入代码中,参数名称都一样,应该很容易看明白。
function onBridgeReady() {
WeixinJSBridge.invoke('getBrandWCPayRequest', {
"appId": "wx2421b1c4370ec43b", //公众号ID,由商户传入
"timeStamp": "1395712654", //时间戳,自1970年以来的秒数
"nonceStr": "e61463f8efa94090b1f366cccfbbb444", //随机串
"package": "prepay_id=up_wx21201855730335ac86f8c43d1889123400",
"signType": "RSA", //微信签名方式:
"paySign": "oR9d8PuhnIc+YZ8cBHFCwfgpaK9gd7vaRvkYD7rthRAZ\/X+QBhcCYL21N7cHCTUxbQ+EAt6Uy+lwSN22f5YZvI45MLko8Pfso0jm46v5hqcVwrk6uddkGuT+Cdvu4WBqDzaDjnNa5UK3GfE1Wfl2gHxIIY5lLdUgWFts17D4WuolLLkiFZV+JSHMvH7eaLdT9N5GBovBwu5yYKUR7skR8Fu+LozcSqQixnlEZUfyE55feLOQTUYzLmR9pNtPbPsu6WVhbNHMS3Ss2+AehHvz+n64GDmXxbX++IOBvm2olHu3PsOUGRwhudhVf7UcGcunXt8cqNjKNqZLhLw4jq\/xDg==" //微信签名
},
function(res) {
if (res.err_msg == "get_brand_wcpay_request:ok") {
// 使用以上方式判断前端返回,微信团队郑重提示:
//res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
}
});
}
if (typeof WeixinJSBridge == "undefined") {
if (document.addEventListener) {
document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
} else if (document.attachEvent) {
document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
}
} else {
onBridgeReady();
}
res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。意思是您不能使用这个来判断支付已经成功。您可以使用支付通知或主动查询来判断。
prepay_id参数请直接使用微信支付官方的示例。微信支付官方开发文档:https://pay.weixin.qq.com/wiki/doc/apiv3_partner/pages/index.shtml
官方SDK示例
找到官方SDK示例,jsapi支付参数签名示例:
use WeChatPay\Formatter;
use WeChatPay\Crypto\Rsa;
$merchantPrivateKeyFilePath = 'file:///path/to/merchant/apiclient_key.pem';
$merchantPrivateKeyInstance = Rsa::from($merchantPrivateKeyFilePath);
$params = [
'appId' => 'wx8888888888888888',
'timeStamp' => (string)Formatter::timestamp(),
'nonceStr' => Formatter::nonce(),
'package' => 'prepay_id=wx201410272009395522657a690389285100',
];
$params += ['paySign' => Rsa::sign(
Formatter::joinedByLineFeed(...array_values($params)),
$merchantPrivateKeyInstance
), 'signType' => 'RSA'];
echo json_encode($params);
觉得哪个方法方便用哪个。