From: orangekay <84cdz4d02@...> Date: 2005-09-30T22:51:45+09:00 Subject: Re: Client certificates with https I'm pathetically replying to my own post with the solution I have come up with since there is absolutely no example code for getting Ruby to talk to the Linkpoint gateway out there. Hopefully it will get indexed and help someone else who finds themselves in a similar position someday. This example posts a phony order to the testing server. In order to talk to the real server, you'll simply need to change the host to "secure.linkpoint.net" in the URL. You'll need to supply your store number in the "configfile" element of the XML, and you'll need to provide a valid path to your own PEM file to File.read. Once those things are done, you should get a response and be ready to take it from there. --------------------------------- #!/usr/bin/ruby require 'net/https' require 'uri' require 'rexml/document' xml_string = <<-END_XML GOOD SALE PUT YOUR STORE NUMBER HERE!!!!!!!!! 4111111111111111 12 08 1.03 END_XML #Parse the URL to the Linkpoint gateway script. uri = URI.parse('https://staging.linkpt.net:1129/LSGSXML') #Read the PEM file into a string. You'll need to supply your own path to your own PEM file here obviously pem_file = File.read('/home/yourdomain/storenumber.pem') #Create a new HTTP connection and configure it for SSL #with a client-side certificate which we build from the #PEM file's data. connection = Net::HTTP.new(uri.host, uri.port) connection.use_ssl = true connection.verify_mode = OpenSSL::SSL::VERIFY_NONE connection.cert = OpenSSL::X509::Certificate.new(pem_file) connection.key = OpenSSL::PKey::RSA.new(pem_file) #Send the XML as POST data after ridding it of excess whitespace. raw_response = connection.post(uri.path, xml_string.gsub!(/\s/, '')) #Parse the (invalid!) XML response into an array of values for ease of processing. #REXML will complain about the multiple root elements unless we wrap what #Linkpoint sends us up in another set of tags. response_doc_root = REXML::Document.new("#{raw_response.body}").root #Build a hash containing the key/value pairs from the response. response_values = Hash.new response_doc_root.each_element() {|element| response_values["#{element.name}"] = element.text if element.text != nil } #Process those values however you like. This just prints them out. response_values.each() {|key, val| puts "#{key} => #{val}\n" } -----------------------------------