以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [求助]发送移动短信乱码  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=151008)

--  作者:zcgmxf
--  发布时间:2020/6/12 15:42:00
--  [求助]发送移动短信乱码
老师,现在可以接入移动短信平台,但有个问题,就是output.show(jo(mac))是乱码,不知道怎么解决。谢谢!

U?&????????1?

Dim hc As New HttpClient("http://112.35.1.155:1992/sms/norsubmit")
Dim jo As New JObject
jo("addSerial") = ""
jo("apId") = "dddddd"
jo("content") = "测试短信"
jo("ecName") = "常德市第一中医院"
jo("mobiles") = "13807363451"
jo("secretKey") = "zyyyyy"
jo("sign") = "lPdRggggga"
Dim str As String = jo("ecName").ToString() & jo("apId").ToString() & jo("secretKey").ToString() & jo("mobiles").ToString() & jo("content").ToString() & jo("sign").ToString() & jo("addSerial").ToString() 
Dim md5Hash As System.Security.Cryptography.MD5 = System.Security.Cryptography.MD5.Create()
Dim data As Byte() = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(str))

jo("mac") = Encoding.UTF8.GetString(data)
Dim base64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(jo.ToString))
\'output.Show(base64 )
output.Show(jo("mac"))
hc.Content = base64 
Dim ret As String = hc.GetData()
MessageBox.Show(ret)
[此贴子已经被作者于2020/6/12 15:56:29编辑过]

--  作者:有点蓝
--  发布时间:2020/6/12 15:59:00
--  
http://foxtable.com/bbs/dispbbs.asp?boardid=2&Id=150847&page=1&star=2
--  作者:zcgmxf
--  发布时间:2020/6/12 16:01:00
--  
蓝老师,打不开啊
--  作者:有点蓝
--  发布时间:2020/6/12 16:11:00
--  
自己发的贴打不开?加密后的数据就是这样的,有什么奇怪的?
--  作者:zcgmxf
--  发布时间:2020/6/12 17:11:00
--  
蓝老师,按照文档说明,Mac 应该是一个32位的随机字符串,不应是乱码。请帮忙看看哦。谢谢!

API输入参数签名结果,签名算法:将ecNameapIdsecretKeymobilescontentsignaddSerial按照顺序拼接,然后通过md5(32位小写,值的拼接,中间无符号)计算后得出的值


就是加密:Dim str As String = jo("ecName").ToString() & jo("apId").ToString() & jo("secretKey").ToString() & jo("mobiles").ToString() & jo("content").ToString() & jo("sign").ToString() & jo("addSerial").ToString() 


也就是str 如何得到一个32位的字符串?

[此贴子已经被作者于2020/6/12 17:29:53编辑过]

--  作者:有点蓝
--  发布时间:2020/6/12 17:31:00
--  
你理解错了,意思是使用32位的加密算法。

如果不正确,找移动要.net源码。如果没有就换其他短信平台吧

--  作者:zcgmxf
--  发布时间:2020/6/13 7:33:00
--  
蓝老师,下面这个网址你打开看看。就是加密后生成的mac 要和这个一样
http://tool.chinaz.com/tools/md5.aspx

譬如:常德市第一中医院dddzzzfffgggg13807363451测试短信lPdRneeee  

 32加密后的小写字符串 :ee5f7c6c132a258ea2bcba4d21a9da0f
下面这个是在网上找到的,执行报错,我也看不懂。

MD5加密 生成32位md5

 Function MD5(ByVal strSource As String, ByVal Code As Int16) As String
        Dim dataToHash As Byte() = (New System.Text.ASCIIEncoding).GetBytes(strSource)
        Dim hashvalue As Byte() = CType(System.Security.Cryptography.CryptoConfig.CreateFromName("MD5"), System.Security.Cryptography.HashAlgorithm).ComputeHash(dataToHash)
        Dim ATR As String = ""
        Dim i As Integer
        Select Case Code
            Case 16      \'选择16位字符的加密结果   
                For i = 4 To 11
                    ATR &= Hex(hashvalue(i)).PadLeft(2, "0").ToLower
 
                Next
            Case 32      \'选择32位字符的加密结果   
                For i = 0 To 15
                    ATR &= Hex(hashvalue(i)).PadLeft(2, "0").ToLower
                Next
            Case Else       \'Code错误时,返回全部字符串,即32位字符   
                For i = 0 To 15
                    ATR &= Hex(hashvalue(i)).PadLeft(2, "0").ToLower
                Next
        End Select
        Return ATR
End Function
[此贴子已经被作者于2020/6/13 8:18:02编辑过]

--  作者:有点蓝
--  发布时间:2020/6/13 9:31:00
--  
把上面的代码最前面加上public,放到全局代码
如:
public Function MD5(ByVal strSource As String, ByVal Code As Int16) As String
        Dim dataToHash As Byte() = (New System.Text.ASCIIEncoding).GetBytes(strSource)
……

然后命令窗口测试:
Dim s As String = "常德市第一中医院dddzzzfffgggg13807363451测试短信lPdRneeee"
Output.Show(md5(s,32))

如果结果也不是预期的,说明算法不一样。MD5有多种算法,如果官方不给实例,就自己在找找其他算法吧,或者就不要折腾了

--  作者:zcgmxf
--  发布时间:2020/6/14 5:54:00
--  
谢谢蓝老师,昨天网上看了一天的资料,今天早上反复看了代码,把ASCIIEncoding  改成 UTF8Encoding 就行了。再次感谢!