我在尝试使用Convert.FromBase64String
时遇到以下错误“输入不是有效的Base-64字符串,因为它包含非基本64个字符,两个以上的填充字符或填充字符中的非空白字符。”
Dim payloadBytes = Convert.FromBase64String(payloadBase64)
基本上,当我的Facebook注册表格(http://developers.facebook.com/docs/plugins/registration/)手机字段中有一个短划线并且编码的字符串被发布到其他页面而我正在尝试解码它这会产生这个错误。基本上我试图从Facebook签名请求中提取数据。
答案 0 :(得分:2)
问题是破折号不是Base64String中的有效字符。以下是MSDN的引用:
从零开始按升序排列的base-64数字是大写字符" A"到" Z",小写字符" a"到" z",数字" 0"到" 9"和符号" +"和" /"。无值字符" ="用于尾随填充。
你可以拿出破折号(这可能不是你想要的)或你需要弄清楚数据真正进入的格式,因为它看起来不像是Base-64字符串数据
http://msdn.microsoft.com/en-us/library/system.convert.frombase64string.aspx
问题在于Facebook签名请求正在使用经过修改的Base-64 URL请求来更改一些内容。以下是它的作用:
出于这个原因,存在修改后的Base64 for URL变体,其中没有填充' ='将被使用,' +'和' /'标准Base64的字符分别替换为' - '和' _',因此不再需要使用URL编码器/解码器,并且对编码值的长度没有影响,保留相同的编码形式,以便在关系数据库,Web表单和对象中使用一般的标识符。
我相信您可以通过简单地用加号替换短划线并用反斜杠替换下划线来解决您的问题,然后您应该能够从Base-64解码它。
以下是Facebook开发者页面的链接,指示您尝试解码的值是base64url编码:
http://developers.facebook.com/docs/authentication/signed_request/
答案 1 :(得分:0)
您是否尝试将其编码为Base64或解码编码为Base64的内容?从它的外观来看,你应该使用Convert.ToBase64String
。
- 绝对不是将出现在Base64编码字符串中的字符。
您确定从Facebook签名请求中获取了有效的Base64编码字符串吗?
答案 2 :(得分:0)
我在同一任务上也遇到了同样的问题
我正在使用ifram,一切正常,然后在同一页面上我用xfbml注册代码替换了ifrm代码,当我再次检查它时它给出了以下错误 “输入不是有效的Base-64字符串,因为它包含非基本64个字符,两个以上的填充字符或填充字符中的非空白字符。” 我花了很多时间来解决这个问题,但问题仍然存在,最后我想到了临时的互联网文件,我删除了那些文件,之后我测试它工作正常。
您也可以尝试此解决方案。
答案 3 :(得分:0)
<%@ Page Language="vb" %>
<%
Dim strSignedRequest As String
strSignedRequest = Request("signed_request")
If String.IsNullOrEmpty(strSignedRequest) = False Then
Dim arrayRequest As Array
arrayRequest = Split(strSignedRequest, ".")
Dim strPayload As String
strPayload = arrayRequest(1)
strPayload = Replace(strPayload, "-", "+")
strPayload = Replace(strPayload, "_", "/")
' padding, FromBase64String() will barf if the string is the wrong length so we need to pad it with =
strPayload = strPayload.PadRight(strPayload.Length + (4 - strPayload.Length Mod 4) Mod 4, "="C)
Dim bytSignedRequest As Byte()
bytSignedRequest = Convert.FromBase64String(strPayload)
Dim strJson As String
strJson = Encoding.UTF8.GetString(bytSignedRequest)
'Response.Write("encoded: " & strPayload)
Response.Write("decoded: " & strJson)
End If
%>