收藏
回答

服务商特约商户进件提交申请单密文加密错误

错误信息:

{"code""PARAM_ERROR","message""请确认待处理的消息是否为加密后的密文"}

看到特约商户更新了文档之后,我采用的是最新的API-v3接口规则

请求头如下(证书序列号是微信支付平台序列号):

array("Content-Type: application/json","Accept:application/json","User-Agent:".$_SERVER['HTTP_USER_AGENT'],"Authorization:"$this->authorization,"Wechatpay-Serial:"$this->cert_sn)

验签如下(验签使用的是商户平台私钥):

$url_parts = parse_url($url);
$canonical_url = ($url_parts['path'] . (!empty($url_parts['query'])) ? "?${url_parts['query']}" : ""));
$message = strtoupper($http_method).'\n'.canonical_url.'\n'.
    $timestamp.'\n'.
    $nonce.'\n'.
    $body.'\n';
$pri_key_string = file_get_contents($this->apiclient_key);
$pri_key = openssl_get_privatekey($pri_key_string);
if(!openssl_sign(message, raw_sign, pri_key, 'sha256WithRSAEncryption')){
    throw new WxPayException('make sign failed:'.PHP_EOL);
}
$sign = base64_encode($raw_sign);

加密敏感信息(使用微信支付平台公钥):

$pub_key_string = file_get_contents($this->cert_path);
$pub_key = openssl_get_publickey($pub_key_string);
$encrypted = '';
if(openssl_public_encrypt($str,$encrypted,$pub_key,OPENSSL_PKCS1_OAEP_PADDING)){
    return base64_encode($encrypted);
}

麻烦看一下是什么问题,官方给的错误信息没有明确指出是哪个字段加密出错,现在找不到处理的办法了。

最后一次编辑于  2019-12-31
回答关注问题邀请回答
收藏

9 个回答

  • 北望沣渭
    北望沣渭
    2020-06-02

    https://github.com/wechatpay-apiv3/wechatpay-guzzle-middleware/pull/18 这个0侵入的加/解密方案,可以尝试下。

    use WechatPay\GuzzleMiddleware\Util\SensitiveInfoCodec as Codec;
    // Codec默认为加密模式,实例后直接当方法用即可
    $encryptor = new Codec(PemUtil::loadCertificate('/downloaded/public.pem'));
    // POST 语法糖
    $resp = $client->post('/v3/applyment4sub/applyment/', [
        'json' => [
            'business_code' => 'APL_98761234',
            'contact_info'  => [
                'contact_name'      => $encryptor('窃格瓦拉'),
                'contact_id_number' => $encryptor('45012119841227000X'),
                'mobile_phone'      => $encryptor('12345678901'),
                'contact_email'     => $encryptor('noop@real.world'),
            ],
            //...
        ],
        'headers' => [
            // 命令行获取证书序列号
            // openssl x509 -in /downloaded/public.pem -noout -serial | awk -F= '{print $2}'
            'Wechatpay-Serial' => 'must be the serial number via the downloaded pem file of `/v3/certificates`',
            'Accept'           => 'application/json',
        ],
    ]);
    
    2020-06-02
    有用 1
    回复
  • 静候花开
    静候花开
    2023-06-26

    req username 不设置就不会报这个错

    2023-06-26
    有用
    回复
  • 千帆船
    千帆船
    2021-12-09

    同样的问题,不知道哪些参数需要加密,哪些参数不需要加密,也没个说明

    2021-12-09
    有用
    回复
  • tian
    tian
    2021-02-03

    https://github.com/wechatpay-apiv3/wechatpay-apache-httpclient/blob/master/src/main/java/com/wechat/pay/contrib/apache/httpclient/util/RsaCryptoUtil.java

    我是使用官方提供的加密方法(方法的证书参数是微信平台证书),尝试对请求json中的每一个参数加密,然后再做减法依次取消一个参数,直到最后只剩对一个姓名加密,就不报错了

    2021-02-03
    有用
    回复
  • _jekyll
    _jekyll
    2020-12-07

    解决了,contactme:qq1198551705

    2020-12-07
    有用
    回复
  • 冬雪ルo
    冬雪ルo
    2020-07-28

    麻烦您说一下您的问题出在哪了?我现在也是出了这个问题

    2020-07-28
    有用
    回复
  • Zend Rhythm
    Zend Rhythm
    2019-12-31

    解决了。

    2019-12-31
    有用
    回复 7
    查看更多(2)
  • 微信支付技术助手1
    微信支付技术助手1
    2019-12-31

    这边是上传了敏感数据吧,要加密的。关键加密数据的格式需要参考文档。仔细参考文档核对一下。

    2019-12-31
    有用
    回复 6
    • Zend Rhythm
      Zend Rhythm
      2019-12-31
      部分加密后的字段如下,加密是成功的,老版本采用的是OPENSSL_PKCS1_PADDING加密一直是成功的,新版本采用的是OPENSSL_PKCS1_OAEP_PADDING用的是同一个公钥,但是不知道为什么微信接口返回的失败。
      2019-12-31
      回复
    • Zend Rhythm
      Zend Rhythm
      2019-12-31
      请官方确认后给个答复,在线等,急......
      2019-12-31
      回复
    • 释然
      释然
      2020-07-28
      发个文档链接吧  没找到
      2020-07-28
      回复
    • __C
      __C
      2020-10-27
      请问 加密是成功的 提示请确认待处理的消息是否为加密后的密文? 咋回事
      2020-10-27
      回复
    • _jekyll
      _jekyll
      2020-12-04
      说得不清不楚,难过
      2020-12-04
      回复
    查看更多(1)
  • 王浩Hanks🇨🇳
    王浩Hanks🇨🇳
    2019-12-31

    谢邀,首先看不懂php,再一个没做过你这,等官方看下吧

    2019-12-31
    有用
    回复
登录 后发表内容
问题标签