2012年5月8日火曜日

ASP.NETでPayPalのエクスプレスチェックアウトAPI実装

ASP.NET(VB)でPayPalのエクスプレスチェックアウトをAPIを使って実装することに
なりました。
PayPalのサイトを調べたのですが、とにかく資料があちこちに散らばってわかりにくい。
ASP.NET用SDKもあるのですが、.net framework1.1用とか。。
SDKじゃなくてもいけそうなので自分で作成してみました。

エクスプレスチェックアウトは以下のフローになります。
ざっくりとですが、、

��.商品とかの購入画面(用途によります)のPayPal支払いボタンクリック
��.tokenを取得して、PayPalサイトへリダイレクト
��.PayPalサイトで購入情報を確認して、購入ボタンクリック
��.自サイトに戻り、商品金額などの確認画面、支払いボタンクリック
  (このとき、PayPalからAPIで商品情報を取得して表示)
��.支払確定のAPIを呼んでトランザクション終了

��でポップアップして表示するやり方があるみたいなのですが、どうもうまくいかず。。
特にこだわらないので一旦PayPalサイトへ移動する方法です。

まずは1,2のtokenを取得する、SetExpressCheckout APIのところ。
そうそう、PayPalはsandboxというテスト環境を提供しています。
予めsandboxアカウントを作成しておきます。
APIのURLもsandbox環境のものです。


Dim wReq As HttpWebRequest = CType(WebRequest.Create("https://api-3t.sandbox.paypal.com/nvp"),
HttpWebRequest)
Dim wDataStr As String
Dim wData As Byte()
Dim wReqStream As Stream

Dim wRes As WebResponse
Dim wResStream As Stream
Dim wSr As StreamReader
Dim wResData As String
Dim wResArrData As String()
Dim wResHt As Hashtable

Dim wCt As Integer

wDataStr = "&METHOD=SetExpressCheckout" _
& "&USER=userid" _
& "&PWD=password" _
& "&SIGNATURE=signature" _
& "&VERSION=64" _
& "&PAYMENTACTION=Sale" _
& "&RETURNURL=http://localhost:58119/TestPaypal/return.aspx" _
& "&CANCELURL=" & HttpUtility.UrlEncode("http://localhost:58119/TestPaypal/kakunin.aspx
?amt=" & Request.QueryString("amt") & "&desc=" & Request.QueryString("desc")) _
& "&PAYMENTREQUEST_0_CURRENCYCODE=JPY" _
& "&PAYMENTREQUEST_0_AMT=" & Request.QueryString("amt") _
& "&PAYMENTREQUEST_0_DESC=" & HttpUtility.UrlEncode(Request.QueryString("desc"))
wData = Encoding.ASCII.GetBytes(wDataStr)

With wReq
.Method = "POST"
.ContentType = "application/x-www-form-urlencoded"
.ContentLength = wData.Length
End With
wReqStream = wReq.GetRequestStream()
wReqStream.Write(wData, 0, wData.Length)
wReqStream.Close()

wRes = wReq.GetResponse()
wResStream = wRes.GetResponseStream()
wSr = New StreamReader(wResStream)
wResData = wSr.ReadToEnd()
wSr.Close()
wResStream.Close()

'&で分割
wResArrData = wResData.Split(New Char() {"&", "="})

'ハッシュテーブルに読み込み
wResHt = New Hashtable
For wCt = 0 To wResArrData.Length - 1 Step 2
wResHt(wResArrData(wCt)) = wResArrData(wCt + 1)
Next

If wResHt("ACK") = "Success" Then
Response.Redirect("https://www.sandbox.paypal.com/webscr?cmd=_express-checkout&token="
& wResHt("TOKEN"))
Else
ltrMsg.Text = "err:" & wResData
End If


次に4の戻ってきた時のGetExpressCheckoutDetails APIの部分。
確認画面に表示する情報などを取得。
そういえば、戻ってきた時にquerystringでtokenとPayerIDが付加されています。



Dim wReq As HttpWebRequest = CType(WebRequest.Create("https://api-3t.sandbox.paypal.com/nvp"),
HttpWebRequest)
Dim wDataStr As String
Dim wData As Byte()
Dim wReqStream As Stream

Dim wRes As WebResponse
Dim wResStream As Stream
Dim wSr As StreamReader
Dim wResData As String
Dim wResArrData As String()
Dim wResHt As Hashtable

Dim wCt As Integer

wDataStr = "&METHOD=GetExpressCheckoutDetails" _
& "&USER=userid" _
& "&PWD=password" _
& "&SIGNATURE=signature" _
& "&VERSION=64" _
& "&TOKEN=" & Request.QueryString("token")
wData = Encoding.ASCII.GetBytes(wDataStr)

With wReq
.Method = "POST"
.ContentType = "application/x-www-form-urlencoded"
.ContentLength = wData.Length
End With
wReqStream = wReq.GetRequestStream()
wReqStream.Write(wData, 0, wData.Length)
wReqStream.Close()

wRes = wReq.GetResponse()
wResStream = wRes.GetResponseStream()
wSr = New StreamReader(wResStream)
wResData = wSr.ReadToEnd()
wSr.Close()
wResStream.Close()

'&で分割
wResArrData = wResData.Split(New Char() {"&", "="})

'ハッシュテーブルに読み込み
wResHt = New Hashtable
For wCt = 0 To wResArrData.Length - 1 Step 2
wResHt(wResArrData(wCt)) = wResArrData(wCt + 1)
Next

ltrGetEC.Text = wResData
ltrAmt.Text = wResHt("PAYMENTREQUEST_0_AMT")
ltrCur.Text = wResHt("PAYMENTREQUEST_0_CURRENCYCODE")


最後に4,5の支払確定する部分、DoExpressCheckoutPayment APIのところです。


Dim wReq As HttpWebRequest = CType(WebRequest.Create("https://api-3t.sandbox.paypal.com/nvp"),
HttpWebRequest)
Dim wDataStr As String
Dim wData As Byte()
Dim wReqStream As Stream

Dim wRes As WebResponse
Dim wResStream As Stream
Dim wSr As StreamReader
Dim wResData As String

wDataStr = "&METHOD=DoExpressCheckoutPayment" _
& "&USER=userid" _
& "&PWD=password" _
& "&SIGNATURE=signature" _
& "&VERSION=64" _
& "&PAYMENTACTION=Sale" _
& "&TOKEN=" & Request.QueryString("token") _
& "&PAYERID=" & Request.QueryString("PayerID") _
& "&PAYMENTREQUEST_0_CURRENCYCODE=" & ltrCur.Text _
& "&PAYMENTREQUEST_0_AMT=" & ltrAmt.Text
wData = Encoding.ASCII.GetBytes(wDataStr)


With wReq
.Method = "POST"
.ContentType = "application/x-www-form-urlencoded"
.ContentLength = wData.Length
End With
wReqStream = wReq.GetRequestStream()
wReqStream.Write(wData, 0, wData.Length)
wReqStream.Close()

wRes = wReq.GetResponse()
wResStream = wRes.GetResponseStream()
wSr = New StreamReader(wResStream)
wResData = wSr.ReadToEnd()
wSr.Close()
wResStream.Close()

ltrDoEC.Text = wResData


とりあえず、これでうまく行ってます。
書き方の良し悪しはあると思いますが、、、他に良い方法があれば教えて下さい。。

あと、SetExpressCheckoutで商品情報をもっとちゃんと入れてやると、PayPalサイトで
商品情報の詳細が出そうな感じです。
このコードのままだとPAYMENTREQUEST_0_DESCで設定した情報しか表示されません。。


0 件のコメント:

コメントを投稿