微信支付验签失败

微信支付签名错误:
先用别人的沙箱账号测试,排除代码和配置问题
微信支付接口返回“签名错误”的排查方法
1、确认公众号的appSecret和商户号的API密钥没有搞混。
2、重置商户API密钥。(本人亲测是这样解决了问题,tx真是个坑,我严重鄙视。)
3、确认公众号授权的域名和目录是正确的。
4、参数body含有中文字符,改换英文签名成功,那么就转换字符编码试试。

$dat = iconv('UTF-8','ISO8859-1',array2xml($package));

5、以上都试过之后,再仔细对比参数,确认签名算法没有问题,可以使用官网的调试工具验证自己的签名是否正确。
https://pay.weixin.qq.com/wiki/tools/signverify/

在 PHP 中使用微信支付的公钥进行操作时,主要涉及以下几个步骤: 1. **获取微信支付的公钥**:微信支付提供了获取公钥的接口,开发者可以通过调用微信支付的 API 获取公钥。通常,公钥是以 PEM 格式提供的,内容类似于以下结构: ``` -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA... -----END PUBLIC KEY----- ``` 2. **准备名数据**:微信支付会在回调通知中提供名信息(`sign` 字段),以及需要名的数据。通常,名数据是由多个字段拼接而成,并按照特定规则排序后生成的字符串。 3. **使用 OpenSSL 名**:PHP 提供了 `openssl_verify` 函数,可以用于名。需要将微信支付的公钥加载为 OpenSSL 可识别的资源,并对名数据进行证。 以下是 PHP 中使用微信支付公钥的具体实现: ```php <?php // 微信支付回调返回的数据 $data = [ 'return_code' => 'SUCCESS', 'return_msg' => 'OK', 'appid' => 'wx8888888888888888', 'mch_id' => '1900000101', 'nonce_str' => '9A027968729484', 'sign' => '9A027968729484F1F9E652594B52E9C8', // 名值 // 其他字段... ]; // 提取需要名的数据 $signData = []; foreach ($data as $key => $value) { if ($key !== 'sign' && $value !== '') { $signData[$key] = $value; } } // 按照ASCII顺序排序 ksort($signData, SORT_STRING); // 拼接名字符串 $signString = http_build_query($signData) . '&key=' . 'your_merchant_key'; // your_merchant_key 是商户私钥 // 计算名 $calculatedSign = strtoupper(md5($signString)); // 名 if ($calculatedSign === $data['sign']) { echo "证通过"; } else { echo "失败"; } // 如果需要使用公钥证(例如在某些场景下微信支付返回的名需要使用其公钥证) // 加载微信支付公钥 $publicKey = <<<EOD -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA... -----END PUBLIC KEY----- EOD; // 将公钥转换为 OpenSSL 可识别的资源 $pubKeyResource = openssl_pkey_get_public($publicKey); // 待证的原始数据 $originalData = '待证的数据'; // 通常是微信支付回调中的数据,不包含名字段 // 微信支付返回的名值 $signature = hex2bin('微信支付返回的名值'); // 需要将名值从十六进制转换为二进制 // 名 $verifyResult = openssl_verify($originalData, $signature, $pubKeyResource, OPENSSL_ALGO_SHA256); if ($verifyResult === 1) { echo "公钥名成功"; } else { echo "公钥失败"; } ?> ``` ### 注意事项 - **名生成规则**:微信支付名生成规则通常涉及将参数按照 ASCII 顺序排列,并拼接成字符串后进行 MD5 或 SHA256 加密。 - **公钥格式**:确保公钥的格式正确,并且以 PEM 格式提供。 - **证方式**:根据微信支付的文档,部分场景下需要使用公钥名,而部分场景下则使用商户私钥计算名。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值