开篇先给大家讲段历史故事,博主是湖北襄阳人。襄阳物华天宝,人杰地灵,曾用名襄樊。在2800多年的历史文化中出现了一代名相诸葛亮(卧龙),三国名士庞统(凤雏),魏晋隐士司马徽(水镜先生),唐代大诗人孟浩然(孟襄阳),张继、杜审言,文学家皮日休,北宋著名书画家米芾(米襄阳),“允冠百王”的光武帝刘秀,东方圣人释道安等一大批历史文化名人。小说《三国演义》120回故事中有30多回提到襄阳。

相传诸葛亮的老婆黄月英黄头发黑皮肤,但知识广博。诸葛亮发明木牛流马,就是从黄月英的传授的技巧上发展出来。不仅如此黄月英还有一大很重要的发明,就是大头菜,传承多年到现在已经成为湖北襄阳的一道特产,也是一项重要的饮食文化,早几年有关部门根据诸葛孔明的赫赫大名为大头菜取了个比较国际化的名字:孔明菜(广告语:吃孔明菜,谋天下事!)。

正是因为孔明菜响亮的声誉美名,近几年家乡的孔明菜事业繁荣发展,畅销五大洲,海内外。为了更好的打造国外市场,博主有幸得令,成为襄阳市孔明菜国际互联网电子商务平台打造任务的一分子,负责对接国际支付接口Paypal。

以上故事只为引题,部分虚构,如有雷同,不胜荣幸。如果你正在或将来打算赚赚老外的钱,那就跟着博主的节奏一起来国际化吧!

怎么对接Paypal支付呢?博主选择了其中的一种对接方式即(快速结账),也是当前的主流对接方式,具体步骤和详细参见官方介绍:https://www.paypal-biz.com/developer/internet/ec/,博主友情提示,操作步骤需要遵循,至于每个步骤的文档可以粗略的看看。

因为博主一出道就从MVC干起,传统的webForm先天性驾驭不了,也没那闲时间去回头学习,官方提供的源码下载下来一直未调通(如有大神调通,望不吝赐教!)。所以博主潜心研究,取其技术精髓,整合出了一个MVC3版本下的demo供各位看官参考。

MVC对接Paypal怎么做呢?我们需要如下准备材料:

  1. 在Paypal官方注册个高级帐号:https://www.paypal.com/c2/webapps/mpp/get-started
    然后在开发者中心里面去创建至少一个卖家和一个买家帐号(供您在上线之前做测试用,官方称之为Sandbox帐号,同可以理解为测试环境帐号):https://developer.paypal.com/webapps/developer/applications/accounts,如下图,红色代表卖家帐号,绿色代表买家帐号
  2. 在项目中加入官方dll文件,引用Paypal类库paypal_base.dll和log4net.dll,已在源码中附加。
  3. 获取卖家帐号API配置项,(配置项的关键需要从您创建的某个卖家帐号中获取,获取方式如下图):
  4. 配置卖家帐号API到您的网站:
    <!--Paypal支付账号配置--><add key="APIUserName" value="wen_api1.shipfinder.cn"/><add key="APIPassword" value="1376359127"/><add key="APISinature" value="An5ns1Kso7MWUdW4ErQKJJJ4qi4-AKqBVNoNVjFOrjJUxaTCiRAvn7V4"/><add key="Environment" value="sandbox"/><!--测试环境:https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token= --><!--真实环境:https://www.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token= --><add key="RedirectURL" value="https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&amp;token="/>

  5. SetExpressCheckout (向paypal提交订单,自己的网站做订单入库操作)核心代码如下:

    public ActionResult SetExpressCheckout() {
    string currency = Request.Form["currencyCodeType"];
    string name = Request.Form["NAME"];
    string SHIPTOSTREET = Request.Form["SHIPTOSTREET"];
    string SHIPTOCITY = Request.Form["SHIPTOCITY"];
    string SHIPTOSTATE = Request.Form["SHIPTOSTATE"];
    string SHIPTOCOUNTRYCODE = Request.Form["SHIPTOCOUNTRYCODE"];
    string SHIPTOZIP = Request.Form["SHIPTOZIP"];
    string L_NAME1 = Request.Form["L_NAME1"];
    string L_AMT1 = Request.Form["L_AMT1"];
    string L_QTY1 = Request.Form["L_QTY1"];
    string L_NAME0 = Request.Form["L_NAME0"];
    string L_AMT0 = Request.Form["L_AMT0"];
    string L_QTY0 = Request.Form["L_QTY0"];

    string hots = Request.Url.Scheme + "://" + Request.Url.Host + ":" + Request.Url.Port + "/";

    NVPCodec encoder = new NVPCodec();
    encoder.Add("PAYMENTACTION", "Sale");

    //不允许客户改地址
    encoder.Add("ADDROVERRIDE", "1");
    encoder.Add("CANCELURL", hots + "/Pay/Index");
    encoder.Add("CURRENCYCODE", currency);
    encoder.Add("SHIPTONAME", name);
    encoder.Add("SHIPTOSTREET", SHIPTOSTREET);
    encoder.Add("SHIPTOCITY", SHIPTOCITY);
    encoder.Add("SHIPTOSTATE", SHIPTOSTATE);
    encoder.Add("SHIPTOCOUNTRYCODE", SHIPTOCOUNTRYCODE);
    encoder.Add("SHIPTOZIP", SHIPTOZIP);
    encoder.Add("L_NAME0", L_NAME0);
    encoder.Add("L_NUMBER0", "1000");
    encoder.Add("L_DESC0", "Size: 8.8-oz");
    encoder.Add("L_AMT0", L_AMT0);
    encoder.Add("L_QTY0", L_QTY0);
    encoder.Add("L_NAME1", L_NAME1);
    encoder.Add("L_NUMBER1", "10001");
    encoder.Add("L_DESC1", "Size: Two 24-piece boxes");
    encoder.Add("L_AMT1", L_AMT1);
    encoder.Add("L_QTY1", L_QTY1);
    encoder.Add("L_ITEMWEIGHTVALUE1", "0.5");
    encoder.Add("L_ITEMWEIGHTUNIT1", "lbs");

    double ft = double.Parse(L_QTY0) * double.Parse(L_AMT0) + double.Parse(L_QTY1) * double.Parse(L_AMT1);
    encoder.Add("ITEMAMT", ft.ToString());
    encoder.Add("TAXAMT", "2.00");

    double amt = System.Math.Round(ft + 5.00f + 2.00f + 1.00f, 2);
    double maxamt = System.Math.Round(amt + 25.00f, 2);

    encoder.Add("SHIPDISCAMT","-3.00");
    encoder.Add("AMT",amt.ToString());

    string returnURL = hots + "/Pay/GetExpressCheckoutDetails?amount="+amt.ToString();//获取订单详情的地址,也是此步骤之后的地址

    encoder.Add("RETURNURL",returnURL);
    encoder.Add("SHIPPINGAMT", "8.00");
    encoder.Add("MAXAMT", maxamt.ToString());

    encoder.Add("INSURANCEOPTIONOFFERED", "true");
    encoder.Add("INSURANCEAMT", "1.00");

    encoder.Add("LOCALECODE", "US");

    encoder.Add("NOSHIPPING", "1");

    encoder.Add("L_SHIPPINGOPTIONISDEFAULT0", "false");
    encoder.Add("L_SHIPPINGOPTIONNAME0", "Ground");
    encoder.Add("L_SHIPPINGOPTIONLABEL0", "UPS Ground 7 Days");
    encoder.Add("L_SHIPPINGOPTIONAMOUNT0", "3.00");
    encoder.Add("L_SHIPPINGOPTIONISDEFAULT1", "true");
    encoder.Add("L_SHIPPINGOPTIONNAME1", "UPS Air");
    encoder.Add("L_SHIPPINGOPTIONlABEL1", "UPS Next Day Air");
    encoder.Add("L_SHIPPINGOPTIONAMOUNT1", "8.00");

    encoder.Add("CALLBACKTIMEOUT", "4");

    NVPCodec decoder = PaypalProvider.SetExpressCheckout(encoder);

    string ack = decoder["ACK"];
    string L_ERRORCODE0 = decoder["L_ERRORCODE0"];
    string L_SHORTMESSAGE0 = decoder["L_SHORTMESSAGE0"];
    string L_LONGMESSAGE0 = decoder["L_LONGMESSAGE0"];
    string L_SEVERITYCODE0 = decoder["L_SEVERITYCODE0"];

    if (!string.IsNullOrEmpty(ack) &&
    (ack.Equals("Success", System.StringComparison.OrdinalIgnoreCase) || ack.Equals("SuccessWithWarning", System.StringComparison.OrdinalIgnoreCase))
    )
    {
    // 发送电子邮件
    //new MailManager(email, "订单", "订单信息").Send();
    Session["TOKEN"] = decoder["token"];
    return Redirect(ConfigurationManager.AppSettings["RedirectURL"] + decoder["token"]);

    }
    else
    {
    return Redirect("/Pay/Index");
    }
    }

    public ActionResult SetExpressCheckout() {string currency = Request.Form["currencyCodeType"];string name = Request.Form["NAME"];string SHIPTOSTREET = Request.Form["SHIPTOSTREET"];string SHIPTOCITY = Request.Form["SHIPTOCITY"];string SHIPTOSTATE = Request.Form["SHIPTOSTATE"];string SHIPTOCOUNTRYCODE = Request.Form["SHIPTOCOUNTRYCODE"];string SHIPTOZIP = Request.Form["SHIPTOZIP"];string L_NAME1 = Request.Form["L_NAME1"];string L_AMT1 = Request.Form["L_AMT1"];string L_QTY1 = Request.Form["L_QTY1"];string L_NAME0 = Request.Form["L_NAME0"];string L_AMT0 = Request.Form["L_AMT0"];string L_QTY0 = Request.Form["L_QTY0"];string hots = Request.Url.Scheme + "://" + Request.Url.Host + ":" + Request.Url.Port + "/";NVPCodec encoder = new NVPCodec();encoder.Add("PAYMENTACTION", "Sale");//不允许客户改地址encoder.Add("ADDROVERRIDE", "1");encoder.Add("CANCELURL", hots + "/Pay/Index");encoder.Add("CURRENCYCODE", currency);encoder.Add("SHIPTONAME", name);encoder.Add("SHIPTOSTREET", SHIPTOSTREET);encoder.Add("SHIPTOCITY", SHIPTOCITY);encoder.Add("SHIPTOSTATE", SHIPTOSTATE);encoder.Add("SHIPTOCOUNTRYCODE", SHIPTOCOUNTRYCODE);encoder.Add("SHIPTOZIP", SHIPTOZIP);encoder.Add("L_NAME0", L_NAME0);encoder.Add("L_NUMBER0", "1000");encoder.Add("L_DESC0", "Size: 8.8-oz");encoder.Add("L_AMT0", L_AMT0);encoder.Add("L_QTY0", L_QTY0);encoder.Add("L_NAME1", L_NAME1);encoder.Add("L_NUMBER1", "10001");encoder.Add("L_DESC1", "Size: Two 24-piece boxes");encoder.Add("L_AMT1", L_AMT1);encoder.Add("L_QTY1", L_QTY1);encoder.Add("L_ITEMWEIGHTVALUE1", "0.5");encoder.Add("L_ITEMWEIGHTUNIT1", "lbs");double ft = double.Parse(L_QTY0) * double.Parse(L_AMT0) + double.Parse(L_QTY1) * double.Parse(L_AMT1);encoder.Add("ITEMAMT", ft.ToString());encoder.Add("TAXAMT", "2.00");double amt = System.Math.Round(ft + 5.00f + 2.00f + 1.00f, 2);double maxamt = System.Math.Round(amt + 25.00f, 2);encoder.Add("SHIPDISCAMT","-3.00");encoder.Add("AMT",amt.ToString());string returnURL = hots + "/Pay/GetExpressCheckoutDetails?amount="+amt.ToString();//获取订单详情的地址,也是此步骤之后的地址encoder.Add("RETURNURL",returnURL);encoder.Add("SHIPPINGAMT", "8.00");encoder.Add("MAXAMT", maxamt.ToString());encoder.Add("INSURANCEOPTIONOFFERED", "true");encoder.Add("INSURANCEAMT", "1.00");encoder.Add("LOCALECODE", "US");encoder.Add("NOSHIPPING", "1");encoder.Add("L_SHIPPINGOPTIONISDEFAULT0", "false");encoder.Add("L_SHIPPINGOPTIONNAME0", "Ground");encoder.Add("L_SHIPPINGOPTIONLABEL0", "UPS Ground 7 Days");encoder.Add("L_SHIPPINGOPTIONAMOUNT0", "3.00");encoder.Add("L_SHIPPINGOPTIONISDEFAULT1", "true");encoder.Add("L_SHIPPINGOPTIONNAME1", "UPS Air");encoder.Add("L_SHIPPINGOPTIONlABEL1", "UPS Next Day Air");encoder.Add("L_SHIPPINGOPTIONAMOUNT1", "8.00");encoder.Add("CALLBACKTIMEOUT", "4");NVPCodec decoder = PaypalProvider.SetExpressCheckout(encoder);string ack = decoder["ACK"];string L_ERRORCODE0 = decoder["L_ERRORCODE0"];string L_SHORTMESSAGE0 = decoder["L_SHORTMESSAGE0"];string L_LONGMESSAGE0 = decoder["L_LONGMESSAGE0"];string L_SEVERITYCODE0 = decoder["L_SEVERITYCODE0"];if (!string.IsNullOrEmpty(ack) &&(ack.Equals("Success", System.StringComparison.OrdinalIgnoreCase) || ack.Equals("SuccessWithWarning", System.StringComparison.OrdinalIgnoreCase))){// 发送电子邮件//new MailManager(email, "订单", "订单信息").Send();Session["TOKEN"] = decoder["token"];return Redirect(ConfigurationManager.AppSettings["RedirectURL"] + decoder["token"]);}else{return Redirect("/Pay/Index");}}

  6. GetExpressCheckoutDetails (根据提交订单后返回的Token,获取当前订单详情 ),核心代码如下:
      //得到支付详细信息string token = Session["TOKEN"].ToString();NVPCodec nvp = new NVPCodec();nvp.Add("TOKEN", token);nvp.Add("CURRENCYCODE", "USD");NVPCodec responsenvp = PaypalProvider.GetExpressCheckoutDetails(nvp);string ack = responsenvp["ACK"];if (string.IsNullOrEmpty(ack) ||(!ack.Equals("Success", System.StringComparison.OrdinalIgnoreCase) &&!ack.Equals("SuccessWithWarning", System.StringComparison.OrdinalIgnoreCase))){return Redirect("/Pay/Index");}string payerstatus = responsenvp["PAYERSTATUS"];string email = responsenvp["EMAIL"];string payerid = responsenvp["PAYERID"];string firstname = responsenvp["FIRSTNAME"];string lastname = responsenvp["LASTNAME"];

  7. DoExpressCheckoutPayment(根据订单详情进行验证并支付,然后自己的网站更新支付状态,订单状态),核心代码如下:
    //开始支付NVPCodec donvp = new NVPCodec();donvp.Add("TOKEN", token);donvp.Add("AMT", amount);donvp.Add("PAYERID", payerid);donvp.Add("PAYMENTACTION", "Sale");donvp.Add("CURRENCYCODE", "USD");NVPCodec response_do = PaypalProvider.DoExpressCheckoutPayment(donvp);string do_ack = response_do["ACK"];string L_ERRORCODE0 = response_do["L_ERRORCODE0"];string L_SHORTMESSAGE0 = response_do["L_SHORTMESSAGE0"];string L_LONGMESSAGE0 = response_do["L_LONGMESSAGE0"];string L_SEVERITYCODE0 = response_do["L_SEVERITYCODE0"];if (string.IsNullOrEmpty(do_ack) ||(!do_ack.Equals("Success", System.StringComparison.OrdinalIgnoreCase) &&!do_ack.Equals("SuccessWithWarning", System.StringComparison.OrdinalIgnoreCase))){return Redirect("/Pay/Index");}else {string paymenttype = response_do["PAYMENTTYPE"];string transactionID = response_do["TRANSACTIONID"];string note = response_do["NOTE"];string ordertime = response_do["ORDERTIME"];string paymentstatus = response_do["PAYMENTSTATUS"];string reason=response_do["PENDINGREASON"];double feeamt = double.Parse(response_do["FEEAMT"]);return Content("恭喜您支付成功!");}

  8. 真正的核心就是5、6、7步骤,用Paypal技术人员熟练的口气说就是Set,Get,Do,最后一步成功后就是处理我们网站业务逻辑的过程。博主这里提供个买家帐号供大家测试(帐号:a@bc.cn,密码:11111111),下面附上demo运行效果:




源码下载地址

【网站国际化必备】Asp.Net MVC 集成Paypal(贝宝)快速结账 支付接口 ,附源码demo...相关推荐

  1. Python3+Django2集成PayPal(贝宝)跨境支付三方接口以及订单查询和退款业务

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_157 如果您所在的公司涉及外贸或者跨境支付业务,那一定听说过大名鼎鼎的PayPal,总的来说,PayPal在跨国贸易里的优势还是比 ...

  2. MVC 停车场管理系统java jsp 程序设计 课程设计 毕业设计-附源码02141

    因上传问题  只上传了文案 图片未上传  点赞+收藏+关注  →  私信领取本源代码.数据库 摘  要 如今,我国现代化发展迅速,人口比例急剧上升,在一些大型的商场,显得就格外拥挤,私家车的数量越来越 ...

  3. [ASP.NET]web实现用FTP上传、下载文件(附源码)

    文章配套源码下载地址:https://download.csdn.net/download/djk8888/10486581 index.aspx 页: <%@ Page Language=&q ...

  4. HTML5期末大作业:网站——个人网站介绍 (7页面带轮播特效)明星赵丽颖 学生DW网页设计作业源码 web课程设计网页规划与设计 大学生个人网站作业模板

    HTML5期末大作业:网站--个人网站介绍 (7页面带轮播特效)明星赵丽颖 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大?HTML网页作业无从下手?网页要求的总数量太多?没有合 ...

  5. 通用权限管理系统组件 中集成多个子系统的单点登录(网站入口方式)附源码

    通用权限管理系统组件 (GPM - General Permissions Manager) 中集成多个子系统的单点登录(网站入口方式)附源码 上文中实现了直接连接数据库的方式,通过配置文件,自定义的 ...

  6. ASP.NET MVC 音乐商店 - 9. 注册和结账

    ASP.NET MVC 音乐商店 - 9. 注册和结账 转自http://www.cnblogs.com/haogj/archive/2011/11/20/2255675.html 在这一节,我们将创 ...

  7. [转]Asp.Net大型项目实践(11)-基于MVC Action粒度的权限管理【续】【源码在这里】(在线demo,全部源码)...

    本文转自:http://www.cnblogs.com/legendxian/archive/2010/01/25/1655551.html 接上篇Asp.Net大型项目实践(10)-基于MVC Ac ...

  8. Entity Framework在Asp.net MVC中的实现One Context Per Request(附源码)

    上篇中"Entity Framework中的Identity map和Unit of Work模式", 由于EF中的Identity map和Unit of Work模式,EF体现 ...

  9. asp毕业设计——基于asp+access的学生成绩查询系统设计与实现(毕业论文+程序源码)——成绩查询系统

    基于asp+access的学生成绩查询系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+access的学生成绩查询系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦. ...

最新文章

  1. Docker 使用 supervisord 管理 lumen队列与crontab
  2. Rust 阴阳谜题,及纯基于代码的分析与化简
  3. Linux下查看文件内容
  4. S5P4418 OV5640摄像头 花屏的解决方法
  5. java停车场管理系统程序设计代码_社区养老服务管理系统,java程序设计
  6. Win11系统如何设置黑暗模式
  7. HDU1492/The number of divisors(约数) about Humble Numbers
  8. 未来五年最具前景的一门编程语言是什么?
  9. 本科自考计算机专业有哪些学校,自考本科计算机专业要学什么?广东有哪些学校可以考?...
  10. 张宇1000题高等数学 第十七章 多元函数积分学的预备知识
  11. iphone win7无法识别_小编操作win7系统电脑不能识别iphone苹果设备的设置教程
  12. C语言拍皮球双重循环,山东理工大学ACM平台题答案关于C语言 1184 C语言实验——拍皮球...
  13. stony大学计算机科学找工作,美国STEM专业毕业生薪资最高的院校有哪些?
  14. VMware安装失败 找不到msi文件
  15. 一个小透明作者到出版书籍,我的心路历程分享给各位作者
  16. HUAWEI MH5000-31 5G LGA Module Application Guide-(V100R001_01, English)
  17. xshell 免费版申请
  18. xcode mac app_IOS苹果APP签名详解
  19. 学生信息管理系统——顺序表
  20. CSS的再深入2(更新中···)

热门文章

  1. php报纸源码,PHP报纸在线阅读程序 电子读报系统 杂志在线阅读源码 DM阅读源码...
  2. 英国电信公布2016第一财季业绩财报 营收76亿美元
  3. qphy-ddr3自动化测试软件包,DDR测试系列之四----漫话DDR3
  4. Savieo 万能下载器,下载多达34 站点,包括ins、Facebook
  5. 报告论文:汽车GPS调度系统车载终端设计技术方案
  6. [网络安全设备——物理隔离设备2]物理隔离网闸常见概念问题解答
  7. RocketMQ (六) 主题-Topic
  8. kafka-topic管理
  9. xp计算机如何查看内存大小,怎样查看电脑内存大小_xp怎么看电脑内存大小
  10. python学习第五天作业