/// <summary> /// 加密敏感信息字段 /// </summary> /// <remarks> /// <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay4_3.shtml">敏感信息加解密</a></para> /// </remarks> private static void EncryptPrivacyProperty(WeChatPayObject obj, RSA rsa) { foreach (var propertyInfo in obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance)) { if (propertyInfo.PropertyType == typeof(string)) // 为string类型 { if (propertyInfo.IsDefined(typeof(WeChatPayPrivacyPropertyAttribute), false)) // 是否标记为敏感信息 { var value = propertyInfo.GetValue(obj, null); // 获取值 if (value is string strValue) { if (string.IsNullOrEmpty(strValue)) { continue; // 跳过空字符串 } // 加密并将加密串设置回对象 var strEncrypted = OaepSHA1WithRSA.Encrypt(rsa, strValue); propertyInfo.SetValue(obj, strEncrypted, null); } } } else if (propertyInfo.PropertyType.IsClass) { var value = propertyInfo.GetValue(obj, null); // 获取子对象 if (value is null) { continue; // 跳过空值 } if (value is WeChatPayObject weChatPayObject) { EncryptPrivacyProperty(weChatPayObject, rsa); // 继续加密 } else if (value is IList list) // 获取列表对象 { foreach (var item in list) { if (item is WeChatPayObject wcpObj) { EncryptPrivacyProperty(wcpObj, rsa); // 继续加密 } else { break; } } } else { continue; // 跳过其他类型 } } } }
public void PrimaryHandler(WeChatPayDictionary sortedTxtParams, WeChatPayOptions options) { if (string.IsNullOrEmpty(options.RsaPublicKey)) { throw new WeChatPayException($"{nameof(WeChatPayPayBankRequest)}.{nameof(PrimaryHandler)}: {nameof(options.RsaPublicKey)} is empty!"); } sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr()); sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId); sortedTxtParams.Add(WeChatPayConsts.enc_bank_no, OaepSHA1WithRSA.Encrypt(BankNo, options.RsaPublicKey)); sortedTxtParams.Add(WeChatPayConsts.enc_true_name, OaepSHA1WithRSA.Encrypt(TrueName, options.RsaPublicKey)); sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.APIKey, signType)); }
/// <summary> /// 加密敏感信息字段 /// </summary> /// <remarks> /// <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay4_3.shtml">敏感信息加解密</a></para> /// </remarks> private static void EncryptPrivacyProperty(object obj, RSA rsa) { foreach (var prop in obj.GetType().GetProperties()) { if (prop.PropertyType == typeof(string)) // 为string类型 { var val = prop.GetValue(obj, null); // 获取值 if (val is null) // 跳过空值 { continue; } if (prop.IsDefined(typeof(WeChatPayPrivacyPropertyAttribute), false)) // 是否标记为敏感信息 { if (val is string str) { if (string.IsNullOrEmpty(str)) // 跳过空字符串 { continue; } // 加密并将加密串设置回对象。 var encStr = OaepSHA1WithRSA.Encrypt(rsa, str); prop.SetValue(obj, encStr, null); } } } else if (prop.PropertyType.IsClass) { var subObj = prop.GetValue(obj, null); // 获取子对象 if (subObj is null) // 跳过空值 { continue; } if (subObj is not WeChatPayObject) // 跳过除WeChatPayObject和基类为WeChatPayObject以外的一切类型。 { continue; } EncryptPrivacyProperty(subObj, rsa); // 继续加密子对象 } } }
public void PrimaryHandler(WeChatPayOptions options, WeChatPaySignType signType, WeChatPayDictionary sortedTxtParams) { if (string.IsNullOrEmpty(options.RsaPublicKey)) { throw new WeChatPayException("WeChatPayPayBankRequest: RsaPublicKey is null!"); } sortedTxtParams.Add(WeChatPayConsts.nonce_str, WeChatPayUtility.GenerateNonceStr()); sortedTxtParams.Add(WeChatPayConsts.mch_id, options.MchId); var no = OaepSHA1WithRSA.Encrypt(sortedTxtParams.GetValue(WeChatPayConsts.enc_bank_no), options.RsaPublicKey); sortedTxtParams.SetValue(WeChatPayConsts.enc_bank_no, no); var name = OaepSHA1WithRSA.Encrypt(sortedTxtParams.GetValue(WeChatPayConsts.enc_true_name), options.RsaPublicKey); sortedTxtParams.SetValue(WeChatPayConsts.enc_true_name, name); sortedTxtParams.Add(WeChatPayConsts.sign, WeChatPaySignature.SignWithKey(sortedTxtParams, options.Key, signType)); }