Techioz Blog

Ruby での Web 販売者セッションでの Apple Pay

概要

Ruby で販売者セッションの検証を行うことができないようです。 HTTParty と RestClient を試してみたところ、次の結果が得られました。

OpenSSL::SSL::SSLError (返された SSL_connect=1 errno=0 state=SSLv3 読み取り完了 A: sslv3 アラート証明書の有効期限が切れました):

このノード サーバーの例 https://github.com/tomdale/apple-pay-merchant-session-server で同じ証明書を試してみましたが、問題なく動作したので、これは私の Ruby コードに何かあるに違いありません。

誰かがこれを機能させることができましたか?

解決策

私も同じ問題を抱えていました。あなたが参照した例と https://github.com/norfolkmustard/ApplePayJS の実装の助けを借りて (https://forums.developer.apple.com/thread/51580 の実装に関する議論も参照してください)それを機能させることができます。

私にとっての鍵は、Apple が提供する正しい証明書 (Apple Pay Merchant Identity 証明書) を渡し、次のように証明書キーを取得することでした。

Apple からの Apple Pay Merchant Identification 証明書と 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

これは、私の 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()
  )

誰かの時間と白髪を節約するのに役立つことを願っています。