PayPal Payments Advanced

  Payflow是应用Paypal高级产品的必要部分,包括Paypal Payments Advanced。集成方法见此链接:https://ppmts.custhelp.com/app/answers/detail/a_id/929/

  Part 1:创建一个Payflow的测试账户。

    打开https://registration.paypal.com/welcomePage.do?country=US&mode=try,点击continue,填写表单,让Processor的值保持默认(FDMS Nashville)。下一个

页面,点击"Login to PayPal Manager",不要点击"continue"。    

  Part 2:创建一个sandbox的测试账户。

    打开https://www.sandbox.paypal.com/home,点击"Sign Up",国家选择“United Kingdom”,这是因为在选择US作为测试账号的时候有一个已知的问题存在,但是

它只影响到测试账号,对正式账号没有影响。选择bussiness账户,注册一个国际为UK的sandbox账户。

  Part 3:设置manager。

    打开https://manager.paypal.com/登录。

    Service Setting => Hosted Checkout Pages=>Set Up

      1、Transaction Process Mode=>Test。

      2、PayPal Sandbox email address=>UK Sandbox account。

      3、选择Billing Information下的CSC。

      4、Show confirmation page=>On my website。

      5、Enable Secure Token=>Yes

 

    Service Settings => Fraud Protection => Test Setup => Edit Standard Filters,取消所有的checkbox,点击deploy。

  Part 4:配置Hosted Checkout Pages。

    Service Settings => Hosted Checkout Pages => Customize,选择Layout C,要选择布局C,你要再Set Up里添加Return和Error URL。

  Part 5:测试。

    在教程页面底下有一个名为payflowbasictestdemos.zip的压缩包,下载他,按照实例代码修改。

    

/// <summary>
        /// 根据订单信息返回tokenId和token的组合对象NameValueCollection
        /// </summary>
        /// <param name="basketOrder"></param>
        /// <returns></returns>
        public NameValueCollection PayAdvanced(VM_BasketOrder basketOrder)
        {
            #region ReturnURL  CancelURL
                string baseUrl = Request.Url.Scheme + "://" + Request.Url.Authority;
                string ReturnURL = baseUrl + Url.Action("ReturnPayAdvanced", "Checkout");
                string CancelURL = baseUrl + Url.Action("CancelPayAdvanced", "Checkout");
                string ErrorURL = baseUrl + Url.Action("ErrorPayAdvanced", "Checkout");
            #endregion

            #region billAddress  shipAddress
                StoredAddress billAddress = basketOrder.billto_sAddress;
                StoredAddress shipAddress = basketOrder.shipto_sAddress;
            #endregion

            #region 构建要传输的数据对象
                    NameValueCollection requestArray = new NameValueCollection()
                    {
                        {"PARTNER", "PayPal"},  
                        {"VENDOR", "你的manager账户"},  
                        {"USER", "你的manager账户"},
                        {"PWD", "你的manager密码"},

                        //根据securetokenid(唯一的)和CREATESECURETOKEN=Y,获取 a secure token
                        //secure token30分钟内可用,且可用一次
                        {"CREATESECURETOKEN", "Y"},
                        {"SECURETOKENID", genId()},

                        {"TRXTYPE", "S"},
                        {"SHIPAMOUNT", basketOrder.ShippingAmount.ToString()},
                        {"AMT", basketOrder.Total.ToString()},
                        {"TAX", basketOrder.SalesTax.ToString()},
                       

                        {"CURRENCY", "USD"},

                        {"RETURNURL", ReturnURL}, 
                        {"CANCELURL", CancelURL},
                        {"ERRORURL", ErrorURL},
                   
                        {"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",billAddress.Phone},


                        {"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",shipAddress.Phone},
                    };
                #endregion
                
                
            NameValueCollection resp = run_payflow_call(requestArray);

            //将订单 信息 存入 session
            Session["VM_BasketOrder"] = Serialization.ScriptSerialize<VM_BasketOrder>(basketOrder);

            return resp;
        }
        /// <summary>
        /// 发送请求到Payflow 从PayPal获取Token
        /// 
        /// </summary>
        /// <param name="requestArray">要传输的订单信息</param>
        /// <returns></returns>
        protected NameValueCollection run_payflow_call(NameValueCollection requestArray)
        {
            #region 发送请求到Payflow
                String nvpstring = "";
                foreach (string key in requestArray)
                {
                    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 获取Payflow的回复
                HttpWebResponse payResp = (HttpWebResponse)payReq.GetResponse();
                StreamReader sr = new StreamReader(payResp.GetResponseStream());
                string response = sr.ReadToEnd();
                sr.Close();
            #endregion

            #region 将回复 转换成 NameValueCollection对象,返回
                NameValueCollection dict = new NameValueCollection();
                foreach (string nvp in response.Split('&'))
                {
                    string[] keys = nvp.Split('=');
                    dict.Add(keys[0], keys[1]);
                }
                return dict;
            #endregion
        }
        /// <summary>
        /// 创建唯一的TokenID,传递给PayPal 用来获取Token
        /// 
        /// </summary>
        /// <returns></returns>
        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"
        }

  将返回的TokenId和Token放到下面的代码里  

<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的支付页面就被镶嵌到了你的网站里了。

  Account Administration=>Processor&Merchant Bank Information=>Accepted Card Types下的设置可能会影响到你是否能收到信用卡付款,怎么设置我还不太清

楚,希望有人指点。

posted @ 2013-07-23 16:47  小飞的DD  阅读(799)  评论(0编辑  收藏  举报