ruby 中的 Web 商家会话上的 Apple Pay

MB.*_*MB. 0 ruby applepay

我似乎无法使用 Ruby 进行商家会话验证。尝试了 HTTParty 和 RestClient,我得到:

OpenSSL::SSL::SSLError (SSL_connect 返回=1 errno=0 状态=SSLv3 读取完成 A:sslv3 警报证书已过期):

我在这个节点服务器示例中尝试了相同的证书,https://github.com/tomdale/apple-pay-merchant-session-server,它工作正常,所以它一定是我的 ruby​​ 代码中的东西。

有人设法让这个工作吗?

gal*_*tor 5

我也遇到了同样的问题。在您引用的示例和https://github.com/norfolkmustard/ApplePayJS上的实现的帮助下 (另请参阅https://forums.developer.apple.com/thread/51580上有关实现的讨论)我是能够让它工作。

对我来说,关键是传递正确的证书(Apple Pay 商家身份证书),就像 Apple 提供的那样,并获取证书密钥,如下所示:

从 Apple 获得商家 ID(会话)证书后,双击将其导入 Mac 上的 keychain.app,右键单击钥匙串中的证书,然后将组合的私钥和证书导出为 .p12 文件,然后,在终端中:-

openssl pkcs12 -in your_merchant_identity_cert_name.p12 -out ApplePay.key.pem -nocerts -nodes
Run Code Online (Sandbox Code Playgroud)

将 Apple 的 Apple Pay 商家识别证书和文件内容添加ApplePay.key.pem到环境变量后,我能够使用 Ruby 的 Net::HTTP 类构造以下请求...

class YourControllerName < ApplicationController

  def apple_pay_validation
    respond_to do |format|
      format.json { render json: start_apple_session(params[:url]) } if params[:url].include?('apple.com')
    end
  end

  private

  def start_apple_session(url)
    uri = URI.parse(url) # the url from event.validationURL
    data = {'merchantIdentifier' => "merchant.com.your_site_name", 'domainName' => "your_doamin", 'displayName' => "your_company_name"}
    pem = File.read('path/to/your/merchant_id.cer')
    key = ENV['APPLE_PAY_MERCHANT_ID_ KEY']
    passphrase = 'passphrase set up when exporting certificate in keychain' # Should be an environment variable
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true
    http.ssl_version = :TLSv1_2
    http.ciphers = ['ECDHE-RSA-AES128-GCM-SHA256']
    http.cert = OpenSSL::X509::Certificate.new(pem)
    http.key = OpenSSL::PKey::RSA.new(key, passphrase)
    http.verify_mode = OpenSSL::SSL::VERIFY_PEER
    request = Net::HTTP::Post.new(uri.request_uri, 'Content-Type' => 'application/json')
    request.body = data.to_json
    response = http.request(request)
    response.body
  end

end
Run Code Online (Sandbox Code Playgroud)

这是从我的performValidation函数调用的(从上面列出的 ApplePayJS 存储库修改),看起来像这样。

performValidation = (valURL) ->
  new Promise((resolve, reject) ->
    xhr = new XMLHttpRequest
    xhr.open 'GET', '/your_controller_name/apple_pay_validation?url=' + valURL
    xhr.onerror = reject
    xhr.onload = ->
      data = JSON.parse(@responseText)
      resolve data
    xhr.send()
  )
Run Code Online (Sandbox Code Playgroud)

希望这有助于节省一些时间和白发!