私のサイトで PayPal Payment Advanced をテストして、https ://ppmts.custhelp.com/app/answers/detail/a_id/929/ を使用します。これで、サイトとの統合が完了しました。しかし、今では PayPal アカウントで支払うことができ、クレジット カードでの支払いに失敗しました。この API を使用すると、PayPal から間違った応答を受け取ることはありません。これは私のコードです:
public NameValueCollection PayAdvanced(VM_BasketOrder basketOrder)
{
string baseUrl = Request.Url.Scheme + "://" + Request.Url.Authority;
string ReturnURL = baseUrl + Url.Action("ReturnPayAdvanced", "ShoppingCart");
string CancelURL = baseUrl + Url.Action("CancelPay", "ShoppingCart");
StoredAddress billAddress = basketOrder.billto_sAddress;
StoredAddress shipAddress = basketOrder.shipto_sAddress;
NameValueCollection requestArray = new NameValueCollection()
{
{"PARTNER", "PayPal"},
{"VENDOR", "s04124226"},
{"USER", "g041234226"},
{"PWD", "k_123452346789"},
{"CREATESECURETOKEN", "Y"},
{"SECURETOKENID", genId()},
{"TRXTYPE", "S"},//A
{"SHIPAMOUNT", basketOrder.ShippingAmount.ToString()},
{"AMT", basketOrder.Total.ToString()},
{"TAX", basketOrder.SalesTax.ToString()},
// {"ACCT","4111111111111111"},
// {"EXPDATE","1215"},
{"CURRENCY", "USD"},
//{"SILENTTRAN","TRUE"},
{"RETURNURL", ReturnURL},
{"CANCELURL", CancelURL},
{"ERRORURL", CancelURL},
{"BILLTOFIRSTNAME",billAddress.Name.AddressNameSplit()[0]},
{"BILLTOLASTNAME", billAddress.Name.AddressNameSplit()[1]},
{"BILLTOSTREET", billAddress.Street1},
{"BILLTOCITY",billAddress.City},
{"BILLTOSTATE",billAddress.State},
{"BILLTOZIP",billAddress.Zip},
{"BILLTOCOUNTRY",billAddress.Country},
{"BILLTOPHONE","55555"},
{"SHIPTOFIRSTNAME", shipAddress.Name.AddressNameSplit()[0]},
{"SHIPTOLASTNAME", shipAddress.Name.AddressNameSplit()[1]},
{"SHIPTOSTREET", shipAddress.Street1},
{"SHIPTOCITY", shipAddress.City},
{"SHIPTOSTATE", shipAddress.State},
{"SHIPTOZIP",shipAddress.Zip},
{"SHIPTOCOUNTRY",shipAddress.Country},
{"SHIPTOPHONE","55555"},
};
NameValueCollection resp = run_payflow_call(requestArray);
return resp;
}
protected NameValueCollection run_payflow_call(NameValueCollection requestArray)
{
#region send request to Payflow
String nvpstring = "";
foreach (string key in requestArray)
{
//format: "PARAMETERNAME[lengthofvalue]=VALUE&". Never URL encode.
var val = requestArray[key];
nvpstring += key + "[ " + val.Length + "]=" + val + "&";
}
string urlEndpoint = "https://pilot-payflowpro.paypal.com/";
HttpWebRequest payReq = (HttpWebRequest)WebRequest.Create(urlEndpoint);
payReq.Method = "POST";
payReq.ContentLength = nvpstring.Length;
payReq.ContentType = "application/x-www-form-urlencoded";
StreamWriter sw = new StreamWriter(payReq.GetRequestStream());
sw.Write(nvpstring);
sw.Close();
#endregion
#region get Payflow response
HttpWebResponse payResp = (HttpWebResponse)payReq.GetResponse();
StreamReader sr = new StreamReader(payResp.GetResponseStream());
string response = sr.ReadToEnd();
sr.Close();
#endregion
#region parse string into array and return
NameValueCollection dict = new NameValueCollection();
foreach (string nvp in response.Split('&'))
{
string[] keys = nvp.Split('=');
dict.Add(keys[0], keys[1]);
}
return dict;
#endregion
}
protected string genId()
{
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
var random = new Random();
var result = new string(
Enumerable.Repeat(chars, 16)
.Select(s => s[random.Next(s.Length)])
.ToArray());
return "MySecTokenID-" + result; //add a prefix to avoid confusion with the "SECURETOKEN"
}
このコードを使用すると、トークン ID とトークンが次のコードに渡されます。
<iframe src="@("https://payflowlink.paypal.com?MODE=TEST&SECURETOKENID="+ViewBag.SECURETOKENID+"&SECURETOKEN="+ViewBag.SECURETOKEN)" name="test_iframe" scrolling="no" style=" width:480px;height:490px;border:0px;"></iframe>
サイトで PayPal iframe を取得し、PayPal ボタンをクリックすると、問題なく支払いができますが、クレジット カード番号を入力して [今すぐ支払う] をクリックすると、テスト アカウントでお金を受け取ることができません。コードは PayPal で実行されているため、コードをデバッグする方法がわかりません。そのため、コードのどこに間違いがあるのか わかりません。だから私は自分のコードをここに貼り付けました。
今日、クレジット カードでの支払い PNREF=V72A4DR7AE07 を使用すると、PPREF を取得できないことがわかりました。PayPal アカウントを使用して支払うと、PNREF と PPREF をすべて取得できます。PPREF は PayPal の transactionId です。