1

Ruby を使用して PesaPal API を動作させようとすると、本当に悪夢に見舞われます...

おそらく最も一般的に使用されている API ではないことは承知していますが、OAuth の使用経験が豊富で、PHP の経験が豊富で、新しい視点を提供できる人がここにオンラインでいる場合は、感謝します。

PesaPal 開発者サイトはこちらです: http://developer.pesapal.com 彼らのAPI ドキュメントは、彼らのサイトで OAuth を使用する方法についてあまり多くの手がかりを与えていません。彼らのPHP サンプルを正しく読みました。

これをRubyで実装しようとする私の試みは次のとおりです。

require 'oauth'
require 'uri'

key = '<my sandbox key>'
sec = '<my sandbox secret>' 

API_DOMAIN = 'https://demo.pesapal.com'

# An XML string of param data to include with our request
RAW_XML  = %{<?xml version=\"1.0\" encoding=\"utf-8\"?><PesapalDirectOrderInfo xmlns:xsi=\"http://www.w3.org/2001/XMLSchemainstance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" Amount=\"12.34\" Description=\"Bob Test 1\" Type=\"MERCHANT\" Reference=\"808\" FirstName=\"Bo\" LastName=\"Tester\" Email=\"bodacious@bodacious.com\" xmlns=\"http://www.pesapal.com\" />}

# Escape the XML
@post_xml = URI.escape(RAW_XML)

# Create a new OAuth Consumer
@consumer = OAuth::Consumer.new(key, sec, {
  site: API_DOMAIN, 
  scheme: :query_string
})

# The signed request object
@signed_request  = @consumer.create_signed_request('get', "#{API_DOMAIN}/API/PostPesapalDirectOrderV4")

# Join the pesapal_request_data and oauth_callback with '&' for valid URL params
@params = { 
  oauth_callback: URI.escape('http://localhost:3000'),
  pesapal_request_data: @post_xml,
}.map { |k,v| "#{k}=#{v}" }.join('&')

# This is the URL we should redirect to
puts redirect_url = "#{@signed_request.path}&#{@params}"

このコードによって返された URL にアクセスしようとするとProblem: signature_invalid | Advice: > |、API から返されます。

ここで私が間違っていることを誰かが考えることができますか?

ありがとう

4

3 に答える 3

0

私は同じ問題を抱えていたので、手動で URL に署名する方法を作成して解決しました。このように oauth_nonce を取得する独自のメソッドを作成します。

def nonce
Array.new( 5 ) { rand(256) }.pack('C*').unpack('H*').first
end

署名方法は次のようになります。

def signature
key = percent_encode( @consumer_secret ) + '&' + percent_encode( @token_secret )

digest = OpenSSL::Digest::Digest.new( 'sha1' )
hmac = OpenSSL::HMAC.digest( digest, key, @base_str )

Base64.encode64( hmac ).chomp.gsub( /\n/, '' )
end

これは @base_str インスタンス変数です。

@base_str = [@req_method,
percent_encode( req_url ),
percent_encode( query_string )
].join( '&' )

これは query_string メソッドです。

def query_string
pairs = []
@params.sort.each { | key, val |
pairs.push( "#{ percent_encode( key ) }=#{ percent_encode( val.to_s ) }" )
}
pairs.join '&'
end

次に、上記の署名メソッドを使用して、結果の URL で使用する oauth_signature パラメータを取得できます。

于 2013-07-19T07:42:25.983 に答える