从Ruby连接到适用于Windows Phone 8的Microsoft推送通知服务

从Ruby连接到适用于Windows Phone 8的Microsoft推送通知服务,ruby,ssl,notifications,windows-phone-8,push,Ruby,Ssl,Notifications,Windows Phone 8,Push,我们正在开发一个需要推送通知的WP8应用程序。 为了测试它,我们使用CURL命令行运行push-notification-POST请求,确保它实际连接、使用客户端SSL证书进行身份验证并发送正确的数据。我们知道这是一个事实,当我们接收到设备的推力时,它就起作用了 这是用于测试目的的CURL命令: curl --cert client_cert.pem -v -H "Content-Type:text/xml" -H "X-WindowsPhone-Target:Toast" -H "X-Noti

我们正在开发一个需要推送通知的WP8应用程序。 为了测试它,我们使用CURL命令行运行push-notification-POST请求,确保它实际连接、使用客户端SSL证书进行身份验证并发送正确的数据。我们知道这是一个事实,当我们接收到设备的推力时,它就起作用了

这是用于测试目的的CURL命令:

curl --cert client_cert.pem -v -H "Content-Type:text/xml" -H "X-WindowsPhone-Target:Toast" -H "X-NotificationClass:2" -X POST -d "<?xml version='1.0' encoding='utf-8'?><wp:Notification xmlns:wp='WPNotification'><wp:Toast><wp:Text1>My title</wp:Text1><wp:Text2>My subtitle</wp:Text2></wp:Toast></wp:Notification>" https://db3.notify.live.net/unthrottledthirdparty/01.00/AAF9MBULkDV0Tpyj24I3bzE3AgAAAAADCQAAAAQUZm52OkE1OUZCRDkzM0MyREY1RkE
curl--cert client\u cert.pem-v-H“内容类型:text/xml”-H“X-WindowsPhone-Target:Toast”-H“X-NotificationClass:2”-X POST-d“我的标题字幕”https://db3.notify.live.net/unthrottledthirdparty/01.00/AAF9MBULkDV0Tpyj24I3bzE3AgAAAAADCQAAAAQUZm52OkE1OUZCRDkzM0MyREY1RkE
当然,我们的SSL证书需要实际使用URL,但我希望其他人已经这样做了,可以看到我们做错了什么

现在,我们的问题是我们需要用Ruby来实现这一点,这是我们迄今为止无法实现的

我们已经尝试过使用HTTParty,但没有运气,也尝试过直接使用net/http

下面是我用来测试的一个非常简单的HTTParty测试脚本:

require "httparty"

payload = "<?xml version='1.0' encoding='utf-8'?><wp:Notification xmlns:wp='WPNotification'><wp:Toast><wp:Text1>My title</wp:Text1><wp:Text2>My subtitle</wp:Text2></wp:Toast></wp:Notification>"
uri = "https://db3.notify.live.net/unthrottledthirdparty/01.00/AAF9MBULkDV0Tpyj24I3bzE3AgAAAAADCQAAAAQUZm52OkE1OUZCRDkzM0MyREY1RkE"

opts = {
  body: payload,
  headers: {
    "Content-Type" => "text/xml",
    "X-WindowsPhone-Target" => "Toast",
    "X-NotificationClass" => "2"
  },
  debug_output: $stderr,
  pem: File.read("/Users/kenny/Desktop/client_cert.pem"),
  ca_file: File.read('/usr/local/opt/curl-ca-bundle/share/ca-bundle.crt')
}

resp = HTTParty.post uri, opts
puts resp.code
需要“httparty”
payload=“我的标题字幕”
uri=”https://db3.notify.live.net/unthrottledthirdparty/01.00/AAF9MBULkDV0Tpyj24I3bzE3AgAAAAADCQAAAAQUZm52OkE1OUZCRDkzM0MyREY1RkE"
选项={
机身:有效载荷,
标题:{
“内容类型”=>“文本/xml”,
“X-WindowsPhone-Target”=>“Toast”,
“X-NotificationClass”=>“2”
},
调试输出:$stderr,
pem:File.read(“/Users/kenny/Desktop/client_cert.pem”),
ca_文件:file.read('/usr/local/opt/curl-ca-bundle/share/ca-bundle.crt')
}
resp=HTTParty.post uri,选项
放置响应代码
这似乎与SSL正确连接,但由于某些原因,MS IIS服务器返回403给我们,我们无法得到

下面是我使用net/http尝试过的基本相同的东西:

require "net/http"

url = URI.parse "https://db3.notify.live.net/unthrottledthirdparty/01.00/AAF9MBULkDV0Tpyj24I3bzE3AgAAAAADCQAAAAQUZm52OkE1OUZCRDkzM0MyREY1RkE"
payload = "<?xml version='1.0' encoding='utf-8'?><wp:Notification xmlns:wp='WPNotification'><wp:Toast><wp:Text1>My title</wp:Text1><wp:Text2>My subtitle</wp:Text2></wp:Toast></wp:Notification>"
pem_path = "./client_cert.pem"
cert = File.read pem_path

http = Net::HTTP.new url.host, url.port
http.use_ssl = true
http.cert = OpenSSL::X509::Certificate.new cert
http.key = OpenSSL::PKey::RSA.new cert
http.ca_path = '/etc/ssl/certs' if File.exists?('/etc/ssl/certs') # Ubuntu
http.ca_file = '/usr/local/opt/curl-ca-bundle/share/ca-bundle.crt' if File.exists?('/usr/local/opt/curl-ca-bundle/share/ca-bundle.crt') # Mac OS X
http.verify_mode = OpenSSL::SSL::VERIFY_PEER

r = Net::HTTP::Post.new url.path
r.body = payload
r.content_type = "text/xml"
r["X-WindowsPhone-Target"] = "toast"
r["X-NotificationClass"] = "2"

http.start do
  resp = http.request r
  puts resp.code, resp.body
end
需要“net/http”
url=URI.parse“https://db3.notify.live.net/unthrottledthirdparty/01.00/AAF9MBULkDV0Tpyj24I3bzE3AgAAAAADCQAAAAQUZm52OkE1OUZCRDkzM0MyREY1RkE"
payload=“我的标题字幕”
pem_path=“/客户证书pem”
cert=File.read pem\u路径
http=Net::http.new url.host,url.port
http.use_ssl=true
http.cert=OpenSSL::X509::Certificate.new cert
http.key=OpenSSL::PKey::RSA.new证书
http.ca_path='/etc/ssl/certs'如果File.exists?('/etc/ssl/certs')#Ubuntu
http.ca_file='/usr/local/opt/curl ca bundle/share/ca bundle.crt'如果file.exists?('/usr/local/opt/curl ca bundle/share/ca bundle.crt')#Mac OS X
http.verify\u mode=OpenSSL::SSL::verify\u PEER
r=Net::HTTP::Post.new url.path
r、 车身=有效载荷
r、 content\u type=“text/xml”
r[“X-WindowsPhone-Target”]=“toast”
r[“X-NotificationClass”]=“2”
http.start-do
resp=http.r请求
放置相应的代码,相应的主体
结束
与HTTParty版本一样,这也返回403

我开始觉得这在net/http上实际上是行不通的,但我也看到了一些声称有效的代码示例,但与我们在这里测试的代码相比,我看不出有什么不同

有人知道如何解决这个问题吗?可能吗?也许我应该使用libcurl吗?或者甚至对curl进行系统调用?(如果我们不能很快实现这一点,我可能不得不做最后一个作为临时解决方案)

非常感谢您的任何意见

谢谢, Kenny

尝试使用一些工具,比如比较来自代码和curl的请求

例如,除了指定的头确实发送
用户代理
接受
头之外,microsoft服务器可能出于某种原因正在检查这些头


如果这没有帮助-那么这是与ssl相关的

您的方面有什么进展吗?我一直在使用类似的代码从Node.js进行尝试,但被卡住了。我希望我能在开发中心区域看到一个错误日志,以获取证书或帮助诊断问题所在。很抱歉,回复太晚,但无法使其正常工作。我们现在不得不求助于呼叫CURL。。