---
url: "https://pay.weixin.qq.com/doc/v3/merchant/4013053264.md"
title: "如何使用平台证书加密敏感字段"
doc_id: 4013053264
---

>更新时间：2025.03.19

为了保证通信过程中敏感信息字段（如用户的住址、银行卡号、手机号码等）的机密性，微信支付API v3要求商户对上送的敏感信息字段进行加密。与之相对应，微信支付会对下行的敏感信息字段进行加密，商户需解密后方能得到原文。下面详细介绍加解密的方式，以及如何进行相应的计算。

我们提供了微信支付API v3官方SDK（目前包含[Java](https://github.com/wechatpay-apiv3/wechatpay-java#%E6%95%8F%E6%84%9F%E4%BF%A1%E6%81%AF%E5%8A%A0%E8%A7%A3%E5%AF%86)、[PHP](https://github.com/wechatpay-apiv3/wechatpay-php#%E6%95%8F%E6%84%9F%E4%BF%A1%E6%81%AF%E5%8A%A0%E8%A7%A3%E5%AF%86)、[Go](https://github.com/wechatpay-apiv3/wechatpay-go#%E6%95%8F%E6%84%9F%E4%BF%A1%E6%81%AF%E5%8A%A0%E8%A7%A3%E5%AF%86)三种语言版本），使用官方 SDK 调用微信支付接口，无需关心签名生成和验证，接入更方便。

注意：

使用平台证书加密，需要在http请求增加一个Wechatpay-Serial请求头，并传入平台证书序列号"Wechatpay-Serial: 4A4EF961F12345D888A902944179F1F270FC68B3"（此处的平台证书序列号只是一个示例，每个商户号的平台证书序列号不一样，需传入商户号对应的平台证书序列号）



## 1. 加密算法

敏感信息加密使用的[RSA公钥加密算法](https://zh.wikipedia.org/wiki/RSA%E5%8A%A0%E5%AF%86%E6%BC%94%E7%AE%97%E6%B3%95)。加密算法使用的填充方案，我们使用了相对更安全的RSAES-OAEP(Optimal Asymmetric Encryption Padding)。

RSAES-OAEP在各个编程语言中的模式值为：

- [OpenSSL](https://www.openssl.org/docs/manmaster/man3/RSA_public_encrypt.html)，padding设置为RSA\_PKCS1\_OAEP\_PADDING

- Java，使用Cipher.getinstance(RSA/ECB/OAEPWithSHA-1AndMGF1Padding)

- [PHP](https://www.php.net/manual/en/function.openssl-public-encrypt.php)，padding设置为OPENSSL\_PKCS1\_OAEP\_PADDING

- [.NET](https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.rsacryptoserviceprovider.encrypt?view=netframework-4.5.2)，fOAEP设置为true

- [Node.js](https://nodejs.org/api/crypto.html#crypto_crypto_publicencrypt_key_buffer)，padding设置为crypto.constants.RSA\_PKCS1\_OAEP\_PADDING

- [GO](https://pkg.go.dev/crypto/rsa#EncryptOAEP)，使用EncryptOAEP


开发者应当使用微信支付平台证书中的公钥，对上送的敏感信息进行加密。这样只有拥有私钥的微信支付才能对密文进行解密，从而保证了信息的机密性。

另一方面，微信支付使用 商户证书中的公钥对下行的敏感信息进行加密。开发者应使用商户私钥对下行的敏感信息的密文进行解密。

## 2. 加密示例

开发者应当使用微信支付平台证书中的公钥，对上送的敏感信息进行加密。

大部分编程语言支持RSA公钥加密。你可以参考示例，了解如何使用您的编程语言实现敏感信息加密。

JAVA：

```
public static String rsaEncryptOAEP(String message, X509Certificate certificate)
throws IllegalBlockSizeException, IOException {
  try {
    Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding");
    cipher.init(Cipher.ENCRYPT_MODE, certificate.getPublicKey());
    byte[] data = message.getBytes("utf-8");
    byte[] cipherdata = cipher.doFinal(data);
    return Base64.getEncoder().encodeToString(cipherdata);
  } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
    throw new RuntimeException("当前Java环境不支持RSA v1.5/OAEP", e);
  } catch (InvalidKeyException e) {
    throw new IllegalArgumentException("无效的证书", e);
  } catch (IllegalBlockSizeException | BadPaddingException e) {
    throw new IllegalBlockSizeException("加密原串的长度不能超过214字节");
  }
}
```

GO：

```
secretMessage := []byte("send reinforcements, we're going to advance")
rng := rand.Reader
cipherdata, err := EncryptOAEP(sha1.New(), rng, rsaPublicKey, secretMessage, nil)
if err != nil {
        fmt.Fprintf(os.Stderr, "Error from encryption: %s\n", err)
        return
}
ciphertext := base64.StdEncoding.EncodeToString(cipherdata)
fmt.Printf("Ciphertext: %s\n", ciphertext)
```

PHP：

```
private
function getEncrypt($str) {
  //$str是待加密字符串
  $public_key_path = '平台证书路径';
  $public_key = file_get_contents($public_key_path);
  $encrypted = '';
  if (openssl_public_encrypt($str, $encrypted, $public_key, OPENSSL_PKCS1_OAEP_PADDING)) {
    //base64编码
    $sign = base64_encode($encrypted);
  } else {
    throw new Exception('encrypt failed');
  }
  return $sign;
}
```

csharp：

```
///
/// 最终提交请求时，需对敏感信息加密，如身份证、银行卡号。
/// 加密算法是RSA，使用从接口下载到的公钥进行加密，非后台下载到的私钥。
/// 感谢ISV(https://github.com/ndma-isv)提供示例
///
///
/// 要加密的明文
///  -----BEGIN CERTIFICATE----- 开头的string，转为bytes
///
public static string RSAEncrypt(string text, byte[] publicKey)
{
    using (var x509 = new X509Certificate2(publicKey))
    {
        using (var rsa = (RSACryptoServiceProvider)x509.PublicKey.Key)
        {
            var buff = rsa.Encrypt(Encoding.UTF8.GetBytes(text), true);
            return Convert.ToBase64String(buff);
        }
    }
}
```