0

私のサイトで 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 です。

4

0 に答える 0