首页 技术文章 php

微信支付jsapi支付提示chooseWXPay:fail, the permission value is offline verifying

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

微信支付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);

觉得哪个方法方便用哪个。