Paypal标准支付对接
提醒一下,题主是在快速标准支付做到一半的时候换成了标准支付,所以该文档的快速支付大家做个参考就可以了.
一、两种支付方式
标准支付
- 优点:纯前端对接,简单方便,适用于非技术开发人员.个人即可用,不用花一个月时间进行商家认证(需要营业执照)
- 缺点:对接简单也就意味着无法执行复杂的工作,无法进行回调(因为本身就是给非技术开发人员使用的,如果这里有人发现可以回调请记得回来打我的脸!)
使用
快速支付
- 优点:可以进行回调,对接较为复杂的业务
- 缺点:开发难度大,需要相关的营业资质
二、沙盒使用
地址:https://developer.paypal.com/developer/applications/
为什么要使用沙盒环境:
- 快速支付的开通需要对应有国内相关的营业执照,但是通过沙盒环境我们可以直接获得一个仅在沙盒环境下可用的商家app
- paypal作为国外的支付手段是无法直接使用国内的银行卡支付的,需要使用visa等卡
使用:
- 创建相关账号
- 点击
Sandbox -> account,进入主页的account下,分别创建一个商家账号和买家账号 - (标准支付)登陆https://www.sandbox.paypal.com/,创建按钮
- (快速支付)点击
Dashboard -> My Account,以商家账号为基础创建一个app,在开发快速支付时使用
三、标准支付
创建账号
创建相关的按钮,即生成对应的html代码
<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top">
<input type="hidden" name="cmd" value="_s-xclick">
<input type="hidden" name="hosted_button_id" value="D7U8ME8UVW5MG">
<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_buynow_LG.gif" border="0" name="submit" alt="PayPal——最安全便捷的在线支付方式!">
<img alt="" border="0" src="https://www.paypalobjects.com/zh_XC/i/scr/pixel.gif" width="1" height="1">
</form>
将代码嵌入到对应的页面即可(这里不放相关的代码了,因为都是和业务深度内嵌的)
补充:
- 按钮的代码可以定制不同的规格选项
- 看清楚按钮的本质:将相关的cmd,hosted_button_id等参数以post形式传送到https://www.paypal.com/cgi-bin/webscr,返回一个对应的支付页面
- 如果按钮的排版布局无法满足你的要求,比如你需要将不同的支付手段(如微信支付)集成到同一个按钮,可以设置一个能选择不同支付手段的按钮选项,根据这个选项间接地用js调用paypal支付按钮
- paypal不支持国内的支付手段,支付需要使用VISA
四、快速支付
注:
- 本代码主要参考了这篇博客.遗憾的是,这篇博客距今已经有三年历史了,所以其实本人还使用了其它的博客进行参考,由于篇幅所限就不一一列举了.
- 由于本人没有visa的卡+该方案最终没有被采纳(因为相关资质的审核需要30天),实际本代码的可用性仅到订单生成为止,还无法确定回调是否可行
创建相关账号
获得app(这里具体的地址应该和沙盒一样,遗憾的是我个人并没有实际使用过)
sdk下载:
开发
public Payment createPayment(Map<String,String> paraMap) throws PayPalRESTException { Transaction transaction = new Transaction();
transaction.setDescription("icwlRegister");
// 将我们的订单ID保存到支付信息中,用于后面支付回传
if (null != paraMap.get("user_id")) {
transaction.setCustom(paraMap.get("user_id"));
}
/**
* 订单价格
* 注意两个公式:
* 1. total = subtotal(商品总额) + tax(税) + shopping(邮费) + other
* 2. subtotal = product1*num1+...
* 注意:如果有优化活动的话要坑
*/
Amount amount = new Amount();
// 设置各种费用
amount.setCurrency("USD"); //其实在paypal的返回值有说什么是哪个类哪个字段的问题
// 商品总价
amount.setTotal(paraMap.get("order_amount")); Details details = new Details();
details.setSubtotal(paraMap.get("order_amount"));
// 税费
details.setTax("0"); amount.setDetails(details); transaction.setAmount(amount); ItemList itemList = new ItemList();
//收获地址不设置 /**
* 商品明细
*/
List<Item> items = new ArrayList<>();
Item item = new Item();
item.setSku("PRODUCT0000001");
item.setName("register");
item.setPrice(paraMap.get("order_amount"));
item.setQuantity("1");
item.setCurrency("USD"); //货币种类,注意应该不支持人民币
items.add(item); itemList.setItems(items);
transaction.setItemList(itemList); List<Transaction> transactions = new ArrayList<>();
transactions.add(transaction); /**
* 支付信息
*/
Payer payer = new Payer();
payer.setPaymentMethod(PaypalPaymentMethod.paypal.toString()); Payment payment = new Payment();
payment.setIntent(PaypalPaymentIntent.sale.toString());
payment.setPayer(payer);
payment.setTransactions(transactions); /**
* 回调地址
*/
RedirectUrls redirectUrls = new RedirectUrls();
redirectUrls.setReturnUrl("http://..."); //成功支付后的回调地址
redirectUrls.setCancelUrl("www.baidu.com"); //支付失败后的回调地址
payment.setRedirectUrls(redirectUrls);
System.out.println("调用之前:" + payment); // 创建paypal API对象
APIContext apiContext = new APIContext(paypalConfigBean.getClientId(), paypalConfigBean.getClientSecret(), paypalConfigBean.getMode());
return payment.create(apiContext);
} @Override
public String paypalService(Map map) throws PayPalRESTException { HashMap<String, Object> resMap = new HashMap<>(); //paypal
Payment payment = createPayment( map ); //订单成功的回调地址
System.out.println("调用之后:" + payment);
for(Links links : payment.getLinks()){
if(links.getRel().equals("approval_url")){
resMap.put("url",links.getHref());
}
} //数据库操作
map.put("payment_id",payment.getId()); //获得paypal的唯一识别id
System.out.println(map.get("payment_id"));
Integer maxUserId = userMapper.getMaxUserId();
Integer id = maxUserId==null?1:maxUserId+1;
System.out.println("id:" +id);
map.put("user_id",id.toString());
userMapper.addUser(map);
resMap.put("id",id);
return JsonUtil.toJsonString(resMap);
} @Override
public void paypalNotify(String paymentId) {
Integer userId = userMapper.getUserIdByPaymentId(paymentId);
if(userId != null){
String dateFormat = "yyyy-MM-dd HH:mm:ss";
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
userMapper.updateUserById(userId,sdf.format(new Date()));
}else{
System.out.println("Wrong!");
}
} @Override
public String getUserId(Map map) {
Integer maxUserId = userMapper.getMaxUserId();
Integer id = maxUserId==null?1:maxUserId+1;
map.put("user_id",id);
userMapper.addUser(map);
//结果集
Map<String, Object> resMap = new HashMap<String, Object>();
resMap.put("userId",id);
return JsonUtil.toJsonString(resMap);
}
注:
这里的代码参考意义更强一些,因为没有完工,很烂(留着给自己做个记录吧)
订单价格的两个公式(如果不正确也是会报错的):
1. total = subtotal(商品总额) + tax(税) + shopping(邮费) + other
2. subtotal = product1*num1+..
总结一下
- paypal支付的对接过程在我看来是非常糟心的,因为缺少相关的中文文档(自己这方面的能力的确还不足)
- 相关的api设置还不够完善,曾经的微信支付的api也是乱七八糟的,但现在都有了比较统一的接口.就比如关于价格的严格规则,其实就可以做成api调用,即总价格由计算得出,当然可能paypal本身的考虑也可能是为了使开发者避免单价价格和税率,总价的不一致性,那么我只能说这波paypal是在大气层!
Paypal标准支付对接的更多相关文章
- PayPal支付对接
开发时间:2019-04-30 我的目标:在我们公司的海外网站上,接入PayPal支付,美国用户在线完成付款. 准备: (1)准备:公司注册信息(执照,注册号,法人等),法人信息(身份证,住址等) ( ...
- [label][转载][paypal]paypal在线支付接口的WEB语言设置
http://stephen830.iteye.com/blog/274072 ★★★ 本篇为原创,需要引用转载的朋友请注明:< http://stephen830.iteye.com/blog ...
- Stripe支付对接
一.由于文档丢失原因,我就直接上代码了. 这个Stripe支付可以支持多个币种,我下面就采用"HDK"来参照支付先上一个支付效果图 提示:先上代码,在说明博主自己理解的流程. 一 ...
- Razorpay支付对接,JAVA对接篇
Razorpay 作为印度本土的一家支付公司,类似中国的支付宝 微信,本篇记录一下对接印度第三方支付公司 准备工作: 注册公司 申请Razorpay账号 申请正式环境 Razorpay工作台: 获取k ...
- C#微信支付对接
c#版在pc端发起微信扫码支付 主要代码: /** * 生成直接支付url,支付url有效期为2小时,模式二 * @param productId 商品ID * @return 模式二URL */ ...
- ecshop移动端支付宝支付对接
初始页,提交基本信息到api页面, <?php /* * * 功能:支付宝手机网站支付接口接口调试入口页面 * 版本:3.4 * 修改日期:2016-03-08 * 说明: * 以下代码只是为了 ...
- 海外支付:遍布全球的Paypal
海外支付:遍布全球的Paypal 吴剑 2015-11-26 原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jian 吴剑 http://www.cnblogs.co ...
- PayPal网站付款标准版(for PHP)
简单整理一下PHP项目整合PayPal支付功能. 一.表单的构建: <form method="post" name="form" action=&quo ...
- 基于ASP.NET/C#开发国外支付平台(Paypal)学习心得。
最近一直在研究Paypal的支付平台,因为本人之前没有接触过接口这一块,新来一家公司比较不清楚流程就要求开发两个支付平台一个是支付宝(这边就不再这篇文章里面赘述了),但还是花了2-3天的时间通 ...
随机推荐
- 对已有的docker容器增加新的端口映射
一般在运行容器时,我们都会通过参数 -p(使用大写的-P参数则会随机选择宿主机的一个端口进行映射)来指定宿主机和容器端口的映射,例如 docker run -it -d --name [contain ...
- 最好的Java开发工具---IDEA
IntelliJ IDEA工具的使用 1. 常见的Java集成开发工具 Eclipse IBM团队研发的一个开源的非常好用的集成开发环境.寓意:吞并Sun公司.不过Sun最终被Oracle公司收购了. ...
- Bootstrap提供的CDN服务标签与下载文档
目录 1.引入Bootstrap提供的CDN服务 1.选择下载Bootstrap CDN 二:下载Bootstrap官方文档 1.进入Bootstrap官网,选择3版本中文档. 1.引入Bootstr ...
- 9、Linux基础--编译安装、压缩打包、定时任务
笔记 1.晨考 1.搭建yum私有仓库的步骤 1.安装工具 yum install createrepo yum-utils nginx -y 2.创建目录 mkdir /opt/test 3.创建包 ...
- Solution Set -「ABC 217」
大家好屑兔子又来啦! [A - Lexicographic Order] 说个笑话,\(\color{black}{\text{W}}\color{red}{\text{alkingDead} ...
- Python中模块import的使用案例
1 import test # 导入test模块 2 3 print(test.a) # 使用"模块.变量"调用模块中的变量 4 5 test.hi() # 使用"模块. ...
- Linux之history使用技巧
背景: 正常情况下,Linux系统中输入 history 只显示序号和历史命令如下图,但是当我们想要根据历史命令来排查一些故障问题时,无法精确获取该命令执行的详细信息,包括执行时间.执行的用户.是哪 ...
- windows server2012 r2 .net framework 3.5失败
拿到手的虚拟机系统是Windows server 2012R2,本想着安装SQlserver2012轻轻松松,结果途中警告未安装.NET Framework 3.5.于是找了个.NET Framewo ...
- RENIX使用模板创建报文——网络测试仪实操
一.简介 RENIX内置多种报文模板,可以直接用来创建一个报文,节省时间 二.操作步骤 1.准备工作:连接机框,占用端口 2.新建或者编辑流 3.切换到 数据包/编辑 界面:点击创建新协议报文 4.在 ...
- Maven目录结构, war目录结构
Maven目录结构 src/main/java 存放java servlet类文件 src/main/webapp 存放jsp文件 war目录结构 Maven web项目目录结构