近日网站需要对接国际化的支付接口PayPal,折腾了几天把遇到的坑记录下以备后用。

1.第一步先到官网申请商家账户https://www.paypal.com/这里的具体步骤我不太清楚,毕竟不是我来申请的

2.因为我们这里是网站用到的,使用了最便捷的网站付款标准版,其他的还可以用快速结账的API来实现。

首先我们把需要用到的参数信息配置到config中

   <!--paypal支付--><add key="payPalBusiness" value="你的账户"/><add key="payPalReturnUrl" value="操作完成后的返回地址"/><add key="payPalNotifyUrl" value="操作完成后的异步通知页面"/>

然后我们构建需要我们进行Post的页面代码,将必须填写的值存放到隐藏域<input type="hidden" />之中

                string webUrl = CFun.GetAppStr("webUrl");string business = CFun.GetAppStr("payPalBusiness");string returnUrl = CFun.GetAppStr("payPalReturnUrl");string notifyUrl = CFun.GetAppStr("payPalNotifyUrl");Dictionary<string, string> sParaTemp = new Dictionary<string, string>();sParaTemp.Add("cmd", "_xclick"); //按钮类型,包含:_xclick单个商品立即购买、_xclick_subscription订阅、_cart购物车、s_x-click加密sParaTemp.Add("business", business); //商户名称sParaTemp.Add("item_name", product_name); //商品名称sParaTemp.Add("item_number", out_trade_no); //商品编号sParaTemp.Add("currency_code", "USD"); //货币类型,默认美元sParaTemp.Add("amount", payMoney.ToString()); //付款金额sParaTemp.Add("notify_url", notifyUrl); //通知地址sParaTemp.Add("cancel_return", webUrl); //取消返回地址sParaTemp.Add("return", returnUrl); //返回地址string submitHtml = PayPalSubmit.BuildRequest(sParaTemp, "post");Response.Write(submitHtml);

        /// <summary>/// 建立请求,以表单HTML形式构造(默认)/// </summary>/// <param name="sParaTemp">请求参数数组</param>/// <param name="strMethod">提交方式。两个值可选:post、get</param>/// <param name="strButtonValue">确认按钮显示文字</param>/// <returns>提交表单HTML文本</returns>public static string BuildRequest(Dictionary<string, string> dicPara, string strMethod){             //正式的是https://www.paypal.com/cgi-bin/webscr,这里我们用测试的地址进行测试             string actionUrl = "https://www.sandbox.paypal.com/cgi-bin/webscr";StringBuilder sbHtml = new StringBuilder();sbHtml.Append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />");sbHtml.Append("<form id='paypalsubmit' name='alipaysubmit' action='" + actionUrl + "' method='" + strMethod.ToLower().Trim() + "'>");foreach (KeyValuePair<string, string> temp in dicPara){sbHtml.Append("<input type='hidden' name='" + temp.Key + "' value='" + temp.Value + "'/>");}//submit按钮控件请不要含有name属性sbHtml.Append("<input type='submit'  style='display:none;'></form>");sbHtml.Append("<script>document.forms['paypalsubmit'].submit();</script>");return sbHtml.ToString();}

这几个参数是比较重要的,更全面的参数介绍可以去官网查找相关文档

3.发起代码可以了,我们接下来写一下返回和通知页面的代码

在通知页面我们可以获取到下面几个关键参数

          string item_number = CFun.RequestPamStr("item_number"); //商品编号string pay_order = CFun.RequestPamStr("tx"); //paypal交易编号string pay_status = CFun.RequestPamStr("st"); //交易状态

我们可以通过item_number参数跟数据库做数据对应,根据pay_order做验证防止重复使用,根据pay_status判断是否交易成功(pay_status="Completed")

这里有一点要注意,PayPal默认的是没有自动返回的,需要进行相关配置。操作步骤:用户信息-->销售通知-->网站付款习惯设定

将图中两处设置为开启即可。

4.返回页面一般只是用来显示充值结果,处理相关业务逻辑我们一般要放在通知页面进行操作。

            string response=ValidateSource();if (response == "VERIFIED")  //信息验证成功{string sendData = response;string item_number = CFun.RequestPamStr("item_number"); //商品编号string pay_order = CFun.RequestPamStr("txn_id"); //paypal交易编号string pay_status = CFun.RequestPamStr("payment_status"); //交易状态ErrorLog.sendLog(new Exception(),"商品编号:"+item_number+";交易编号:"+pay_order+"交易状态:"+pay_status);if (pay_status == "Completed") //付款成功{//业务处理}Response.Write(sendData);}

 /// <summary>/// 验证返回地址是否是官方返回/// </summary>/// <returns></returns>private string  ValidateSource(){//Post back to either sandbox or livestring strSandbox = "https://www.sandbox.paypal.com/cgi-bin/webscr";string strLive = "https://www.paypal.com/cgi-bin/webscr";//System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; //Framework4.5支持ServicePointManager.SecurityProtocol = (SecurityProtocolType)192 | (SecurityProtocolType)768 | (SecurityProtocolType)3072; //4.0写法HttpWebRequest req = (HttpWebRequest)WebRequest.Create(strSandbox);//Set values for the request backreq.Method = "POST";req.ContentType = "application/x-www-form-urlencoded";byte[] param = Request.BinaryRead(HttpContext.Current.Request.ContentLength);string strRequest = Encoding.ASCII.GetString(param);string ipnPost = strRequest;strRequest += "&cmd=_notify-validate";req.ContentLength = strRequest.Length;//for proxy//WebProxy proxy = new WebProxy(new Uri("http://url:port#"));//req.Proxy = proxy;//Send the request to PayPal and get the responseStreamWriter streamOut = new StreamWriter(req.GetRequestStream(),System.Text.Encoding.ASCII);streamOut.Write(strRequest);streamOut.Close();StreamReader streamIn = new StreamReader(req.GetResponse().GetResponseStream());string strResponse = streamIn.ReadToEnd();streamIn.Close();return strResponse;}

ValidateSource方法主要是通过将获取到的参数+"&cmd=_notify-validate"后调用接口进行验证,查看参数传递过程中是否被篡改,如果返回VERIFIED证明参数信息一致。

注意上面标红的地方,这个一定不能少,我们访问的https接口,如果少了上面的代码会报异常:请求被中止: 未能创建 SSL/TLS 安全通道

好了,上面代码写完后我们就可以发布到服务器进行测试了,paypal的测试还是比较好的,给我们提供了专门的测试地址,可以任意添加商户和个人账户来进行测试。

首先我们用我们注册的账户来登录:https://developer.paypal.com/

登录后我们找到

这里会给我们默认两个账户,当然你也可以做任意的修改,然后我们就可以用我们设定的账户进行测试了

测试完成以后如果我们想登录我们的测试账户进行信息查看就需要用到这个网址:https://www.sandbox.paypal.com

我们这里用商户账号进行登录,在这里我们同样需要把步骤3上面的配置信息再次进行操作。

在这里我们还能查看我们的IPN信息

转载于:https://www.cnblogs.com/zzs-pedestrian/p/6548983.html

PayPal接口开发相关推荐

  1. PHP Paypal接口开发

    PayPal 快速.安全而又方便,是跨国交易的首选在线付款方式.现在PayPal可以和国内大部分信用卡关联,可以实现国人的跨国交易收支. 申请PayPal注册网址:https://www.paypal ...

  2. php接口 汉字出错 空,php接口开发时,数据解析失败问题,字符转义,编码问题(示例代码)...

    php接口开发时,数据解析失败问题,字符转义,编码问题 情景: A平台--->向接口请求数据---->接口向B平台请求数据---->B平台返回数据给接口---->接口返回数据给 ...

  3. 《Web接口开发与自动化测试 -- 基于Python语言》 ---前言

    前    言 本书的原型是我整理一份Django学习文档,从事软件测试工作的这六.七年来,一直有整理学习资料的习惯,这种学习理解再输出的方式对我非常受用,博客和文档是我主要的输出形式,这些输出同时也帮 ...

  4. 一周的微信公众平台接口开发总结

    2019独角兽企业重金招聘Python工程师标准>>> 在公司弄了一个星期的微信公众平台的接口开发,由于之前没弄过,开发的过程遇到了很多的小问题.下面我就总结一下我在开发过程中遇到了 ...

  5. php限制接口访问次数_PhalApi专业版 v2.4 版本发布!接口开发,快人一步

    dogstar 小白开放平台 今天 PhalApi专业版介绍 PhalApi Pro 是PhalApi开源接口框架的专业版, 基于主流的PHP+MySQL,是一款开发和管理接口的超级框架. 从接口设计 ...

  6. php 接口 2.0,YII 2.0 API接口开发

    YII2.0 API接口开发 首先先安装 YII2.0 高级模板(安装请参考其他教程) 准备 添加数据库配置 common/config/main-local.php image 把backend目录 ...

  7. php 动态彩码辨色 接口的调用_好用的云函数!后端低代码接口开发,零基础编写API接口...

    前言 在开发项目过程中,经常需要用到API接口,实现对数据库的CURD等操作. 不管你是专业的PHP开发工程师,还是客户端开发工程师,或者是不懂编程但懂得数据库SQL查询,又或者是完全不太懂技术的人, ...

  8. 浅谈 PHP 与手机 APP 开发(API 接口开发)

    http://www.thinkphp.cn/topic/5023.html 推荐阅读:RESTful 是什么?一起来理解 RESTful 架构 更深入了解API开发 这个帖子写给不太了解PHP与AP ...

  9. 微信JS-SDK之图像接口开发详解

    2019独角兽企业重金招聘Python工程师标准>>> 参考: 微信JS-SDK之图像接口开发详解 http://www.cnblogs.com/it-cen/p/4587812.h ...

  10. 说说第三方支付接口开发及开发中遇到的坑爹问题

    前言 最近在做公司的支付接口,从微信支付到各种第三方的支付接口,还有点卡等支付,微信支付文档相对比较详细,虽然也不少坑,被各路开发人员吐槽,但是填的人多啊,所以是最好开发的,但是公司还有用到一些第三方 ...

最新文章

  1. MVC应用程序播放RealPlayer(rmvb)视频
  2. Android开发之适配器模式初探
  3. 字符串匹配的KMP算法——Python实现
  4. 深度学习核心技术精讲100篇(十五)-搜索引擎Indri系列之安装及使用
  5. 基于节拍谱的语音音乐分类模型
  6. Springmvc借助SimpleUrlHandlerMapping实现接口开关功能
  7. [.net基础]访问修饰符
  8. Service获取客户端IP地址(java)
  9. 路径标记语法 in Windows Presentation Foundation(WPF)
  10. MySQL之Handler_read_*查看索引使用情况
  11. Linux下查杀进程的方法说明
  12. 聚观早报 | 华为官宣新机Pocket S;苹果旗舰店开售智能门锁
  13. Linux 创建oracle数据库
  14. 渗透安全学习记录笔记
  15. 线性光耦 和 非线性光耦
  16. SMB v1远程代码执行漏洞(CVE-2020-1301)复现
  17. 启动手机自带浏览器和手机拨号
  18. 异星工厂 自动机器人_异星工厂自动科研系统建造技巧_图文攻略
  19. 电脑不能开热点的一种可以尝试的解决方法
  20. GIT命令(急速学习)

热门文章

  1. 初步了解PS“时间轴”
  2. 64位计算机装32位系统,32位装64位系统教程
  3. When Color Constancy Goes Wrong:Correcting Improperly White-Balanced Images阅读札记
  4. Second season sixth episode,Chandler and Joey lost Ross‘s baby???!!!
  5. Seventh season eighteenth episode,Joey got an award??????
  6. (数位dp) 算法竞赛入门到进阶 书本题集
  7. python pip 换源_Python pip换源教程
  8. kindle paperwhite 完美越狱,KPV / Koreader 安装
  9. 《人工智能及其应用》练习题
  10. 如何使用计算机上合并计算方法,excel合并计算的方法步骤详解