為了保證通信過程中敏感信息字段(如用戶的住址、銀行卡號、手機號碼等)的機密性,微信支付API v3要求商戶對上送的敏感信息字段進行加密。與之相對應,微信支付會對下行的敏感信息字段進行加密,商戶需解密后方能得到原文。下面詳細介紹加解密的方式,以及如何進行相應的計算。
我們提供了微信支付API v3官方SDK(目前包含Java (opens new window)、PHP (opens new window)、 Go (opens new window)三種語言版本),使用官方 SDK 調(diào)用微信支付接口,無需關(guān)心簽名生成和驗證,接入更方便。
# 1. 加密算法
敏感信息加密使用的RSA公鑰加密算法 (opens new window)。加密算法使用的填充方案,我們使用了相對更安全的RSAES-OAEP(Optimal Asymmetric Encryption Padding)。
RSAES-OAEP在各個編程語言中的模式值為:
- OpenSSL (opens new window),padding設(shè)置為
RSA_PKCS1_OAEP_PADDING
- Java,使用
Cipher.getinstance(RSA/ECB/OAEPWithSHA-1AndMGF1Padding)
- PHP (opens new window),padding設(shè)置為
OPENSSL_PKCS1_OAEP_PADDING
- .NET (opens new window),fOAEP設(shè)置為true
- Node.js (opens new window),padding設(shè)置為
crypto.constants.RSA_PKCS1_OAEP_PADDING
- GO (opens new window),使用
EncryptOAEP
開發(fā)者應當使用微信支付平臺證書中的公鑰,對上送的敏感信息進行加密。這樣只有擁有私鑰的微信支付才能對密文進行解密,從而保證了信息的機密性。
另一方面,微信支付使用?商戶證書中的公鑰對下行的敏感信息進行加密。開發(fā)者應使用商戶私鑰對下行的敏感信息的密文進行解密。
# 2. 加密示例
開發(fā)者應當使用微信支付平臺證書中的公鑰,對上送的敏感信息進行加密。
大部分編程語言支持RSA公鑰加密。你可以參考示例,了解如何使用您的編程語言實現(xiàn)敏感信息加密。
# 3. 聲明加密使用的平臺證書
某些情況下,微信支付會更新平臺證書。這時,商戶有多個微信支付平臺證書可以用于加密。為了保證解密順利,商戶發(fā)起請求的HTTP頭部中應包括聲明加密所用的平臺證書。
- 商戶上送敏感信息時使用微信支付平臺公鑰加密,證書序列號包含在請求HTTP頭部的Wechatpay-Serial
# 4. 解密示例
微信支付使用商戶API證書中的公鑰對下行的敏感信息進行加密。開發(fā)者應使用商戶私鑰對下行的敏感信息的密文進行解密。
同樣的,大部分編程語言支持RSA私鑰解密。你可以參考示例,了解如何使用您的編程語言實現(xiàn)敏感信息解密。